RAG 核心流程
·
一、RAG 核心流程:4 步完成 “检索→生成” 闭环
RAG 的完整流程可分为数据准备、检索、增强、生成四大阶段,每个阶段都有明确的目标和关键操作,对应你代码中的核心功能模块。
1. 数据准备阶段:把文档 “拆碎 + 编码”,存入数据库
这是 RAG 的 “知识库搭建” 环节,目的是让计算机能快速找到文档中的关键信息。
- 文档加载:读取 PDF、Word 等格式的文档(对应代码中
extract_text函数,提取 PDF 文本)。 - 文本分块:将长文档拆成短文本块(代码中
RecursiveCharacterTextSplitter,按 400 字符拆分、40 字符重叠,避免拆分语义)。- 为什么要分块?大模型有 “上下文窗口限制”,短文本块能更精准匹配查询,也能减少计算量。
- 文本编码(向量化):用嵌入模型(代码中
all-MiniLM-L6-v2)将文本块转为 “向量”(一串数字),捕捉文本语义。 - 向量存储:将向量存入向量数据库(代码中
FAISS),方便后续快速检索相似向量。
2. 检索阶段:根据问题 “精准找信息”
这是 RAG 的 “信息筛选” 环节,核心是从知识库中找到与用户问题最相关的文本块。你的代码用了 “混合检索”,比单一检索更精准:
- 语义检索(向量检索):将用户问题也转为向量,在 FAISS 中搜索 “向量距离最近” 的文本块(代码中
faiss_index.search),基于 “语义相似” 匹配。 - 关键词检索(BM25):用
jieba分词用户问题,按 “关键词出现频率 + 位置” 找相关文本块(代码中BM25IndexManager),基于 “字面匹配” 补充语义检索的遗漏。 - 混合合并:用
hybrid_merge函数结合两种检索结果(语义权重 0.7,关键词权重 0.3),避免单一检索的偏差。 - 递归检索(进阶):代码中
recursive_retrieval会根据首次检索结果,让模型判断是否需要生成 “新查询” 再次检索(比如问题太宽泛时,先搜 “AI 定义”,再基于结果搜 “AI 在医疗的应用”),提升信息全面性。
3. 增强阶段:给信息 “提质去噪”
这是 RAG 的 “信息优化” 环节,确保输入给大模型的信息高质量、无冲突:
- 重排序:用 “交叉编码器”(代码中
CrossEncoder)或 “LLM 评分”(rerank_with_llm)对检索结果二次打分,只保留 Top5 最相关的文本块,减少冗余。 - 矛盾检测:
detect_conflicts函数提取文本中的关键事实(如数值、术语),检查不同来源是否冲突(比如 A 文档说 “AI 市场规模 100 亿”,B 文档说 “200 亿”)。 - 可信度评估:
evaluate_source_credibility函数对来源打分(政府网站 0.9、教育网站 0.85,普通网站 0.5),冲突时优先用高可信度信息。
4. 生成阶段:基于信息 “写回答”
这是 RAG 的 “最终输出” 环节,核心是让大模型 “只基于检索到的信息回答”,避免幻觉:
- 构建提示词(Prompt):将 “用户问题 + 筛选后的文本块 + 来源标注” 整合为提示词(代码中
prompt_template),明确要求模型 “不编信息、标来源、分结构”。 - 模型生成:调用本地模型(Ollama 的
deepseek-r1)或云端模型(SiliconFlow)生成回答(代码中stream_answer支持流式输出,让回答 “逐字显示”)。 - 格式处理:
process_thinking_content函数将模型的 “思考过程” 转为可折叠的详情框,让回答更清晰。
二、RAG 关键知识:理解核心概念
掌握这些概念,能帮你判断 RAG 系统的优劣:
| 概念 | 作用 | 你的代码实现 |
|---|---|---|
| 嵌入模型(Embedding) | 将文本转为语义向量 | all-MiniLM-L6-v2(多语言通用,轻量) |
| 向量数据库 | 高效存储 / 检索向量 | FAISS(轻量、适合单机部署) |
| 分块策略 | 平衡语义完整性与检索效率 | 递归拆分(按段落→句子→标点) |
| 混合检索 | 结合语义与关键词,提升召回率 | 语义检索(FAISS)+ 关键词检索(BM25) |
| 思维链(CoT) | 让模型逐步推理检索方向(递归检索用) | 模型生成 “新查询” 的逻辑 |
三、RAG 常见优化方向(基于你的代码)
如果想进一步提升系统效果,可从这些方向入手:
- 分块优化:当前固定 400 字符,可改为 “按语义自动分块”(比如用
langchain的SemanticChunker),避免拆分完整句子。 - 向量数据库升级:FAISS 适合单机,若文档量超 10 万条,可换
Milvus或Pinecone,支持分布式存储。 - 多模态支持:当前只处理文本,可添加 “PDF 图片提取”(用
pytesseract)、“表格提取”(用pdfplumber),覆盖更多文档类型。 - 记忆机制:当前对话不记忆历史检索结果,可添加 “对话缓存”,同一主题的后续问题直接复用之前的检索结果,减少耗时。
更多推荐



所有评论(0)