AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


【Dify示例】dify工作流中知识检索节点的使用心得
发布日期:2024-08-28 14:13:57 浏览次数: 2029 来源:提示日记


 最近发现,有不少小伙伴对dify工作流的知识检索节点使用存在不少的疑惑。今天讲讲我对这个节点的使用心得体会。


我们先看看知识检索节点的官方定义:

从知识库中检索与用户问题相关的文本内容,可作为下游 LLM 节点的上下文来使用。

顾名思义,这个节点的设计初衷,是希望开发者搭配LLM节点使用的。但是在工作流中,LLM节点虽然能直接解析知识检索的输出变量(数组类型)。但是我们一般在实际应用中,不会直接这么做,而是将知识检索节点的内容提取出来,转换成string格式。


这样做有两个好处:

  1. 提取的知识库内容,不仅可以被LLM节点使用,同时,还可以被其他节点使用,尤其是当知识检索节点的输出结果存在多个时,这种容许二次加工后的结果,更加有利于LLM使用。

  2. 知识检索节点输出的变量是一个数组(result列表类型),这个数组里面不仅仅有检索出来的知识库内容,还有关于本次检索的相关数据,如:多个segment相关参数、score分数、多个块相关参数等。如果对知识检索的top k参数设置大于1,那么这个输出变量中会出现多条记录。当你在工作流中,需要这些参数时,你可以提取出来直接用,而不是再次检索知识库。这就带来一个好处,你的工作流如果较为复杂,并且有类似这种实际需求,可拓展性一下子就体现出来了。


下面我提供两种方法供大家参考:

第一种:当你的top k设置为1的时候,你除了直接接入LLM以外的办法;

第二种:当你的当你的top k设置大于1的时候,使用代码节点提取。



01

当top k参数设置为1




top k参数解释:

用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整分段数量。


请注意,无论你使用哪种检索方式,这个参数都是必须要设置的。

这种情况下,你除了直接接入一个LLM阶段读取以外,其实我建议你不要这么干,虽然LLM节点能读取它的输出数组内容,但是它终究不是string类型,很难被其他大多数节点读取,如;回复节点、参数提取节点、问题分类器节点等。因为这些节点要读取string类型的变量。


所以,我推荐大家在知识检索节点后面接入一个模板转换节点。把数组类型转换成string类型,这样就可以被其他大多数节点也能同样读取,以防哪一天,你的工作流不用大改动,直接调用相应参数就行。

先说好,这是一个不严谨的懒人做法,其实从严谨性、可阅读性上来说,这不是最佳处理办法。


这里要解释一下,当设置大于1时,如果粗暴处理,其实连带着大量的无用内容一并发给大模型了,可能会引起大模型的错误,毕竟大量垃圾内容可能会干扰大模型的正确理解。

那么,你就需要看看第二种情况了。




02


当top k参数>=1



这个时候,知识检索节点输出的是一个多result列表中就会包含多个字典集合。当然,你设置为1的时候,只有一个哈。


那么在这种情况下,想要满足可扩展性,我们就需要通过代码节点做一次加工处理,本文举例,将多个结果提取并拼接到一起交付给大模型再次优化。

我们先来看看,如果top k参数>=1时,知识检索节点返回的结果长什么样,以下是一个参考示例:


