[智能客服project] AI代理系统 | 意图路由器
第三章:AI代理系统
欢迎回来!
在第一章:对话记忆中,我们学习了机器人如何记忆对话
。
在第二章:闲鱼通信层中,我们了解了它如何接收闲鱼消息并发送回复
。
现在来到最激动人心的部分:机器人如何决定要回复用户什么内容?
为什么机器人需要"AI代理系统"?
假设你在网上出售商品。潜在买家发来消息时,你需要:
- 理解对方诉求(询问价格?技术细节?库存情况?)
- 记忆对话历史(是否已议价?上次报价多少?)
- 掌握商品信息(产品特性?定价策略?)
- 组织基于所有信息的礼貌有效回复
这需要智能。对于我们的机器人,这种智能来自AI代理系统。它是核心"大脑",接收消息后结合历史记录(对话记忆)和商品详情,利用大语言模型(LLM)生成最佳回应。
若无此系统,机器人只是高级消息记录器,无法真正智能对话。
什么是AI代理系统?
AI代理系统是生成机器人回复的核心智能模块,主要职责是利用LLM结合对话历史和商品上下文处理用户消息,生成相关且得体的回复。
可视为专家顾问团队。当消息到达时,系统首先判断用户意图(技术问题?价格协商?),然后将消息和上下文分派给对应领域的专家代理(“Agent”)。专家代理在定制化指令引导下,通过LLM生成完美回复。
核心组件包括:
- 主控制器(
XianyuReplyBot
):类似项目经理,接收消息、分配处理者并协调流程 - 专家代理(如
PriceAgent
、TechAgent
、DefaultAgent
):各领域顾问,掌握特定知识(如议价策略或技术答疑)并擅长运用LLM - 意图路由器(
IntentRouter
):调度员,解析消息以确定需要哪位专家代理
工作原理(高层流程图)
可视化展示新消息到达时的处理流程:
如图所示,XianyuReplyBot
作为流程协调者,通过IntentRouter
选择正确的Expert Agent
,后者与LLM
交互生成回复。
主控制器:XianyuReplyBot
项目中XianyuAgent.py
的XianyuReplyBot
类是AI代理系统的核心,管理各代理和路由器,加载代理指令(prompt),控制回复生成全流程。
其核心方法是generate_reply
:
# 摘自 XianyuAgent.py 的简化代码片段
class XianyuReplyBot:def __init__(self):# ... 初始化代理和路由器 ...self.agents = {} # 存储不同代理实例self.router = None # 意图路由器实例def generate_reply(self, user_msg: str, item_desc: str, context: List[Dict]) -> str:"""生成回复的主流程"""# 1. 格式化记忆系统的历史记录formatted_context = self.format_history(context)# 2. 通过路由器确定代理类型detected_intent = self.router.detect(user_msg, item_desc, formatted_context)# 3. 根据意图选择代理agent = self.agents.get(detected_intent, self.agents['default'])logger.info(f'检测到意图: {detected_intent}, 使用代理: {type(agent).__name__}')# 4. 从记忆系统提取议价次数等细节bargain_count = self._extract_bargain_count(context)logger.info(f'议价次数: {bargain_count}')# 5. 通过选定代理生成回复return agent.generate(user_msg=user_msg,item_desc=item_desc,context=formatted_context,bargain_count=bargain_count # 传递相关细节)def format_history(self, context: List[Dict]) -> str:"""将对话记忆格式化为LLM可读文本"""# ... 格式化代码 ...def _extract_bargain_count(self, context: List[Dict]) -> int:"""从上下文中提取议价次数"""# ... 分析代码 ...
generate_reply
方法接收原始输入(用户消息、商品描述、对话记忆的上下文),处理后通过路由器选择代理,调用代理的generate
方法获取最终回复。
意图路由器:流量调度
IntentRouter
(详见第四章:意图路由器)是消息调度中枢。XianyuReplyBot
在生成回复前会询问路由器:“用户意图是什么?”
# 摘自 XianyuAgent.py 的简化代码片段
class IntentRouter:def __init__(self, classify_agent):# ... 定义关键词匹配规则 ...self.classify_agent = classify_agent # 用于备选的LLM代理def detect(self, user_msg: str, item_desc, context) -> str:"""判断用户意图"""# 1. 检查关键词(如"参数"、"价格")if "参数" in user_msg or "规格" in user_msg:return 'tech' # 技术类问题if "价格" in user_msg or "便宜" in user_msg:return 'price' # 价格协商# 2. 无匹配时使用LLM代理判断return self.classify_agent.generate(user_msg=user_msg, item_desc=item_desc, context=context)
路由器结合关键词匹配(如"价格")和LLM代理(classify_agent
)的智能判断,返回意图标识符(如'price'
、'tech'
或'default'
)。
专家代理:专业化提示工程
所有专家代理继承自BaseAgent
基类,提供LLM交互的通用功能。
# 摘自 XianyuAgent.py 的简化代码片段
class BaseAgent:def __init__(self, client, system_prompt, safety_filter):self.client = client # LLM客户端实例self.system_prompt = system_prompt # 代理专用指令self.safety_filter = safety_filter # 内容安全过滤器def generate(self, user_msg: str, item_desc: str, context: str, bargain_count: int = 0) -> str:"""生成回复的模板方法"""# 1. 构建LLM消息结构messages = self._build_messages(user_msg, item_desc, context)# 2. 调用LLM接口response = self._call_llm(messages)# 3. 应用安全过滤return self.safety_filter(response)def _build_messages(self, user_msg: str, item_desc: str, context: str) -> List[Dict]:"""结构化提示词和上下文"""return [{"role": "system", "content": f"【商品信息】{item_desc}\n【对话历史】{context}\n{self.system_prompt}"},{"role": "user", "content": user_msg}]def _call_llm(self, messages: List[Dict], temperature: float = 0.4) -> str:"""调用LLM API(如OpenAI)"""response = self.client.chat.completions.create(model="qwen-max", # 模型名称示例messages=messages, temperature=temperature, # 控制生成随机性max_tokens=500, # 回复长度限制# ... 其他参数 ...)return response.choices[0].message.content
BaseAgent
初始化时加载system_prompt
,包含该代理的专用指令(如"你是二手商品销售助手…")。_build_messages
方法将指令、商品描述和对话历史组合成LLM输入。
特化代理(PriceAgent、TechAgent等)
具体代理如PriceAgent
和TechAgent
继承BaseAgent
,可定制生成逻辑。
例如,PriceAgent
根据议价次数调整temperature
参数(影响回复随机性),议价次数越多越严格:
# 摘自 XianyuAgent.py 的简化代码片段
class PriceAgent(BaseAgent):"""处理价格协商"""def generate(self, user_msg: str, item_desc: str, context: str, bargain_count: int=0) -> str:"""覆盖生成方法添加议价逻辑"""# 根据议价次数计算温度值dynamic_temp = self._calc_temperature(bargain_count)# 在提示词中添加议价轮次messages = self._build_messages(user_msg, item_desc, context)messages[0]['content'] += f"\n▲当前议价轮次: {bargain_count}"# 使用动态温度调用LLMresponse = self.client.chat.completions.create(model=os.getenv("MODEL_NAME", "qwen-max"),messages=messages,temperature=dynamic_temp,max_tokens=500,top_p=0.8)return self.safety_filter(response.choices[0].message.content)def _calc_temperature(self, bargain_count: int) -> float:"""温度调整策略"""return min(0.3 + bargain_count * 0.15, 0.9) # 初始保守,逐渐灵活
TechAgent
可配置外部知识库调用(示例中仅包含enable_search
参数,具体依赖LLM服务商)。DefaultAgent
处理未识别意图,采用更通用的回复风格。
每个代理通过专用指令(system_prompt
,存储于prompts
目录)和定制参数,使机器人回复更精准专业。
内部结构:代理与提示词
AI代理系统的核心结构:
XianyuReplyBot
加载提示词文件,创建IntentRouter
和各BaseAgent
派生类实例。
调用generate_reply
时,通过路由器选择代理,代理调用LLM生成回复,最后经安全过滤器返回最终文本。
结论
AI代理系统(核心实现于XianyuReplyBot
类,配合IntentRouter
和特化代理)是XianyuAutoAgent
的智能核心。
它整合对话上下文和用户输入,通过路由器判断意图,分派专家代理,在定制提示词引导下生成专业、安全、上下文感知的回复。
此系统将机器人从简单消息处理器升级为具备闲鱼场景对话能力的智能代理。下一步将深入探讨意图路由器的运作机制。
下一章:意图路由器
第四章:意图路由器
在第三章:AI代理系统中,我们了解到XianyuReplyBot
如何作为主脑协调不同"专家"代理(各司其职,解耦编写简短函数的思想),利用大语言模型(LLM
)生成回复。
但XianyuReplyBot
如何知道该使用哪个专家代理处理特定消息?应该调用PriceAgent
?TechAgent
?还是默认的DefaultAgent
?
这正是意图路由器的职责所在。
为什么机器人需要"意图路由器"?
假设XianyuReplyBot
是客服团队经理,各类代理(PriceAgent
、TechAgent
等)是专业员工。当客户消息到达时,经理需要快速决策由哪位员工处理最合适。
- 若消息是"最低多少钱?" → 转交议价专家(
PriceAgent
) - 若消息是"支持蓝牙吗?" → 转交技术专家(
TechAgent
) - 若消息是"你好!" → 转交通用助手(
DefaultAgent
)
消息分派的准确性至关重要。若议价问题误转技术专家,将无法生成正确回复。
意图路由器如同XianyuReplyBot
的智能接待员。
其核心职责是快速解析用户消息,识别用户意图(用户意图询问或执行的操作),据此告知XianyuReplyBot
应调用的专家代理。
什么是意图路由器?
意图路由器是AI代理系统中的组件,负责分析入站消息以确定其核心意图。
它不直接生成回复,而是将消息分类至对应专家代理的预设类别。
在XianyuAutoAgent
项目中,XianyuAgent.py
的IntentRouter
类负责此任务。
其采用规则匹配与LLM智能判断相结合的策略实现意图分类。
工作原理(高层流程图)
将意图路由器嵌入现有消息处理流程:
如图所示,XianyuReplyBot
在调用专家代理前,将消息与上下文传递给IntentRouter
。路由器完成意图分析后,返回检测结果供主控系统选择代理。
路由决策机制:规则与LLM双轨制
IntentRouter
采用智能混合策略平衡效率与准确率:
- 快速规则匹配:扫描消息中的关键词或正则模式(如"价格"/"参数"类词汇),实现毫秒级判断
- LLM智能回退:无规则匹配时,调用专用LLM代理(
ClassifyAgent
)进行语义分析
查看XianyuAgent.py
中IntentRouter
类的结构:
# 摘自 XianyuAgent.py 的简化代码片段
class IntentRouter:"""意图路由决策器"""def __init__(self, classify_agent):# 定义关键词与正则匹配规则self.rules = {'tech': {'keywords': ['参数', '规格', '型号'], # 技术类关键词'patterns': [r'和.+比'] # 技术类正则模式},'price': {'keywords': ['便宜', '价', '砍价'], # 价格类关键词'patterns': [r'\d+元'] # 价格类正则模式}# ... 其他意图规则 ...}# 用于回退分类的LLM代理self.classify_agent = classify_agentdef detect(self, user_msg: str, item_desc, context) -> str:"""核心意图检测方法"""pass # 示意用简化代码
__init__
方法初始化rules
字典,该字典将意图名称映射至关键词列表和正则表达式模式,并存储classify_agent
实例(专用于LLM意图分类)。
核心逻辑在detect
方法中实现:
# 简化版detect方法逻辑(摘自IntentRouter类)def detect(self, user_msg: str, item_desc, context) -> str:"""用户意图检测"""text_clean = user_msg # 实际代码会进行文本清洗# 1. 技术类意图匹配(优先级1)if any(kw in text_clean for kw in self.rules['tech']['keywords']) or \any(re.search(p, text_clean) for p in self.rules['tech']['patterns']):return 'tech'# 2. 价格类意图匹配(优先级2)if any(kw in text_clean for kw in self.rules['price']['keywords']) or \any(re.search(p, text_clean) for p in self.rules['price']['patterns']):return 'price'# 3. 无规则匹配时调用LLM代理return self.classify_agent.generate(user_msg=user_msg,item_desc=item_desc,context=context)
流程说明:
- 优先检查消息是否包含技术类关键词/模式,匹配则返回
'tech'
- 若无匹配,检查价格类关键词/模式,匹配则返回
'price'
- 若均未匹配,调用
classify_agent
的LLM进行语义分类
XianyuReplyBot
根据返回的意图字符串(如'tech'
),从self.agents
字典查找对应代理实例。
内部结构:规则与LLM协同
意图路由器的内部架构呈双轨制:
IntentRouter
优先使用内置规则库进行高效匹配,失败时通过ClassifyAgent
调用LLM实现智能判断。
ClassifyAgent
作为特化的BaseAgent
实例,其系统提示词专用于意图分类(非生成回复),详见第五章:AI提示词配置。
结论
意图路由器是AI代理系统的关键组件,负责解析用户消息并分类至'price'
、'tech'
等意图类别。
其采用规则匹配与LLM智能回退的混合策略,既保障常见问题的高速响应,又实现复杂语义的精准判断。
这种设计使XianyuReplyBot
能高效分派消息至最适配的专家代理,确保回复的专业性与准确性。
理解意图路由机制后,下一步将探讨如何为各代理配置专属指令——这正是第五章:AI提示词配置的核心内容。
下一章:AI提示词配置