一、项目背景

最近我用 Coze 搭了一个中国近现代史问答助手——问史通。

它的目标很明确:基于知识库检索结果回答问题,而不是自由发挥。这样做的好处是:

  • 回答更聚焦,适合课程学习与知识问答
  • 能把回答范围限定在上传资料内,减少“幻觉”
  • 方便后续扩展成专题型、课程型或考试型助手

这篇文章我会完整记录一下“问史通”的搭建过程,包括:

  1. 为什么要选择 Coze 来做这类应用
  2. “问史通”的整体设计思路
  3. 知识库、工作流、对话配置的搭建过程
  4. 中途踩过的坑和排查思路
  5. 最终效果演示
  6. 适合继续优化的方向

如果你也想做一个面向垂直知识库的问答助手,这个流程基本可以直接复用。

二、项目目标与产品定位

“问史通”的定位不是一个泛知识聊天机器人,而是一个基于中国近现代史知识库的问答助手。

我的预期能力主要包括:

  1. 回答历史事件:如鸦片战争、五四运动、辛亥革命等
  2. 回答背景与影响:如某事件发生原因、历史意义、社会影响
  3. 回答概念型问题:如“为什么说中国是半殖民地半封建社会”
  4. 回答总结型问题:如“中国近代化探索为什么屡次失败”

为了保证回答可控,我给它设定了一个核心原则:

回答尽量基于知识库检索结果;如果资料不足,就明确说明“根据现有资料无法完整回答”。

这也是整个搭建过程里最关键的一条设计原则。

三、为什么选择 Coze

之所以选择 Coze,主要有三个原因:

  1. 上手快
    Coze 把知识库、工作流、大模型、对话体验这些能力都做成了可视化组件。
    对于想快速验证一个想法的人来说,门槛非常低。

  2. 适合做 RAG 类助手
    “问史通”本质上就是一个典型的 RAG(检索增强生成) 应用:
    – 用户提问
    – 先查知识库
    – 再把检索结果交给模型生成答案
    Coze 的“知识库检索节点 + 大模型节点 + 结束节点”这套组合,正好适合这个场景。

  3. 调试体验比较顺手
    在工作流调试时,可以直接看到:
    – 输入变量
    – 知识库检索结果
    – 模型入参
    – 模型输出
    – 最终返回结果
    对于排查“到底是没检索到,还是模型没吃进去检索结果”这类问题,非常有帮助。

四、准备工作:知识库素材整理

在正式搭建之前,我先准备了“问史通”的知识库内容。
这里我主要使用了两类资料:

  1. 原始学习资料
    比如《中国近现代史》相关 PDF 文档。

  2. 结构化摘要资料 (据原PDF文档,AI 生成)
    我又额外整理了一份更适合检索的 Markdown 版知识摘要,把内容按以下结构梳理:
    – 时间划分
    – 历史主线
    – 两大历史任务
    – 半殖民地半封建社会
    – 列强侵略方式
    – 社会阶级变化
    –近 代化探索
    – 新民主主义革命
    – 抗日战争与解放战争
    – 社会主义建设与发展

这样做的原因很简单:
原始 PDF 适合保留全量信息,结构化摘要适合提升检索命中率与召回质量。
也就是说,知识库不是“只传一个 PDF 就结束了”,而是应该尽量让内容既有原始材料,又有面向问答的整理版。

在这里插入图片描述

五、知识库搭建过程

在 Coze 的资源库里,我建立了与“问史通”相关的历史知识库资源,比如:

  • 中国近现代史
  • 中国近现代史-RAG优化版

这里“RAG 优化版”是一个很重要的思路:
不是单纯上传资料,而是根据问答场景去优化知识库内容。
我的做法是:

  1. 保留原始资料,保证信息完整
  2. 再做一个面向检索的优化版
  3. 在工作流的知识库检索节点里,同时挂载两个知识库
  4. 检索策略选择偏混合/综合的方式,尽量兼顾召回与准确性

这样做之后,针对“鸦片战争的影响”“半殖民地半封建社会”这类问题,检索效果会明显比单独传一个大 PDF 更稳定。

在这里插入图片描述

六、工作流设计思路

“问史通”的工作流整体并不复杂,核心就是一个三段式流程:

开始 → 知识库检索 → 大模型 → 结束

具体来说:

  1. 开始节点
    接收用户输入,得到 USER_INPUT。

  2. 知识库检索节点
    把用户问题作为 Query 传入知识库检索节点,得到 outputList。

  3. 大模型节点
    把用户原始问题和知识库检索结果一并传给大模型,让模型基于检索结果作答。

  4. 结束节点
    把模型输出结果返回给用户。

从结构上看,这其实就是最经典的一条 RAG 链路。

