大语言模型“幻觉“终结者:RAG技术如何实现实时知识检索与精准回答?

大语言模型这几年进步飞快,但在实际落地时有一个绕不开的短板:知识截止日期。

训练数据停在某个时间点,之后发生的事情模型一概不知。问它"你们公司的内部 Wiki 里怎么写接口规范",问它"上周刚发布的竞品文档里说了什么",模型只能原地编。这种"看上去很合理、实际上全瞎编"的现象,大家已经给它起了名字——幻觉。

RAG(Retrieval-Augmented Generation,检索增强生成)就是冲着这个问题来的。思路不算复杂:不给模型死记硬背,给它配一个可以实时查询的外部知识库。每次提问,系统先去库里翻找相关材料,找到之后连同问题一起丢给模型,让模型对照材料来回答。

这一整套流程拆开来,就是三个环节:索引构建、检索召回、答案生成。下面逐个拆开看。


  1. 索引构建:先把知识装进库

知识库不会自己长出来。把文档变成可检索的知识,要走三步:分块、向量化、存库。

1.1 文档分块

一份产品手册可能有好几十页,直接整篇丢进去做索引,效果很差——用户问的是一个具体问题,只在其中两三段里有答案,剩下几十页全是噪音。

分块就是把长文档切成一截一截的片段(chunk),每截单独建索引。这样检索时命中的是相关的那几句,整篇文档里的无关内容不会掺进来。

分块有几种做法:

固定大小分块:按字符数或 token 数切,比如每 512 token 一段。实现最简单,但可能在句子中间下刀,语义连不上。

滑动窗口分块:相邻两块之间留一段重叠,比如每块 512 token,跟前一块重叠 128 token。重叠区能兜住边界上的语义,不会因为切在句子中间就丢了信息。

递归分块:按优先级试不同的分隔符——先找段落(\n\n),段落太长了再找句子(\n),句子还太长就按空格。这种方式能顺着文档的自然结构切,比固定大小聪明不少。

语义分块:用 Embedding 模型算相邻句子的语义相似度,在相似度跳变的地方下刀。一段讲"模型训练",下一段突然跳到"推理部署",相似度暴跌,系统在这里切一刀。好处是每个 chunk 内部主题统一,坏处是计算开销大。

块的大小本身就是一个需要权衡的参数。太小了,片段里语义不完整;太大了,无关信息混进去稀释信号。512~1024 token 是一个比较常见的选择区间,具体还得看 Embedding 模型支持多长的输入、以及文档是哪种类型。

1.2 向量化

切完块之后,每段文字得变成机器能算的格式——向量。这一步用的模型叫 Embedding 模型,输入一段文字,输出一个固定长度的浮点数向量,比如 768 维。

向量化的妙处在这里:语义相近的文本,在向量空间里的位置也近。“苹果手机多少钱"和"iPhone 最新售价”,用词完全不同,但经过 Embedding 之后,两个向量在高维空间里的余弦相似度很高。这就是语义检索能跑通的基础。

选哪个 Embedding 模型,直接影响检索质量。几个常用选项:

  • text-embedding-3-small:OpenAI 出品,512 或 1536 维,性价比高,中文支持不差
  • BGE-M3:BAAI 开源,1024 维,中文和多语言场景表现优秀,输入最长能到 8192 token
  • BCEmbedding:有道开源,768 维,中文检索和重排序配对使用效果好
  • Cohere embed-v3:1024 维,支持向量压缩,多语言场景够用

维度越高,语义表达能力越强,但存储和计算也跟着涨。实践中 768 到 1024 维已经够应付多数场景了。

1.3 向量数据库

几万、几十万个向量存进去之后,要能快速检索"跟这个查询向量最像的前 K 个"。传统数据库(MySQL、PostgreSQL)不会干这活——它们的索引是为精确匹配建的,不是为相似度搜索建的。

向量数据库用了近似最近邻搜索(ANN)算法来加速。与其逐一计算查询向量和库里每个向量的距离,ANN 先在"速度"和"精度"之间找个平衡点,用极小的精度代价换数量级的查询提速。

常用的 ANN 算法有两个:HNSW(分层可导航小世界图)和 IVF(倒排文件索引)。HNSW 建了一个多层图结构,高层稀疏、低层密集,查询时从高层粗定位,逐层往下精搜。IVF 先把向量做聚类,查询时只在最近的几个聚类中心附近搜。

主流选择有 Milvus(功能全、社区活跃)、Qdrant(Rust 实现,性能强悍)、Weaviate(支持向量+关键词混合检索)、Pinecone(SaaS 模式零运维),还有轻量级的 Chroma 适合做原型。


  1. 检索环节:从库里面翻出对的东西

知识库建好了,用户提问时系统的第一件事就是把问题转成向量,在库里翻找最相关的片段。

2.1 查询向量化

用户的问题得先过一遍跟文档向量化同一个 Embedding 模型。不同模型输出的向量坐标系不一样,混用了检索就全乱了。

查询向量出来后,在向量库里跑相似度搜索。三种常用的度量方式:

  • 余弦相似度:衡量两个向量方向的接近程度,范围 [-1, 1]。RAG 里最常用的一种,因为它不挑向量长度,长文本和短文本能公平比较。
  • 欧氏距离:直接算两个向量在空间里的直线距离,值越小越像。适合向量长度差不多的场景。
  • 内积:对应位置元素乘起来再加总。归一化之后的向量,内积就等于余弦相似度。

Top-K 设多大,要看场景。K 太小漏关键信息,K 太大混进噪音还浪费 token 预算。实践中经常取 3 到 10,配合其他策略灵活调。

2.2 不止一种检索方式

纯向量检索在大方向上够用,但有些场景会露怯:遇到精确的日期、ID、专有名词,向量检索就不如关键词检索准。

