文章目录
- RAG是什么
- 一、为什么需要 RAG
- 二、RAG 系统的标准链路
- 搭建RAG知识库系统
- 第一步:Ollama 侧补齐 embedding 模型
- 第二步:装 AnythingLLM 桌面版
- 第三步:向导里把四件套接上
- 第四步:建 Workspace + 投喂文档
- 第五步:提问,看引用
RAG是什么
RAG(Retrieval-Augmented Generation,检索增强生成)知识库系统,是当前企业把大模型"接私域数据"最主流的架构。核心思路一句话:回答问题时,不让 LLM 只靠训练记忆硬答,而是先去你指定的知识库里查资料,再把查到的内容拼进 Prompt 让模型基于证据生成——既解决幻觉,又解决知识过时和私有数据不可用的问题。
一、为什么需要 RAG
纯 LLM 的三个硬伤:
- 知识有截止日期,新政策、新文档它不知道
- 私有数据不能拿来训(合同、客服记录、内部 Wiki,合规+成本都不允许)
- 幻觉:它"编"得很自信,你没法溯源
RAG 的解法是:知识存在外挂库里,用时才取,取来才用。回答可溯源到原始段落,这是它比微调更适合大多数企业场景的原因。
二、RAG 系统的标准链路
文档接入 → 解析清洗 → 切片(Chunk) → Embedding → 向量库 ↓ 用户提问 → 查询改写 → 检索召回 → Rerank重排 → 拼Prompt → LLM生成文档解析
PDF / Word / Excel / PPT / 网页 / 图片 OCR。难点在扫描件、表格、多栏排版。常用工具:Unstructured、Marker、MinerU。切片策略(最容易踩坑的一环)
- 固定长度(500/800 token + 滑动窗口):简单但容易把一段话拦腰切断
- 按结构切(标题/段落/语义):结构化文档效果更好
- 父子文档(Parent-Child):检索用小块提精度,生成时拼回父块保上下文
- Embedding 向量化
把文本转成稠密向量,中文场景主流选:
- 开源:BGE、GTE、M3E
- API:text-embedding-3-small(便宜够用)
- 向量数据库
- 轻量原型:FAISS、Chroma
- 生产级:Milvus、Weaviate、Qdrant、PGVector
- 托管:Pinecone、阿里云 DashVector
- 检索 ≠ 只查向量(工业级都会做混合)
- 向量检索(语义匹配)+关键词检索(BM25 / 全文索引)双路召回
- 召回后用Rerank 模型(如 BGE-Reranker)重排 TopK,精度明显提升
- 生成
召回片段 + 用户问题拼 Prompt,交给 LLM。Prompt 里一般加一句"知识库不足以回答就说不知道",防硬编。
搭建RAG知识库系统
本地部署的模型是 Ollama + deepseek-r1:7b,详情可参考用Ollama本地部署大语言模型 ,剩下就是把 AnythingLLM 接上去、补齐 embedding 模型、投喂文档。下面按"Ollama 侧补齐 → 装 AnythingLLM → 向导四件套 → 建库投喂 → 验证 → 调优"六块走。
第一步:Ollama 侧补齐 embedding 模型
deepseek-r1:7b 有了,但 RAG 还需要一个嵌入模型把文档转向量:
# 嵌入模型(约 274MB,很小,中文通用够用)ollama pull nomic-embed-text如果你中文文档多(合同/手册/论文),
nomic-embed-text能用但非最优,可以更换成bge-m3(Hugging Face 下或 Ollama 社区版bge-m3:latest),中文检索匹配度明显高一档。先用 nomic 跑通,后面再换也行。
确认 Ollama 服务在跑,默认http://localhost:11434,AnythingLLM 待会连这个。
第二步:装 AnythingLLM 桌面版
去anythingllm.com/desktop下对应系统安装包,Windows/macOS/Linux 都有,一路下一步,不用注册账号,纯本地。
Docker 党跳过这步,直接
docker run -d -p 3001:3001 -v anythingllm:/app/server/storage --name anythingllm mintplexlabs/anythingllm:latest,但 Ollama Base URL 要填http://host.docker.internal:11434,容器内localhost不是宿主机。
第三步:向导里把四件套接上
打开 AnythingLLM,首次会弹设置向导(也可左下角 Settings 里改),关键四项:
| 配置项 | 选/填什么 | 说明 |
|---|---|---|
| LLM Provider | Ollama | |
| Ollama Base URL | http://127.0.0.1:11434(本机) | Docker 部署填http://host.docker.internal:11434 |
| Chat Model | deepseek-r1:7b | 下拉框应该能自动识别,空的话检查 Ollama 是否在跑 |
| Embedder | Ollama →nomic-embed-text(或 bge-m3) | 把文档转向量用 |
| Vector DB | LanceDB(默认) | 内置的,零配置,个人场景完全够 |
点 Test / Save,能绿就过。
第四步:建 Workspace + 投喂文档
Workspace 是 AnythingLLM 的隔离单位——一个区一套文档、一套 prompt,建议按主题拆(产品/技术/财务各一个),别全塞一个里,检索精度会高很多。
- 左侧新工作区,取名比如「员工手册」
- 进入工作区 → 点上传(或工作区名旁边上传图标)
拖文件进去——支持 PDF / Word / Excel / TXT / Markdown / 网页链接
勾选上传的文件 →移动到工作区
点保存并嵌入→ 开始:解析 → 切片(chunk)→ 向量化 → 入 LanceDB
进度条跑完就好,几秒到几分钟看文档大小
可以在向量数据库页签中查看向量数量:
第五步:提问,看引用
对话框直接问,比如"张三的手机号"
链路是:你的问题 → LanceDB 向量检索 top-k 片段 → 拼进 prompt → 送 deepseek-r1:7b 本地生成 → 回答底部带引用来源,点开能看到命中原文。
能出引用 = RAG 链路通了。
这里没有检索出刚上传的文档内容,因为聊天模式是“代理”,聊天模式决定了 AI“怎么回答你”以及“从哪里找答案”。
以下是这三个模式的核心区别和适用场景:
| 模式名称 | 核心逻辑 | 回答边界 | 典型适用场景 | 不适合的场景 | 用法提示 |
|---|---|---|---|---|---|
| 查询(Query) | 严格仅基于你上传的文档内容生成回答,完全不调用模型预训练的通用知识 | 文档有明确内容→准确回答;文档无相关内容→直接说「未找到相关信息」,绝不编造 | 私有知识库查询、合同条款核对、内部人员/数据查找、需要溯源的严谨问答 | 日常闲聊、需要通用常识补充的问题、需要实时信息的场景 | 能避免模型用「保护隐私」为由拒答,也不会编造张三的信息,回答底部一定会带文档引用可溯源 |
| 聊天(Chat) | 混合调用「上传文档内容+模型预训练通用知识」生成回答 | 文档有相关内容会参考,文档无内容时会用通用知识补充,可能出现轻微幻觉 | 日常咨询、内容润色、非严谨类问答、通用知识科普 | 涉密/内部信息查询、需要100%准确溯源的场景、合同条款类严谨查询 | 容易出现「模型知道通用隐私规则但没读到你的文档」的情况,要么拒答要么编造信息 |
| 代理(Agent) | 可自主调用你配置的外置工具(搜索引擎、计算器、文件管理器、API接口等)完成任务 | 回答能力取决于你开放的工具权限,可跨数据源整合信息 | 复杂任务处理(比如自动统计Excel数据、搜索最新行业政策、批量处理文件) | 单纯查询内部文档、隐私敏感场景、追求低延迟的简单问答 | 会增加响应延迟,还可能触发不必要的工具调用,反而干扰文档检索准确性 |
设置为“查询模式”后点“Update Workspace”:
然后就能检索文档的内容: