RouterChain | 豆包MarsCode AI刷题

这是一个非常详细的LangChain实战教程,通过构建不同类型的链(Chain)来处理用户的输入,特别是如何通过RouterChain来动态选择合适的处理模板。在这个案例中,主要展示了如何通过LangChain实现鲜花运营智能客服的路由功能,以便根据用户提问的内容自动引导到相应的专家链处理。

关键点总结:

  1. 链(Chain)概念

    • LLMChain:基础的语言模型链,用于根据给定的提示模板生成响应。
    • RouterChain:用于根据输入选择适合的下一个链。
    • MultiPromptChain:将多个链整合在一起,根据路由链的结果选择具体的目标链。
  2. 路由链(RouterChain)

    • 路由链的作用是根据输入内容决定使用哪个具体的处理链。
    • 在代码中,LLMRouterChain接收用户的输入,选择最适合的提示(例如:flower_careflower_decoration)并传递给相应的处理链。
  3. 构建步骤

    • 创建模板:为每种处理场景(例如鲜花护理、鲜花装饰)创建对应的字符串模板。
    • 初始化LLM模型:例如OpenAI的语言模型,通过OpenAI()实例化。
    • 构建目标链(LLMChain) :根据模板和语言模型创建不同的处理链,存储在字典中以供路由器使用。
    • 构建路由链:通过RouterChainLLMRouterChain,让模型根据输入选择合适的目标链。
    • 默认链:当路由链无法选择到合适的链时,使用默认链(例如ConversationChain)进行处理。
  4. MultiPromptChain

    • MultiPromptChain将路由链、目标链和默认链整合在一起,确保输入能够被正确处理。
    • 它的工作流程是:首先由路由链决定使用哪个目标链,若没有合适的目标链,则会交由默认链处理。
  5. 路由模板

    • 路由模板的核心在于引导模型选择最适合的问题处理模板。
    • 输出格式需要符合特定的JSON结构,其中包含destination(目标链名称)和next_inputs(修改后的输入)。
  6. 测试案例

    • 测试A:如用户提问“如何为玫瑰浇水?”,这个问题被路由到鲜花护理链。
    • 测试B:如用户提问“如何为婚礼场地装饰花朵?”,被路由到鲜花装饰链。
    • 测试C:如用户提问“如何考入哈佛大学?”,因为问题不适合任何一个模板,所以被路由到默认链(ConversationChain)。

思考题:

  1. 设置verbose=False

    • 如果将verbose设置为False,你将无法看到链调用的详细日志。这可以减少输出内容,但也意味着调试时不容易查看链的执行流程。设置为True时,会显示链的开始和结束日志,帮助你追踪执行过程。
  2. ConversationChain替换为LLMChain

    • 你可以尝试将ConversationChain替换为一个普通的LLMChain,这样做的区别在于,ConversationChain通常会保留对话的上下文信息,适合于连续对话的场景。而LLMChain则每次都从头开始,不会保持上下文。在某些场景下,如果不需要上下文,可以使用LLMChain,但如果需要保持对话流的连贯性,ConversationChain会更合适。

总结:

这个案例充分展示了LangChain的强大能力,通过灵活的链路组合(LLMChainRouterChainMultiPromptChain等)能够高效地为不同的输入提供智能响应。它让我们能够根据不同的输入类型,自动选择最合适的处理方法,并且能够扩展到更多场景和链的组合。

4o

您说:

内容更全更多

ChatGPT 说:

ChatGPT

LangChain 实战心得:RouterChain 和 MultiPromptChain 的动态问题处理


前言

在构建智能客服系统的过程中,用户的提问往往会涵盖多个领域或场景。这种复杂性要求系统能够根据问题的特性选择最适合的回答方式。在上一节课中,我们学习了 LLMChainSequencialChain,通过多步骤链的方式解决了简单问题。而本节课通过 RouterChain 和 MultiPromptChain 实现了多模板动态路由,展示了如何根据用户问题类型选择不同的处理模板。


任务背景与目标

任务背景

我们构建了一个鲜花运营智能客服 ChatBot,主要处理以下两类问题:

  1. 鲜花养护:如“如何浇水”“施肥的频率是多少”等。
  2. 鲜花装饰:如“婚礼场地如何装饰”“鲜花如何搭配色彩”等。

用户的需求是:

  • 问题类型识别:系统根据问题内容选择适合的回答模板。
  • 动态路由:系统能够将用户问题自动引导至正确的目标链处理。
  • 兜底机制:如果问题不属于上述两类,系统依然能够以默认链处理,避免问题无解。

解决方案框架

为了实现上述目标,采用了 LangChain 提供的 RouterChain 和 MultiPromptChain,整体解决方案的框架如下:

  1. 构建提示模板(Prompts)

    • 针对鲜花养护和鲜花装饰分别设计模板。
    • 模板描述了语言模型的角色和回答方式。
  2. 初始化语言模型

    • 使用 OpenAI 的 API 作为语言模型。
    • 可扩展到 HuggingFace 或其他自定义模型。
  3. 构建目标链

    • 为每种问题类型创建一个目标链(LLMChain),与模板一一对应。
  4. 构建路由链(RouterChain)

    • 使用 LLMRouterChain,设计一个路由器链,通过问题内容识别问题类型并选择对应的目标链。
  5. 构建默认链(Default Chain)

    • 当问题不属于任何已定义的类型时,触发默认链(ConversationChain)。
  6. 组合多提示链(MultiPromptChain)

    • 使用 MultiPromptChain,将路由链、目标链和默认链整合成一个完整的决策系统。

