凉城老泉
手机扫码
十二.智能体开发实验之路由链
凉城老泉  2025-05-29     阅读(57)   分享

langChain路由链 (RouterChain)‌是一种在 语言模型 (LLM)编程框架中用于根据输入的提示词(Prompt)选择具体执行链的机制。路由链的主要作用是根据不同的输入提示词,动态选择合适的处理链来执行任务。

路由链(RouterChain)由多个提示词(Prompt)组成,这些提示词与LLM结合,决定下一步应该调用哪个链。它通常涉及两个核心类: LLMRouterChain 和 MultiPromptChain 。LLMRouterChain用于将LLM路由到可能的选项中,而MultiPromptChain则用于在多个提示词之间路由输入,选择其中一个提示词来执行相应的链

使用场景和步骤
‌准备多个链的提示词‌:根据不同的任务需求,准备多个链的提示词,并将它们封装成链。
‌构建RouterChain‌:使用LLMRouterChain和MultiPromptChain来选择下一个要调用的链。
‌选择和执行链‌:通过MultiPromptChain选择某个链,然后执行该链以完成相应的任务。

下面我们通过一个关于猫和狗的动物专家示例做练习:

示例中如果问题是关于猫科动物的则交由猫科专家来处理,如果是关于犬科的则交由犬科专家来处理。

一.引入所需的包

'''路由链示例'''

from lc_deepseek_ai import CreateChartDeepSeek
from qifan_ai import CreateMyLLM
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, ConversationChain
from langchain.chains.router import MultiPromptChain, RouterChain
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE

二.定义猫和狗的处理chain

#关于猫科动物专家的链,使用deepseek大模型作答
prompt_template_cat = "你是一个猫科动物专家,专门回答关于猫类动物的问题。请回答用户输入的问题,如果不知道则直接回答不知道:\n\n{input}"
prompt_cat = PromptTemplate(input_variables=["input"], template=prompt_template_cat)
chain_cat = LLMChain(llm=llm, prompt=prompt_cat, verbose=True)

#关于犬科动物专家的链,使用文心一言模型作答
prompt_template_dog = "你是一个犬科类动物专家,专门回答关于犬类动物的问题。请回答用户输入的问题,如果不知道则直接回答不知道\n\n{input}"
prompt_dog = PromptTemplate(input_variables=["input"], template=prompt_template_dog)
chain_dog = LLMChain(llm=CreateMyLLM(), prompt=prompt_dog,verbose=True)
三.定义一个默认chain,当不属于两者时调用处理

#默认回答链,当问题不是猫也不是狗时,使用默认回答
default_conversation = ConversationChain(llm=llm, verbose=True)
四.定义多链路由

#多链路由,根据用户输入的问题,选择合适的链进行回答
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations="\n".join(["猫科动物:回答关于猫类动物的问题","犬科动物:专门回答关于犬类动物的问题"]))
router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser(),
)
router_chain = LLMRouterChain.from_llm(llm, router_prompt)
五.定义多提示词链

#多提示词链,在路由中选择合适的链进行回答,注意这里的描述链要和路由链的描述提示词的key要保持一致
chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains={
        "猫科动物": chain_cat,
        "犬科动物": chain_dog,
    },
    default_chain=default_conversation,
    verbose=True
)
result=chain.invoke({"input":"小猫为什么特别爱吃鱼?"})
print(result)
六.查看一下运行结果

> Finished chain.
{'input': '小猫为什么特别爱吃鱼?', 'text': '作为猫科动物专家,我可以解释小猫爱吃鱼的几个科学原因:\n\n1. 营养需求驱动\n- 鱼类富含优质动物蛋白和牛磺酸,这对猫的视力、心脏健康和繁殖系统至关重要(猫无法自行合成足量牛磺酸)\n- 鱼油中的Ω-3脂肪酸能促进幼猫大脑发育\n- 高水分含量(约70-80%)符合猫类天然饮食结构\n\n2. 感官吸引力\n- 鱼类强烈的腥味来自三甲胺,猫的嗅觉受体对此特别敏感(比人类强14倍)\n- 鱼肉质地松软,适合猫的牙齿结构(猫臼齿主要用来剪切而非咀嚼)\n\n3. 进化适应\n- 家猫祖先包括近东野猫(Felis silvestris lybica),其栖息地常靠近水域\n- 考古证据显示1万年前近东人类聚落附近,猫与鱼骨经常同期出现\n\n4. 行为强化\n- 鱼类的高适口性使猫容易形成味觉偏好\n- 现代猫粮中鱼味添加剂(如水解鱼蛋白)进一步强化这种倾向\n\n需要注意的是:\n- 并非所有猫都爱鱼(约15%个体表现冷淡)\n- 生鱼含硫胺素酶,长期食用可能导致维生素B1缺乏\n- 建议喂食煮熟去刺的鱼,每周不超过3次作为辅食\n\n需要更详细解释某个方面吗?'}

进程已结束,退出代码为 0