{"result": [{"metadata": {"_source": "knowledge","position": 1,"dataset_id": "0918f9d2-78d4-4176-9c04-16d6e04bb146","dataset_name": "中华人民共和国促进科技成果转化法","document_id": "2fc7b8bf-e34a-41fb-b15c-dd302b978680","document_name": "中华人民共和国促进科技成果转化法","document_data_source_type": "upload_file","segment_id": "0ef1967e-a5d3-4327-a970-af5582581121","retriever_from": "workflow","score": 0.29208900795375264,"segment_hit_count": 1,"segment_word_count": 62,"segment_position": 36,"segment_index_node_hash": "621fde014993438b8a28a3622803c7d1e9f68931efb0cd70fe6566fe2016c3f3"},"title": "中华人民共和国促进科技成果转化法","content": "中华人民共和国促进科技成果转化法第三十六条 国家鼓励保险机构开发符合科技成果转化特点的保险品种,为科技成果转化提供保险服务。"},{"metadata": {"_source": "knowledge","position": 1,"dataset_id": "0918f9d2-78d4-4176-9c04-16d6e04bb146","dataset_name": "中华人民共和国促进科技成果转化法","document_id": "2fc7b8bf-e34a-41fb-b15c-dd302b978680","document_name": "中华人民共和国促进科技成果转化法","document_data_source_type": "upload_file","segment_id": "481b5cbb-d784-4ba1-8cc1-69022e49c455","retriever_from": "workflow","score": 0.25351966026553047,"segment_hit_count": 1,"segment_word_count": 81,"segment_position": 33,"segment_index_node_hash": "9e1529513fa5d7543eeb54467c2fb31be7d889f0f4b8f6194cd75ae3529625a5"},"title": "中华人民共和国促进科技成果转化法","content": "中华人民共和国促进科技成果转化法第三十三条 科技成果转化财政经费,主要用于科技成果转化的引导资金、贷款贴息、补助资金和风险投资以及其他促进科技成果转化的资金用途。"},{"metadata": {"_source": "knowledge","position": 1,"dataset_id": "0918f9d2-78d4-4176-9c04-16d6e04bb146","dataset_name": "中华人民共和国促进科技成果转化法","document_id": "2fc7b8bf-e34a-41fb-b15c-dd302b978680","document_name": "中华人民共和国促进科技成果转化法","document_data_source_type": "upload_file","segment_id": "18d979c2-483b-4770-950d-f36ccbb1450a","retriever_from": "workflow","score": 0.16448095575533164,"segment_hit_count": 1,"segment_word_count": 132,"segment_position": 5,"segment_index_node_hash": "24f64f5657b58cc44a7fb3340a2c0c0f771e7dfb9e02682404bbd3d477ea3770"},"title": "中华人民共和国促进科技成果转化法","content": "中华人民共和国促进科技成果转化法第五条 国务院和地方各级人民政府应当加强科技、财政、投资、税收、人才、产业、金融、政府采购、军民融合等政策协同,为科技成果转化创造良好环境。地方各级人民政府根据本法规定的原则,结合本地实际,可以采取更加有利于促进科技成果转化的措施。"},{"metadata": {"_source": "knowledge","position": 1,"dataset_id": "0918f9d2-78d4-4176-9c04-16d6e04bb146","dataset_name": "中华人民共和国促进科技成果转化法","document_id": "2fc7b8bf-e34a-41fb-b15c-dd302b978680","document_name": "中华人民共和国促进科技成果转化法","document_data_source_type": "upload_file","segment_id": "f5c5e428-c25c-4bec-8d4c-4541d2c7d10d","retriever_from": "workflow","score": 0.16217518876465065,"segment_hit_count": 1,"segment_word_count": 170,"segment_position": 17,"segment_index_node_hash": "1aafff0734ee3b9045e57926cd4f632f5731e487fae8974c62cf1bb77a9c540b"},"title": "中华人民共和国促进科技成果转化法","content": "中华人民共和国促进科技成果转化法第十七条 国家鼓励研究开发机构、高等院校采取转让、许可或者作价投资等方式,向企业或者其他组织转移科技成果。国家设立的研究开发机构、高等院校应当加强对科技成果转化的管理、组织和协调,促进科技成果转化队伍建设,优化科技成果转化流程,通过本单位负责技术转移工作的机构或者委托独立的科技成果转化服务机构开展技术转移。"}]}


在这个result列表中,就出现了多个metadata,那么我们想要提取所有metadata中的content内容,并拼接到一起,就需要使用到代码节点了。示例代码如下:

def main(data) -> str:
contents = []
# 遍历结果并提取每个对象的 content 字段for item in data['result']:contents.append(item['content'])
# 将所有内容拼接成一个字符串contentss = "\n".join(contents)return {"result1": contentss}

如上图所示:

这样result1这个变量就是一个string类型的多content拼接结果,我们将这个结果发给大模型,是不是更加简洁准确呢!这个示例仅仅是提取content内容并拼接的,其他字段并未提取,如有需要,参考源码自行修改即可。目的是了解为什么要这么做,这是从工作流设计角度考虑,并不是从编程角度考虑哈。

综上所述,第二种办法,泛化能力更强,准确度更高。毕竟这个流程是需经过了开发者人工校验一遍,本质上是一次极简的“数据清洗”。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询