在这里插入图片描述

读完本文,你将掌握知识库构建的核心技巧,让 AI 基于你的文档准确回答问题,告别"一本正经地胡说八道"。


上篇回顾

上一篇,小禾完成了:

  • Dify 平台部署(20 分钟)
  • DeepSeek 模型接入(10 分钟)
  • 基础对话功能验证

现在 AI 能对话了,但问它"公司年假怎么算",它只能瞎编。

附:上一篇链接

这篇,要把它变成真正的"企业知识库"——把文档喂给它,让它基于真实内容回答问题


RAG 是个啥?30 秒讲明白

在开始之前,先搞懂一个概念:RAG(检索增强生成)

用户问题

检索相关文档

拼接上下文

模型生成回答

返回答案

简单说就是:

  1. 用户问:“年假怎么算?”
  2. 系统检索:从知识库里找到《员工手册》第三章
  3. 拼给模型:“根据以下内容回答:[员工手册内容]… 问题:年假怎么算?”
  4. 模型回答:基于真实文档生成答案

这样 AI 就不会瞎编了——它的回答有据可查。


创建知识库:把文档喂进去

第一步:创建知识库

  1. 登录 Dify 控制台
  2. 左侧菜单点击「知识库」
  3. 点击「创建知识库」
  4. 填写名称,比如"公司内部文档"
  5. 点击「创建」

第二步:上传文档

Dify 支持的文档格式:

格式 支持情况 说明
TXT 完美 最推荐,处理最稳定
Markdown 完美 保留格式
PDF 支持 扫描件效果差,建议用文字版
Word(.docx) 支持 复杂表格可能丢格式
HTML 支持 会自动提取正文
Excel 部分支持 建议转成 CSV 或 Markdown 表格

点击「添加文件」,选择你的文档上传。

第三步:选择分段策略(重要!)

上传后,Dify 会问你怎么切分文档。这一步非常关键,直接影响检索效果。

自动分段:Dify 自动识别段落,适合格式规整的文档。

自定义分段:自己设置规则,小禾一般这么配:

参数 建议值 说明
分段标识符 \n\n(两个换行) 按段落切分
最大分段长度 500-800 字符 太长检索不精准,太短缺上下文
分段重叠 50-100 字符 避免切断句子

小禾的经验

  • 规章制度类:按条款切,每条一段
  • 技术文档类:按章节切,500-800 字符
  • FAQ 类:按问答对切,一问一答一段

第四步:等待索引完成

上传后,Dify 会自动:

  1. 解析文档内容
  2. 按规则分段
  3. 生成向量嵌入(Embedding)
  4. 存入向量数据库

进度条走完,知识库就可以用了。


把知识库接入应用

知识库建好了,现在要让聊天应用"用上"它。

方法一:在已有应用中添加知识库

  1. 打开你之前创建的聊天应用
  2. 点击「编排」
  3. 在左侧找到「上下文」模块
  4. 点击「添加」→ 选择你的知识库
  5. 点击「发布」

方法二:创建新的知识库问答应用

  1. 点击「创建应用」
  2. 选择「聊天助手」
  3. 在「上下文」中添加知识库
  4. 配置模型(选 DeepSeek)
  5. 发布并测试

检索参数调优

在「上下文」设置里,有几个重要参数:

参数 说明 建议值
Top K 检索返回的段落数 3-5
Score 阈值 相似度最低分 0.5-0.7
检索模式 向量/全文/混合 混合检索

小禾的调参心得

  • Top K = 3:大多数场景够用,太多会干扰模型
  • Score 阈值 = 0.6:过滤掉不太相关的内容
  • 混合检索:向量检索找语义相关,全文检索找关键词命中,两者结合最稳

实战踩坑:那些文档没告诉你的事

坑 1:问啥都说"未找到相关信息"

症状:明明文档里有,AI 就是找不到。

排查步骤

# 1. 检查文档是否成功导入
在知识库页面,点击「文档」,确认状态是「已完成」

# 2. 检查分段是否合理
点击文档,查看「分段」,看内容是否被正确切分

# 3. 测试检索
在知识库页面,点击「召回测试」
输入用户可能问的问题
看能否召回相关段落

常见原因

  • 文档是扫描 PDF,内容没被识别出来 → 换成文字版
  • 分段太大,检索不精准 → 调小分段长度
  • 问题和文档用词差异大 → 调低 Score 阈值