混合检索是常见的解法:向量检索负责语义层面的匹配,BM25 这类关键词检索负责精确命中的部分,两路结果合并排序。

重排序(Reranking)再往前推了一步。向量检索召回的 Top-K 里,排第一的不一定真是最相关的。重排序模型(Cross-Encoder)把"问题 + 文档"成对丢进去算分,比 Embedding 的双塔结构精细不少——双塔是问题和文档各自算向量,Cross-Encoder 直接让两者在模型内部交互一次。排序准了,但计算开销也明显大了。

到了企业级场景,多路召回 + 融合排序更常见。部署好几路检索器——语义检索、关键词检索、知识图谱检索——各路独立召回 Top-N,最后用 RRF(Reciprocal Rank Fusion)统一排一版结果。架构复杂了,但召回覆盖率上了好几个台阶。


  1. 生成环节:拼上下文,输出答案

Top-K 片段到手了,下一步是把它们塞到 Prompt 里,让模型对着资料回答。

3.1 Prompt 怎么拼

检索结果不能原样丢进去,得按一个结构化的模板组装。一个典型的 RAG Prompt 长这样:

基于以下参考资料回答问题。如果参考资料不包含相关信息,请说明无法回答。参考资料:---{片段1}{片段2}{片段3}---问题:{用户提问}

这里面有几个细节值得留意:

  • 明确告诉模型"只参考给出的这些材料",降低它自行发挥的空间
  • 用分隔符---把资料和指令隔开,避免 Prompt 注入
  • 给出兜底行为——“找不到就直说”,防止模型在没资料时硬编

3.2 上下文窗口是有限的

LLM 的上下文窗口再大也不是无限的,RAG 场景下塞进去的检索结果经常占大头。怎么分配 token 预算,直接影响生成质量。

几个实用的做法:

控制片段长度:对过长的检索结果做截断,按 Token 数裁到可管理的范围。相关性排序:把最相关的片段放在 prompt 前面——模型对开头和结尾的关注度天然更高。去重:多段检索结果可能包含重复内容,去重之后省出来的空间能塞进更多差异化的信息。

3.3 生成和溯源

模型拿到组装好的 Prompt 后,跟普通对话有本质区别——它进入了"阅读理解"模式,从给的素材里提取答案,对照着资料来回话。

工程上做到位的话,还会给每个检索片段打上来源标记——文档 ID 或者 URL——并要求模型在回答里标注引用。用户追问"这句是从哪里来的",可以直接定位到原文。在医疗、法律、金融这些合规敏感的场景里,这一点比回答本身还重要。

下面是一段简化的 Python 流程示意,把上面讲的几步串起来:

import numpy as np# 查询向量化defquery_to_vector(query, embedder): return embedder.encode(query)# 检索 Top-Kdefretrieve(query_vector, vector_db, top_k=5): # 用余弦相似度 similarities = np.dot(vector_db.vectors, query_vector) similarities /= (np.linalg.norm(vector_db.vectors, axis=1) * np.linalg.norm(query_vector)) top_indices = np.argsort(similarities)[-top_k:][::-1] return [vector_db.chunks[i] for i in top_indices]# 组装 Promptdefbuild_prompt(query, chunks): context = "\n\n".join( [f"## 片段 {i+1}\n{c}"for i, c inenumerate(chunks)] ) return ( f"请基于以下参考资料回答问题:\n\n" f"{context}\n\n" f"问题:{query}\n\n" f"如参考资料中无相关信息,请说明无法回答。" )# 完整流程defrag_pipeline(query, embedder, vector_db, llm): q_vec = query_to_vector(query, embedder) chunks = retrieve(q_vec, vector_db, top_k=5) prompt = build_prompt(query, chunks) return llm.generate(prompt)

检索是上游,Prompt 是桥,生成是下游。上游歪了,下游的模型再强也救不回来。


最后唠两句

为什么AI大模型成为越来越多程序员转行就业、升职加薪的首选

很简单,这些岗位缺人且高薪

智联招聘的最新数据给出了最直观的印证:2025年2月,AI领域求职人数同比增幅突破200% ,远超其他行业平均水平;整个人工智能行业的求职增速达到33.4%,位居各行业榜首,其中人工智能工程师岗位的求职热度更是飙升69.6%。

AI产业的快速扩张,也让人才供需矛盾愈发突出。麦肯锡报告明确预测,到2030年中国AI专业人才需求将达600万人,人才缺口可能高达400万人,这一缺口不仅存在于核心技术领域,更蔓延至产业应用的各个环节。

那0基础普通人如何学习大模型 ?

深耕科技一线十二载,亲历技术浪潮变迁。我见证那些率先拥抱AI的同行,如何建立起效率与薪资的代际优势。如今,我将积累的大模型面试真题、独家资料、技术报告与实战路线系统整理,分享于此,为你扫清学习困惑,共赴AI时代新程。

我整理出这套 AI 大模型突围资料包【允许白嫖】:

  • ✅从入门到精通的全套视频教程
  • ✅AI大模型学习路线图(0基础到项目实战仅需90天)
  • ✅大模型书籍与技术文档PDF
  • ✅各大厂大模型面试题目详解
  • ✅640套AI大模型报告合集
  • ✅大模型入门实战训练

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

①从入门到精通的全套视频教程

包含提示词工程、RAG、Agent等技术点

② AI大模型学习路线图(0基础到项目实战仅需90天)

全过程AI大模型学习路线

③学习电子书籍和技术文档

市面上的大模型书籍确实太多了,这些是我精选出来的

④各大厂大模型面试题目详解

⑤640套AI大模型报告合集

⑥大模型入门实战训练

如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能 ‌突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

👉获取方式:
有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