别再硬调模型了:一文搞懂 RAG 检索增强生成的正确打开方式


很多团队接入大模型后的第一反应是:把所有资料塞进提示词,或者直接微调一个专属模型。结果要么是上下文爆炸、成本飙升,要么是模型一遇到私有知识就开始一本正经地胡说八道。如果你也被这两个问题困扰,那么 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 效果翻倍的四个进阶技巧

  1. 混合检索:向量检索 + BM25 关键词检索并行,再用 RRF 融合排序,能同时覆盖语义相似和精确匹配两类问题。
  2. 查询改写:让模型先把用户的口语化问题改写成更适合检索的形式,多轮对话中尤其有效。
  3. 引用溯源:要求模型在回答中标注来源 chunk 编号,既能方便用户核实,也能显著抑制幻觉。
  4. 检索评估:用召回率(Recall@K)评估检索质量,别只盯着最终回答好不好——检索不行,生成端再怎么调提示词都是白费。

五、总结与展望

RAG 之所以成为企业落地大模型的事实标准,是因为它把”知识更新”从昂贵的训练问题变成了廉价的工程问题。当前的趋势也很清晰:Agentic RAG 正在兴起——让 Agent 自主决定何时检索、检索什么、检索几轮,RAG 从一条固定流水线进化为可规划的工具调用;而长上下文模型的普及并未取代 RAG,反而推动两者结合:大海捞针时,先检索缩小范围依然是性价比最高的路径。

如果你正在搭建自己的知识库问答系统,建议从”朴素 RAG”起步快速验证价值,再逐步叠加混合检索、重排和查询改写。先跑起来,再变强——这本身就是一种工程上的”检索增强”。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注