坑 2:回答不准确,瞎编内容

症状:检索到了相关段落,但 AI 的回答还是有问题。

解决方案

  1. 优化 System Prompt
你是一个企业知识库助手。

重要规则:
1. 只能根据提供的「上下文」内容回答问题
2. 如果上下文中没有相关信息,直接说"文档中未找到相关内容"
3. 不要编造、推测或添加上下文中没有的信息
4. 回答时引用来源,如"根据《员工手册》第三章..."

回答格式:
- 先给出直接答案
- 再补充细节说明
- 最后注明信息来源
  1. 调低 Temperature

知识库问答场景,Temperature 建议设为 0.1-0.3,让模型更"老实"。

坑 3:中文检索效果差

症状:英文问题检索很准,中文就不行。

原因:默认的 Embedding 模型对中文支持一般。

解决方案

在 Dify 设置里,把 Embedding 模型换成对中文友好的:

模型 中文效果 说明
text-embedding-3-small 一般 OpenAI 默认
text-embedding-3-large 较好 OpenAI 大号
bge-large-zh 很好 专门针对中文优化
m3e-base 很好 国产,中文强

如果用本地部署,可以用 Ollama 跑 nomic-embed-textbge-m3

坑 4:长文档检索慢

症状:知识库文档多了以后,回答明显变慢。

优化方案

  1. 启用缓存:Dify 默认开启查询缓存,相同问题秒回
  2. 精简文档:删除无用内容,只保留核心信息
  3. 分库管理:按主题建多个知识库,应用按需挂载
  4. 升级向量库:数据量大时,考虑换成 Milvus 或 Qdrant

进阶:让检索更精准的技巧

技巧 1:给文档加元数据

上传文档时,可以添加元数据标签:

# 文档属性
标题: 员工手册 2024 版
部门: 人力资源部
更新日期: 2024-01-15
文档类型: 规章制度

检索时可以按元数据过滤,比如"只搜索人力资源部的文档"。

技巧 2:预处理文档

上传前做一些清洗:

# 文档预处理示例
def preprocess_doc(text):
    # 1. 去除多余空白
    text = re.sub(r'\n{3,}', '\n\n', text)

    # 2. 统一标点符号
    text = text.replace(':', ': ').replace(';', '; ')

    # 3. 提取有效内容(去掉页眉页脚)
    text = re.sub(r'第 \d+ 页,共 \d+ 页', '', text)

    # 4. 保留结构化标记
    # 比如「第一章」「1.1」这种,方便分段

    return text

技巧 3:写好的分段提示

对于结构化文档,可以手动加分隔符:

---SECTION---
## 第一章 总则
公司成立于 2020 年...

---SECTION---
## 第二章 考勤制度
工作时间为早 9 晚 6...

---SECTION---
## 第三章 休假制度
年假计算方式如下...

然后在 Dify 分段设置里,用 ---SECTION--- 作为分隔符。

技巧 4:FAQ 模式

如果有现成的 FAQ,直接用问答对格式:

Q: 年假怎么计算?
A: 入职满一年享有 5 天年假,每增加一年工龄增加 1 天,上限 15 天。

Q: 加班费怎么算?
A: 工作日加班 1.5 倍,周末 2 倍,法定节假日 3 倍。

Q: 报销流程是什么?
A: 1. OA 提交报销单 2. 直属领导审批 3. 财务审核 4. 打款到工资卡

这种格式检索效果最好,因为问题和答案天然配对。


完整架构图

现在的架构是这样的:

私有化 AI 知识库架构

知识库

Dify 核心

提问

1. 向量检索
2. 返回相关段落
3. 拼接 Prompt
4. 生成回答
5. 返回答案

导入

导入

导入

员工手册

用户

Dify 平台

向量数据库
Weaviate

DeepSeek

技术文档

FAQ

API 服务

异步任务

PostgreSQL

数据流向:

  1. 用户提问
  2. Dify 将问题转成向量,在向量库中检索
  3. 取出最相关的 K 个段落
  4. 把段落 + 问题拼成 Prompt 发给 DeepSeek
  5. DeepSeek 基于上下文生成回答
  6. 返回给用户

效果对比:有知识库 vs 没知识库