在这里插入图片描述

七、第一版工作流的配置方式

我一开始的配置思路是这样的:

开始节点

  • 输入:USER_INPUT

知识库检索节点

  • Query:开始.USER_INPUT

大模型节点

  • input:开始.USER_INPUT
  • output:知识库检索.outputList

结束节点

  • 返回:大模型.output

乍一看,这样已经跑通了,而且知识库节点也确实能检索出内容。

但后面调试时发现,这版配置虽然表面没报错,实际上埋了坑。

八、踩坑记录:为什么“查到了数据,模型却说无法回答”

这是整个搭建过程中最值得记录的部分。

现象

在工作流调试时,我能明显看到:

  • 知识库检索节点运行成功
  • outputList 中有多条检索结果
  • 右侧调试面板里也能看到检索到的文本片段

但最后模型却仍然可能输出类似:

根据现有资料无法完整回答
或者在推理内容中表现出一种“像是没拿到上下文”的状态。

九、问题排查:核心问题出在哪里

后面复盘下来,问题主要集中在两个点。

  1. 大模型入参命名不合理

我最初把知识库检索结果传给大模型时,使用了一个叫 output 的输入变量:

  • input = 用户问题
  • output = 知识库检索结果

这个命名看起来省事,但其实非常容易引发混淆。原因是:

  • 大模型节点自身就有一个输出字段 output
  • 你又额外定义了一个输入变量 output

于是同一个节点里同时存在:

  • 输入 output
  • 输出 output

这在调试和模板引用时都很容易出问题。

  1. 知识库返回的是 outputList,本质上是列表对象

知识库节点给出的不是一段简单字符串,而是一个数组/对象列表。

如果直接粗暴地把它塞给模型,有时候平台虽然会做自动转换,但模型未必能稳定理解。

这类问题的典型表现就是:

– 知识库节点看起来已经有内容
– 模型侧却像没真正吃到可用上下文

十、正确的修正方式

后来我把大模型节点的输入重新调整为:

  • input:用户问题
  • context:知识库检索结果

也就是:

大模型节点

  • input = 开始.USER_INPUT
  • context = 知识库检索.outputList

这一步的核心思想就是:

不要把知识库结果命名成 output,而是命名成更清晰的 context。
这样能明显降低变量冲突和语义混乱的问题。

十一、系统提示词的优化

除了变量命名,提示词也必须和变量显式绑定。

我后面采用的思路是:在大模型节点里明确告诉模型,它要根据哪个变量来回答。

一个比较稳妥的系统提示词模板如下:

你是“问史通”,一个基于RAG(检索增强生成)的历史智能助手,专注中国近现代史。

你的回答必须严格基于提供的【知识库检索结果】生成。

【严格约束】

* 只能使用知识库中的信息进行回答
* 严禁编造、扩展或引入未提供的历史事实
* 若信息不足,必须说明:“根据现有资料无法完整回答”

【任务目标】
围绕用户问题,完成以下内容:

1. 给出直接答案(简洁)
2. 结合知识库进行解释说明
3. 如适用,补充:背景 / 原因 / 过程 / 影响

【回答结构(默认)】

* 结论:
* 解释:
* 延伸(可选):

【输入变量】

* 用户问题:{{input}}
* 检索结果:{{outputList}}

请输出清晰、可信、结构化的历史解答。

一个比较稳妥的用户提示词模板如下:

用户问题:
{{input}}

知识库检索结果:
{{context}}

请仅依据以上知识库检索结果回答用户问题。
如果知识库中存在明确数值或条款结论,请直接给出结论,并在【依据】中引用对应内容。

这一步非常关键。因为很多时候不是模型能力不行,而是没有把变量引用清楚。

十二、最终稳定版工作流

最终跑通并且比较稳定的版本,结构如下:

  1. 开始节点
    – 输入:USER_INPUT

  2. 知识库检索节点
    – Query:开始.USER_INPUT
    – 知识库:中国近现代史 + 中国近现代史-RAG优化版

  3. 大模型节点
    – input:开始.USER_INPUT
    – context:知识库检索.outputList

  4. 结束节点
    – 返回变量:大模型.output
    – 返回文本:{{output}}

这个版本的核心特点是:

  • 链路简单
  • 变量清晰
  • 检索结果能够稳定传给模型
  • 调试时更容易定位问题
    在这里插入图片描述

十三、对话配置:开场白和预置问题

工作流跑通之后,我又对“对话体验”做了单独优化。
因为如果开场白和预置问题写得不好,用户即使面对一个能力正常的助手,也可能不知道该怎么问。

  1. 开场白设计原则

