

























大模型最头疼的问题是什么?"幻觉"——一本正经地胡说八道。RAG(检索增强生成)是如何解决这个问题的?这篇文章带你从零理解RAG技术。
你以为大模型读了那么多书,应该记得很牢?
实际上,模型对知识的记忆效率惊人地低:
| 发现 | 数据 |
|---|---|
| 记住一个知识点需要的曝光次数 | 约1000次! |
| GPT-4 Turbo本科知识测试准确率 | 仅73.6% |
类比:
大模型就像一个"记忆力很差的学生",读了100遍才记住一个知识点,而且还会记错。
大模型的知识来自预训练数据,有一个致命问题:时效性。
举例:
问:"2024年世界杯冠军是谁?"
GPT-4(训练数据截止2023年):"我无法回答这个问题..."
模型不知道:
最可怕的问题:幻觉(Hallucination)
模型会编造看似合理但完全错误的内容:
真实案例:
问:"请介绍一下《星际穿越》这部电影"
模型错误回答:"这部电影由詹姆斯·卡梅隆执导..."
实际:克里斯托弗·诺兰执导!
模型自信地说出错误信息,用户很难辨别!
RAG(Retrieval-Augmented Generation,检索增强生成)的核心思想:
不要让模型死记硬背,而是让它"现场查资料"!
类比对比:
| 类型 | 比喻 | 特点 |
|---|---|---|
| 传统LLM | 闭卷考试 | 只能依赖记忆,可能忘、可能错 |
| RAG | 开卷考试 | 可以查资料,答案有据可查 |
基本流程:

数学表示:
f: Q × D → A
Q = 用户问题(Query)
D = 数据源(Documents)
A = 答案(Answer)
| 问题 | RAG如何解决 |
|---|---|
| 知识效率低 | 不需要记住,直接检索 |
| 知识过时 | 数据库可以实时更新 |
| 幻觉严重 | 答案基于真实文档,可溯源 |
研究人员把RAG任务分为四个层级:
| 层级 | 名称 | 特点 | 例子 |
|---|---|---|---|
| L1 | 显性事实查询 | 答案直接在文档中 | "复旦大学有几个校区?" |
| L2 | 隐性事实查询 | 需要推理,信息分散在多个文档 | "复旦计算机学院和法学院在一个校区吗?" |
| L3 | 可解释推理查询 | 需要领域推理过程 | "根据症状判断可能的疾病" |
| L4 | 隐性推理查询 | 缺乏明确推理指导,需要深层专业知识 | "国际经济形势如何影响公司发展?" |
L1(最简单):
问题:"公司成立于哪年?"
文档:"公司成立于2010年..."
回答:"2010年"(直接找到)
L2(需要聚合):
问题:"复旦计算机学院和法学院在一个校区吗?"
文档A:"计算机学院在张江校区"
文档B:"法学院在邯郸校区"
回答:"不在一个校区,计算机学院在张江,法学院在邯郸"
L3(需要推理):
问题:"患者发热、咳嗽、乏力,可能是什么病?"
文档A:"流感症状包括发热、咳嗽..."
文档B:"新冠症状包括发热、咳嗽、乏力..."
回答:"可能是流感或新冠,建议就医确诊"
L4(最难):
问题:"当前经济形势如何影响公司发展?"
需要:宏观经济知识 + 行业分析 + 公司具体情况
回答:需要深层专业知识,可能涉及多步推理