问题 没有知识库 有知识库
“公司年假怎么算?” “一般来说,年假根据工龄计算…”(通用回答) “根据《员工手册》第三章,入职满一年享有 5 天年假…”(准确引用)
“报销需要什么材料?” “通常需要发票、申请单…”(瞎猜) “根据财务制度,需要:1. 正规发票 2. OA 报销单 3. 部门领导签字…”(具体流程)
“项目 A 的技术方案是什么?” “无法回答,我没有相关信息” “根据《项目 A 技术方案 v2.3》,系统采用微服务架构…”(直接引用文档)

快速避坑清单

# 1. 文档格式检查
- 优先用 TXT/Markdown,PDF 确保是文字版
- Excel 转成 CSV 或 Markdown 表格
- 扫描件先 OCR 再上传

# 2. 分段策略
- 规章制度:按条款切
- 技术文档:500-800 字符
- FAQ:一问一答一段
- 分段重叠:50-100 字符

# 3. 检索参数
- Top K: 3-5
- Score 阈值: 0.5-0.7
- 检索模式: 混合检索

# 4. Prompt 优化
- 明确要求"只根据上下文回答"
- 要求"引用来源"
- Temperature 调低到 0.1-0.3

# 5. 中文优化
- Embedding 模型换成 bge-large-zh 或 m3e
- 检索模式用"混合检索"

# 6. 性能优化
- 启用查询缓存
- 分库管理
- 定期清理无用文档

一键可用的配置模板

System Prompt 模板

你是一个企业知识库助手,专门回答关于 {{公司名称}} 的问题。

## 核心规则
1. 严格根据「上下文」中的内容回答
2. 上下文没有的信息,直接说"文档中未找到相关内容,建议咨询 XX 部门"
3. 不要编造、推测、添加文档中没有的信息
4. 回答时注明来源,如"根据《XX 文档》..."

## 回答格式
- 先给出直接答案(1-2 句话)
- 再补充必要的细节
- 最后注明信息来源

## 语气要求
- 专业、简洁、友好
- 不用"亲"、"呢"等过于口语化的表达

知识库配置模板

# 推荐配置
分段策略: 自定义
分段标识符: "\n\n"
最大分段长度: 600
分段重叠: 80

# 检索配置
检索模式: 混合检索
Top K: 4
Score 阈值: 0.6
重排序: 开启(如果可用)

# 模型配置
模型: deepseek-chat
Temperature: 0.2
Max Tokens: 1500

写在最后:从"能用"到"好用"

搭建私有化 AI 知识库,技术门槛其实不高——DeepSeek + Dify 的组合,让这件事变得异常简单。

但从"能用"到"好用",关键在于:

  1. 文档质量:垃圾进,垃圾出。花时间整理好文档,比调参数重要 10 倍
  2. 分段策略:切得好,检索才准
  3. Prompt 工程:给 AI 立好规矩,它才不乱说
  4. 持续迭代:收集用户反馈,不断优化

现在,你已经有了一个完整的私有化 AI 知识库。

接下来可以做的事:

  • 接入企业微信/钉钉,让员工随时提问
  • 加入更多文档,覆盖更多场景
  • 训练专属模型,让回答更"懂"你的业务

这两篇文章的完整收获

小禾踩过的坑:

  • 端口占用、容器残留数据
  • 扫描 PDF 内容识别失败
  • 分段不合理导致检索不准
  • 中文 Embedding 效果差
  • 模型瞎编,不按文档回答

值得复用的经验:

  1. 文档预处理很重要,格式统一、内容精简
  2. 分段策略要因"文"制宜
  3. Prompt 里明确"只根据上下文回答"
  4. 混合检索 + 适当的 Score 阈值
  5. 先跑通再优化,别一开始就追求完美

零成本清单:

  • Dify:开源免费 ✓
  • DeepSeek API:新用户有免费额度 ✓
  • DeepSeek 本地部署:开源免费(需要 GPU)✓
  • 数据:完全在自己服务器 ✓

如果你在搭建过程中遇到问题,欢迎留言交流。

知识库这事儿,搭起来不难,用起来才是开始。


环境信息:
- Dify 1.0.0+(2026-01 最新版)
- DeepSeek-V3 / DeepSeek-R1
- Embedding: bge-large-zh / text-embedding-3-small
- 测试文档量:约 50 篇,共 10 万字

我在公众号 DevJar 持续分享 AI 企业应用开发经验,欢迎查看 AI 后端架构及开发实战合集

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