基于Qwen-14b的基础RAG实现及反思

news2025/5/10 17:01:16

1、概览

        本文主要介绍RAG的基础实现过程,给初学者提供一些帮助,RAG即检索增强生成,主要是两个步骤:检索、生成,下面将基于这两部分进行介绍。

2、检索

        检索的主要目的是在自定义的知识库kb中查询到与问题query相关的候选答案。过程中主要涉及的几个关键内容是:文本向量化模型、向量数据库,文本向量化模型如GTE、BGE等、向量数据库如faiss、weaviate、milvus等,对于选型本文不作介绍,读者可自行了解。

        向量数据库主要用于存放文本向量化模型处理的知识库向量,并为检索相似候选答案提供快速的方法,下面以bge-large-zh及faiss库讲解一下检索的主要内容。

2.1 向量库构建

        向量库构建前需要构建知识库,对知识库的处理五花八门,可以是pdf、docx、txt、pptx、web等等,本文以构建好的txt为例介绍,txt内容举例如下:

文本内容

文本内容

注:文本格式并无要求,可先随机复制一些文本内容,对于质量下文说明

        文本内容的读取使用 langchain_community 工具封装好的方法,如下:

loader = TextLoader('test.txt')

        当我们的文本内容校多时,可以遍历文件夹读取txt文件。

        然后需要将文本内容转化为向量,内容如下,直接给出全部代码:

from langchain_community.document_loaders import TextLoader
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
import os

embed_path = 'path/to/bge_model_weight'
faiss_path = 'faiss_db.index'

filename = os.listdir('data')

data = []

for fn in filename:
    loader = TextLoader(f'data/{fn}')
    data.append(loader.load()[0])

embeddings = HuggingFaceEmbeddings(model_name=embed_path, model_kwargs={'device': 'cuda'})
db = FAISS.from_documents(data, embeddings)
db.save_local(faiss_path)

           其中,FAISS.from_documents(data, embeddings) 方法即为向量数据库构建,通过传入需要构建的数据及向量化模型,然后调用save_local方法将向量存储到向量数据库中,至此,向量数据库已构建完成。

2.2 向量库检索

        向量库检索主要使用Faiss的 as_retriever() 方法,如下:

from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS

embed_path = 'path/to/bge_model_weight'
faiss_path = 'faiss_db.index'

embeddings = HuggingFaceEmbeddings(model_name=embed_path, model_kwargs={'device': 'cuda'})
db = FAISS.load_local(faiss_path, embeddings, allow_dangerous_deserialization=True)


result = db.as_retriever().invoke('什么是RAG', return_scores=True)

print(result)

        其中,result默认会包含最相似的top4个候选答案,至此,向量库构建及检索均已完成,下面介绍生成应用。

3、生成

        以qwen2.5-14b模型为例,搭建rag应用,实现如下:

from modelscope import AutoModelForCausalLM, AutoTokenizer
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS

model_name = "path/to/Qwen2.5-14B-Instruct"
embed_path = 'path/to/bge_model_weight'
faiss_path = 'faiss_db.index'

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

RAG_prompt = """
                请根据输入内容总结回答

                """

messages = [
    {"role": "system", "content": RAG_prompt}
    # {"role": "user", "content": prompt}
]

embeddings = HuggingFaceEmbeddings(model_name=embed_path, model_kwargs={'device': 'cuda'})
db = FAISS.load_local(faiss_path, embeddings, allow_dangerous_deserialization=True)

