AI Agent从无到有11:从单智能体到多智能体助手实战演变
纲要
- 项目全景:单智能体与多智能体架构
- 单智能体助手:钉钉集成版
- 多智能体助手:数字人客服版
- 小浪助手·单智能体版
- 核心特性:多轮对话、情绪识别、日历交互、知识库检索
- 技术架构与数据流
- 关键交互流程解析
- 小浪助手·多智能体版
- 新增能力:数字人集成、流式输出、TTS 语音合成、多智能体编排
- 架构演进:从单一大模型到专家协作网络
- 单智能体与多智能体方案对比
- 代码实战:构建具备情绪感知能力的单智能体对话骨架
- 技术选型:Python + OpenAI 兼容 API
- 核心模块实现:多轮对话、情绪识别、日程解析与待办模拟
- 完整可运行代码(含修正说明)
- API 速览
- 总结
- 参考文档
- 修订说明
项目全景:单智能体与多智能体架构
在 AI Agent 的技术演进中,从单智能体到多智能体的跃迁并非简单的数量叠加,而是架构范式的转变。本文以“小浪助手”为案例,剖析两个版本的实现方案:
- 单智能体版:部署于钉钉环境的企业级助手,具备多轮对话、情绪识别、日历操作及 RAG 知识库检索能力。
- 多智能体版:面向数字人客服场景,由多个专业 Agent 协作完成复杂任务,支持实时语音合成与流式输出。
两个版本由浅入深,覆盖 Agent 开发的核心模块。以下逐一拆解其设计与实现。
小浪助手·单智能体版
单智能体版本定位为钉钉企业内部助手,其目标是通过自然语言交互帮助员工管理日程、解答专业技术问题,并在检测到用户负面情绪时自动生成待办任务。
核心特性
- 多轮对话上下文管理:维护完整对话历史,支持连续交互中的日程调整、意图修正等复杂场景。
- 情绪识别与自动化联动:基于规则或轻量模型对用户输入进行情感分析,当判定为负面情绪(如投诉)时,自动在钉钉中创建待办事项,并根据情绪强度设定优先级。
- 自然语言日历交互:支持通过对话完成日程的增删改查,所有变更操作在用户确认后执行,保障数据安全。
- RAG 知识库检索:内置 LangChain 技术文档向量库,使其能够作为专业领域答疑助手。
技术架构与数据流
单智能体的逻辑流程如下所示:
关键交互流程解析
以一次典型的日程调整场景为例:
- 用户输入:“帮我安排明天上午十点的面试。”
- 助手调用日历 API 创建事件,并回复:“已为您安排明天 10:00 的面试。”
- 用户继续:“后天我有事,把面试改到后天下午三点。”
- 助手结合上下文定位原事件,发起修改请求,并返回确认提示:“是否将原定明天 10:00 的面试调整至后天 15:00?请回复确认。”
- 用户确认后,助手执行更新并返回成功信息。
当用户输入负面情绪表述时(如“你们服务太差了,我要投诉!”),情绪分析模块触发,创建一条包含投诉内容和情绪评分的待办记录,供人工客服后续跟进。
小浪助手·多智能体版
多智能体版本在单智能体基础上进行了架构升级。它将一个总控客服 Agent 与多个后台专家 Agent(如代码专家、搜索专家、资料专家)组合成协作网络,并引入数字人交互界面,提供更沉浸的用户体验。
新增能力
- 数字人形象与 TTS 语音合成:基于 WebRTC 实现实时数字人驱动,支持普通话及多种方言的语音回复。
- 多智能体协作编排:客服 Agent 承担前台接待与意图分发职责,后端多个 Agent 各司其职,协同完成复杂任务。
- 流式输出:回复内容以打字机效果逐字呈现,有效降低用户等待感知时间。
- 可观测性:集成 LangSmith,提供多 Agent 调用链追踪、Token 消耗监控等运维能力。
架构演进:从单一大模型到专家协作网络
多智能体协作的典型时序流程如下:
在单智能体架构中,所有逻辑集中于一个 Agent;多智能体架构则将总控 Agent 作为统一入口,负责意图解析与子任务分发,各个专业 Agent 并行或串行执行,最终由总控汇总输出。
单智能体与多智能体方案对比
| 维度 | 单智能体 | 多智能体 |
|---|---|---|
| 架构复杂度 | 低 | 中高 |
| 适用场景 | 功能聚焦、流程固定的助手 | 需要多技能协作的复杂客服或业务系统 |
| 上下文管理 | 单一对话历史 | 多 Agent 需协调共享记忆 |
| 扩展性 | 通过工具函数扩展 | 可热插拔 Agent,职责分离更清晰 |
| 推理成本 | 单次调用 | 多次调用,需精细控制预算 |
| 可观测性 | 基础日志 | 支持链路追踪与性能监控 |
| 代表实现 | 钉钉日程助手 | 数字人客服 + 专家团 |
代码实战:构建具备情绪感知能力的单智能体对话骨架
本节提供一个可运行的 Python 示例,模拟单智能体助手的核心逻辑:多轮对话、情绪识别与待办创建。代码使用 OpenAI 兼容接口,可替换为智谱、DeepSeek 或本地 Ollama 等模型。
技术栈版本说明:
- Python 3.8+
openai库 >= 1.0.0- 类型注解兼容 Python 3.10+(示例中使用
typing.Optional以适配低版本)
功能说明:
- 支持多轮对话:维护对话历史,确保上下文连贯。
- 情绪识别:通过关键词匹配识别用户情绪(生产环境建议使用专用情感分析模型)。
- 日程解析:基于正则表达式提取时间与事件描述(演示级实现,实际项目应接入日历 API)。
- 待办模拟:当检测到负面情绪时,模拟创建待办事项(可扩展为钉钉/飞书接口调用)。
import openai
from datetime import datetime, timedelta
import re
from typing import List, Dict, Optional
# ================= 配置区 =================
API_KEY = "your-api-key-here" # 替换为你的 API Key
BASE_URL = "https://api.deepseek.com" # 或使用 https://open.bigmodel.cn/api/paas/v4/
MODEL = "deepseek-chat"
# ==========================================
client = openai.OpenAI(api_key=API_KEY, base_url=BASE_URL)
class SimpleAgent:
"""带情绪识别和日程模拟的单智能体"""
def __init__(self):
self.history: List[Dict[str, str]] = [
{"role": "system", "content": "你是小浪助手,一个友好的企业内部助手。你可以帮用户安排日程、回答问题。请用中文回复。"}
]
self.events: List[Dict] = [] # 模拟日历事件列表
def detect_emotion(self, text: str) -> str:
"""基于关键词的情绪识别(演示级实现)"""
negative_words = ["投诉", "差劲", "生气", "失望", "太烂", "糟糕"]
if any(w in text for w in negative_words):
return "负面"
return "中性"
def create_todo(self, content: str, priority: str = "中") -> None:
"""模拟创建钉钉待办(可扩展为实际 API 调用)"""
print(f"[待办] 已创建待办: {content} (优先级: {priority})")
def parse_event(self, text: str) -> Optional[Dict]:
"""
基于正则表达式解析日程意图(演示级实现)
支持格式:[今天/明天/后天] + [早上/上午/下午/晚上] + [数字]点 + 事件描述
修正内容:将时间词(下午、晚上)转换为 24 小时制
"""
# 时间词到 24 小时制偏移的映射
period_map = {
"早上": 0, "上午": 0, # 早上/上午 按整点处理
"下午": 12, "晚上": 12
}
pattern = r'(今天|明天|后天)?(早上|上午|下午|晚上)?(\d{1,2})点(.*)'
match = re.search(pattern, text)
if not match:
return None
day_word, period, hour_str, title = match.groups()
hour = int(hour_str)
# 根据时间段调整小时(下午 3 点 -> 15 点)
if period in period_map:
hour += period_map[period]
# 边界处理:晚上 10 点 -> 22 点,如果超过 24 则重置(理论上不会)
if hour >= 24:
hour = hour - 12 # 简单容错:如晚上 13 点(异常输入)转为 1 点
# 日期计算
now = datetime.now()
if day_word == "明天":
event_date = now + timedelta(days=1)
elif day_word == "后天":
event_date = now + timedelta(days=2)
else:
event_date = now
# 组合日期与时间,若时间已过则默认顺延一天
try:
event_time = event_date.replace(hour=hour, minute=0, second=0, microsecond=0)
except ValueError:
# 小时值非法(如 25 点)时回退为当前小时
event_time = event_date.replace(hour=now.hour, minute=0, second=0, microsecond=0)
# 如果设置的时间已过,自动顺延至明天(仅当日期为今天时)
if event_time < now and day_word is None:
event_time = event_time + timedelta(days=1)
return {"time": event_time, "title": title.strip()}
def chat(self, user_input: str) -> str:
# 1. 将用户消息追加至历史记录
self.history.append({"role": "user", "content": user_input})
# 2. 情绪分析(独立于意图,并行触发)
emotion = self.detect_emotion(user_input)
if emotion == "负面":
self.create_todo(f"用户情绪激动,原始输入:{user_input}", priority="高")
# 3. 尝试解析日程意图
event = self.parse_event(user_input)
if event:
self.events.append(event)
reply = f"已为您安排 {event['time'].strftime('%m月%d日 %H:%M')} 的「{event['title']}」。"
self.history.append({"role": "assistant", "content": reply})
return reply
# 4. 普通对话:调用大模型
try:
resp = client.chat.completions.create(
model=MODEL,
messages=self.history,
temperature=0.7,
max_tokens=500
)
bot_msg = resp.choices[0].message.content
self.history.append({"role": "assistant", "content": bot_msg})
return bot_msg
except Exception as e:
error_msg = f"模型调用失败:{str(e)}"
self.history.append({"role": "assistant", "content": error_msg})
return error_msg
if __name__ == "__main__":
agent = SimpleAgent()
print("小浪助手已启动(输入 'exit' 退出)。")
while True:
user_input = input("You: ")
if user_input.lower() in ["exit", "quit"]:
break
reply = agent.chat(user_input)
print(f"Bot: {reply}")
运行说明:
- 安装依赖:
pip install openai - 将
API_KEY替换为您的实际密钥;若使用智谱 API,可将BASE_URL改为https://open.bigmodel.cn/api/paas/v4/,MODEL改为glm-4。 - 启动脚本后,尝试输入示例:
- “明天下午3点开团队周会”
- “你们的服务太差了,我要投诉!”
- “帮我查一下 LangChain 是什么”(需配置 RAG 模块,当前为演示版)
API 速览
本示例主要涉及 OpenAI Python SDK 的 ChatCompletion API。
| 所属库 | 方法 | 方法签名/参数 | 返回值 | 说明 |
|---|---|---|---|---|
openai |
client.chat.completions.create |
model: str, messages: List[Dict], temperature: float, max_tokens: int |
ChatCompletion 对象 |
调用大模型生成回复,支持 OpenAI 兼容接口 |
openai |
OpenAI 初始化 |
api_key: str, base_url: Optional[str] |
OpenAI 客户端实例 |
配置 API 密钥和自定义端点 |
完整调用示例:
from openai import OpenAI
client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "你好"}],
temperature=0.7,
max_tokens=300
)
print(response.choices[0].message.content)
参考文档
官方文档
- https://platform.openai.com/docs/api-reference
- https://python.langchain.com/docs
- https://docs.smith.langchain.com
参考链接
- https://platform.deepseek.com/api-docs
- https://open.bigmodel.cn/
- https://open.dingtalk.com/document/robots
总结
本文围绕“小浪助手”案例,完整剖析了单智能体与多智能体两种架构的设计思路、核心特性与实现要点。单智能体方案以简洁的架构满足聚焦场景下的自动化需求,通过工具集成和情绪感知增强人机交互的智能化程度。多智能体方案则通过专业化分工与协作编排,支撑更复杂的业务场景,并借助数字人、流式输出和可观测性组件提升用户体验与运维效率。
随文提供的 Python 代码骨架,演示了单智能体的核心闭环:上下文管理 → 意图解析 → 工具调用 → 结果整合。读者可在此基础上,将模拟函数替换为真实的日历 API、待办接口和 RAG 检索模块,快速构建生产级 Agent 应用。
后续的系列内容将进一步拆解多智能体协作框架的实现细节,涵盖 LangGraph 工作流编排、Agent 间通信协议以及可观测性系统的搭建等进阶主题。
更多推荐



所有评论(0)