一、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 常见优化方向(基于你的代码)

如果想进一步提升系统效果,可从这些方向入手:

  1. 分块优化:当前固定 400 字符,可改为 “按语义自动分块”(比如用langchainSemanticChunker),避免拆分完整句子。
  2. 向量数据库升级:FAISS 适合单机,若文档量超 10 万条,可换MilvusPinecone,支持分布式存储。
  3. 多模态支持:当前只处理文本,可添加 “PDF 图片提取”(用pytesseract)、“表格提取”(用pdfplumber),覆盖更多文档类型。
  4. 记忆机制:当前对话不记忆历史检索结果,可添加 “对话缓存”,同一主题的后续问题直接复用之前的检索结果,减少耗时。
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