09|链(下):想学“育花”还是“插花”?用RouterChain确定客户意图
任务设定
整体框架
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了如何利用RouterChain和MultiPromptChain实现ChatBot的动态问题处理功能。作者首先定义了两大类问题:鲜花养护和鲜花装饰,并构建了相应的处理模板。通过RouterChain的动态选择功能,结合LLMRouterChain和MultiPromptChain的组合,实现了路由功能。文章详细解释了路由模板的构造和路由提示的生成,以及如何构建默认链和多提示链。最后,通过示例测试展示了路由链的运行情况。整体来看,本文通过实际代码演示了如何使用RouterChain来实现ChatBot中动态处理不同类型问题的方法,为读者提供了一种在ChatBot中动态处理不同类型问题的技术实现。读者可以通过本文了解如何利用RouterChain和MultiPromptChain来实现ChatBot的动态问题处理,为ChatBot开发提供了有益的技术指导。
《LangChain 实战课》,新⼈⾸单¥59
全部留言(22)
- 最新
- 精选
- 在路上ConversationChain和LLMChain的区别在于,ConversationChain有memory成员变量,能保留对话上下文,而LLMChain不行。在源码上,跟踪ConversationBufferMemory.load_memory_variables()可知,对话上下文会作为inputs的一部分传入PromptTemplate,成为llm的提示词。
作者回复: 很精辟
2023-09-22归属地:广东10 - 阶前梧叶在这种路由链中,返回的数据也想做结构化json解析,那最终llm返回的结果,如何去确定是哪个chain返回的?继而选择对应的parser处理
作者回复: 同学提出了一个好问题。很启发思考。 一个路由链,它根据LLM的输出决定下一步应该去哪个链。可以看一下路由链的内部代码,当LLM返回一个结果时,它通过 RouterOutputParser 进行解析。此解析器返回一个字典,其中包含两个关键部分:destination 和 next_inputs。其中,destination 标识了下一步应该路由到哪个链。 那么,我们是可以从destination知道是那个Chain解决的问题的哈。那么如果你想要这个具体的Chain返回具体的数据格式,也是可以在给到这个具体Chain的提示中指定的哈。应该都做的到。同学可以自己编写代码试试。
2023-09-25归属地:江苏2 - 黄振宇感觉router_chain是一个agent了,只不过agent调用的是不同的tool,router_chain调用的是其他的大模型LLM
作者回复: 对,router_chain是一个简单agent了。这是因为它的Router路径是LLM推出来的,不是人为指定的。Agent也就是让LLM推出来调用哪个Tool,另外Agent还多加了ReAct等推理框架。
2023-09-21归属地:北京1 - dydcm老师您好,我跑样例的时候一直报一个错,能麻烦帮忙看下原因吗?报错如下: The above exception was the direct cause of the following exception: 。。。 File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/langchain/utils/__init__.py", line 15, in <module> from langchain.utils.math import cosine_similarity, cosine_similarity_top_k File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/langchain/utils/math.py", line 5, in <module> import numpy as np File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/numpy/__init__.py", line 135, in <module> raise ImportError(msg) from e ImportError: Error importing numpy: you should not try to import numpy from its source directory; please exit the numpy source tree, and relaunch your python interpreter from there.
作者回复: import numpy as np 出错,看起来环境的问题。重装一下环境?
2023-12-05归属地:广东 - SH这节里面的问题,如果使用 当前的 ChatGPT 我们如果直接向他提问的时候,他的内部是否已经帮助我调整好了相关的提示模版,通过相关的链 来回答相关的问题呢? 实际测试了一下,没有提示模板问,与加了提示模板(告诉他是个专门),两种方式输出的确会有些差异;
作者回复: 通过显示verbose或者设置全局debug,就可以看到具体的提示模板。
2023-11-05归属地:浙江 - 鲸鱼我发现使用MultiPromptChain.from_prompts方法会更简洁,其内部实现就是老师上面列出的内容类似 flower_care_template = """ 你是一个经验丰富的园丁,擅长解答关于养花育花的问题。 下面是需要你来回答的问题: {input}""" flower_deco_template = """ 你是一位网红插花大师,擅长解答关于鲜花装饰的问题。 下面是需要你来回答的问题: {input}""" prompt_infos = [ { 'name': 'flower_care', 'description': '适合回答关于鲜花护理的问题', 'prompt_template': flower_care_template, }, { 'name': 'flower_decoration', 'description': '适合回答关于鲜花装饰的问题', 'prompt_template': flower_care_template, }, ] llm = OpenAI() chain = MultiPromptChain.from_prompts(llm=llm, prompt_infos=prompt_infos, verbose=True) print(chain.run("如何为玫瑰浇水?"))
作者回复: 非常棒的分享,谢谢同学!!🤡
2023-10-27归属地:北京 - sunny文章中的这一段话: (RouterChain,也叫路由链,能动态选择用于给定输入的下一个链。我们会根据用户的问题内容,首先使用路由器链确定问题更适合哪个处理模板,然后将问题发送到该处理模板进行回答。如果问题不适合任何已定义的处理模板,它会被发送到默认链。) 我的疑问是:这里指路由链是能自动推理出用户意图,进而选择对应意图所要走的任务处理目标链吗;不需要通过写prompt+用户输入送入到大模型让大模型进行自动推理做选择题输出意图吗? (比如写个prompt: 请理解这一段话{变量=用户输入},判断这段话是想进行[鲜花养护]还是[鲜花培育]; ##若是鲜花养护请输出"A",若是鲜花培育输出”B“) 这样得到到了A或B判断出了用户意图走哪个目标链
作者回复: 好问题。 RouterChain由两个主要组件组成: 1. RouterChain本身(负责选择下一个要调用的链) 2. destination_chains: 路由器可以路由到的链 RouterChain的作用是根据输入动态选择下一个要执行的链。它不需要通过为大型语言模型编写提示来推断用户的意图。 相反,RouterChain在内部维护一组可能的目标链(destination_chains)。对于每个输入,它会根据内部逻辑选择下一个要运行的目标链。 例如,EmbeddingRouterChain使用输入的嵌入向量与目标链描述的嵌入向量进行相似性比较,选择相似度最高的链。LLMRouterChain使用小型语言模型根据目标链的描述来选择链。 RouterChain自动处理路由逻辑,用户只需要提供目标链,而不需要编写选择目标链的提示。它动态地根据每个输入选择下一个链,实现了可配置的多任务链。—— 我认为此处对于destination_chains的说明文字非常重要,其它问题RouterChain内部解决 —— 同学们有不同意见么?
2023-10-16归属地:安徽4 - Geek_19a2eb就是当输入的内容匹配不上其他的链的时候到默认路由这报错 其他的链都是正常的 报错信息如下,麻烦老师帮忙看下 刚入门的小白,多多理解:OutputParserException: Parsing text ```json { "destination": "DEFAULT", "next_inputs": "如何考入哈佛大学?" } raised following error: Got invalid JSON object. Error: Expecting value: line 1 column 1 (char 0)
作者回复: 大模型有时给出的结果不稳定。解决方案:1. 重新运行。2. 可以考虑输出解析时使用我们之前(第7课)讲过的错误处理机制。
2023-10-16归属地:浙江2 - Geek_19a2eb老师您好 我运行到print(chain.run(“如何考入哈佛大学?”))的时候报错 能给看下是啥原因吗 报错如下: OutputParserException: Parsing text ```json { "destination": "DEFAULT", "next_inputs": "如何考入哈佛大学?" } raised following error: Got invalid JSON object. Error: Expecting value: line 1 column 1 (char 0)
作者回复: 这是大模型给出的答案格式不稳定造成的。多运行几次就好了。同时同学也可以思考一下有没有什么错误处理方案。
2023-10-16归属地:浙江 - 漏网之渔RouterChain中每个分支chain的输入参数要求是相同的么,可以使用不同数量的参数么
作者回复: 为了清晰和一致的实现,如果RouterChain中的所有分支都期望相同的输入格式,通常会更简单。这确保了路由逻辑保持简单,行为是可预测的。但是,如果真的需要支持不同的参数用于不同的链,那么通过一些额外的开发工作应该是可能的。
2023-10-10归属地:北京