while True:
    query = input("question: ")
    if query == "exit":
        break
    result = db.as_retriever().invoke(query)

    test_text = f"按照要求回答用户问题\n。参考文档:{result[0].page_content}.\n 用户问题是:{query}\n "

    messages.append({"role": "user", "content": test_text})
    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

    generated_ids = model.generate(
        **model_inputs,
        max_new_tokens=512
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

    print("AI: " + response)

    print('*'*30)

        生成过程的关键处理是构建test_text = f"按照要求回答用户问题\n。参考文档:{result[0].page_content}.\n 用户问题是:{query}\n "

        即在构建prompt时传入候选答案,示例中使用了top1,即最相关的参考答案,然后其余步骤是利用大模型的语言能力根据参考答案回答用户问题。

4、思考

4.1 知识库质量 

        知识库质量是影响检索效果的关键因素,如上述的txt文件,每个相对独立的文件我们称为document,要注意你知识库的多个document并不是完全独立的,而是相对独立的,换句话说,至少上下文的语义是有相关性的,因此我们在处理document时要考虑重叠overlap,即docment1中要包含一些document2的内容;反之如果文档都是完全独立的,则不需要考虑,但这在实际情况中较少。

4.2 检索效果调整

        检索效果调整我认为可以分为几个方面,无先后顺序

        a、向量库质量-上文已说明

        b、系统、问答提示词,不断优化prompt增强对大模型的要求

        c、参考文档数量,可以增加参考文档以增强效果,如增加到4个,丰富候选集

        d、重排reranker,增加重排模型,对检索的结果再次进行相似度处理,提升候选集准确率

        e、增加llm参数,换用参数量大的llm,能力强

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算

目录 一、结构体(struct关键字) (一)声明一个结构体数据类型 (二)结构体的成员初始化与赋值 a、结构体变量赋值 b、结构体成员初始化 c、结构体的定义形式 (三)考点&#xff…

《软件项目经济性论证报告模板:全面解析与策略建议》

《软件项目经济性论证报告模板:全面解析与策略建议》 一、引言 1.1 项目背景阐述 在数字化浪潮席卷全球的当下,各行业对软件的依赖程度日益加深。[行业名称] 行业也不例外,随着业务规模的不断扩张、业务复杂度的持续提升以及市场竞争的愈发激烈,对高效、智能、定制化软件…

关税冲击下,FBA国际物流企业如何靠智能拓客跑出增长“加速度”?

国际物流行业正迎来前所未有的增长机遇。据中研普华最新报告,2025年全球物流市场规模已突破6.27万亿美元,其中中国跨境物流市场预计达2.71万亿元。在全球化与数字化双轮驱动下,国际物流从“规模扩张”迈向“价值重构”。可以说,国…

vue源代码采用的设计模式分解

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…

使用 JavaScript 实现数据导出为 Excel 和 CSV 文件

在 Web 开发中,经常会遇到需要将数据导出为文件的需求,例如将数据导出为 Excel 或 CSV 文件。今天,我们就来探讨如何使用 JavaScript 实现这一功能。 一、实现思路 我们通过 HTML 创建一个按钮,点击按钮时,触发 Java…

eNSP中路由器RIP协议配置完整实验实验和命令解释

一、实验拓扑 二、配置命令 R1配置并先测试一下连通性 R1、R2和R3接口配置完后再测试连通性,直连路由可通 启动RIP进程,宣告直连网络 查看路由表,测试连通性 环回接口配置 三、命令解释及注意事项 配置命令逐行解释 system-view: 从用户视…

密码学--AES

一、实验目的 1、完成AES算法中1轮加密和解密操作 2、掌握AES的4个基本处理步骤 3、理解对称加密算法的“对称”思想 二、实验内容 1、题目内容描述 (1)利用C语言实现字节代换和逆向字节代换,字节查S盒代换 (2)利…

Vue项目中实现自定义连线图

需求描述 在vue项目中实现由自定义块元素组成的连线图。效果图 实现思路 Leader-Line 是一个用于 Web 的轻量级 JavaScript 库,专为创建从一个元素指向另一个元素的引导线而设计。它提供了高度自定义的能力,使得开发者能够轻松地在网页上实现各种指引用…

C++编程语言:标准库:标准库概观(Bjarne Stroustrup)

第30章 标准库概观(Standard-Library Overview) 目录 30.1 引言 30.1.1 标准库设施 30.1.2 设计约束 30.1.3 描述风格 30.2 头文件 30.3 语言支持 30.3.1 对initializer_list的支持 30.3.2 对范围for的支持 30.4 异常处理 30.4.1 异常 30.4.1…

Shiro(八):JWT介绍

1、什么是JWT? JWT(JSON Web Token,JSON Web令牌)是一种开放标准(RFC 7519),用于在网络应 用环境间安全地传递声明(claims)作为JSON对象;JWT会按指定的加密算…

【HDLBits刷题】Verilog Language——1.Basics

目录 一、题目与题解 1.Simple wire(简单导线) 2.Four wires(4线) 3.Inverter(逆变器(非门)) 4.AND gate (与门) 5. NOR gate (或非门&am…

Python 常用内置函数详解(十):help()函数——查看对象的帮助信息

目录 一、语法参考二、示例 一、语法参考 help() 函数的语法格式如下: 参数说明: request:可选参数,要查看其帮助信息的对象,如类、函数、模块、数据类型等;返回值:返回对象的帮助信息。 二…

【Python系列】Python 中的 HTTP 请求处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

辉芒微离线烧录器“文件格式错误”问题解决

最近在使用辉芒微离线烧录器烧录程序时,提示“文件格式错误”,记录一下解决方法。 一、问题现象 经过多次尝试和排查,发现以下几种情况: 情况一:使用离线烧录器导入固件1(boot程序)&#xff0c…

【软件设计师:体系结构】15.计算机体系结构概论

计算机体系结构是指计算机系统的功能和属性,是程序员所看到的计算机的属性。它主要研究计算机体系的概念性结构和功能特性,包括指令集、数据类型、存储器寻址技术、I/O机制等。例如,计算机是否具备乘法指令的功能,这是一个体系结构的问题。 一、机内代码及运算 一、数的进…

vscode 配置doxygen注释和snippet

vscode 配置doxygen注释和snippet Doxygen的C/C注释原则 基于Doxygen的C/C注释原则 标注总述 1.文件头标注 2. 命名空间标注 3. 类、结构、枚举标注 4. 函数注释原则 5. 变量注释 6. 模块标注 7. 分组标注指令表格 命令字段名语法file文件名file [< name >]brief简介b…

HarmonyOS NEXT 免费无广告看电影app:从想法到实现的经验总结

学习一项新技能&#xff0c;最好也是最快的方法就是动手实战。学习鸿蒙也一样&#xff0c;给自己定一个小目标&#xff0c;直接找项目练,这样进步是最快的。最近&#xff0c;我在网上看到360周董的一句话&#xff1a;“想干什么就去干&#xff0c;干得烂总比不干强&#xff01;…

代码随想论图论part06冗余连接

图论part06 冗余连接 代码随想录 冗余边就是已经边已经在并查集里了&#xff0c;从图的角度来说构成了环&#xff08;冗余连接2要用到这个概念&#xff09; 代码其他部分为&#xff1a;并查集初始化&#xff0c;查根&#xff0c;判断是否在集合里&#xff0c;加入集合 冗余…

企业高性能WEB服务器—Nginx

Nginx介绍 Nginx是一款轻量级的网页服务器、反向代理服务器以及电子邮件代理服务器。 具有高并发&#xff08;特别是静态资源&#xff09;、占用系统资源少的特性。它不仅是Web服务软件&#xff0c;还具有反向代理负载均衡功能和缓存服务功能 具备如下基本特性 可针对静态资…

Python MNE-Python 脑功能磁共振数据分析

一、什​​么​​是​​Python MNE-Python 脑​​功​​能​​磁​​共​​振​​数​​据​​分​​析 为大脑功能磁共振成像数据分析工具&#xff0c;致力于为神经科学研究提供便捷、高效的数据分析处理工具。MNE-Python提供了处理和分析脑电图&#xff08;EEG&#xff09;、…