本地 DeepSeek 已经能在 ollama 里跑起来了,但一让它答公司内部文档就胡说。这篇不聊参数和框架对比,只走一条动作线:在 AnythingLLM 里把 ollama 接上、给知识库配一个靠谱的嵌入模型、把文档切好灌进去,再用几个问题验证它到底有没有真读到你的资料。跑不通的地方也给排查顺序。
本地 DeepSeek 已经在 ollama 里跑起来,随口聊两句没问题,可一旦把公司内部的制度、产品说明、客服话术丢进去问,它就开始一本正经地编。原因不在模型不行,而是它压根没读到你的资料,只是拿训练时的印象在接话。要让它答得靠谱,得在中间加一层检索:把文档切好、转成向量存起来,提问时先把相关片段捞出来塞进上下文。AnythingLLM 就是干这层活的,图形界面点几下就能接上本地 ollama。
这篇不讲框架对比,也不聊参数调优,只走一条动作线:动手前确认三件事、先挑嵌入模型、再灌文档做分段、最后用几类问题验证它到底有没有真读到你的资料。跑不通的地方,末尾给一个从上到下的排查顺序。文档、模型这些数字会变,遇到要核对的地方我都指了站内页面,去那边看当时的值。
动手前先确认三件事
很多人一上来就装 AnythingLLM,结果卡在连不上,然后开始怀疑模型。其实连接层的问题和模型无关,先确认基础条件能省掉一大半来回。这三件事都不难,但顺序错了会浪费很多时间。
- ollama 服务得能被 AnythingLLM 访问到:本机跑就填本机地址,容器里跑要改成宿主机可达的地址,两个东西不在同一网络里,填错地址当然连不上,这不是模型问题;
- 确认拉下来的 DeepSeek 是对话模型,别把纯推理或纯补全的权重当聊天用,哪个权重适合对话,到 /models 看条目说明;
- 先想清楚资料的用法:是「照着资料回答」还是「照资料改写」,前者对分段和召回的容错低,后者松一些。资料本身互相矛盾、或者大量表格扫描件,知识库只能照搬矛盾,不会替你裁决,这种情况不适用。
先挑嵌入模型,再谈挂知识库
知识库能不能答对,很大程度不取决于对话模型,而是取决于嵌入模型。嵌入模型负责把文档和问题都转成向量,靠向量距离找相关片段。嵌入选得不对,问法稍微一换就召不回,对话模型再强也只能干瞪眼——它根本没见过你要的那段资料。
| 配置项 | 作用 | 改完之后要做什么 |
|---|---|---|
| 对话模型 | 生成回答,选对话权重 | 无需重建索引,换个模型直接生效 |
| 嵌入模型 | 文档和问题转成向量,决定召回 | 必须重建索引,否则新旧向量对不上 |
| 分段设置 | 决定每段多长、按什么切 | 已入库文档需要重新投喂或重新同步 |
- 中文资料优先挑中文语义检索表现稳的嵌入模型,别直接沿用默认的英文模型,选型维度可以去 /embeddings 对照;
- 对话模型和嵌入模型是两个独立设置项,改完嵌入一定要重建索引,不然旧向量和新向量不在一个空间里,检索结果会乱;
- 本地嵌入跑不动就换成外部嵌入接口,但得接受资料片段外发这一步,数据不出内网的要求下不适用。
投喂与分段:决定答得准不准
文档进库不是拖进去就完事,怎么切直接影响检索命中。切太碎,每段只剩半句话,上下文丢了;切太大,一段里塞了好几个主题,问题只匹配到其中一句,剩下全是噪声。分段粒度得按文档类型来定,没有一刀切的值。
- 先建一个小工作区挑一小批最典型的文件,比如三五个 FAQ 和一个制度文件,先灌进去跑通,出问题时才知道是哪一步坏。
- 按类型定分段条款、FAQ 这类短段落可以按自然段切;长章节按标题切,让每段围绕一个主题。
- 清理重复版本同一份制度存了三个版本,模型会把三版一起引用,答案自相矛盾。入库前先把旧版本删掉。
- 给文件起能看懂的名字检索时文件标题会一起参与匹配,命名混乱等于白白丢掉一路线索,用「部门-文档名-年份」这种格式。
怎么验证它真的读到了你的资料
灌完文档别急着用,先做一轮自测。核心是分清两种情况:是压根没召回相关片段,还是召回了但模型没答对。这两者的修法完全相反,搞混了会越调越乱。
- 准备三类问题:文档里明写的、需要跨两段拼起来的、文档里根本没有的,第三类看它是否老实说不知道,而不是硬编;
- 答错先看答案下面的引用来源,没引用任何文档说明没召回,引用了但答偏说明召回对、生成错;
- 没召回就调分段和相似度门槛,召回了答错再考虑换对话模型或改写提问方式;
- 多轮追问会带上历史上下文,测召回时用单轮问法,否则分不清是检索问题还是上下文干扰。
连不上、不回答、答得慢的排查顺序
出问题的表现就那几类,按层往下查比逐个试参数快得多。先排除最简单的连接问题,再动检索设置,最后才怀疑性能。
| 现象 | 先查哪一层 | 怎么判断 |
|---|---|---|
| 连不上模型 | 连接层 | 命令行先确认模型本身能出字,再查地址和端口 |
| 什么都搜不到 | 检索层 | 把相似度门槛调低做对照,能召回说明门槛太高 |
| 召回了但答偏 | 生成层 | 换对话模型或改写提问方式,看引用是否对得上 |
| 首字特别慢 | 性能层 | 看是模型加载占显存,还是长文档检索本身在等 |
显存和并发的量级算法,到 /models/deploy 自己套一遍,别凭感觉估。文档更新后要重新同步,更新频率高就做增量同步,更新少就直接重建索引,取舍看你的维护成本。
下一步本地部署只是起点,模型选型、显存需求、部署方式这些数字一直在变,去 /models/deploy 对照当时的实际配置,再决定要不要换权重或调并发。→常见问题
本地知识库能不能不联网就用?
检索和生成都可以完全在本地完成,前提是对话模型和嵌入模型都跑在自己机器上。一旦图省事把嵌入换成外部接口,投喂的资料片段就会离开本机,这时候「不联网」只剩对话那一段。想全本地,就选一个显存装得下的嵌入模型。
挂了知识库还是答不对,先改哪儿?
先看引用来源,别急着换更大的对话模型。来源没命中说明是分段或嵌入的问题,换模型也救不回来;来源对了但答案跑偏,再去看提问方式和上下文窗口够不够。一次只改一个变量,改完重跑同一批问题,才比得出效果。
多少份文档才值得上知识库?
看的是问答频率和资料稳定性,不是页数。资料经常改、答案又需要带出处,几份也值得建;资料基本不变、答案靠常识就能说清,塞进去反而增加维护量。小团队可以先拿一个高频问题的工作区试,用不上就别扩。