📰 来源: 博客园
大模型最头疼的问题是什么?"幻觉"——一本正经地胡说八道。RAG(检索增强生成)是如何解决这个问题的?这篇文章带你从零理解RAG技术。
一、大模型的三大"知识痛点"
1.1 痛点一:知识效率低
你以为大模型读了那么多书,应该记得很牢?
实际上,模型对知识的记忆效率惊人地低:
大模型就像一个"记忆力很差的学生",读了100遍才记住一个知识点,而且还会记错。
1.2 痛点二:知识是静态的
大模型的知识来自预训练数据,有一个致命问题:时效性。
问:"2024年世界杯冠军是谁?"
GPT-4(训练数据截止2023年):"我无法回答这个问题..."
1.3 痛点三:幻觉问题严重
最可怕的问题:幻觉(Hallucination)
模型会编造看似合理但完全错误的内容:
问:"请介绍一下《星际穿越》这部电影"
模型错误回答:"这部电影由詹姆斯·卡梅隆执导..."
实际:克里斯托弗·诺兰执导!
模型自信地说出错误信息,用户很难辨别!
二、RAG:从闭卷考试到开卷考试
2.1 什么是RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)的核心思想:
不要让模型死记硬背,而是让它"现场查资料"!
2.2 RAG的工作原理
f: Q × D → A
Q = 用户问题(Query)
D = 数据源(Documents)
A = 答案(Answer)
2.3 RAG解决了什么?
研究人员把RAG任务分为四个层级:
问题:"公司成立于哪年?"
文档:"公司成立于2010年..."
回答:"2010年"(直接找到)
问题:"复旦计算机学院和法学院在一个校区吗?"
文档A:"计算机学院在张江校区"
文档B:"法学院在邯郸校区"
回答:"不在一个校区,计算机学院在张江,法学院在邯郸"
问题:"患者发热、咳嗽、乏力,可能是什么病?"
文档A:"流感症状包括发热、咳嗽..."
文档B:"新冠症状包括发热、咳嗽、乏力..."
回答:"可能是流感或新冠,建议就医确诊"
问题:"当前经济形势如何影响公司发展?"
需要:宏观经济知识 + 行业分析 + 公司具体情况
回答:需要深层专业知识,可能涉及多步推理
四、RAG系统的六大模块
4.2 模块一:索引模块
作用:把文档划分成可管理的片段(Chunk)
4.3 模块二:检索前优化
作用:让用户查询更精准,更容易找到相关文档
原问题:"Python如何读取文件"
扩展后:
- "Python文件读取方法"
- "Python open函数用法"
- "Python读取txt文件"
原问题(模糊):"那个东西怎么弄"
改写后:"如何在Python中读取文本文件"
3. HyDE方法(有趣!)
原问题:"什么是机器学习?"
先让模型"脑补"一个假设答案
然后拿这个假设答案去检索文档
为什么?因为"答案和答案"比"问题和答案"语义更相似!
4.4 模块三:检索模块
作用:从知识库中找到相关文档
文档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没有"机器学习"这个词,但因为语义接近,也能检索出来
4.5 模块四:检索后优化
作用:精炼检索结果,提升质量
检索结果:[文档3, 文档1, 文档5, 文档2]
(按相似度排序)
用更精细的模型重新排序:
[文档1, 文档2, 文档3, 文档5]
(把最相关的放前面)
原始文档(1000字):"人工智能是...发展历程...应用领域..."
压缩后(200字):"人工智能是模拟人类智能的技术,应用包括..."
3. MMR算法
在"相关性"和"新颖性"之间平衡,避免返回内容都太相似。
4.6 模块五:生成模块
作用:基于检索结果生成答案
4.7 模块六:编排模块
作用:智能调度,决定流程走向
5.1 线性模式(最简单)
适用:简单直接的查询任务
5.2 条件模式(智能路由)
5.3 分支模式(并行处理)
优点:提高全面性和多样性
5.4 循环模式(迭代优化)
适用:需要多轮完善的复杂问题
7.1 企业知识库问答
场景:企业内部文档、手册、政策查询
场景:产品FAQ、售后支持
7.3 法律/医疗专业问答
场景:法律条文查询、医学文献检索
场景:个人笔记、文档检索
工具:Obsidian + RAG插件、Notion AI等
# 用LangChain实现简单RAG
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import OpenAI
# 1. 加载文档
documents = load_documents("my_docs/")
🔗 原文链接: 点击阅读原文
文章评论