RAG模块流程和架构
RAG
为什么需要RAG:
1 注入背景知识,让大模型更懂你的业务
2 大模型token参数限制。 假如每个问题都把大量的私有知识给大模型,token太大行不通。 所以借助向量数据库,把相似度很高的私有知识给到大模型
流程

这是一个结合LangChain和ChatGLM处理文本和查询的流程图,具体流程如下:
- 本地文档(Local Documents)通过非结构化加载器(Unstructured Loader)读取,转化为文本(Text)。
- 文本经过文本分割器(Text Splitter)处理,被拆分成文本块(Text Chunks)。
- 文本块进行嵌入(Embedding)操作,转化为向量后存储在向量存储(VectorStore)中。
- 查询(Query)同样经过嵌入操作,变为查询向量(Query Vector)。
- 查询向量与向量存储中的向量进行向量相似度(Vector Similarity)计算,找出相关文本块(Related Text Chunks)。
- 相关文本块结合提示模板(Prompt Template)生成提示(Prompt)。
这一步操作原因是什么呢?为什么不直接把向量数据库的内容直接给用户呢?从向量数据库返回的数据之间逻辑性不强,通过大模型来组织语言(逻辑更强,情商更强)。 - 提示输入到大语言模型(LLM)中,最终输出答案(Answer)。
子流程1: 知识更新 (上图的1-7)--数据准备阶段
数据提取和清晰
1 提取企业的数据从PDF,PPT,WORD,文件里面的文字
2 清洗,结构的整理
提取步骤是非常有挑战的,PDF里面有些有图片什么,需要用到OCR技术。一般可以用收费的平台做解析。
数据切分
切割的目的:如果直接把知识给模型, 会影响模型的回应能力。比如直接把一本书的内容丢给模型()
影响模型找到知识的能力,比如你给一堆书让学生做开卷开始,学习查询也查询不赢。
需要对知识进行切割(命令 Text Splitter),生成Text chunks(业务对象)。
切割的要求
1 语义上足够垂直:一个知识只包含一个意思
2 内容足够完善:描述某个东西就在一个片段里面,不应该在很多个片段里面。
切片算法
- 按字数,一般是500字:
- 上下合并: 相邻500字chunk之间有100字重叠:1方案chunk之间没有关联,2方案
- 按段落: 按 /n/n 切分:缺点,文档很少按/n/n分割
- 特殊行业策略切片。 金融,合同领域有固定的格式,按模板切片
Embedding 嵌入
使用向量模型转化成向量
存储(向量数据库)
子流程2 知识检索/ 增强生成
1 用户去知识库找知识
2 拿到知识库的知识+问题 = 新的提示词给模型,让模型回答
查询(Query)
Embedding 嵌入生成向量
通过向量模型,把查询的请求转化为向量(Query Vector)
查询向量数据库返回Related Text Chunks (一阶段检索)
两阶段检索。 向量数据为了提升检索效率,牺牲了准确率。目的:提高召回率。 第一阶段检索足够多的知识
查询向量与向量存储中的向量进行向量相似度(Vector Similarity)计算,找出相关文本块(Related Text Chunks)。
重排序 rerank (二阶段精排)
Rerank的核心作用
优化排序质量
大模型(如LLM)生成的初始结果可能按概率或相关性排序,但未必完全符合用户需求。Rerank通过更精细的规则或模型,重新调整顺序,确保最相关、最优质的结果排在前面。
减少噪声和冗余
大模型的输出可能包含重复、无关或低质量内容(如幻觉回答),Rerank可通过过滤或加权剔除这些噪声。
平衡多样性与相关性
在推荐或生成任务中,Rerank可以调整结果的多样性(避免重复)和相关性之间的平衡。
将向量数据库的召回结果+用户的query交给重排序模型重排序,增加召回的结果跟用户的提问准确率(千问有rerank模型)
效果评估
RAG回答问题的准确率是多少?如何优化
相关文本块结合提示模板(Prompt Template)生成提示(Prompt)。
把用户的问题+结合重排序的结果以prompt的形式给到大模型
提示输入到大语言模型(LLM)中,最终输出答案(Answer)。
FAQ
RAG和Agent是什么关系?
完全独立, Agent需要RAG给模型补充知识。RAG需要Agent做任务拆解


浙公网安备 33010602011771号