8、什么是向量数据库?有没有做过向量数据库的对比选型?
前面讲了 RAG 的检索过程,也讲了怎么把文本变成向量,那这些向量存在哪里呢?答案就是向量数据库。
向量数据库解决什么问题?
假设你有 100 万个文本块,每个文本块都被转换成了一个 1536 维的向量。当用户提问时,你需要快速找到和问题向量最相近的 Top-10 个文本块。
如果是暴力搜索,那每次查询都要和 100 万个向量逐一计算相似度,速度完全不可接受。
向量数据库就是为解决这个问题而生的。它使用特殊的索引结构(如 HNSW、IVF、PQ 等),能够在海量向量中实现毫秒级的近似最近邻搜索(ANN)。

向量数据库的核心原理
你可能会好奇:100 万个 1536 维的向量,暴力逐一比对肯定不行,那向量数据库是怎么做到毫秒级检索的?
核心思路是用空间换时间,通过提前构建索引结构,让检索的时候不需要遍历所有向量。目前主流的索引思路有三种。
最常用的一种叫 HNSW ,你可以把它理解成「在一栋大楼里找人」。想象你要在一栋 50 层的大楼里找一个叫「张三」的人。如果一层一层、一间一间地找,得找到什么时候?但如果大楼有一个智能导航系统,先告诉你在第 30 层,再告诉你在 3012 房间,几步就找到了。HNSW 就是给所有向量建了这么一个「多层导航图」,从粗到细、层层缩小范围,几跳就能定位到目标。这种方式查询速度极快(毫秒级),召回率也高,是目前大多数向量数据库的默认选择。
第二种思路叫 IVF,核心思想是「先分区域再搜索」。就好比快递分拣中心不会一个一个找包裹,而是先把包裹按地区分成几堆(华东堆、华南堆、华北堆),找到上海来的包裹就只去「华东堆」里翻就行了。IVF 也是这样,先把所有向量按相似度聚成若干个「桶」,查询的时候先判断目标最可能在哪几个桶里,然后只在这几个桶内搜索,不用遍历全部向量。它的好处是内存效率高,适合超大规模数据,但因为只搜索部分桶,所以会损失一点召回率。
第三种思路叫 PQ,核心是「压缩存储」。你想象一下,如果每个向量的信息量很大,存起来特别占内存怎么办?PQ 的做法是把一个完整的向量切成几段,每段做一个「简化版」的表示,就像把一张高清照片压缩成缩略图,虽然细节丢了,但关键特征还在。这样每个向量只需要很少的字节就能存,在内存有限的场景下特别实用。通常 PQ 会和 IVF 结合使用,先分桶再压缩,兼顾速度和内存。
主流向量数据库对比
目前市面上的向量数据库选择非常多,我挑几个最主流的,像跟朋友聊天一样,给你说说各自的特点和我的使用感受。
先说 Milvus。这个应该是目前开源向量数据库里最有名的一个了,由 Zilliz 公司开发维护,GitHub 上有 2 万多 Star。它最大的优势就是「能扛」,支持十亿级甚至百亿级的向量规模,索引类型也很丰富,HNSW、IVF、PQ 都支持,还有 GPU 加速选项。如果你的项目是那种企业级的、数据量特别大的场景,Milvus 基本上是首选。它的生态也很完善,Python、Java、Go 的 SDK 都有。但说实话,Milvus 的部署和维护有一定门槛,通常需要 Kubernetes 来编排,如果你团队没有 DevOps 经验,上手会有点吃力。
然后是 Pinecone。如果你不想折腾基础设施,Pinecone 可能是最省心的选择。它是一个全托管的 SaaS 服务,你不需要自己部署任何东西,注册个账号、几行代码就能开始用。自动扩缩容、零运维,对开发团队特别友好。但它的缺点也很明显:一是付费的,而且费用不算便宜;二是数据存在第三方服务器上,如果你的数据有合规要求(比如不能出境),就不太合适了。
再来说 Weaviate。这个是我个人比较喜欢的一个,因为它原生支持混合检索,也就是向量检索和 BM25 关键词检索可以一起做,不用你自己去拼接两套系统。它还内置了多种 Embedding 模型的集成,可以直接在 Weaviate 内部完成文本到向量的转换,省了一个步骤。如果你要做混合检索的 RAG 系统,Weaviate 是开箱即用的,体验很好。不过在大规模数据场景下,它的性能会比 Milvus 弱一些,适合中小规模的应用。
Chroma 则是另外一个极端。它主打的就是「轻量」和「简单」,Python 原生支持,装个 pip 包就能用,API 设计得非常简洁。如果你是在做原型验证、个人项目、或者教学演示,Chroma 是最方便的。但它的功能和性能都比较有限,不支持分布式,也没有安全机制(没有加密、没有权限控制),所以不太适合用在生产环境里。
最后是 Qdrant。这个是后起之秀,用 Rust 语言写的,所以单机性能非常强。在 2025 年的一些基准测试中,Qdrant 的 QPS 和延迟表现都是同类产品里最好的。它也支持丰富的过滤条件和混合检索。如果你的场景对响应速度有很高要求,或者想自建但不想用那么重的 Milvus,Qdrant 是一个很好的折中选择。不过它的分布式方案相对来说还比较新,如果你需要多节点的集群部署,可能需要多测试一下稳定性。
选型建议
聊了这么多,你可能会问:那我实际项目中到底该选哪个?
我的建议是根据你的场景来。
- 如果你只是想快速做个 POC 验证一下效果,直接用 Chroma,轻量、上手快,别在基础设施上花太多时间。
- 如果是中小规模的生产应用,预算充足的话可以考虑 Pinecone,省心;如果需要私有化部署,Weaviate 是个不错的选择。
- 如果是大规模的企业级应用,数据量上亿的那种,那基本就得选 Milvus 了,它的扩展性最好。
- 如果你对性能有极致要求,想自建但不想用 Milvus 那么重的方案,Qdrant 值得试试。
另外还有一个趋势值得说一下,就是传统数据库的向量扩展。
比如 PostgreSQL 的 pgvector 插件、Elasticsearch 的向量搜索功能。如果你的项目已经在用 PostgreSQL 或 ES,不想为了 RAG 再引入一套新的数据库组件,用它们的向量扩展也是一个很务实的选择。
虽然性能比不上专门的向量数据库,但对于中小规模来说完全够用,而且运维成本几乎为零。
9、什么是多路召回?具体怎么做?
前面的章节里,我们讲的检索方式都是「向量检索」,也就是把查询和文档都转成向量,然后通过相似度搜索来找相关文档。但你有没有想过:单一检索方式真的够用吗?
单路召回的局限性
向量检索擅长捕捉「语义相似性」。比如用户问「怎么修改密码」,它能检索出包含「重置登录凭据」的文档,即使两者的字面完全不同,但语义是接近的。这是向量检索的强项,没得说。
但你有没有遇到过这种情况:用户搜索「iPhone 15 Pro Max 256GB」,结果向量检索把「iPhone 14 Pro Max 512GB」也搜出来了。为什么?
因为这两个型号的语义太像了,向量检索分不太清。但用户要的就是精确型号,你给他一个不同代、不同容量的型号,能行吗?
再比如,用户搜你们公司内部的一个产品编号「PRD-2024-089」,向量检索很可能一脸懵,因为这种编号没有「语义」可言,纯靠语义相似度是匹配不上的。
这说明,向量检索虽然在「理解意思」方面很厉害,但在「精确匹配」方面有短板。光靠向量检索这一条路,召回的结果可能有遗漏。
多路召回的核心思想
多路召回的思路很简单:既然一条路不保险,那就多走几条路,每条路各有侧重,最后把各路结果合并。
常见的召回通道有:
第一路:向量检索(Dense Retrieval)
用 Embedding 模型把文本转成稠密向量,通过相似度搜索来召回。擅长语义匹配,是 RAG 系统的主力召回通道。
第二路:关键词检索(Sparse Retrieval / BM25)
传统的全文检索方式,基于词频和文档频率来计算相关性。BM25 是最经典的算法。擅长精确关键词匹配,对于专有名词、产品编号、人名等有天然优势。
第三路:知识图谱检索(可选)
如果知识库有结构化的知识图谱,可以用图查询来做第三路召回。擅长实体关系推理,比如「A 公司的 CEO 是谁」这种查询。
多路召回的关键在于「融合」 。各路召回的结果需要合并去重,并按综合相关性排序。融合的方法有很多,最常用的是 RRF(倒数排名融合,Reciprocal Rank Fusion):

