deepseek rag 增强检索知识库系统,步骤和注意事项

接入与开发

把用 DeepSeek 搭 RAG 知识库的落地步骤拆开讲:从选接口、切文档、存向量到评测与排错顺序,给判断标准和踩坑清单。

想自己用 DeepSeek 搭一套能问答的私有知识库,最容易卡在三个地方:不知道该先改哪一段、切完的文档进库后召回不准、出问题时分不清是检索错还是模型编。这篇按动手顺序把链路拆成几段,每段给可执行的检查动作和「什么情况下这套做法不适用」,照着走完能拿到一个能自测、能定位问题的版本。

想自己用 DeepSeek 搭一套能问答的私有知识库,最容易卡在三个地方:不知道先改哪一段、切完的文档进库后召回不准、出问题时分不清是检索错还是模型在编。这篇按动手顺序把链路拆成几段,每段给可执行的检查动作和「什么情况下这套做法不适用」,照着走完能拿到一个能自测、能定位问题的版本。

先说清楚一点:本文讲的是普通 RAG(检索增强生成)的落地顺序,不涉及训练和微调。目标不是一步做到最好的效果,而是先搭出一个能跑通、能改、能查错的骨架,再拿自测集一轮轮往上推。顺序别乱:进料没干净就调检索参数,相当于在烂地基上刷墙。

先定边界:这套 RAG 适合什么、不适合什么

RAG 擅长的是「资料里有答案、需要引用出处」的问答,比如内部制度、产品手册、技术文档库。如果任务是推理计算、跨库实时查数、要调外部系统拿最新状态,检索增强帮不上多少忙,硬套只会得到一堆看起来像样但没法验证的回答。开工前先把这两类需求分开,别指望一个系统全吃下。

动手前先确认 DeepSeek 接口的调用方式与计费口径,价格、额度这类数字别照抄别人文章,到 /official-api/providers/deepseek 核对当时的值。另外,向量化那一段可以换别的模型,别默认生成和嵌入用同一个;嵌入模型对召回的影响往往比生成模型更大,候选清单可以看 /embeddings 做对比。

  • 资料里有答案、要给引用:适合 RAG,按本文链路走。
  • 需要多步推理或调接口取实时数据:不适合纯 RAG,先考虑工具调用。
  • 团队只有几百篇短文档:先用全文检索或混合检索打底,往往比上向量库更快见效。
  • 查询词很具体、原文用词也固定:纯向量召回不一定占优,混合检索更稳。

进料:文档清洗与切分才是效果的地基

  1. 去噪声去掉页眉页脚、目录、水印和重复的宣传段落。做完抽 5 篇人工翻一遍,确认切出来的块单独看是完整意思。
  2. 按标题切按标题层级切段落,不要把整章塞进一个块。判定标准是每块独立能读懂,且能看出它属于哪一节。
  3. 二次切分超长段落再按语义或固定窗口切,块之间留一点重叠,避免一句话被拦腰截断。重叠别太大,否则同一段资料会占掉多个候选位。
  4. 带元数据每块带上来源文件名、章节路径、更新时间。后面做过滤、增量更新、回答给引用全靠它,没有就只能整库重建。

表格、扫描件、图片型 PDF 不要直接丢进流程,先做 OCR 与版面还原。如果切出来的块里出现大量乱码或表格错行,说明这一步没过关,后面的召回怎么调都不会准。每个块的元数据要留字段,后面按文件或时间过滤时直接可用。

组装链路:检索、重排、拼提示词

检索先用向量召回拿一批候选,再叠一层重排把明显不相关的剔掉。候选数量和重排开关要留成配置项,别写死在代码里,不然后面做自测对比时没法逐项调。日志里同时记下召回列表、重排后的结果和最终拼出的提示词,排查问题时能一眼看出断在哪一环。

拼提示词时明确要求「只依据下面资料回答,资料里没有就说没有」,并要求给出引用位置。结构约束写清楚,比反复调温度有用得多。多跳问题(要先查 A 再查 B)单轮检索往往不够,需要拆成多次检索,这时就不是简单 RAG,先想清楚要不要引入工具调用循环。

环节关键配置留什么日志
向量召回召回条数、相似度阈值原始召回列表与分数
重排开关、保留条数重排前后顺序对比
拼提示词资料拼接顺序、引用格式最终提示词全文
生成调用模型与参数模型原始输出

自测与排错:出问题时按这个顺序查

准备一份 20~30 条问题的自测集,每条写清标准答案出自哪份文件的哪一节。每次改切分或检索参数都跑一遍,看整体有没有退化,别用单条 case 反复调参,否则容易修好一个问坏三个。

  • 先看召回列表里有没有包含正确块;没有就是切分或嵌入的问题。
  • 再看正确块排在第几;排太靠后说明重排阈值或候选数量要调。
  • 接着看提示词有没有把资料用上;资料在里面但回答没引用,是提示词结构的问题。
  • 最后才怀疑生成模型;前面三步都干净,才轮到换模型或调参数。
现象优先怀疑下一步动作
答得笼统切太碎或候选太少加大块长度、提高召回条数
资料有却说没有重排阈值卡太严放宽阈值并重跑自测集
答得好但引用错位编号拼接出错检查提示词里的编号与来源映射
答非所问召回没命中查日志里正确块是否在候选内
下一步把接口口径、嵌入模型和费用情况对照着看一遍再动手搭,比边写边猜省事。

常见问题

DeepSeek 做 RAG,生成和向量化可以用同一个模型吗?

不建议。生成模型负责读资料写答案,向量模型负责把文本压成可比较的向量,两者优化目标不同。用生成模型兼职做嵌入,召回质量通常撑不住,而且成本和延迟都不划算。嵌入模型另挑,候选看 /embeddings,选完用小自测集比一比召回命中率再定。

文档只有几百篇,还需要上向量数据库吗?

不一定。数据量小、查询措辞和原文接近时,关键词或全文检索加一层重排就够用,部署和维护都简单。判断标准是自测集上召回命中率,如果全文检索已经能覆盖大部分问题,先别急着引向量库;等文档量涨上来、查询变得口语化再切也不迟。

回答总是说「资料里没有」,是模型问题吗?

多数是检索环节的问题。先看召回列表里到底有没有那段正确内容:没有就是切分或向量模型的问题;有但排在很后面就是重排或候选数设置的问题;都正常才去查提示词里资料有没有被正确拼进去。逐层排除比直接换模型有效得多。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。