开场白不是单纯介绍自己,而是要告诉用户两件事:

  • 你能回答什么
  • 怎样提问更合适

我最终给“问史通”配置是:

你好,我是「问史通」,一个基于中国近现代史知识库的问答助手。

 我可以帮你解答:
历史事件(如鸦片战争、五四运动)
历史背景与影响
人物与制度变革
中国近代化与革命进程

 你可以直接提问,例如:
• 鸦片战争对中国社会产生了什么影响?
• 为什么说中国是半殖民地半封建社会?
• 五四运动的意义是什么?
• 辛亥革命为什么没有改变中国社会性质?

 我会根据知识库内容进行回答;如果资料不足,会说明“根据现有资料无法完整回答”。
  1. 预置问题设计原则

预置问题我尽量选成几类典型问题:

– 高频考点型
– 概念解释型
– 总结分析型

比如:

- 鸦片战争对中国社会产生了什么影响?
- 为什么说中国是半殖民地半封建社会?
- 中国近代化探索为什么屡次失败?
- 辛亥革命的历史意义和局限是什么?
- 五四运动为什么是新民主主义革命的开端?

这些问题的好处是:

  • 用户一眼就知道助手能做什么
  • 有利于引导用户进入正确的问题域
  • 也方便调试知识库和工作流是否真的生效

十四、效果演示

在预览与调试界面中,我直接使用预置问题进行了测试。

例如输入:

鸦片战争对中国社会产生了什么影响?

“问史通”能够给出较为结构化的回答,大致会包括:

  • 鸦片战争是中国近代史的起点
  • 中国主权受到严重侵害
  • 中国社会逐步由封建社会转向半殖民地半封建社会
  • 中国人民开始了反帝反封建的资产阶级民主革命

从效果上看,这类问题已经可以实现:

  1. 先给结论
  2. 再分点解释
  3. 回答风格相对稳定
  4. 基本不再出现明显跑题

这就说明整条“检索 → 生成”的链路已经真正打通了。

在这里插入图片描述

十五、发布流程

在本地调试通过后,我把“问史通”提交发布。

发布流程本身不复杂,大概就是:

  1. 保存当前对话流与配置
  2. 点击发布
  3. 提交审核
  4. 等待审核通过

发布成功后,就可以以一个完整的智能体形式对外演示和使用。

十六、这次实践中最值得总结的经验

如果要用一句话总结这次搭建过程,我会说:

知识库问答类应用,最重要的不是“模型有多强”,而是“检索结果是否被清晰、稳定地传给模型”。

具体来说,我觉得最值得记住的是以下几点:

  1. 知识库要做“原始版 + 优化版”
    不要只传原始 PDF。

最好再准备一份适合问答检索的结构化摘要。

  1. 工作流变量命名一定要清晰
    尤其不要把大模型输入变量命名成 output 这种和节点输出字段重名的名字。

  2. 提示词必须显式引用变量
    不要只写“请根据知识库回答”,而要明确写出:
    – {{input}}
    – {{context}}

  3. 开场白和预置问题很重要
    这是用户理解产品能力的入口,也是你验证产品能力边界的最好方式。

  4. 调试时要区分两个问题
    要分清:
    –是不是没检索到?
    –还是检索到了,但模型没正确消费?

这两个问题看起来像一个问题,实际排查方式完全不同。

十七、后续可优化方向

虽然“问史通”已经能用了,但如果继续打磨,我觉得还可以从以下方向优化:

  1. 增加中间格式化节点
    把知识库返回的 outputList 先整理成更标准的纯文本,再传给大模型,稳定性会更高。

  2. 增加回答模板
    比如强制输出结构:
    – 结论
    —背景
    – 影响
    – 意义
    这样更适合学习场景。

  3. 增加专题型知识库
    比如后续把内容拆成:
    – 鸦片战争专题
    – 洋务运动专题
    –戊戌变法专题
    –五四运动专题
    –新民主主义革命专题
    这样在专题问答时,检索精度还能进一步提高。

  4. 做成考试辅助版
    如果面向课程学习,还可以加上:
    –高频考点总结
    –名词解释模式
    –简答题模式
    –论述题模式
    这样“问史通”就不仅是问答助手,还能变成一个学习辅助工具。

十八、结语

整体来看,这次用 Coze 搭建“问史通”的过程,让我更直观地理解了一个垂直知识库问答助手的核心逻辑:

– 知识库负责“找”
– 大模型负责“答”
– 工作流负责“串”
– 对话配置负责“用起来顺不顺手”

如果你也想做一个自己的垂直领域助手,我很建议从这种最小闭环开始:

开始节点 → 知识库检索 → 大模型 → 结束节点

先把链路跑通,再逐步优化知识库、提示词和交互体验。

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