一、RAG的本质思想
1.1 为什么需要RAG?
大语言模型的三大困境
知识截止日期:
- GPT-4的知识截止在2023年4月
- 无法回答"今天的新闻是什么"
- 业务场景:客服系统需要最新的产品信息
幻觉问题:
- LLM会"一本正经地胡说八道"
- 编造不存在的论文、数据、人名
- 业务场景:法律咨询、医疗诊断不能容忍错误
无法访问私有数据:
- LLM是用公开数据训练的
- 企业内部文档、客户数据、专有知识不在训练集中
- 业务场景:企业知识库问答、客户服务
RAG的核心思想
检索 + 生成的结合:
用户问题 → 检索相关文档 → 将文档作为上下文 → LLM生成答案
深层价值:
- 知识外置化:知识存在数据库中,而非模型参数中
- 实时更新:更新数据库即可,无需重训模型
- 可追溯性:答案有明确的来源文档
生活类比:
- 传统LLM:闭卷考试,只能靠记忆
- RAG:开卷考试,可以查阅资料
1.2 RAG vs 微调 vs Prompt Engineering
三种方案的业务场景对比
Prompt Engineering(提示工程):
- 适用场景:通用任务,不需要专业知识
- 优点:零成本,即时生效
- 缺点:无法注入大量新知识
- 示例:格式化输出、角色扮演
微调(Fine-tuning):
- 适用场景:特定领域风格、行为模式
- 优点:改变模型行为,回答风格
- 缺点:成本高,知识更新需要重新训练
- 示例:客服语气、医学术语理解
RAG:
- 适用场景:需要最新知识、私有数据
- 优点:成本低,实时更新
- 缺点:受检索质量影响
- 示例:企业知识库问答、新闻分析
混合策略:
- 微调:让模型理解行业术语和风格
- RAG:注入最新知识和私有数据
- Prompt Engineering:控制输出格式
二、RAG的核心架构
2.1 文档处理流程的深层挑战
文档切分的粒度权衡
场景:一份100页的产品手册
切分策略的影响:
按段落切分(200字/块):
- 优点:语义完整性好
- 缺点:可能遗漏跨段落的信息
- 场景:FAQ、技术文档
按固定长度切分(512 token/块):
- 优点:符合模型输入限制
- 缺点:可能截断句子,破坏语义
- 场景:长文档快速检索
按语义切分(主题段落):
- 优点:保持主题完整性
- 缺点:实现复杂,效果依赖算法
- 场景:学术论文、技术规范
业务场景的最佳实践:
- 法律合同:按条款切分
- 技术文档:按章节切分
- 客服FAQ:按问题切分
- 新闻文章:按段落切分
重叠窗口(Overlap)的必要性
为什么需要重叠?
- 避免关键信息被切断
- 例如:"这个功能的优点是...(被截断)...提升性能"
重叠策略:
- 重叠20%:512 token的块,重叠100 token
- 前后文保持连续性
业务代价:
- 存储空间增加20%
- 检索时可能返回重复内容
2.2 向量化与语义理解
为什么需要向量化?
传统关键词搜索的局限:
- 用户问:"如何提升销售额?"
- 文档中:"增加收入的方法"
- 关键词搜索:匹配不到(词汇不同)
向量化的语义理解:
- "提升销售额"和"增加收入"的向量接近
- 能找到语义相似的文档
Embedding模型的选择:
- OpenAI text-embedding-ada-002:多语言,通用性好
- BGE(中文):中文效果更好
- M3E:中英双语,开源
业务场景的权衡:
- 成本:OpenAI按token收费,开源模型自部署
- 效果:通用模型 vs 领域模型
- 延迟:API调用 vs 本地部署
2.3 向量数据库的架构选型
为什么不用传统数据库?
向量检索的特殊性:
- 不是精确匹配,而是相似度搜索
- 需要计算余弦相似度、欧氏距离
- 百万级向量的相似度搜索,传统数据库慢
向量数据库的优化:
- 近似最近邻搜索(ANN)
- HNSW、IVF等索引算法
- 毫秒级检索百万向量
业务场景的选择:
Faiss(Facebook):
- 优点:速度快,支持GPU加速
- 缺点:不支持分布式,数据存内存
- 场景:中小规模(<1000万向量)
Milvus:
- 优点:分布式,支持十亿级
- 缺点:运维复杂
- 场景:大规模企业应用
Pinecone:
- 优点:云服务,无需运维
- 缺点:成本高,数据在外部
- 场景:快速POC,小团队
Elasticsearch(8.0+):
- 优点:已有ES基础设施可复用
- 缺点:向量检索不是核心功能
- 场景:混合搜索(关键词 + 向量)
三、检索质量的深层优化
3.1 语义检索 vs 关键词检索
混合检索的必要性
场景:用户问"iPhone 15 Pro的价格"
纯语义检索的问题:
- 可能返回"iPhone 14 Pro的价格"(语义相似)
- 但用户要的是具体型号
纯关键词检索的问题:
- 用户问"最新款苹果手机多少钱"
- 关键词搜索:"最新款"、"苹果手机"、"多少钱"
- 匹配不到"iPhone 15 Pro价格"
混合检索策略:
最终得分 = 0.7 × 语义相似度 + 0.3 × BM25得分
业务场景的权重调整:
- 技术文档:语义70%,关键词30%(概念理解重要)
- 产品搜索:语义50%,关键词50%(型号精确匹配重要)
- 法律条文:语义30%,关键词70%(术语精确匹配重要)
3.2 重排序(Rerank)的价值
为什么需要二次排序?
向量检索的局限:
- Embedding模型将文本压缩为固定长度向量
- 信息有损失,排序不够精确
Rerank模型的优势:
- 直接计算问题和文档的匹配度
- 考虑更多细节信息
- 但计算慢,不能用于初筛
两阶段检索架构:
- 召回(Recall):向量检索,从10万文档中召回100个
- 精排(Rerank):Rerank模型,从100个中选出最相关的10个
业务场景的代价分析:
- 初筛:向量检索,10万文档,耗时50ms
- 精排:Rerank模型,100文档,耗时200ms
- 总耗时:250ms,但准确率提升20%
3.3 查询理解与改写
用户问题的模糊性
场景示例:
- 用户问:"它支持5G吗?"
- 问题:不知道"它"是什么
查询改写策略:
1. 指代消解:
- 历史对话:"iPhone 15 Pro怎么样?"
- 当前问题:"它支持5G吗?"
- 改写后:"iPhone 15 Pro支持5G吗?"
2. 查询扩展:
- 原问题:"RAG技术"
- 扩展后:"RAG技术"、"检索增强生成"、"Retrieval-Augmented Generation"
- 提高召回率
3. 多查询生成:
- 原问题:"如何提升模型效果?"
- 生成多个子问题:
- "如何提升模型准确率?"
- "如何优化模型性能?"
- "模型调优方法有哪些?"
- 并行检索,合并结果
业务场景的成本权衡:
- 简单问答:不需要改写
- 多轮对话:需要指代消解
- 复杂查询:需要查询扩展
四、生成质量的控制
4.1 Prompt工程的深度应用
上下文构建的艺术
场景:检索到3篇相关文档
简单拼接的问题:
文档1:xxx
文档2:xxx
文档3:xxx
问题:xxx
- 模型不知道哪些信息重要
- 可能被无关信息干扰
结构化Prompt:
你是一个专业的客服助手。
请根据以下参考文档回答用户问题。
【重要】如果文档中没有相关信息,请明确告知用户,不要编造。
参考文档:
[文档1 - 来源:产品手册第3页]
内容:xxx
[文档2 - 来源:FAQ第12条]
内容:xxx
用户问题:xxx
回答要求:
1. 引用具体文档来源
2. 如果多个文档有冲突,说明差异
3. 语气友好专业
业务场景的定制:
- 客服:强调友好、耐心
- 技术支持:强调准确、详细
- 法律咨询:强调严谨、引用条文
4.2 幻觉检测与控制
为什么RAG仍会产生幻觉?
场景:
- 文档中:"iPhone 15 Pro有三个摄像头"
- 用户问:"iPhone 15 Pro有几个摄像头?"
- LLM回答:"iPhone 15 Pro有四个摄像头"(幻觉)
深层原因:
- LLM的预训练知识与检索文档冲突
- LLM倾向于"创造性"补充信息
- 上下文太长,LLM忽略部分内容
幻觉控制策略:
1. 强制引用:
要求:回答必须引用文档原文,用引号标注
例如:根据文档,"iPhone 15 Pro配备三个摄像头"
2. 置信度标注:
要求:对回答的每个事实标注置信度
例如:iPhone 15 Pro有三个摄像头(置信度:高,来源:官方文档)
3. 事实核查:
- 用另一个LLM检查答案与文档的一致性
- 如果不一致,拒绝回答
业务场景的权衡:
- 创意类(营销文案):允许适度发挥
- 事实类(技术支持):严格限制幻觉
- 关键领域(医疗、法律):必须引用原文
4.3 答案的可解释性
为什么需要引用来源?
业务价值:
- 用户可以验证信息真实性
- 便于用户深入阅读原文
- 提升信任度
引用格式的设计:
回答:iPhone 15 Pro配备三个摄像头...
来源:
[1] 产品手册 - 第3页 - "技术规格:后置三摄系统"
[2] 官方发布会 - 2023年9月 - "全新的Pro级摄像系统"
深层挑战:
- 如何提取引用片段?
- 如何定位文档位置(页码、章节)?
- 如何处理多文档冲突的引用?
五、高级RAG技术
5.1 自适应检索(Self-RAG)
为什么不是每个问题都需要检索?
场景分析:
- "1+1等于几?":常识问题,不需要检索
- "今天北京天气如何?":需要实时数据,必须检索
- "什么是RAG?":LLM已知,但检索可提供更多细节
自适应策略:
- LLM判断是否需要检索
- 如果需要,执行RAG
- 如果不需要,直接生成答案
业务价值:
- 减少不必要的检索,降低延迟
- 节省向量数据库查询成本
5.2 多跳推理(Multi-Hop)
复杂问题的分解
场景:
- 用户问:"iPhone 15 Pro相比上一代提升了多少性能?"
- 需要两步:
- 查iPhone 15 Pro的性能
- 查iPhone 14 Pro的性能
- 对比
Chain-of-Thought RAG:
问题分解:
1. iPhone 15 Pro的性能是多少?
→ 检索 → A15芯片,性能xxx
2. iPhone 14 Pro的性能是多少?
→ 检索 → A14芯片,性能yyy
3. 对比:提升了(xxx - yyy) / yyy
业务场景:
- 技术对比:产品A vs 产品B
- 因果推理:政策A导致了什么影响?
- 时间序列:某指标的历史变化趋势
5.3 Graph RAG(图检索)
为什么需要知识图谱?
场景:
- 用户问:"张三的老板是谁?"
- 向量检索:可能找不到"张三的老板"这句话
- 知识图谱:张三 → 隶属于 → 部门A → 负责人 → 李四
Graph RAG的架构:
- 从文档中抽取实体和关系
- 构建知识图谱
- 用户问题 → 实体识别 → 图查询 → 找到路径
- 将路径作为上下文,生成答案
业务场景:
- 企业组织架构查询
- 产品关系网络(配件、兼容性)
- 学术论文引用关系
六、实战场景的深度设计
6.1 企业知识库问答系统
业务挑战
多文档类型:
- Word文档、PDF、Excel表格
- 不同格式的解析质量差异
权限控制:
- 不同员工能访问不同文档
- RAG检索时需要过滤
知识时效性:
- 政策文档会过期
- 需要标注文档的有效期
架构设计:
文档上传 → 格式解析 → 切分 → 向量化 → 存储(附带元数据)
↓
元数据:部门、权限、有效期、版本
用户提问 → 检索(过滤权限) → Rerank → 生成答案 → 引用来源
6.2 智能客服系统
多轮对话的状态管理
场景:
- 用户:"我要买手机"
- 客服:"您想要什么价位的?"
- 用户:"3000左右"
- 客服:"推荐iPhone 15"
- 用户:"它支持5G吗?"(指代:iPhone 15)
对话状态管理:
- 维护对话历史
- 提取关键实体(当前关注的商品)
- 查询改写时加入上下文
业务价值:
- 用户体验:流畅的多轮对话
- 转化率:精准推荐
6.3 代码助手(Code RAG)
代码检索的特殊性
挑战:
- 代码结构化:函数、类、注释
- 语义理解:变量名、函数名的语义
检索策略:
- 向量检索:找语义相似的代码
- 符号检索:找特定函数、类
- 混合检索:结合两者
业务场景:
- 代码补全:根据上下文推荐代码
- 代码解释:查找相关文档和示例
- Bug修复:找到相似的修复案例
七、性能优化与成本控制
7.1 缓存策略
为什么需要缓存?
场景:
- 100个用户问"iPhone 15 Pro的价格"
- 每次都检索 + 生成,成本高
缓存层次:
- 问题缓存:相同问题直接返回
- 检索缓存:相同检索结果复用
- 向量缓存:相同文档的向量复用
业务价值:
- 降低LLM调用成本
- 提升响应速度
7.2 成本优化策略
LLM调用成本分析
场景:
- 检索到10个文档,每个1000 token
- 总上下文:10000 token
- GPT-4成本:10000 token × 0.3/次
优化方案:
- 文档摘要:将1000 token压缩到200 token
- 只传标题:初筛用标题,精选后传全文
- 使用更便宜的模型:Claude、Llama
业务场景的权衡:
- 高频低价值:用便宜模型(如Claude Instant)
- 低频高价值:用强模型(如GPT-4)
思考题:
- 在什么场景下,RAG不如微调?
- 如何平衡检索数量(Top-K)与生成质量?K越大越好吗?
- 如果让你设计一个法律咨询的RAG系统,你会特别注意哪些问题?