系列目标:30 天从 LangChain 入门到企业级部署
今日任务:理解动态路由的价值 → 掌握RouterChain基础用法 → 构建“客服问题自动分发系统”!
🧭 一、为什么需要 RouterChain?
在 Day 8 中,我们构建了一条固定流水线:所有用户反馈都走“提取 → 回复 → 情绪分析”。
但真实客服场景中,问题类型多样:
- “怎么退货?” → 需要退货流程指引
- “产品坏了怎么办?” → 需要技术支持
- “你们公司地址在哪?” → 需要通用信息回答
如果强行用同一套流程处理,结果会很奇怪!
RouterChain 就是 LangChain 提供的“AI 路由器” —— 它先判断用户问题属于哪一类,再动态调用对应的子 Chain,实现智能分发。
✅ 今天,我们就来打造一个能自动区分“退货 / 技术 / 通用”三类问题的智能客服!
🧱 二、RouterChain 工作原理
用户输入:“我的耳机充不进电!”
↓
[Router] 判断类型 → "technical"
↓
调用 [TechnicalSupportChain]
↓
返回专业解决方案
LangChain 提供两种 Router 实现:
MultiPromptChain(基于关键词匹配 + LLM 判断)✅ 推荐新手用- 自定义
RouterChain(完全控制逻辑,Day 21 讲)
🔔 Day 9 重点:
MultiPromptChain—— 开箱即用的智能路由!
🛠️ 三、实战:构建智能客服问题分发系统
我们将支持三类问题:
- 退货咨询(refund)
- 技术支持(technical)
- 通用问答(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内部会:
- 用 LLM 分析用户问题属于哪一类(基于 description)
- 自动选择对应的 prompt 模板
- 调用 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 智能体!