模型的两个先天短板
把大语言模型直接当知识库用,很快会撞上两类问题。
第一类是时间问题:模型的知识停留在训练截止日。训练数据收口之后世界照常运转——新版本发布了、政策改了、框架的 API 换了——模型一无所知,还会一脸自信地给你去年的答案。
第二类是范围问题:公司内部的产品文档、工单记录、代码库、规章制度,这些私有知识在公开语料里从未出现过。模型不是「答错了」,而是「根本没见过」,于是开始编——幻觉(hallucination,模型一本正经地生成看似合理实则虚构的内容)最常见的来源之一,就是这种「被迫作答」。
两类问题的共同点是:**答案存在,只是不在模型参数里。**要补上这块短板,摆在前面的有两条路:把知识「烤」进模型权重,或者把知识放在模型外面、用的时候再递给它。后一条路就是 RAG,也是这个系列的主角。
RAG:先检索,再生成
RAG(Retrieval-Augmented Generation,检索增强生成)一句话就能讲清:回答问题之前,先从外部知识库里检索出相关片段,拼进提示词(prompt,喂给模型的输入文本),再让模型基于这些材料作答。
先解释三个贯穿全系列的术语:
- chunk(切块):把长文档切成的小段,是检索的基本单位。
- embedding(向量化):把文本映射成一串浮点数(向量),语义相近的文本在向量空间里距离也近,「按意思搜」靠的就是它。
- top-k:检索时只取相似度最高的 k 条结果,k 通常取个位数到十位数。
另一条路是微调(fine-tuning):用新数据继续训练,把知识直接写进权重。它的局限不少:知识更新要走完整训练管道,成本高、周期以天计;新增数据还可能冲淡旧能力,产生灾难性遗忘(catastrophic forgetting,学新忘旧);知识熔进权重之后说不清出处,审计与纠错都很困难。两条路的差别,一张表说清:
| 维度 | 微调 | RAG |
|---|---|---|
| 知识更新 | 重新训练,成本高、周期长 | 增删文档即生效,分钟级 |
| 可溯源 | 知识熔进权重,说不清出处 | 每个答案都能附上引用片段 |
| 数据量弹性 | 大规模知识灌入代价高 | 知识库随时可扩到海量 |
| 适用场景 | 固定风格、格式、领域语感 | 事实问答、知识频繁变化 |
一句话总结:微调改的是模型的「能力与习惯」,RAG 改的是模型的「参考资料」。知识类需求,后者几乎总是更划算。
最小流水线
RAG 的最小闭环只有六步:文档 → 切块 → 向量化入库 → 查询时检索 top-k → 拼进提示词 → 生成。前两步是离线准备,做一次;后四步发生在每一次提问时:
# 伪代码:RAG 最小闭环,不依赖任何具体商业服务
docs = load_documents("knowledge/*.md")
# 离线:切块并向量化入库
chunks = [c for d in docs for c in split(d, size=500, overlap=80)]
index = VectorIndex()
index.add([embed(c) for c in chunks], texts=chunks)
# 在线:检索 top-k,拼提示词,生成
def answer(question: str) -> str:
hits = index.search(embed(question), top_k=3)
context = "\n---\n".join(h.text for h in hits)
prompt = f"仅依据以下材料回答,材料里没有就直说不知道。\n{context}\n\n问题:{question}"
return llm(prompt)
二十行以内,RAG 的骨架全在这里。后面几篇要讲的所有优化——切块策略、混合检索、重排序、评测、知识图谱——都是在给这条流水线的某一段换零件,主干从来不变。
三种典型失败
RAG 系统答错,几乎都能归进三个桶:
- 检索不到:该命中的块根本没进 top-k。常见原因是切块切得太大或太小,块向量偏离了问题的语义;或者查询词与文档用词对不上——用户问缩写,文档写全称;用户问型号,文档谈参数。
- 检索到但没用上:相关片段进了提示词,答案却还是错的。多半是上下文里混进太多无关块形成噪音,或者关键片段埋在长提示词的中段,模型的注意力够不着。
- 答非所问:检索回来不少材料,但排序不对,排在前面的不是最相关的,模型被带偏了方向。
这三个桶恰好构成系列的路线图:下一篇讲切块——怎么切才能让每块「自包含、可回答」;第三篇讲混合检索与重排序——BM25 补字面匹配,交叉编码器管精排;第四篇讲评测——不测就不知道坏在哪一层;最后一篇讲 GraphRAG——跨文档串联的多跳问题怎么破。
什么时候用哪条路
- 知识频繁更新、需要给出处、文档量大而杂 → RAG。
- 要的是固定输出风格、语气、格式,而不是新知识 → 微调。
- 两者都要:先用 RAG 兜底事实正确性,再用微调统一语感与格式。
要点小结:RAG 的本质,是把「模型不知道」改造成「检索得到、再喂给它」;它的效果上限由检索质量决定,而检索质量的第一道关卡是切块。下一篇我们就从切块讲起。
读者留言
COMMENTS 暂无还没有留言,来说第一句?