知识库与工作流编排
学习目标:掌握知识库的搭建方法(文档上传、分块策略、检索方式),能用工作流实现"检索 → 处理 → 输出"的多步骤 Agent
预计时间:35 分钟
难度等级:⭐⭐⭐☆☆
一、为什么知识库是 Agent 的第二大脑
先说结论:没有知识库的 Agent,和 ChatGPT 没区别。
ChatGPT 之所以"什么都懂一点",是因为它训练时"读过"大量通用数据。但你让它回答你们公司的产品细节、你们团队的内部规范——它只能瞎编。
知识库解决的就是这个问题:让 Agent 知道它原本不知道的事。
| 维度 | 没有知识库 | 有知识库 |
|---|---|---|
| 知识来源 | 模型训练数据(通用) | 你的文档(专业) |
| 回答准确性 | 大致正确,细节可能错 | 基于真实文档,准确性高 |
| 可控性 | 不知道它在说什么 | 能追溯答案来自哪个文档 |
| 更新 | 需要重新训练模型 | 上传新文档即可 |
二、上传文档构建知识库
2.1 支持的数据源
| 数据源 | Coze 支持 | Dify 支持 | 适合场景 |
|---|---|---|---|
| PDF 文件 | ✅ | ✅ | 产品手册、研究报告 |
| Word/TXT | ✅ | ✅ | 公司制度、操作手册 |
| Excel/CSV | ✅ | ✅ | 产品数据、价格表 |
| 网页 URL | ✅ | ✅ | 在线文档、博客文章 |
| Notion | ✅ | ✅ | 团队知识库 |
| 飞书文档 | ✅ | ❌ | 飞书生态团队 |
| 数据库 | ✅(MySQL) | ✅(多种) | 结构化数据查询 |
| API | 有限 | ✅ | 动态数据 |
2.2 Coze 知识库搭建实操
步骤:
- 进入 Coze 工作空间 → 左侧菜单点击"知识库"
- 点击"创建知识库"
- 选择数据源类型(比如"文件")
- 上传文件或输入 URL
- 配置分块策略(下一节详细讲)
- 等待处理完成(1-5 分钟)
- 在 Bot 配置页面关联这个知识库
文件准备建议
- 一个知识库的主题要聚焦。别把"公司制度"和"产品手册"塞同一个知识库。
- PDF 尽量用文字版(可以选中复制文字的),扫描件效果差。
- 单个文件控制在 20MB 以内,超过就拆分。
2.3 Dify 知识库搭建实操
步骤:
- 左侧菜单点击"知识库" → "创建知识库"
- 上传文件或选择数据源
- Dify 会多一步:让你选择索引方式
- 高质量模式:使用 Embedding 模型向量化,检索效果好,消耗 Token
- 经济模式:使用关键词索引,检索效果一般,但不消耗 Token
- 配置分块策略
- 等待处理完成
- 在工作流中添加"知识检索"节点,关联这个知识库
Dify 索引方式选择
99% 的场景选"高质量模式"。经济模式只适合对成本极其敏感且对检索质量要求不高的场景。
三、分块策略
3.1 为什么要分块?
LLM 有上下文长度限制。你不能把一整个 200 页的 PDF 塞给模型,所以要切成小块。
但分块不是简单地"按字数切"——切得太大会稀释信息,切得太小会丢失上下文。
3.2 分块方式对比
| 分块方式 | 原理 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|---|
| 自动分块 | 平台自动按段落和语义切 | 省事 | 可能切在不合适的位置 | 大多数场景 |
| 按字数分块 | 固定每块 N 个字 | 可控 | 可能在句子中间断开 | 格式统一的文档 |
| 按段落分块 | 按换行符/标题切 | 保持语义完整 | 块大小不均匀 | 结构清晰的文档 |
| 按分隔符分块 | 按自定义标记切 | 最灵活 | 需要文档有统一格式 | 你能控制的文档格式 |
| 父子分块 | 检索用小块,回答用大块 | 检索精准+上下文完整 | 配置复杂 | 高质量要求的场景 |
3.3 分块大小建议
| 文档类型 | 推荐块大小 | 理由 |
|---|---|---|
| FAQ / 问答对 | 200-300 字 | 每条就是一个完整的问答 |
| 产品手册 | 500-800 字 | 一个产品特性完整描述 |
| 长篇报告 | 800-1200 字 | 保留足够的上下文 |
| 代码文档 | 300-500 字 | 函数级别 |
实操建议
先用自动分块试试效果。如果发现检索结果不对,再手动调整。不要一开始就纠结分块策略。
四、检索方式
4.1 三种检索方式
| 检索方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 向量检索 | 把文本变成向量,算相似度 | 理解语义,"苹果手机"能匹配"iPhone" | 可能遗漏精确关键词 |
| 全文检索 | 传统关键词匹配 | 精确匹配关键词 | 不理解同义词 |
| 混合检索 | 向量 + 全文结合 | 兼顾语义和精确 | 计算量更大 |
4.2 怎么选?
你的场景?
│
├─ 用户提问方式多样(同义词多)→ 向量检索
├─ 需要精确匹配(比如产品编号、型号)→ 全文检索
├─ 都想要 → 混合检索
└─ 不确定 → 先用混合检索,效果通常最好4.3 检索参数调优
| 参数 | 作用 | 建议值 |
|---|---|---|
| Top K | 返回最相关的 K 个文档块 | 3-5(太多了 LLM 会困惑) |
| Score 阈值 | 相关性低于这个值的不要 | 0.5-0.7(太低会返回不相关内容) |
| 重排序(Rerank) | 对检索结果二次排序 | 开启(Dify 支持,效果提升明显) |
五、多步工作流设计模式
工作流不是随意连几个节点。好的工作流有清晰的设计模式。
5.1 标准模式:输入 → 检索 → 处理 → 输出
这是最常用的模式,适合 90% 的知识库问答场景:
用户输入
↓
意图理解(LLM 节点)
↓
知识库检索(知识检索节点)
↓
答案生成(LLM 节点)
↓
输出回答在 Coze 中的实现:
- 在 Bot 中开启"工作流"模式
- 创建一个工作流:输入节点 → 知识库检索节点 → LLM 总结节点 → 输出节点
- 配置每个节点的变量传递
在 Dify 中的实现:
- 创建"聊天助手"或"工作流"应用
- 添加"知识检索"节点,关联知识库
- 添加"LLM"节点,将检索结果作为上下文传入
- 配置 System Prompt,要求基于检索结果回答
5.2 多路检索模式
当一个问题可能涉及多个知识库时:
用户输入
↓
意图分类(LLM)
↓
┌──────────┬──────────┐
│ 产品知识库 │ 售后知识库 │
└──────────┴──────────┘
↓ ↓
结果1 结果2
↓ ↓
└─────┬─────┘
↓
LLM 合并回答
↓
输出5.3 带兜底的模式
当知识库可能没有答案时,加一个"兜底"处理:
用户输入
↓
知识库检索
↓
相关性检查(条件分支)
├── 相关性够高 → LLM 基于知识库回答
└── 相关性不够 → LLM 用通用知识回答 + 提示"此回答不来自知识库"花叔的建议
永远加兜底。 不加兜底的工作流,遇到知识库里没的内容就会翻车——要么编造答案,要么报错。好的 Agent 应该能优雅地说"我不知道"。
六、工作流调优技巧
6.1 五个常见问题与解法
| 问题 | 原因 | 解法 |
|---|---|---|
| 回答和知识库内容不符 | 检索到了不相关的块 | 提高相关性阈值,减少 Top K |
| 回答太短/太笼统 | Prompt 没要求详细回答 | 在 LLM 节点的 Prompt 里加"请详细回答,至少 200 字" |
| 回答包含了多个文档的混搭 | Top K 设太大 | 减少到 3,加 Rerank |
| 每次回答不一致 | Temperature 太高 | 调到 0.1-0.3 |
| 响应太慢 | 节点太多或模型太慢 | 用更快的模型(如 GPT-4o-mini),减少节点 |
6.2 调优流程
1. 用 10 个测试问题跑一遍
2. 记录每个问题的回答质量(好/一般/差)
3. 针对回答"差"的问题:
a. 检查检索结果是否相关 → 不相关就调分块/检索参数
b. 检索结果相关但回答差 → 调 Prompt
4. 重复 1-3,直到 80% 以上的测试问题回答满意别追求 100% 完美。 知识库问答达到 80-85% 的准确率就算不错了。剩下的 15-20% 通过 Prompt 优化和兜底逻辑来兜住。
七、本节小结
回顾要点
✅ 知识库是 Agent 的"第二大脑"——没有它,Agent 和通用聊天机器人没区别
✅ 分块策略影响检索质量——先用自动分块,效果不好再手动调
✅ 三种检索方式:向量(语义)、全文(精确)、混合(都想要)——混合通常最好
✅ 标准工作流模式:输入 → 检索 → 处理 → 输出,加兜底
✅ 调优流程:10 个测试问题 → 定位问题 → 调参数/Prompt → 重复迭代