作用:把文档划分成可管理的片段(Chunk)
为什么需要切分?
切分方法:
| 方法 | 说明 | 优点 |
|---|---|---|
| 固定长度切分 | 每块固定字数 | 简单高效 |
| 滑动窗口 | 相邻块有重叠 | 保持语义连贯 |
| 语义切分 | 根据内容逻辑划分 | 质量高 |
| 小到大 | 检索用小块,生成用大块 | 兼顾精准和丰富 |
作用:让用户查询更精准,更容易找到相关文档
优化方法:
1. 查询扩展
原问题:"Python如何读取文件"
扩展后:
- "Python文件读取方法"
- "Python open函数用法"
- "Python读取txt文件"
2. 查询改写
原问题(模糊):"那个东西怎么弄"
改写后:"如何在Python中读取文本文件"
3. HyDE方法(有趣!)
原问题:"什么是机器学习?"
先让模型"脑补"一个假设答案
然后拿这个假设答案去检索文档
为什么?因为"答案和答案"比"问题和答案"语义更相似!
作用:从知识库中找到相关文档
三种检索技术:
| 类型 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 稀疏检索 | 统计关键词匹配(TF-IDF/BM25) | 快、精确词匹配 | 不理解语义 |
| 稠密检索 | 向量语义匹配 | 深层语义理解 | 计算成本高 |
| 混合检索 | 结合两者 | 效率与效果兼顾 | 实现复杂 |
稀疏检索示例:
文档A:"人工智能是一门重要技术"
文档B:"机器学习是人工智能核心技术"
词汇表:["人工智能", "机器学习", "技术"]
查询:"人工智能技术"
向量:[1, 0, 1]
文档A向量:[1, 0, 1] → 完全匹配!
文档B向量:[1, 1, 1] → 匹配度较高
稠密检索原理:
查询向量:[0.2, 0.8, -0.3, ...](语义向量)
文档A向量:[0.21, 0.79, -0.28, ...]
文档B向量:[0.1, 0.5, 0.3, ...]
计算相似度:A比B更相似
即使文档A没有"机器学习"这个词,但因为语义接近,也能检索出来
作用:精炼检索结果,提升质量
为什么要优化?
优化方法:
1. 重排序
检索结果:[文档3, 文档1, 文档5, 文档2]
(按相似度排序)
用更精细的模型重新排序:
[文档1, 文档2, 文档3, 文档5]
(把最相关的放前面)
2. 内容压缩
原始文档(1000字):"人工智能是...发展历程...应用领域..."
压缩后(200字):"人工智能是模拟人类智能的技术,应用包括..."
3. MMR算法
在"相关性"和"新颖性"之间平衡,避免返回内容都太相似。
作用:基于检索结果生成答案
核心职责:
作用:智能调度,决定流程走向
功能:

适用:简单直接的查询任务

例子:

优点:提高全面性和多样性

适用:需要多轮完善的复杂问题
| 挑战 | 说明 |
|---|---|
| 检索质量难衡量 | 如何判断找到的文档是否相关? |
| 生成质量主观 | 开放式问题没有唯一答案 |
| 整体协作复杂 | 检索和生成如何配合? |
检索指标:
| 指标 | 说明 |
|---|---|
| MRR | 平均倒数排名(最相关文档排第几) |
| Recall@k | 前k个结果中找到多少相关文档 |
| Precision | 检索结果中有多少是真正相关的 |
生成指标:
| 指标 | 说明 |
|---|---|
| 事实准确率 | 回答是否符合检索文档 |
| 相关性 | 回答是否针对问题 |
| 流畅性 | 语言是否自然连贯 |
场景:企业内部文档、手册、政策查询
价值:
场景:产品FAQ、售后支持
价值:
场景:法律条文查询、医学文献检索
价值:
场景:个人笔记、文档检索
工具:Obsidian + RAG插件、Notion AI等
| 工具 | 特点 | 适用场景 |
|---|---|---|
| LangChain | 灵活、组件丰富 | 自定义RAG系统 |
| LlamaIndex | 专注数据索引 | 文档处理 |
| Haystack | 生产级框架 | 企业应用 |
| 数据库 | 特点 |
|---|---|
| Milvus | 高性能、开源 |
| Pinecone | 云服务、易用 |
| Chroma | 轻量级、嵌入简单 |
| Weaviate | 支持混合检索 |
最简单的RAG:
# 用LangChain实现简单RAG
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import OpenAI
# 1. 加载文档
documents = load_documents("my_docs/")
# 2. 向量化存储
vectorstore = Chroma.from_documents(
documents,
OpenAIEmbeddings()
)
# 3. 创建检索器
retriever = vectorstore.as_retriever()
# 4. 创建RAG链
qa = RetrievalQA.from_chain_type(
OpenAI(),
retriever=retriever
)
# 5. 查询
answer = qa.run("我的问题是什么?")
如果知识库数据质量差,RAG效果也差。
常见问题:
大规模知识库检索可能很慢。
解决:
目前RAG主要处理文本,图片、视频检索还不成熟。
RAG让大模型从"死记硬背"变成"开卷考试":
| 对比 | 传统LLM | RAG增强LLM |
|---|---|---|
| 知识来源 | 模型参数 | 外部知识库 |
| 更新方式 | 重新训练 | 更新数据库 |
| 答案可信度 | 可能幻觉 | 有据可查 |
| 适用场景 | 通用知识 | 专业/实时知识 |
一句话总结:
RAG不是让模型更聪明,而是让模型有"资料可查",从而减少错误,提高可信度。
下一篇预告:从聊天机器人到智能体——大模型的下一站
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。