LangChain 实战课
黄佳
新加坡科研局首席研究员
8120 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 28 讲
结束语 & 结课测试 (2讲)
LangChain 实战课
15
15
1.0x
00:00/00:00
登录|注册

09|链(下):想学“育花”还是“插花”?用RouterChain确定客户意图

你好,我是黄佳。欢迎来到 LangChain 实战课!
上一节课中,我带着你学习了 Chain 的基本概念,还使用了 LLMChain 和 SequencialChain,这一节课,我们再来看看其他类型的一些 Chain 的用法。

任务设定

首先,还是先看一下今天要完成一个什么样的任务。
这里假设咱们的鲜花运营智能客服 ChatBot 通常会接到两大类问题。
鲜花养护(保持花的健康、如何浇水、施肥等)
鲜花装饰(如何搭配花、如何装饰场地等)
你的需求是,如果接到的是第一类问题,你要给 ChatBot A 指示;如果接到第二类的问题,你要给 ChatBot B 指示
我们可以根据这两个场景来构建两个不同的目标链。遇到不同类型的问题,LangChain 会通过 RouterChain 来自动引导大语言模型选择不同的模板。
当然我们的运营过程会遇到更多种类的问题,你只需要通过同样的方法扩充逻辑即可。

整体框架

RouterChain,也叫路由链,能动态选择用于给定输入的下一个链。我们会根据用户的问题内容,首先使用路由器链确定问题更适合哪个处理模板,然后将问题发送到该处理模板进行回答。如果问题不适合任何已定义的处理模板,它会被发送到默认链。
在这里,我们会用 LLMRouterChain 和 MultiPromptChain(也是一种路由链)组合实现路由功能,该 MultiPromptChain 会调用 LLMRouterChain 选择与给定问题最相关的提示,然后使用该提示回答问题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何利用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归属地:北京
收起评论
显示
设置
留言
22
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部