详细实现步骤

1. 构建提示模板

针对“鲜花养护”和“鲜花装饰”两个场景,分别设计了以下模板:

python
复制代码
flower_care_template = """你是一个经验丰富的园丁,擅长解答关于养花育花的问题。
下面是需要你来回答的问题:
{input}"""

flower_deco_template = """你是一位网红插花大师,擅长解答关于鲜花装饰的问题。
下面是需要你来回答的问题:
{input}"""

然后,将模板存储为提示信息列表 prompt_infos,便于后续动态加载。

python
复制代码
prompt_infos = [
    {
        "key": "flower_care",
        "description": "适合回答关于鲜花护理的问题",
        "template": flower_care_template,
    },
    {
        "key": "flower_decoration",
        "description": "适合回答关于鲜花装饰的问题",
        "template": flower_deco_template,
    }]

2. 初始化语言模型

使用 OpenAI 的语言模型进行测试,便于实现自然语言的高质量响应。

python
复制代码
from langchain.llms import OpenAI
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
llm = OpenAI()

3. 构建目标链

通过循环 prompt_infos,为每个场景模板创建对应的 LLMChain

python
复制代码
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate

chain_map = {}
for info in prompt_infos:
    prompt = PromptTemplate(template=info['template'], 
                            input_variables=["input"])
    chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
    chain_map[info["key"]] = chain

目标链功能

  • flower_care 负责处理鲜花养护相关问题。
  • flower_decoration 负责处理鲜花装饰相关问题。

4. 构建路由链

路由链的作用是根据用户输入的内容选择合适的目标链。通过 RouterChain,定义一个路由模板:

python
复制代码
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RouterTemplate

# 动态生成路由模板
destinations = [f"{p['key']}: {p['description']}" for p in prompt_infos]
router_template = RouterTemplate.format(destinations="\n".join(destinations))
router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser(),
)

# 创建路由链
router_chain = LLMRouterChain.from_llm(llm, router_prompt, verbose=True)

路由链会根据输入内容匹配 prompt_infos 中的描述并选择对应的目标链。


5. 构建默认链

当路由链无法匹配合适的目标链时,触发默认链进行处理。例如:

python
复制代码
from langchain.chains import ConversationChain
default_chain = ConversationChain(llm=llm, output_key="text", verbose=True)

6. 组合多提示链

使用 MultiPromptChain 将目标链、路由链和默认链整合为一个完整的处理系统:

python
复制代码
from langchain.chains.router import MultiPromptChain

chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains=chain_map,
    default_chain=default_chain,
    verbose=True
)

MultiPromptChain 的核心工作流程:

  1. 路由链决定输入应路由到哪个目标链。
  2. 如果目标链存在,路由到目标链处理。
  3. 如果无法匹配,路由到默认链。

测试与结果分析

测试用例

  1. 鲜花养护问题
python
复制代码
print(chain.run("如何为玫瑰浇水?"))

结果: 模型通过路由链选择了 flower_care 链,回答了如何为玫瑰浇水的问题。


  1. 鲜花装饰问题
python
复制代码
print(chain.run("如何为婚礼场地装饰花朵?"))

结果: 模型通过路由链选择了 flower_decoration 链,回答了婚礼场地的装饰建议。


  1. 无关问题
python
复制代码
print(chain.run("如何考入哈佛大学?"))

结果: 模型无法匹配到具体的目标链,因此路由到默认链进行处理。


总结与反思

1. RouterChain 的价值

RouterChain 提供了一种动态决策的能力,使得多场景问题处理更加高效和自动化。特别是在多任务、多模块的应用中,通过路由链可以灵活扩展新的场景,而无需对已有逻辑进行大幅修改。

2. MultiPromptChain 的优势

MultiPromptChain 将路由链与多个目标链整合在一起,实现了问题处理的全流程管理。通过默认链机制,还可以确保每个问题都能得到响应。

3. 性能与优化建议

  • 优化路由链:对于复杂问题,可以通过更丰富的描述或示例提升路由链的决策准确性。
  • 模型性能:测试中发现小型语言模型在回答专业问题时能力有限,可以考虑更强大的模型如 GPT-4。
  • 支持更多场景:通过扩展 prompt_infos 的内容,可以支持更多领域的问答,例如物流管理或客户投诉。

4. 思考题

  1. verbose=True 设置为 False,可以减少日志输出,更适合生产环境。
  2. 将默认链替换为 LLMChain 后,可以直接处理默认输入而不需要上下文管理,适用于非连续对话场景。

结语

通过本节的学习,我们看到了 LangChain 在多场景问题处理中的强大能力。通过 RouterChain 和 MultiPromptChain,系统可以灵活地根据输入动态选择目标链,并确保即使无法匹配也能通过默认链兜底处理。未来可以将此思路扩展到更多业务场景,例如客户服务、流程自动化等,为系统开发提供更高效的解决方案。