很多团队接入大模型后的第一反应是:把所有资料塞进提示词,或者直接微调一个专属模型。结果要么是上下文爆炸、成本飙升,要么是模型一遇到私有知识就开始一本正经地胡说八道。如果你也被这两个问题困扰,那么 RAG(Retrieval-Augmented Generation,检索增强生成)大概率就是你真正需要的答案。
一、为什么需要 RAG?
大模型有两个天生的短板:知识截止(训练数据之外的世界它一无所知)和幻觉(不知道的时候它会编)。RAG 的思路非常朴素:在模型回答之前,先去你的知识库里检索出最相关的几段内容,把它们作为参考资料放进提示词,让模型”看着材料答题”。
一句话总结:微调改变的是模型”会什么”,RAG 决定的是模型”答题时看什么”。让模型掌握新知识,检索比重新训练便宜得多、也快得多。
二、RAG 的完整工作流
一个典型的 RAG 系统分为两个阶段:
1. 离线索引阶段
- 文档切分:把 PDF、网页、数据库文档切分成 300~800 字的语义完整的小块(chunk),切太碎会丢失上下文,切太大则稀释检索精度。
- 向量化:用 Embedding 模型把每个 chunk 转成高维向量,语义相近的文本在向量空间中距离更近。
- 入库:向量和原文一起存入向量数据库(如 Milvus、Qdrant、FAISS)。
2. 在线检索生成阶段
- 用户提问后,问题本身也被向量化;
- 在向量库中做相似度检索,召回 Top-K 个最相关 chunk;
- 把问题和召回内容一起拼成提示词,交给大模型生成最终回答。
三、30 行代码实现一个最小 RAG
下面用一个极简示例展示 RAG 的核心逻辑(演示用途,向量检索用余弦相似度暴力计算):
from openai import OpenAI
client = OpenAI(api_key="your-api-key") # 请使用自己的密钥,切勿硬编码上传
docs = [
"RAG 通过检索外部知识库来增强大模型的回答能力",
"向量数据库常用于存储 Embedding 并支持相似度检索",
"微调适合改变模型的风格与能力,而非注入实时知识",
]
def embed(text):
return client.embeddings.create(
model="text-embedding-3-small", input=text
).data[0].embedding
def retrieve(query, top_k=2):
qv, doc_vecs = embed(query), [embed(d) for d in docs]
score = lambda a, b: sum(x*y for x, y in zip(a, b)) # 归一化后内积即余弦相似度
ranked = sorted(zip(docs, doc_vecs), key=lambda x: score(qv, x[1]), reverse=True)
return [d for d, _ in ranked[:top_k]]
question = "如何让大模型了解我公司的内部文档?"
context = "\n".join(retrieve(question))
prompt = f"请仅根据以下资料回答问题:\n{context}\n\n问题:{question}"
answer = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
print(answer.choices[0].message.content)
生产环境中,把”暴力计算”换成向量数据库的 ANN 索引(如 HNSW),再把单轮检索换成带重排(Rerank)的两阶段检索,就是一套可用的 RAG 骨架了。
四、让 RAG 效果翻倍的四个进阶技巧
- 混合检索:向量检索 + BM25 关键词检索并行,再用 RRF 融合排序,能同时覆盖语义相似和精确匹配两类问题。
- 查询改写:让模型先把用户的口语化问题改写成更适合检索的形式,多轮对话中尤其有效。
- 引用溯源:要求模型在回答中标注来源 chunk 编号,既能方便用户核实,也能显著抑制幻觉。
- 检索评估:用召回率(Recall@K)评估检索质量,别只盯着最终回答好不好——检索不行,生成端再怎么调提示词都是白费。
五、总结与展望
RAG 之所以成为企业落地大模型的事实标准,是因为它把”知识更新”从昂贵的训练问题变成了廉价的工程问题。当前的趋势也很清晰:Agentic RAG 正在兴起——让 Agent 自主决定何时检索、检索什么、检索几轮,RAG 从一条固定流水线进化为可规划的工具调用;而长上下文模型的普及并未取代 RAG,反而推动两者结合:大海捞针时,先检索缩小范围依然是性价比最高的路径。
如果你正在搭建自己的知识库问答系统,建议从”朴素 RAG”起步快速验证价值,再逐步叠加混合检索、重排和查询改写。先跑起来,再变强——这本身就是一种工程上的”检索增强”。