这说明,向量检索虽然在「理解意思」方面很厉害,但在「精确匹配」方面有短板。光靠向量检索这一条路,召回的结果可能有遗漏。
多路召回的核心思想
多路召回的思路很简单:既然一条路不保险,那就多走几条路,每条路各有侧重,最后把各路结果合并。
常见的召回通道有:
第一路:向量检索(Dense Retrieval)
用 Embedding 模型把文本转成稠密向量,通过相似度搜索来召回。擅长语义匹配,是 RAG 系统的主力召回通道。
第二路:关键词检索(Sparse Retrieval / BM25)
传统的全文检索方式,基于词频和文档频率来计算相关性。BM25 是最经典的算法。擅长精确关键词匹配,对于专有名词、产品编号、人名等有天然优势。
第三路:知识图谱检索(可选)
如果知识库有结构化的知识图谱,可以用图查询来做第三路召回。擅长实体关系推理,比如「A 公司的 CEO 是谁」这种查询。
多路召回的关键在于「融合」 。各路召回的结果需要合并去重,并按综合相关性排序。融合的方法有很多,最常用的是 RRF(倒数排名融合,Reciprocal Rank Fusion) :
RRF 的核心思想是:不看每个文档的绝对分数,只看它在各路召回中的排名。排名越靠前,得分越高;被越多路召回命中的文档,综合得分也越高。
打个比方,这就像综艺节目的评委打分,去掉绝对分数的差异,只看排名来综合评判。
混合检索的具体实现
目前 RAG 实践中,向量检索 + BM25 关键词检索的混合检索已经成为标配方案。
具体的实现流程是:
-
用户提问后,同时发起两路检索:
-
向量检索:把问题转成向量,在向量数据库中搜索 Top-K 个相似文档
-
BM25 检索:把问题分词后,在倒排索引中搜索 Top-K 个相关文档
-
-
用 RRF 算法合并两路结果,得到综合排序
-
(可选)对合并后的结果做 Re-rank 精排
-
取最终 Top-N 个文档送入大模型
这种混合检索的效果通常比单路检索好 10%-30%,尤其是在需要精确匹配关键词的场景下提升更明显。
很多框架已经内置了混合检索的支持。比如 LangChain 的 EnsembleRetriever、LlamaIndex 的 QueryFusionRetriever、Weaviate 的混合搜索功能等。
还有哪些高级召回策略?
除了向量检索和关键词检索,还有一些更进阶的召回策略:
- 查询改写(Query Rewriting):在检索之前,先用 LLM 把用户的原始问题改写成更适合检索的形式。比如用户问「你们公司加班多吗」,可以改写成「公司加班制度」「加班时间规定」「加班补贴政策」等多个查询,分别检索后再合并结果。
- HyDE(Hypothetical Document Embedding):先让 LLM 根据用户问题生成一个「假设性的答案文档」,然后用这个假设文档的向量去检索。因为假设文档在表述上更接近真实的答案文档,所以检索效果通常更好。
- 多查询扩展(Multi-Query):把用户的一个问题,用 LLM 改写成多个不同角度的子问题,分别检索后合并结果。
这些策略可以和前面的多路召回组合使用,进一步提升召回效果。
10、怎么量化你的 RAG 效果?
到这里,我们已经聊了很多 RAG 的技术细节:文档切割、Embedding、向量数据库、多路召回、Re-rank......
但有一个非常实际的问题你可能一直在想:我搭了一个 RAG 系统,怎么知道它好不好?有没有什么量化的指标来评估?
这个问题太重要了。如果你不能量化 RAG 的效果,那所有的优化都是「凭感觉」,你永远不知道改进了还是退步了。
为什么评估 RAG 比评估普通 LLM 更复杂?
RAG 系统由两大组件组成:检索器和生成器。检索器负责从知识库中找到相关文档,生成器负责基于这些文档生成回答。所以评估 RAG 不能只看最终回答好不好,还需要分别评估检索质量和生成质量。
打个比方。你开了一家餐厅,顾客反馈「菜不好吃」。你不能直接把锅甩给厨师(生成器),因为有可能厨师水平没问题,但采购的食材(检索结果)本身就不行。所以你必须分别评估「食材采购质量」和「厨师烹饪水平」,才能定位到问题。
检索质量的评估指标
检索是 RAG 的基础,检索质量直接决定了最终回答的上限。常用的检索评估指标有好几个,但最核心的就三个,咱们一个个聊。
召回率(Recall@K):找全了没有?
在检索返回的 Top-K 个结果中,有多少真正相关的文档被找到了。比如知识库中有 10 个和问题相关的文档,检索返回了 5 个,那召回率就是 50%。召回率关注的是「有没有遗漏」,找得全不全。
精确率(Precision@K):找对了没有?
在检索返回的 Top-K 个结果中,有多少是真正相关的。比如检索返回了 10 个文档,其中 6 个是相关的,那精确率就是 60%。精确率关注的是「有没有乱凑」,找得准不准。
这两个是一对好搭档,一个关注「全」,一个关注「准」,通常需要平衡着看。除了这两个,还有一个更综合的指标叫 NDCG,它不仅看你找得全不全、准不准,还看「排得对不对」,也就是高度相关的文档是不是排在了前面,部分相关的文档是不是排在了后面。NDCG 是信息检索领域最常用的综合评估指标。
此外,还有一些辅助指标,比如 MRR 关注的是「第一个相关文档排在了第几位」,MAP 关注的是「所有相关文档的整体排序质量」。了解一下就行,核心记住 Recall、Precision 和 NDCG 这三个就够了。
生成质量的评估指标
生成质量的评估比检索更复杂,因为需要判断「回答内容是否准确、是否相关、是否忠实于检索到的文档」。
Faithfulness(忠实度)
这是 RAG 评估中最重要的指标。它衡量的是:大模型生成的回答,是否忠实于检索到的文档?有没有编造检索文档中不存在的信息?
RAGAS 框架(后面会介绍)的评估方式是:先把生成的回答拆分成一个个独立的陈述,然后检查每个陈述是否能从检索到的文档中找到支撑。如果有 10 个陈述,8 个能找到支撑,2 个是编造的,那忠实度就是 0.8。
举个例子。如果检索到的文档说「爱因斯坦出生于 1879 年 3 月 14 日」,但模型生成的回答是「爱因斯坦出生于 1879 年 3 月 20 日」,那这个回答的忠实度就不高。
Answer Relevance(答案相关性)
生成的回答是否真正回答了用户的问题?有没有跑题?比如用户问「TCP 三次握手是什么」,模型回答了一大段网络协议的历史,虽然内容正确但没回答问题,那答案相关性就很低。
Context Relevance(上下文相关性)
检索到的文档是否和用户的问题相关?如果检索回来一堆不相关的文档,那即使模型忠实地基于这些文档生成了回答,最终效果也不会好。
RAGAS:RAG 评估的事实标准
说到 RAG 评估,就不得不提 RAGAS。这是目前 RAG 评估领域最流行的开源框架。
RAGAS 的核心思路是用一个更强大的 LLM(比如 GPT-4)作为「裁判」,来自动化评估 RAG 系统的输出质量。你只需要提供测试数据集(包含问题、标准答案、检索到的文档、模型生成的回答),RAGAS 就能自动计算上述各种指标。
RAGAS 的使用方式也很简单。你准备一个包含 question(问题)、contexts(检索到的文档)、answer(模型生成的回答)、ground_truth(标准答案)的数据集,然后调用 RAGAS 的 evaluate 函数就行了。
除了 RAGAS,还有一些其他的 RAG 评估工具:
-
DeepEval:把 RAG 评估融入单元测试框架,适合工程化团队
-
TruLens:提供 RAG 应用的深度可观测性和诊断能力
-
ARES:用 LLM 生成合成评估数据,解决人工标注数据不足的问题
评估的最佳实践
最后给几个实际项目中的评估建议:
-
先建基线,再做优化。在优化 RAG 系统之前,先用一组测试数据建立性能基线。之后每次改动都可以对比基线,看效果是提升了还是下降了。
-
测试数据要有代表性。不要只用简单问题测试,要包含各种类型:简单事实查询、复杂推理问题、多跳问题、模糊问题等。
-
定期评估,持续监控。RAG 的效果会随着知识库的更新、模型版本的变化而波动,需要建立持续评估和监控的机制。
-
把评估自动化。把 RAG 评估融入 CI/CD 流程,每次更新都自动跑一轮评估,发现效果下降及时报警。
11、什么是大模型幻觉?怎么降低幻觉?
在 RAG 系列知识的最后,我们来聊一个贯穿始终的话题:大模型的「幻觉」。
前面每个章节都或多或少提到了幻觉,这一节咱们来系统地讲清楚。
什么是大模型幻觉?
所谓幻觉(Hallucination),简单来说就是大模型自信地说出一些听起来很专业但实际上是编造的内容。
你可能在用 ChatGPT 的时候遇到过:问它一个不存在的论文,它能给你编出标题、作者、摘要甚至 DOI 号;问它一个历史事件的细节,它可能自信地把时间、地点、人物全说错了,但语气非常确定,毫无犹豫。
幻觉不等于「错误」。如果模型说「我不知道这个问题的答案」,那不叫幻觉。幻觉是模型不知道但假装知道,用流畅、自信的语言编造错误信息 。
OpenAI 的科学家 Andrej Karpathy 有一段非常精彩的观点:「在某种意义上,幻觉正是大模型所做的一切。它是造梦机,我们通过提示词引导它的梦境。只有当梦境进入事实上不正确的领域时,我们才将其标记为『幻觉』。这不是 bug,而是大模型一直在做的事情。」
幻觉有哪些类型?
学术界通常把幻觉分为两大类:
事实性幻觉(Factuality Hallucination)
生成的内容与客观事实不符。比如把爱因斯坦的出生年份说错了,或者编造了一个不存在的学术论文。这又分为两类:
-
内在幻觉(Intrinsic):生成内容与输入的上下文信息矛盾。比如文档中写的是 A,但模型说成 B。
-
外在幻觉(Extrinsic):生成内容无法从输入上下文或任何已知知识中验证。比如凭空编造了一个不存在的事件。
忠实性幻觉(Faithfulness Hallucination)
在 RAG 场景中更常见。模型虽然拿到了正确的检索文档,但在生成回答时偏离了文档内容,加入了文档中没有的信息,或者曲解了文档的含义。
幻觉是怎么产生的?
理解幻觉的成因,才能有针对性地解决。幻觉的产生贯穿了大模型从训练到推理的整个生命周期。
数据层面的原因
训练数据中可能包含错误信息、偏见或过时的知识。模型把这些「有问题的知识」学进去了,自然就会输出错误信息。这就是所谓的「垃圾进,垃圾出」。
而且有些事实本身就没有规律可循(比如某个人的生日、某个事件的具体时间),模型不可能通过推理得到正确答案,只能靠「记住」。如果训练数据中这个事实只出现过一次,模型大概率会记错或者编造。
训练层面的原因
大模型的训练目标是「预测下一个 token」,它追求的是生成流畅、连贯的文本,而不是确保每句话都是正确的。这导致模型更倾向于生成「看起来合理」的内容,而不是「事实上正确」的内容。
更深层的原因是,当前主流的评估方式(比如多选题评测)鼓励模型「蒙答案」而不是「承认不知道」。因为不答和答错都是零分,那理性选择就是尽量猜,这系统性地鼓励了过度自信。
推理层面的原因
在推理阶段,用户的提示词也可能诱导幻觉。如果用户的问题本身包含错误前提(「请介绍一下林黛玉的妹妹」),模型往往会顺着错误前提继续编造,而不是指出前提有问题。
RAG 是怎么降低幻觉的?
回到 RAG,它为什么能有效降低幻觉?
核心原因是 RAG 把大模型从「闭卷考试」变成了「开卷考试」。
在纯 LLM 场景下,模型只能依赖训练时学到的「参数记忆」来回答,这些记忆可能是模糊的、过时的或者错误的。而 RAG 为模型提供了真实的、可验证的参考文档,模型的回答有了「依据」。
具体来说,RAG 通过以下机制降低幻觉:
注入真实知识:检索到的文档是真实存在的资料,模型基于这些资料来生成回答,大幅减少了「凭空编造」的可能性。研究表明 RAG 能将事实性幻觉降低 20%-40%。
注意力机制偏向:当 Prompt 中包含检索文档时,大模型的注意力权重会显著偏向这些文档(约 70-80% 的注意力集中在检索片段),这确保了模型优先参考检索到的真实信息。
可追溯可验证:RAG 生成的回答可以追溯到具体的文档来源,如果发现回答有误,可以定位是哪个文档出了问题。
但要注意,RAG 不能完全消除幻觉。如果检索到了错误的文档、模型曲解了文档内容、或者在检索结果之外做了越界推断,幻觉依然会发生。RAG 是缓解幻觉的最有效手段之一,但不是银弹。
除了 RAG,还有哪些降低幻觉的方法?
RAG 是降低幻觉最核心的手段,但它不是银弹。前面也说了,RAG 不能完全消除幻觉,如果检索到了错误的文档、模型曲解了文档内容,幻觉照样会出现。所以在实际项目中,通常需要多种策略组合使用,形成一套多层次的「防幻觉体系」。
接下来,我从推理阶段到模型层面,逐个讲解几种主要的降低幻觉的方法。
方法一:Prompt 工程约束
Prompt 工程是成本最低、见效最快的防幻觉手段。它的核心思路是通过精心设计的提示词,来约束模型的行为边界。具体来说,有几条非常实用的策略。
第一条:限制知识范围。
在 Prompt 中明确告诉模型,只能基于给定的资料来回答,不要「发挥」。比如:
「请仅基于以下参考资料回答用户的问题。如果参考资料中没有相关信息,请直接回答『根据现有资料无法回答该问题』,不要自行推测或编造内容。」
这条约束的本质是给模型画一条红线:回答只能来源于提供的文档,超出的部分一律不许碰。
第二条:要求标注来源。
让模型在回答时标注每个观点来自哪个文档、哪个段落。比如:
「请回答用户的问题,并在每个关键陈述后标注出处,格式为来源:文档名-第X段。」
这样做有两个好处:一是让模型的回答更有依据,因为它知道每个观点都需要标注出处,就会更谨慎;二是方便人工核查,如果对某个观点有疑问,可以直接定位到源文档。
第三条:鼓励承认不确定。
这条看起来简单,但效果出奇地好。在 Prompt 中加入这样的指令:
「如果你对某个问题的答案不确定,请坦诚地说『我不确定』或者『根据现有信息无法确认』,而不是猜测。」
研究表明,OpenAI 2025 年的一篇论文指出,鼓励模型在不确定时说「我不知道」,是降低幻觉非常有效的手段。这背后的逻辑是:不答和答错从结果上看差不多,但不答至少不会误导用户。
第四条:结构化推理。
让模型先列出推理步骤,再给出结论。比如:
「请分两步回答:第一步,先列出你知道的确定事实;第二步,基于这些事实进行推理分析,并明确标注哪些是推理部分。」
这种分步推理的方式,能让模型在每一步都停下来想一想,减少「脱口而出」的错误。
方法二:输出验证(独立校验)
Prompt 约束是「事前预防」,输出验证则是「事后检查」。
核心思路很简单:不让模型的回答直接到达用户,中间加一层验证环节。
具体怎么做?有几种常见的验证方式:
用另一个模型来交叉验证。 比如用 GPT-4 生成回答后,再用 Claude 或者另一个 GPT-4 实例来检查这个回答是否存在事实错误。验证模型的 Prompt 可以这样设计:「以下是一段 AI 生成的回答和它引用的参考资料,请逐一检查回答中的每个事实陈述是否都能在参考资料中找到支撑。标注出所有无法被支撑的陈述。」
这种方式也叫 LLM-as-Judge(用大模型当裁判),是目前自动化幻觉检测最主流的方式。
用规则引擎验证关键数据。 对于数字、日期、人名、金额等关键信息,可以建立规则引擎来校验。比如模型说「公司 2024 年营收 500 亿」,系统可以自动去数据库查一下这个数字是否准确。如果不准确,就把这部分回答标红或者直接修正。
基于一致性的多次采样验证。 对同一个问题,让模型生成多个回答,然后比较这些回答是否一致。如果多个回答对某个关键事实的说法不一致,说明模型对这个事实没有把握,这个事实很可能就是幻觉。
打个比方,这就像你去医院看病,不放心一个医生的诊断,就去找第二个医生看看,如果两个医生的说法一致,你就更放心了。输出验证做的就是类似的事情。
方法三:领域微调
如果你发现模型在某个特定领域(比如医疗、法律、金融)的幻觉率特别高,可以考虑用高质量的领域数据对模型进行微调。
为什么微调能降低幻觉?因为通用大模型在这些领域的知识基础可能比较薄弱。比如一个通用模型可能只见过少量医学文献,对医学术语和诊断逻辑的理解不够深入,所以容易在回答医学问题时「编造」内容。微调就像给这个模型补了一门专业课,让它在特定领域有更扎实的知识基础。
具体来说,微调降低幻觉的方式有几种:
- 用领域数据做有监督微调(SFT)。 收集高质量的「问题-正确答案」对,对模型进行有监督微调。这些数据中的答案都是经过人工审核的准确内容,模型通过学习这些数据,能在特定领域建立起更可靠的知识体系。
- 用 RLHF 引导「诚实」。 在人类反馈强化学习(RLHF)阶段,不是奖励模型给出「看起来好听」的回答,而是奖励它「说真话」或者「坦率承认不知道」。OpenAI 2025 年的研究指出,当前的 RLHF 机制系统性地鼓励模型在不确定时猜测,因为「蒙对得分、不答零分」。如果在 RLHF 中改为「蒙错扣分,不答零分」,模型就会学会在不确定时说「我不知道」。
不过微调的成本比较高,需要大量的高质量标注数据和计算资源。所以通常是在 Prompt 工程和 RAG 都尝试过之后,如果效果还不够好,再考虑微调。
方法四:不确定性量化(UQ)
不确定性量化是一种更前沿的方法。它的核心思路是:让模型对自己的每个输出给出一个置信度分数,分数低就意味着可能存在幻觉。
怎么让模型给出置信度分数呢?目前有几种技术路线:
最后,在企业应用中,建议按风险等级来分层管控幻觉:
企业落地的核心原则只有一条:把幻觉当作工程问题而非模型缺陷,用系统设计来约束 AI 的行为边界。
-
基于概率的方法。 如果能获取模型生成每个 token 的概率分布(有些 API 可以返回 logprobs),就可以通过计算 token 概率的平均值或最小值来估计模型对整个回答的置信度。如果模型生成的很多 token 概率都很低,说明它对自己的回答不太确定,幻觉风险就高。
-
基于多次采样的一致性。 前面提到的「对同一问题生成多个回答」就是这里的一个应用。如果多次生成的回答差异很大,说明模型对这个问题没有把握。
-
基于模型内部状态的方法。 这需要白盒访问模型的内部状态(所以只能用于自己部署的开源模型)。研究表明,模型在生成正确内容时,内部隐藏状态的上下文激活模式更「锐利」(熵值低),而生成错误内容时激活模式更「模糊」(熵值高)。通过监控这些内部信号,可以实时检测幻觉。

