知识库没写答案时,Haystack 可以把问题转给网页搜索

开源项目猫目发布于 来源:Haystack 官方资料
官方慕尼黑案例用no_answer标记与ConditionalRouter分流,让本地资料回答和网络补充回答走不同路径。
知识库没写答案时,Haystack 可以把问题转给网页搜索

为什么值得关注

为有限资料库设计明确的补充检索路径,并让用户知道答案用了哪一类来源。

适合谁:开发知识库问答、需要公开网络补充材料的团队

这次有哪些亮点

  • 本地文档足够则直接返回,缺资料则输出原问题给搜索
  • 网络回答提示明确说明来源于websearch

使用前需要知道

no_answer来自模型判断且示例用子串匹配,需检验误分流;网络搜索可能外发查询,模型API和Serper搜索凭据另配,企业平台与开源框架分开。

资料库只收录了产品手册,用户却问到手册之外的近期信息。助手可以直接说不知道,也可以增加公开网页搜索;后者需要决定何时触发、把什么送去搜索,以及怎样告诉用户答案换了来源。

Haystack 的条件路由教程给出一个容易看懂的对照:本地只有一份慕尼黑简介,问它属于德国哪个地区,可以从资料中找;问人口有多少,简介没有提供,流程转向网络补充。

先让本地资料回答自己的范围

官方示例把简介放进 InMemoryDocumentStore,经 BM25 检索取出文档,再交给提示模板与模型。模板要求只按提供的资料回答;不包含答案时,返回约定的 no_answer 标记。

慕尼黑简介写了它是巴伐利亚首府、位于德国南部等信息,但没有人口数字。两个问题因此测试的是资料覆盖范围的差异,并不是换一个更强模型就能补上缺失的原文。

这一步的产物既可能是回答,也可能是一个供后续程序识别的标记。两种结果走向不同分支,流程不必每个问题都先搜遍网络。

路由节点决定下一步接谁

ConditionalRouter 在示例里检查模型回复是否包含 no_answer。没有该字符串时,输出本地回答;出现时,则把原始 query 作为 go_to_websearch 输出,送给 SerperDevWebSearch。

网络搜索结果再进入另一份提示模板,与同一个问题一起交给模型生成答案。第二份模板明确要求说明回答基于网络搜索,避免用户以为新增数字来自原有资料库。

值得注意的是,路由传下去的是用户问题,不是“no_answer”这个词。输出端口与输入连接在 pipeline 里明确写出,读者能沿连接关系看见一次补充检索怎样发生。

这条分界线,也需要验证

no_answer 是模型按指令作出的判断,不是程序证明“所有资料都没有答案”。模型可能漏读,示例的子串匹配也可能被正常回答中的同名文字触发。因此,测试应包含资料里有答案、没有答案,以及容易歧义的问法,再看分支是否符合预期。

教学情境中,如果内部知识库问题带有客户编号,转向公开搜索之前还应决定哪些信息允许外发。官方慕尼黑问题是公共地理信息,不能由此推导所有内部查询都适合直接送往搜索服务。

Haystack 开源框架采用 Apache-2.0,模型 API 与 Serper 凭据需另配,deepset 企业平台是另一层产品。这个例子最值得借鉴的是可见的来源切换:本地文档能回答的留在本地材料路径,需要网络补充的另走一步,最后也把这种来源差别交代给读者。

原始资料:Haystack 官方资料

以上为编辑整理,功能、许可与使用条件以官方说明为准。

返回每日分享