基于LangChain构建RAG问答系统
2025-01-24 15:08:33 0 举报
AI智能生成
知识分享
作者其他创作
大纲/内容
开启AI革命
国外92%以上在使用AI编码
两个要素
GPU,提供算力服务
DATA,为模型训练提供数据服务
模式
文生文
文生图
图生视频
文生视频
大模型开发
开发基座大模型
LLaMA3.1 8B、70B、405B
Llama 3.1系列包括80亿、700亿、4050亿参数版本,上下文长度扩展至12.8万tokens,并增加了对八种语言的支持。
LLaMA3.3 70B
Meta于12月6日重磅发布新一代大语言模型Llama 3.3,以突破性的技术创新在模型效率与性能之间取得了显著平衡。该模型以700亿参数的规模达到了此前4050亿参数模型的性能水平
基于大模型能力,下沉应用
站在巨人的肩膀上
input(prompt) f{大模型} = output 预测
相关概念
LLM关键概念
预训练模型
LLaMA、GPT4o、o1 基座模型
互联网公开的海量数据
实时查互联网数据(插件)
私有化数据
对于没有训练的数据,解决方案
微调
概念:微调其实相当于在通用大模型的基础上,
对超出范围或不擅长的领域,使用专门的数据集或方法对其进行相应的调整和优化,
以提升其在特定领域或任务中的适用性和完成度。
对超出范围或不擅长的领域,使用专门的数据集或方法对其进行相应的调整和优化,
以提升其在特定领域或任务中的适用性和完成度。
SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法
使用场景:QA(法律咨询、问诊)
将数据标签归类,微调出一个适用场景的垂直模型。
不建议使用较大参数的模型。LLaMA3.1,中小型企业使用8B,头部行业使用70B足够
10万行以内的数据使用8B,24G的GPU,训练轮次在3-5次
RAG 检索增强生成
概念:
检索增强生成模型结合了语言模型和信息检索技术。
具体来说,当模型需要生成文本或者回答问题时,
它会先从一个庞大的文档集合中检索出相关的信息,
然后利用这些检索到的信息来指导文本的生成,从而提高预测的质量和准确性
检索增强生成模型结合了语言模型和信息检索技术。
具体来说,当模型需要生成文本或者回答问题时,
它会先从一个庞大的文档集合中检索出相关的信息,
然后利用这些检索到的信息来指导文本的生成,从而提高预测的质量和准确性
使用场景:数据(语料)大部分是文献资料、文档
缺点
检索机制,文档片段可能不全面、噪声太多,造成的结果不精准
使用Rerank模型,做重排序
对于系统的延迟低场景,不适用,当文档越来越多的时候,每次问问题时,都会经历检索,耗时长
RAG与微调的选择
prompt提示词
在AI大模型中,Prompt的作用主要是给AI模型提示输入信息的上下文和输入模型的参数信息。
Vector
向量
是一种有大小和方向的数学对象,它可以表示为从一个点到另一个点的有向线段
Embeddings
Embedding模型是指将高维度的数据(例如文字、图片、视频)映射到低维度空间的过程。简单来说,embedding向量就是一个N维的实值向量,它将输入的数据表示成一个连续的数值空间中的点。
文本向量
1、将文本转成一组N维浮点数,即文本向量
2、向量之间可以计算距离,距离远近对应语义相似度大小
图片向量
比如:从海量的图片中检索有小孩的图片?
1、底层使用了向量,从图片提取特征,将其向量化,存储在向量库
2、将需要检索的对象向量化,在向量数据库检索
2、将需要检索的对象向量化,在向量数据库检索
Vector Store
向量数据库
向量数据库的工作原理
1、用户在应用程序(application)中输入查询(query)。
2、我们的查询将被插入到嵌入模型(embedding model)中,该模型根据我们想要索引的内容创建向量嵌入(vector embedding)。
3、向量嵌入会根据嵌入的内容移入向量数据库(vector database)。
4、最后,向量数据库产生输出并将其作为查询结果(query result)发送回用户。
2、我们的查询将被插入到嵌入模型(embedding model)中,该模型根据我们想要索引的内容创建向量嵌入(vector embedding)。
3、向量嵌入会根据嵌入的内容移入向量数据库(vector database)。
4、最后,向量数据库产生输出并将其作为查询结果(query result)发送回用户。
向量嵌入(Vector Embeddings)是数据的数字表示,它将对象(如文字、图像或概念)的意义或特征捕捉为多维空间中的点,使机器能够高效地处理和比较它们。从本质上讲,它们是一种将复杂信息(如单词、句子、图像或任何其他类型的数据)转化为数字列表的方式,从而捕捉数据的内在含义和关系。这些数据的数学表示法模仿了人类的理解能力,使各种强大的人工智能应用成为可能。
简单来说:向量嵌入的核心是数值列表,以机器可以理解和处理的方式表示复杂数据
用向量嵌入来表示 "猫 "这个词。它可能看起来像这样:
[0.2, -0.5, 0.8, 0.1, -0.3, ...]
用向量嵌入来表示 "猫 "这个词。它可能看起来像这样:
[0.2, -0.5, 0.8, 0.1, -0.3, ...]
向量数据库查询步骤
向量数据库查询经历的三个主要阶段是:
1、索引(indexing)。一旦向量嵌入移入向量数据库,它就会使用各种算法将向量嵌入映射到数据结构,以便更快地搜索。
2、查询(querying)。一旦完成搜索,向量数据库就会将查询的向量与索引向量进行比较,应用相似性度量来查找最近的邻居。
3、后处理(post processing)。根据我们使用的向量数据库,向量数据库将对最终最近邻进行后处理,以生成查询的最终输出。 以及可能重新排列最近的邻居以供将来参考。
1、索引(indexing)。一旦向量嵌入移入向量数据库,它就会使用各种算法将向量嵌入映射到数据结构,以便更快地搜索。
2、查询(querying)。一旦完成搜索,向量数据库就会将查询的向量与索引向量进行比较,应用相似性度量来查找最近的邻居。
3、后处理(post processing)。根据我们使用的向量数据库,向量数据库将对最终最近邻进行后处理,以生成查询的最终输出。 以及可能重新排列最近的邻居以供将来参考。
RAG架构
大模型应用的四大问题
领域知识缺乏:是最明显的问题。大模型的知识来源于训练数据,这些数据主要来自公开的互联网和开源数据集,无法覆盖特定领域或高度专业化的内部知识。
信息过时:则指模型难以处理实时信息,因为训练过程耗时且成本高昂,模型一旦训练完成,就难以获取和处理新信息。
幻觉问题:是另一个显著的局限,模型基于概率生成文本,有时会输出看似合理但实际错误的答案。
数据安全性:在企业应用中尤为重要,如何在确保数据安全的前提下,使大模型有效利用私有数据进行推理和生成,是一个具有挑战性的问题
信息过时:则指模型难以处理实时信息,因为训练过程耗时且成本高昂,模型一旦训练完成,就难以获取和处理新信息。
幻觉问题:是另一个显著的局限,模型基于概率生成文本,有时会输出看似合理但实际错误的答案。
数据安全性:在企业应用中尤为重要,如何在确保数据安全的前提下,使大模型有效利用私有数据进行推理和生成,是一个具有挑战性的问题
RAG(Retrieval-augmented Generation)架构是一种结合了检索和生成的深度学习模型,它在处理问题时,既能够从大量的数据中快速找到相关信息,又能对这些信息进行综合和扩展,生成新的回答。
1. 索引阶段,通过处理多种来源多种格式的文档提取其中文本,将其切分为标准长度的文本块(chunk),并进行嵌入向量化(embedding),向量存储在向量数据库(vector database)中。
2. 检索阶段,用户输入的查询(query)被转化为向量表示,通过相似度匹配从向量数据库中检索出最相关的文本块。
3. 最后生成阶段,检索到的相关文本与原始查询共同构成提示词(Prompt),输入大语言模型(LLM),生成精确且具备上下文关联的回答。
1. 索引阶段,通过处理多种来源多种格式的文档提取其中文本,将其切分为标准长度的文本块(chunk),并进行嵌入向量化(embedding),向量存储在向量数据库(vector database)中。
2. 检索阶段,用户输入的查询(query)被转化为向量表示,通过相似度匹配从向量数据库中检索出最相关的文本块。
3. 最后生成阶段,检索到的相关文本与原始查询共同构成提示词(Prompt),输入大语言模型(LLM),生成精确且具备上下文关联的回答。
Indexing
索引是RAG系统的基础环节,包含四个关键步骤。
Load(加载)
将各类数据源及其格式(如书籍、教材、领域数据、企业文档等,txt、markdown、doc、ppt、excel、pdf、html、json等格式)统一解析为纯文本格式。
Split(切片)
根据文本的语义或文档结构,将文档分割为小而语义完整的文本块(chunks),确保系统能够高效检索和利用这些块中包含的信息。
Embed(嵌入)
使用文本嵌入模型(embedding model),将这些文本块向量化,生成高维稠密向量,转换为计算机可理解的语义表。
Store(存储)
将这些向量存储在向量数据库(vector database)中,并构建索引,完成知识库的构建。这一流程成功将外部文档转化为可检索的向量,支撑后续的检索和生成环节。
Retrieval and Generation
检索与生成
检索是连接用户查询与知识库的核心环节。
生成是RAG流程中的最终环节。
检索是连接用户查询与知识库的核心环节。
生成是RAG流程中的最终环节。
Retrieve
用户输入的问题通过同样的文本嵌入模型转换为向量表示,将查询映射到与知识库内容相同的向量空间中。通过相似度度量方法,检索模块从向量数据库中筛选出与查询最相关的前K个文本块,这些文本块将作为生成阶段输入的一部分。通过相似性搜索,检索模块有效获取了与用户查询切实相关的外部知识,为生成阶段提供了精确且有意义的上下文支持。
简而言之:在用户提出问题后,检索器会根据用户输入从已经建立好的索引中找到最相关的数据片段。
简而言之:在用户提出问题后,检索器会根据用户输入从已经建立好的索引中找到最相关的数据片段。
Generate
将检索到的相关文本块与用户的原始查询整合为增强提示词(Prompt),并输入到大语言模型(LLM)中。LLM基于这些输入生成最终的回答,确保生成内容既符合用户的查询意图,又充分利用了检索到的上下文信息,使得回答更加准确和相关,充分使用到知识库中的知识。通过这一过程,RAG实现了具备领域知识和私有信息的精确内容生成。
简而言之:大模型会利用这个检索到的数据片段作为一个输入,结合用户的问题,生成一个综合性的回答。
简而言之:大模型会利用这个检索到的数据片段作为一个输入,结合用户的问题,生成一个综合性的回答。
举例说明
说明:选择RAG而不是直接将所有知识库数据交给大模型处理,主要是因为模型能够处理的token数有限,输入过多token会增加成本。更重要的是,提供少量相关的关键信息能够带来更优质的回答。
RAG快速开发实战
技术框架与选型
RAG技术框架:LangChain
专为开发基于大型语言模型(LLM)应用而设计的全面框架,其核心目标是简化开发者的构建流程,使其能够高效创建LLM驱动的应用。
索引流程 - 文档解析模块:pypdf
一个开源的Python库,专门用于处理PDF文档。pypdf支持PDF文档的创建、读取、编辑和转换操作,能够有效提取和处理文本、图像及页面内容。
索引流程 - 文档分块模块:RecursiveCharacterTextSplitter
采用LangChain默认的文本分割器-RecursiveCharacterTextSplitter。该分割器通过层次化的分隔符(从双换行符到单字符)拆分文本,旨在保持文本的结构和连贯性,优先考虑自然边界如段落和句子。
索引/检索流程 - 向量化模型:bge-small-zh-v1.5
由北京人工智能研究院(BAAI,智源)开发的开源向量模型。虽然模型体积较小,但仍然能够提供高精度和高效的中文向量检索。该模型的向量维度为512,最大输入长度同样为512。
索引/检索流程 - 向量库:Faiss
全称Facebook AI Similarity Search,由Facebook AI Research团队开源的向量库,因其稳定性和高效性在向量检索领域广受欢迎。
生成流程 - 大语言模型:通义千问 Qwen
阿里云推出的一款超大规模语言模型,支持多轮对话、文案创作、逻辑推理、多模态理解以及多语言处理,在模型性能和工程应用中表现出色。采用云端API服务,注册有1,000,000 token的免费额度。
技术框架流程
LangChain:提供用于构建LLM RAG的应用程序框架。
索引流程:使用 pypdf对文档进行解析并提取信息;随后,采用RecursiveCharacterTextSplitter对文档内容进行分块(chunks);最后,利用bge-small-zh-v1.5将分块内容进行向量化处理,并将生成的向量存储在Faiss向量库中。
检索流程:使用 bge-small-zh-v1.5 对用户的查询(Query)进行向量化处理;然后,通过 Faiss 向量库对查询向量和文本块向量进行相似度匹配,从而检索出与用户查询最相似的前 top-k个文本块(chunk)。
生成流程:通过设定提示模板(Prompt),将用户的查询与检索到的参考文本块组合输入到 Qwen大模型中,生成最终的 RAG 回答。
开发环境与技术库
Python3.8、Linux
1. 创建并激活虚拟环境
目的是隔离项目依赖,避免项目之间冲突。先在命令行窗口中执行指令定位到具体的RAG项目文件夹,然后在命令行中执行以下指令:
2.安装技术依赖库
包括langchain、langchain_community LLM RAG的技术框架及其扩展,pypdf 处理PDF文档的解析库,sentence-transformers 运行指定文本嵌入模型 bge-small-zh-v1.5 的模型库,faiss-cpu 高效相似度搜索的 Faiss 向量库,dashscope 与阿里云Qwen大模型API的集成库。
首先,升级pip版本,以确保兼容性,在命令行中执行以下指令:
然后,安装上述技术依赖库,在命令行中执行以下指令:
如果无法连接,可以使用国内镜像站点,在命令行中执行以下指令:
3.下载bge-small-zh-v1.5模型
该模型的文件已包含在 Gitee 上托管的项目中的 bge-small-zh-v1.5 文件夹内,你可以直接下载到RAG项目的根目录中,模型大小95.8M,在命令行中执行以下指令:
下载过程需要一些时间,不要关闭命令行窗口。下载完成后,检查 rag_app 项目中 bge-small-zh-v1.5 文件夹中是否包含pytorch_model.bin文件。该库中同时包含了本讲的RAG核心流程代码rag_app_lesson2.py及测试PDF文档test_lesson2.pdf。
准备测试 PDF 文档:Gitee 上托管的项目中包含一份名为 test_lesson2.pdf 的数字化转型报告。这个报告涵盖了数字化转型的背景和意义、案例分析,以及制造业、零售业、金融业的数字化转型等章节。你也可以替换成自己的 PDF 文件,并更改查询问题,体验 RAG 应用的效果。
pycharm设置虚拟环境
解决包引用包错问题
RAG核心流程代码
模块库的引入
阿里云百炼大模型服务平台获取的 Qwen大模型 的API密钥流程如下:
1. 打开 [阿里云百炼大模型服务平台](https://www.aliyun.com/product/bailian) ,点击立即开通,登陆阿里云/支付宝/钉钉账号;
2. 点击模型广场,搜索 通义千问-Turbo,点击API 调用示例;
3. 点击查看我的API-KEY,继续点击弹出框中的查看,复制API-KEY,将API-KEY替换代码中qwen\_api\_key = “your\_api\_key”;
4. 点击模型详情,可以看到模型Model英文名称,赋值qwen\_model参数。可以看到剩余额度,当前阿里云提供1,000,000次的免费模型额度;
5. 如果需要尝试其他模型,可以对应赋值上述代码中qwen\_model参数及qwen\_api\_key参数。
以上代码导入了我们在RAG流程中需要使用的核心模块及大模型参数等配置,这些模块和配置将在后续的索引、检索和生成流程中调用使用。
1. 打开 [阿里云百炼大模型服务平台](https://www.aliyun.com/product/bailian) ,点击立即开通,登陆阿里云/支付宝/钉钉账号;
2. 点击模型广场,搜索 通义千问-Turbo,点击API 调用示例;
3. 点击查看我的API-KEY,继续点击弹出框中的查看,复制API-KEY,将API-KEY替换代码中qwen\_api\_key = “your\_api\_key”;
4. 点击模型详情,可以看到模型Model英文名称,赋值qwen\_model参数。可以看到剩余额度,当前阿里云提供1,000,000次的免费模型额度;
5. 如果需要尝试其他模型,可以对应赋值上述代码中qwen\_model参数及qwen\_api\_key参数。
以上代码导入了我们在RAG流程中需要使用的核心模块及大模型参数等配置,这些模块和配置将在后续的索引、检索和生成流程中调用使用。
索引流程
上述代码实现了RAG技术中的索引流程,首先使用 PyPDFLoader 加载并预处理PDF文档,将其内容提取并合并为完整文本。接着,利用 RecursiveCharacterTextSplitter 将文本分割为每块512字符(非token)、重叠128字符(非token)的文本块,并通过预加载的 bge-small-zh-v1.5 嵌入模型将这些文本块转化为归一化的嵌入向量。最终,这些嵌入向量被存储在基于余弦相似度的 Faiss 向量库中,以支持后续的相似性检索和生成任务。
为更清晰地展示RAG流程的各个细节,当前代码未涉及多文档处理、嵌入模型的效率优化与并行处理。此外, Faiss 向量目前仅在内存中存储,未考虑持久化存储问题。以及文档解析、文本分块、嵌入模型与向量库的技术选型,后续课程将逐步深入探讨,并以上述代码作为基础,持续优化。
为更清晰地展示RAG流程的各个细节,当前代码未涉及多文档处理、嵌入模型的效率优化与并行处理。此外, Faiss 向量目前仅在内存中存储,未考虑持久化存储问题。以及文档解析、文本分块、嵌入模型与向量库的技术选型,后续课程将逐步深入探讨,并以上述代码作为基础,持续优化。
检索流程
上述代码实现了RAG技术中的检索流程。首先,用户的查询(Query)被预加载的 bge-small-zh-v1.5 嵌入模型转化为归一化的嵌入向量,进一步转换为 numpy 数组以适配 Faiss 向量库的输入格式。然后,利用 Faiss 向量库中的向量检索功能,计算查询向量与存储向量之间的余弦相似度,从而筛选出与查询最相似的前 top\_k 个文本块。这些文本块及其相应的相似度得分被逐一输出,相似文本块存储在结果列表中,最终返回供后续生成过程使用。
生成流程
上述代码实现了RAG流程中的生成过程。首先,结合用户查询与检索到的文本块内容组织成大模型提示词(Prompt)。随后,代码通过调用 Qwen 大模型云端 API,将构建好的Prompt发送给大模型,并利用流式输出的方式逐步获取模型生成的响应内容,实时输出并汇总为最终的生成结果。
测试脚本
在命令行窗口中执行指令定位到具体的RAG项目文件夹,在命令行中执行以下指令即可开始RAG应用测试:
```plain
source rag_env/bin/activate # 激活虚拟环境
python rag_app/rag_app_lesson2.py # 执行RAG应用脚本
```
测试代码通过 `main()` 函数串联各个步骤,从索引到生成,确保RAG的各个环节顺畅执行,准确完成“下面报告中涉及了哪几个行业的案例以及总结各自面临的挑战?”的RAG问答任务。
```plain
source rag_env/bin/activate # 激活虚拟环境
python rag_app/rag_app_lesson2.py # 执行RAG应用脚本
```
测试代码通过 `main()` 函数串联各个步骤,从索引到生成,确保RAG的各个环节顺畅执行,准确完成“下面报告中涉及了哪几个行业的案例以及总结各自面临的挑战?”的RAG问答任务。

收藏
0 条评论
下一页