技术博客引力科技2026-07-14·5 分钟阅读
RAG 落地实践:从文档到可问答的知识库
什么是 RAG
RAG(Retrieval-Augmented Generation,检索增强生成)是一种让大模型基于外部知识回答问题的架构。它解决了大模型的两个核心局限:知识时效性差、容易产生幻觉(编造事实)。
简单说:RAG = 搜索引擎 + 大模型。先从你的文档库里检索相关片段,再让大模型基于这些片段回答。
完整流水线
一条生产级 RAG 流水线包含五个阶段:
- 文档处理:解析 PDF/Word/网页,清洗文本
- 切分:把长文档切成适合检索的小块(chunk)
- 向量化:用 embedding 模型把文本块转成向量
- 检索:用查询向量做相似度搜索,召回 top-k 候选
- 重排序 + 生成:精排候选片段,拼进 Prompt 喂给大模型
文档切分策略
切分是影响检索质量最关键的一步。切太大召回不精准,切太小丢失上下文。
| 策略 | 粒度 | 适用场景 |
|---|---|---|
| 固定长度 | 500 字符 | 快速验证 |
| 按段落 | 自然段 | 结构化文档 |
| 按语义 | 300-500 字 + 50 字重叠 | 推荐,生产环境 |
向量化代码示例
用 Python + sentence-transformers 把文本转向量:
from sentence_transformers import SentenceTransformer
# 加载中文 embedding 模型
model = SentenceTransformer("BAAI/bge-small-zh-v1.5")
# 单个文本块向量化
chunk = "AI 数字员工能自动处理客服询价、生成报价单。"
embedding = model.encode(chunk)
print(f"向量维度: {embedding.shape}") # (512,)
print(f"前5个值: {embedding[:5]}")
批量处理多个文档块:
chunks = [
"AI 数字员工能自动处理客服询价。",
"智能跟单系统自动提醒未成交商机。",
"打通 ERP 实时查询库存与价格。",
]
embeddings = model.encode(chunks, normalize_embeddings=True)
# 计算查询与每个块的相似度
query = "怎么自动回复客户询价"
query_embedding = model.encode([query], normalize_embeddings=True)
similarities = model.similarity(query_embedding, embeddings)
print(f"相似度: {similarities}")
检索与重排序
单纯靠向量相似度检索,准确率通常只有 60-70%。加一层重排序(reranker)能显著提升。
关键结论:重排序比单纯增加 top-k 更有效。先召回 20 条(top-k=20),再精排取前 5 条,比直接召回 5 条准确率高得多。
Prompt 工程
最后一步是把检索到的片段拼进 Prompt。结构化 Prompt 能减少幻觉:
你是一个企业知识库助手。请仅基于以下参考资料回答问题。
如果参考资料中没有相关信息,请明确说"知识库中未找到相关内容",不要编造。
## 参考资料
{检索到的文档片段}
## 问题
{用户问题}
踩坑记录
实际落地中常遇到的几个坑:
- PDF 表格丢失:表格解析后变成乱序文本,检索召回率暴跌。建议用专门的表格提取工具(如 camelot)
- 中英文混合切分:中文字符数 ≠ token 数,固定字符切分会把英文单词劈成两半
- 冷启动数据不足:文档少于 50 篇时,向量检索效果不稳定,建议先用关键词检索兜底
小结
RAG 不是银弹,但它是当前企业落地大模型性价比最高的架构。关键不在模型多强,而在文档处理和检索质量——这两块占整个工程量的 70%。