一旦检测到置信度很低,系统可以采取几种应对措施:触发人工审核、拒答(告诉用户「我无法确定这个问题的答案」)、或者降低回答的确定性(加上「根据现有信息推测,但不确定是否准确」之类的声明)。
方法五:GraphRAG 和 LightRAG
这是 2025 年出现的新方向。传统的 RAG 只能检索文档片段,对于需要全局理解的问题(比如「这篇财报的核心观点是什么」「这份合同中甲乙双方的义务分别是什么」)效果不好。
GraphRAG 由微软提出,核心思路是:先让 LLM 从文档中提取实体和关系,构建一个知识图谱,然后基于知识图谱来做检索和回答。知识图谱能捕捉实体之间的关联关系,比单纯的文档片段检索更适合回答需要推理的问题。
LightRAG 则是 GraphRAG 的轻量版,解决了 GraphRAG 的 token 开销大、动态更新成本高的问题,通过融合图增强文本索引和双层检索范式,在保持效果的同时大幅降低了成本。
这些高级 RAG 架构能在传统 RAG 的基础上进一步降低幻觉,尤其是对复杂推理类的问题。
实际项目中的组合策略
说了这么多方法,实际项目中怎么组合使用?核心原则是分层设防、按需组合 :

-
第一道防线:Prompt 工程约束。零成本、立即生效,所有场景都应该做。
-
第二道防线:RAG 检索增强。中等成本,提供事实依据,是需要准确知识的场景的标配。
-
第三道防线:输出验证。额外增加延迟和成本,但在高风险场景(医疗、法律、金融)中不可或缺。
-
第四道防线:领域微调 + 不确定性量化。成本最高,但在特定领域效果最好,适合对准确性要求极高的场景。
-
高风险场景(医疗诊断、法律建议、金融决策):必须 RAG + 人工审核 + 明确免责声明,输出验证必备
-
中风险场景(客户服务、内容生产、代码辅助):Prompt 约束 + RAG + 输出验证 + 置信度阈值
-
低风险场景(头脑风暴、草稿起草、创意生成):基础 Prompt 优化即可