🌟 LangChain 30 天保姆级教程 · Day 9|让 AI 自己选路!用 RouterChain 实现智能问题分类与动态路由

3 阅读4分钟

系列目标:30 天从 LangChain 入门到企业级部署
今日任务:理解动态路由的价值 → 掌握 RouterChain 基础用法 → 构建“客服问题自动分发系统”!


🧭 一、为什么需要 RouterChain?

在 Day 8 中,我们构建了一条固定流水线:所有用户反馈都走“提取 → 回复 → 情绪分析”。

但真实客服场景中,问题类型多样:

  • “怎么退货?” → 需要退货流程指引
  • “产品坏了怎么办?” → 需要技术支持
  • “你们公司地址在哪?” → 需要通用信息回答

如果强行用同一套流程处理,结果会很奇怪!

RouterChain 就是 LangChain 提供的“AI 路由器”  —— 它先判断用户问题属于哪一类,再动态调用对应的子 Chain,实现智能分发。

✅ 今天,我们就来打造一个能自动区分“退货 / 技术 / 通用”三类问题的智能客服!


🧱 二、RouterChain 工作原理

用户输入:“我的耳机充不进电!”
        ↓
[Router] 判断类型 → "technical"
        ↓
调用 [TechnicalSupportChain]
        ↓
返回专业解决方案

LangChain 提供两种 Router 实现:

  • MultiPromptChain(基于关键词匹配 + LLM 判断)✅ 推荐新手用
  • 自定义 RouterChain(完全控制逻辑,Day 21 讲)

🔔 Day 9 重点:MultiPromptChain —— 开箱即用的智能路由!


🛠️ 三、实战:构建智能客服问题分发系统

我们将支持三类问题:

  1. 退货咨询(refund)
  2. 技术支持(technical)
  3. 通用问答(general)

步骤 1:准备 LLM

# day9_router_chain.py
from langchain_ollama import ChatOllama
from langchain.chains import MultiPromptChain

llm = ChatOllama(model="qwen:7b", temperature=0)

步骤 2:为每类问题定义专属 Prompt

# 1. 退货咨询 Prompt
refund_prompt = """
你是一个电商退货专员。用户的问题与退货/退款相关。
请提供清晰的退货流程,并提醒用户保留商品原包装。

用户问题:{input}
"""

# 2. 技术支持 Prompt
technical_prompt = """
你是一个技术支持工程师。用户的问题涉及产品使用或故障。
请用通俗语言解释可能原因,并提供解决步骤。

用户问题:{input}
"""

# 3. 通用问答 Prompt
general_prompt = """
你是一个客服代表。用户的问题属于一般咨询(如公司信息、营业时间等)。
请礼貌、简洁地回答。

用户问题:{input}
"""

步骤 3:构建 MultiPromptChain

# 定义路由选项(name + description)
prompt_infos = [
    {
        "name": "refund",
        "description": "处理退货、退款相关问题",
        "prompt_template": refund_prompt
    },
    {
        "name": "technical",
        "description": "处理产品技术故障、使用问题",
        "prompt_template": technical_prompt
    },
    {
        "name": "general",
        "description": "处理一般性咨询(如地址、营业时间等)",
        "prompt_template": general_prompt
    }
]

# 创建 Router Chain
router_chain = MultiPromptChain.from_prompts(
    llm=llm,
    prompt_infos=prompt_infos,
    verbose=True  # 查看路由决策过程
)

💡 MultiPromptChain 内部会:

  1. 用 LLM 分析用户问题属于哪一类(基于 description)
  2. 自动选择对应的 prompt 模板
  3. 调用 LLM 生成最终回答

步骤 4:测试不同问题类型

test_questions = [    "我想退货,怎么操作?",    "蓝牙耳机连不上手机,怎么办?",    "你们公司总部在哪里?"]

for question in test_questions:
    print(f"\n👤 用户:{question}")
    response = router_chain.invoke({"input": question})
    print(f"🤖 AI:{response['text']}")

▶️ 输出示例(verbose 模式):

> Entering new MultiPromptChain chain...
Selected destination: technical
...

👤 用户:蓝牙耳机连不上手机,怎么办?
🤖 AI:可能是蓝牙未开启或配对失败,请尝试以下步骤:
1. 确保耳机处于配对模式(通常长按电源键5秒)...

✅ AI 成功识别问题类型,并调用对应的专业回答模板!


🔍 四、关键机制解析

1. 路由决策靠什么?

  • 内部会构造一个“分类 prompt”,让 LLM 从 description 中选择最匹配的 name

  • 示例内部 prompt:

    给定以下问题,选择最合适的处理方式:
    - refund: 处理退货、退款相关问题
    - technical: 处理产品技术故障...
    问题:"耳机充不进电"
    答案:
    

2. 如何提高分类准确率?

  • description 要清晰、互斥(避免重叠)
  • 可加入关键词提示:“包含‘退’、‘款’、‘换货’等问题属于 refund”

⚠️ 五、注意事项 & 优化建议

表格

问题建议
分类错误(如把“退货”判成“通用”)优化 description,增加典型关键词
中文模型路由不准使用 Qwen、GLM 等中文优化模型;降低 temperature
想要更多类别?直接在 prompt_infos 中添加新项
需要 fallback 机制?后续可加“未知类型”默认 Chain(自定义 Router)

💡 生产建议
对于关键业务(如金融、医疗),建议在 Router 后加人工审核或置信度阈值。


📦 六、配套代码结构

langchain-30-days/
└── day9/
    └── smart_customer_service_router.py  # 智能客服路由系统

📝 七、今日小结

  • ✅ 理解了动态路由在复杂系统中的价值
  • ✅ 学会了 MultiPromptChain 开箱即用的路由方式
  • ✅ 实现了三类客服问题的自动分发
  • ✅ 掌握了提升分类准确率的技巧
  • ✅ 知道了 RouterChain 的适用边界

🎯 明日预告:Day 10 —— Agent 登场!让 AI 自主思考并调用工具,实现 ReAct 智能体!