近期看到Coze开源刷屏,Star已经10K+了,不由想起之前一直困扰的问题,笔者在Coze上配置的"杭州中考小助手",按分数查询可以报考的学校,检索结果总是为空,在掘金上也发过该问题求助的帖子《为啥扣子工作流中知识检索节点不起作用?》,也一直没找到解决方法。
最近找"柚子大哥"做了个验证,终于搞清楚主要还是因为在Coze知识库中没有检索到相应结果,本文展开剖析,供有需要同学参考借鉴,顺便给Coze提个小小的建议,咱也试试看能不能蹭一把最近"Coze开源"的热点哈。

知识库中检索结果为空的排查过程
首先回顾一下问题现象,我的这个"杭州中考小助手"智能体中,主要是引用了一个工作流如下图: 在这个工作流中当判断用户意图如果是"要根据分数查询可报考学校"时,就走到"知识库检索_1"节点,在这个节点中配置了4个知识库,分别对应了4种不同类型的学校录取分数线表格,然后用大模型节点,对检索结果做一个格式整理再输出。
现在问题是调试过程中发现,针对用户输入的分数,Coze知识库检索节点会基于NL2SQL方式,将其转换为相应的SQL:

转换结果SQL看着逻辑也是正确的,但最终检索节点结果就是为空。

因为用户意图如果是另外一个分支"按学校名查询录取分数线"时,每次都很准确地查到结果了,所以就一直没想到是我的知识库本身有问题,总以为是Coze的"知识库检索"节点配置有问题,或者是它的执行机制有问题。
所以试着把"知识库检索节点"的几个选项挨个调整了一遍,发现不起作用,换成"大模型节点"再搭配"技能"中选择知识库,然后写提示词要求大模型查询知识库,结果调试发现也查不到结果。
尝试了多次无果,只能搁置,一放就是2个月过去了,最近找"柚子大哥"做了个验证,结果发现是我知识库本身有问题,比如其中有个"民办高中录取分数线"的知识库表格中,其"最后一位录取考生的投档信息"字段的内容是这样一串文本字符串,并不仅仅是一个具体分数值:

所以导致Coze生成的这段SQL,虽然NL2SQL之后的字段名、条件判断逻辑、union组合逻辑等都匹配得很准,但其实执行肯定是出错了,所以没有查询出结果。
sql
SELECT '高中学校名' FROM '2024年杭州中考普通高中录取分数线' WHERE '分数线'<=600
UNION
SELECT '招生学校' FROM '2024年杭州中考中本一体化录取分数线' WHERE '分数线'<= 600
UNION
SELECT '学校名称' FROM '2024年杭州中考民办高中录取分数线' WHERE '最后一位录取考生的投档信息'<= 600
UNION
SELECT '学校名称' FROM '2024年杭州中考职高+技校+中专投档线' WHERE '最后一位录取考生的投档信息'<=600
建议Coze知识库增加检索/召回的测试能力
这么一个简单问题困扰了这么久,现在回想起来当时调试最大的痛苦,就是不知道为啥没有查询出结果,NL2SQL也生成对了,但就是看不到执行结果,也没有任何报错信息,就返回一个空的结果集,生成的SQL也没有地方可以去测试执行,只能各种改动验证。
建议Coze工作流调试时,最好能输出知识库检索节点的出错信息,同时Coze知识库中增加相应的召回/检索测试,方便我们定位排查问题,Dify和RAGFlow的知识库中都有类似机制:



-end-