知识库检索调优
知识库检索调优
知识库检索调优 知识库检索调优 Modified April 30, 2025 在基本智能体中,强制调用的运行逻辑如下 Code block Plain Text Copy 用户提问 用户提问直接检索知识库 检索返回信息填充至模型上下文 模型输出结果 那么我们其实稍微想一下,会发现这个逻辑其实不那么合理,因为用户的提问直接与知识库检索后返回的结果往往不那么合理。 而按需调用的逻辑如下 Code block Plain Text Copy 用户提问 模型边输出边判断是否需要检索知识库 如果需要,则生成检索参数,调用检索工具 检索返回信息填充至模型上下文 模型继续输出后续结果 那么这个逻辑相比于前面则智能许多,一方面,检索参数是可以是由大模型生成的,而非直接使用用户输入,能更好的利用上下文,另外一方面,可以像搜索插件一样,多次调用,获取所需内容(其实就是私有数据源的搜索插件),此外在不需要搜索的场景下,可以减少冗余信息的传入。 注:按需调用时,知识库会作为工具,其名字和描述决定了大模型是否调用以及如何调用。 经验二:在查询知识库前,添加查询改写 不论是用户的提问直接去查询知识库,还是模型通过按需调用去查询知识库。返回结果的质量与查询的内容息息相关。 因此尽可能添加对查询语句的改写。 在工作流里,可以在查询前添加一个大模型节点,用于改写查询,使之更加清晰,补齐上下文等。 而在按需调用的基础智能体中,可以利用提示词/写在知识库描述的方式,告知模型在查询这个知识库时可以怎么改写查询或者这个知识库倾向于怎么样的查询。 改写细节: 1. 知识库的检索往往对“否定”含义检索效果较差,比如“除A外的商品”,其可能大量返回“A”相关内容,可以考虑改写成“B,C,D,E的商品”等“正向”含义查询 2. 专业知识库(表格数据)的形式,其查询模式类似将查询语句与 {"字段a":"值a","字段b":"值b"}这样的json格式数据匹配。这时候可以考虑关键词检索配合特定的改写提示词,如让模型改写成{"字段a":"值a","字段b":"值b"}的结构。 3. 改写模型应该尽可能知道知识库的整体情况,清楚其可知和不可知的内容分别是哪些。 经验三:知识库不等于信息库,模型往往偏好相信而不会质疑 对于大模型来说,知识库返回的信息,如果填充到模型上下文,传统模型会比较推理模型更信任其中内容,而非对其中内容产生质疑。 因此,优先保证知识库的质量,尽可能选择可信知识。 其次再是在提示词中给大模型以一定的质疑空间,因为即便是可信知识,如果内容相关性不高,模型过于相信后,可能会产生更严重的幻觉。 经验四:用代码/模型节点对知识库返回信息处理:去冗余,重组,改写 知识库直接返回的信息是文本形式的数组,其中有些时候会包含类似 Code block Plain Text Copy 在基本智能体中,强制调用的运行逻辑如下 那么我们其实稍微想一下,会发现这个逻辑其实不那么合理,因为用户的提问直接与知识库检索后返回的结果往往不那么合理。 而按需调用的逻辑如下 那么这个逻辑相比于前面则智能许多,一方面,检索参数是可以是由大模型生成的,而非直接使用用户输入,能更好的利用上下文,另外一方面,可以像搜索插件一样,多次调用,获取所需内容(其实就是私有数据源的搜索插件),此外在不需要搜索的场景下,可以减少冗余信息的传入。 注:按需调用时,知识库会作为工具,其名字和描述决定了大模型是否调用以及如何调用。 经验二:在查询知识库前,添加查询改写 不论是用户的提问直接去查询知识库,还是模型通过按需调用去查询知识库。返回结果的质量与查询的内容息息相关。 因此尽可能添加对查询语句的改写。 在工作流里,可以在查询前添加一个大模型节点,用于改写查询,使之更加清晰,补齐上下文等。 而在按需调用的基础智能体中,可以利用提示词/写在知识库描述的方式,告知模型在查询这个知识库时可以怎么改写查询或者这个知识库倾向于怎么样的查询。 改写细节: 1. 知识库的检索往往对“否定”含义检索效果较差,比如“除A外的商品”,其可能大量返回“A”相关内容,可以考虑改写成“B,C,D,E的商品”等“正向”含义查询 2. 专业知识库(表格数据)的形式,其查询模式类似将查询语句与 {"字段a":"值a","字段b":"值b"}这样的json格式数据匹配。这时候可以考虑关键词检索配合特定的改写提示词,如让模型改写成{"字段a":"值a","字段b":"值b"}的结构。 3. 改写模型应该尽可能知道知识库的整体情况,清楚其可知和不可知的内容分别是哪些。 经验三:知识库不等于信息库,模型往往偏好相信而不会质疑 对于大模型来说,知识库返回的信息,如果填充到模型上下文,传统模型会比较推理模型更信任其中内容,而非对其中内容产生质疑。 因此,优先保证知识库的质量,尽可能选择可信知识。 其次再是在提示词中给大模型以一定的质疑空间,因为即便是可信知识,如果内容相关性不高,模型过于相信后,可能会产生更严重的幻觉。 经验四:用代码/模型节点对知识库返回信息处理:去冗余,重组,改写 知识库直接返回的信息是文本形式的数组,其中有些时候会包含类似 的内容,其为图像。如果图像有必要,则可以单独取出,用图像理解插件进行处理,添加图像的描述(此步骤也可以在上传文件前处理) 其次,如果模型回答不需要查看图片具体内容,则可以直接删去,从而去除冗余信息。 此外,知识库返回结果是语义的向量匹配,但有些时候可能匹配不准确,不匹配信息会比较多,并且可能结构混乱,此时可以考虑选择添加小模型,对返回的知识库信息进行整理,然后再进行使用。 类似如下结构(其中实际情况并非并行,而是串行,或选择其一方式) 经验五:用 ai 重新整理文本结构,重新分段 要想要知识库用的好,除去后期的查询改写,返回信息的整理等,更要考虑在前期对知识库文件内容的整理。 可以使用 ai 对原本的文章进行逐段梳理,并且添加特殊标记符,以便后续拆分。 一方面,这样的拆分,会比用各种分段符的方式更理解语义,拆分更加精确,另外一方面,可以在拆分过程中,添加特殊标记符,添加总结和模拟提问等片段,使得后续检索更加容易且精确。 经验六:巧用分段智能总结和智能提问 使用分段智能总结和分段智能提问可以有效提升上下文的丰富度,但具体细节可以适当人工编辑(因为总结内容和提问的生成均由 ai 生成,并且是基于单片段生成,难免存在幻觉)。 此外,此部分功能完全可以由经验五的方式,实现类似效果,在不考虑成本以及注重效果的情况下,可以考虑经验五的方式(可以更好的控制生成总结和提问时的上下文信息以及输出结果)。 本文在基于对知识库有了基本的了解且能够创建知识库并能在智能体和工作流中合理调用知识库的基础上,讲解关于知识库的检索调优,使得知识库的返回更加精准。 链接直达:https://tbox.alipay.com/pro/knowledge 前情提要:【简单构建】如何在 5min 内搭建私有知识库问答助手专业知识库的构建与使用 【简单构建】如何在 5min 内搭建私有知识库问答助手 专业知识库的构建与使用 特别说明 虽然产品文档里,我们说这个功能为知识库,但在理解上,更应该倾向于理解成信息库 模型并不会通过训练微调等方式学习知识库的内容,大部分情况下,都是从庞大的知识库中获取一小部分的相关内容,然后回答。 因此基于知识库的回答效果好坏与其返回的结果直接相关。 同时,对模型提供一定的固定背景知识,了解知识库返回的信息的整体情况,有利于模型理解具体的散乱切片。 知识库的一般处理和使用流程 经验一:在基础智能体里,优先选择按需调用,而非强制调用。 这里稍微详细的介绍一下知识库的强制调用和按需调用模式。