把几十份 PDF 扔给聊天机器人,不等于建成了知识库。
这话你可能听着刺耳,但它是对的。真正可用的本地知识库必须完成四件事:文档能稳定解析、内容能被正确检索、回答时引用原文、拔了网线还能跑。缺任何一环,你只是在一个好看的聊天界面上对自己撒谎。
本文用 DeepSeek + Ollama + AnythingLLM 这套方案,走完从零搭建到三轮验证再加断网测试的全流程。每一步我都会标注最容易配错的地方——因为我自己配错过。
RAG 是什么——三行字说清楚
别跳进安装命令之前,先理解这条链路。它不复杂:
你的 PDF/Word/Markdown
↓ 拆成小块(Chunks)
嵌进向量数据库(LanceDB,每条文本对应一组数字向量)
↓ 你提问时,问题也变成向量
从库中找出语义最相近的几段
↓ 把片段 + 问题一起丢给 DeepSeek
生成带上下文的回答这就是 RAG(检索增强生成)。它解决的是「模型不认识你的私有资料」这个问题。但它不会自动保证正确——文档解析崩了、分段切歪了、检索漏了、小模型理解跑偏了,回答都会歪。
三个工具:谁管什么
这套方案用三个组件各司其职:
| 组件 | 管什么 | 本文选择 |
|---|---|---|
| Ollama | 下载、管理并运行本地模型,提供 API | 服务地址 127.0.0.1:11434 |
| DeepSeek-R1 | 理解问题、读检索片段、生成回答 | deepseek-r1:8b(推荐起步) |
| BGE-M3 | 把文档和问题变成向量,做语义检索 | bge-m3 |
| AnythingLLM | 管理工作区、文档、向量库、聊天界面 | Desktop 单机版 |
最容易配错的地方在这: 聊天模型和嵌入模型是两个不同的东西,不能互换。DeepSeek-R1 负责回答,BGE-M3 负责向量检索。AnythingLLM 的下拉列表会同时显示两者——名字像,功能完全不同。等下配的时候我再说一遍。
硬件的真话:别一上来就上 14B
官方说基础配置是 16GB 内存、8 核 CPU。实际跑下来的体感:
- 8GB 内存、无独显 → 用
deepseek-r1:1.5b能跑通流程,但复杂问答能力有限,差不多是「证明链路能通」的水平 - 16GB 内存、8GB 左右显存 →
deepseek-r1:8b,模型文件约 5.2GB,本文推荐的起点 - 32GB 内存或更高显存 →
deepseek-r1:14b,回答质量更好,模型约 9GB - Apple Silicon Mac → 8B 起步,统一内存 16GB 以上从容
文档方面别贪多。第一轮就准备 3-10 份结构清楚、内容可验证的资料。扫描版 PDF 用之前先确认能不能选中文字——不能的话做 OCR。不然界面显示「上传成功」,实际上没有可检索的正文。
七步搭完整个链路
1. 装 Ollama
Ollama 官网
ollama --version
curl http://127.0.0.1:11434/api/version能返回版本号就行。浏览器直接打开这个地址没界面是正常的——AnythingLLM 连的是 API。
2. 下载两个模型
ollama pull deepseek-r1:8b
ollama pull bge-m3BGE-M3 约 1.2GB,支持 100+ 语言、最多 8192 Token 输入。先单独测一下 DeepSeek:
ollama run deepseek-r1:8b输入一个中文问题,能正常回答就 /bye 退出。8B 跑不动就换 deepseek-r1:1.5b。再说一遍:不要用 deepseek-r1 做文档向量化,那是 BGE-M3 的活。
3. 装 AnythingLLM Desktop
anythingllm.com/desktop 下载。Desktop 版对个人是最对的选择——单用户、一键装、资料全在本地。需要多人账号、权限管理和网页访问时再考虑 Docker。别一上来就 Docker,多一层部署多一层排查难度。
4. 连接三个配置项
打开 AnythingLLM 的设置面板:
- LLM Provider:Ollama →
http://127.0.0.1:11434→ 模型选deepseek-r1:8b - Embedding Provider:Ollama → 同一地址 → 模型选
bge-m3 - Vector Database:直接用默认的 LanceDB。别为了「更专业」提前上 Milvus 或 Pinecone——LanceDB 处理常见本地知识库绰绰有余
如果模型下拉列表为空:先 ollama list 确认模型存在,再重启 Ollama 和 AnythingLLM。
5. 创建工作区并导入文档
一个工作区 = 一套独立的文档范围 + 聊天记录 + RAG 参数。不要把财务、产品、个人笔记全塞进同一个工作区,检索结果会互相串。
上传文件 → 检查是否完成解析(不是只出现在上传列表)→ 嵌入到工作区 → 等候向量化完成 → 再提问。
6 & 7 见下面的测试和提示词部分,单独展开讲。
用三类问题验真伪
别用「总结这些文件」当第一次测试。总结通顺也可能掩盖漏检。
精确事实题:
根据知识库,验收需要提交哪些材料?逐条列出,标明信息来源。不要补充文件中没有的要求。
答案必须能逐项和原文核对。
跨文档对照题:
比较 A 版和 B 版制度中关于审批时限的差异。分别引用。如果某份文件没说,写「文档未说明」。
这能检查检索是不是只扫到了其中一份。
反例题(最关键的一道):
知识库是否规定了海外差旅每天 500 元补贴?没有依据不要推测。
一个可靠的知识库必须允许模型回答「当前知识库中没有找到依据」。如果它永远能编出一个肯定答案,问题不在资料太少——是你的提示词和回答约束太松。
一段更可靠的工作区提示词
在工作区的系统提示框里加:
你是本工作区的资料检索助手。
回答优先依据检索到的文档片段。
涉及日期、金额、版本、数量和责任人,必须给出来源文件。
不同文档冲突时,分别列出,不自行选择。
没有找到直接依据时,回答「当前知识库中没有找到依据」。
不要把常识、猜测或模型记忆伪装成文档结论。提示词能约束回答方式,但不能修复解析失败和漏检。原文就在库里但模型一直找不到——先查文档内容、Embedding 模型和 RAG 参数,再考虑换更大的 LLM。
检索不准?按这个顺序查
- 确认原文能被复制。 扫描 PDF 先 OCR,复杂表格转 Markdown
- 确认文件已经嵌入工作区。 上传列表里有 ≠ 已经写入向量库
- 确认 Embedding 模型选的是 BGE-M3。 不是 DeepSeek-R1、Llama 或其他聊天模型
- 用原文关键词测试。 关键词都找不到,说明解析或索引有问题
- 再调 RAG 参数。 适当增加 Max Context Snippets,或开 Accuracy Optimized 重排
- 最后才换更大的聊天模型。 检索片段都不对,换再大的 LLM 也只是更流畅地回答错误内容
这条顺序是你以后排查时的检查清单。收藏好。
怎么确认真的能断网跑
「用了 Ollama」不等于「整个链路自动离线」。只要 LLM、Embedding、重排服务或工具调用中有一项走云端,资料就离开了你的设备。
断网测试三步:
- 确认两个模型都已在 Ollama 中下载完成
- 确认 LLM 和 Embedder 都指向
127.0.0.1:11434,别启用联网搜索和外部 Agent - 断网 → 重启 Ollama 和 AnythingLLM → 重新提问已验证过的问题
能跑通才算真正离线。
AnythingLLM 和 Obsidian 不是对手
这是我见过最多人搞混的一组工具。
- AnythingLLM 本质是 RAG 问答层——你把现成的 PDF 扔进去,它帮你检索+回答。适合「问资料」
- Obsidian 本质是笔记工具——你每天写、建链接、沉淀体系。适合「写知识」
不需要二选一。我一直推荐的做法:Obsidian 管 Markdown 原稿,AnythingLLM 负责问答。
日常笔记存在 Obsidian 的本地 Vault 里(Markdown 纯文本,天然可离线、可 Git 管理、可迁移);需要集中提问时,把选定目录导入 AnythingLLM,用 Ollama 完成本地检索。
注意:Obsidian 里的 Markdown 改了之后,AnythingLLM 的向量库不会自动同步。要么手动重新嵌入变动的文件,要么记一个「最后索引日期」。不然你问到的可能是旧版知识。
起步建议
第一次搭别想一口气把所有文档全灌进去。
先跑通最小闭环: 5 份文档 + 两个模型(DeepSeek-R1:8b + BGE-M3)+ 一个工作区。确认每一环都通:能解析、能检索、能说「没找到依据」、能断网运行。
闭环跑通之后,再决定要不要加文档、升模型。如果你主要是读现成的 PDF 和制度文档,从 AnythingLLM 开始;如果知识主要靠你自己每天写出来,从 Obsidian 开始;两种需求都有,就用 Obsidian 管原稿 + AnythingLLM 做问答层。
官方资料
- AnythingLLM Desktop 官方概览
- AnythingLLM 连接 Ollama LLM
- AnythingLLM 配置 Ollama Embedder
- AnythingLLM 文档附加与 RAG 说明
- Ollama Windows 官方文档
- Ollama DeepSeek-R1 模型页
- Ollama BGE-M3 模型页
- Obsidian 数据存储方式
- Obsidian 搜索官方文档

评论(0)