• 5分钟了解LangChain的路由链


    上上篇文章《5分钟理透LangChain的Chain》里用到了顺序链SequentialChain,它可以将多个链按顺序串起来。本文介绍LangChain里的另外1个重要的链:路由链

    1. 路由链概念

    **路由链(RouterChain)**是由LLM根据输入的Prompt去选择具体的某个链。路由链中一般会存在多个Prompt,Prompt结合LLM决定下一步选择哪个链。

    2. 路由链的使用场景

    路由链一般涉及到2个核心类,LLMRouterChainMultiPromptChain,一起看看官网介绍:

    • LLMRouterChain:使用LLM路由到可能的选项中。
    • MultiPromptChain:该链可用于在多个提示词之间路由输入,当你有多个提示词并且只想路由到其中一个时,可以用这个链。

    一般使用路由链时,有固定的几个步骤:

    1. 准备多个链的Prompt提示词,然后各自封装成链。
    2. 将可能路由到的链封装到destination_chains里。
    3. 构建多提示词和RouterChain ,负责选择下一个要调用的链。
    4. 构建默认链。
    5. 使用MultiPromptChain选择某个链,然后再去执行此链。

    3. 使用路由链的案例

    假设我们有一个常见的场景,根据用户的输入内容选择不同的处理路径,如果没有选到合适的链,则使用默认链。比如:根据用户的输入问题,选择不同的链去处理,如果没选到合适的,则走默认链。

    具体代码如下:

    from langchain_openai import ChatOpenAI
    
    model = ChatOpenAI(
        model_name="gpt-3.5-turbo",
        openai_api_key="sk-xxxx",
        openai_api_base="https://api.302.ai/v1",
    )
    
    
    from langchain.chains.router import LLMRouterChain, MultiPromptChain
    from langchain.chains.router.llm_router import RouterOutputParser
    from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE
    from langchain.chains import LLMChain, ConversationChain
    from langchain.prompts import PromptTemplate
    
    # 准备2条目的链:一条物理链,一条数学链
    # 1. 物理链
    physics_template = """
    你是一位物理学家,擅长回答物理相关的问题,当你不知道问题的答案时,你就回答不知道。
    具体问题如下:
    {input}
    """
    physics_prompt = PromptTemplate.from_template(physics_template)
    physics_chain = LLMChain(llm=model, prompt=physics_prompt)
    
    # 2. 数学链
    math_template = """
    你是一个数学家,擅长回答数学相关的问题,当你不知道问题的答案时,你就回答不知道。
    具体问题如下:
    {input}
    """
    math_prompt = PromptTemplate.from_template(math_template)
    math_chain = LLMChain(llm=model, prompt=math_prompt)
    
    # 3. 英语链
    english_template = """
    你是一个非常厉害的英语老师,擅长回答英语相关的问题,当你不知道问题的答案时,你就回答不知道。
    具体问题如下:
    {input}
    """
    english_prompt = PromptTemplate.from_template(english_template)
    english_chain = LLMChain(llm=model, prompt=english_prompt)
    
    
    ######### 所有可能的目的链
    destination_chains = {}
    destination_chains["physics"] = physics_chain
    destination_chains["math"] = math_chain
    destination_chains["english"] = english_chain
    
    
    ######### 默认链
    default_chain = ConversationChain(llm=model, output_key="text")
    
    # 让多路由模板 能找到合适的 提示词模板
    destinations_template_str = """
    physics:擅长回答物理问题
    math:擅长回答数学问题
    english:擅长回答英语问题
    """
    router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(
        destinations=destinations_template_str
    )
    
    # 通过路由提示词模板,构建路由提示词
    router_prompt = PromptTemplate(
        template=router_template,
        input_variables=["input"],
        output_parser=RouterOutputParser(),
    )
    
    ######### 路由链
    router_chain = LLMRouterChain.from_llm(llm=model, prompt=router_prompt)
    
    ######### 最终的链
    multi_prompt_chain = MultiPromptChain(
        router_chain=router_chain,
        destination_chains=destination_chains,
        default_chain=default_chain,
        verbose=True,
    )
    
    
    
    # multi_prompt_chain.invoke({"input": "重力加速度是多少?"})
    # multi_prompt_chain.invoke("y=x^2+2x+1的导数是多少?")
    multi_prompt_chain.invoke("将以下英文翻译成中文,只输出中文翻译结果:\n The largest community building the future of LLM apps.")
    # multi_prompt_chain.invoke("你是怎么理解java的面向对象的思想的?")
    
    

    执行结果跟我们预想的一致,执行结果如下:

    4. 总结

    这篇博客主要介绍了LangChain中的**路由链(RouterChain)**的概念,它主要用在不确定性的场景下,根据提示词,选择具体的某个链去执行。还聊了它的使用场景和具体案例,希望对你有帮助!

    =====>>>>>> 关于我 <<<<<<=====

    本篇完结!欢迎点赞 关注 收藏!!!

    原文链接:https://mp.weixin.qq.com/s/zIu0DjVgbv7R4mMCpETSNA

  • 相关阅读:
    ARP协议详解
    c++ qt连接操作sqlite
    基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(一)
    Install OnlyOffice with docker
    SpringBoot实现指定时间开启定时任务
    【C++】超详细typedef用法和实例,看完不信你不会
    深度神经网络之BiseNet
    IIR滤波器的设计与实现(内含设计IIR滤波器的高效方法)
    Notepad++实用功能分享(正则行尾行首替换常用方法、文本比对功能等)
    Prometheus Operator 自定义监控添加redis explorer
  • 原文地址:https://www.cnblogs.com/mangod/p/18259931