纲要

  • 项目全景:单智能体与多智能体架构
    • 单智能体助手:钉钉集成版
    • 多智能体助手:数字人客服版
  • 小浪助手·单智能体版
    • 核心特性:多轮对话、情绪识别、日历交互、知识库检索
    • 技术架构与数据流
    • 关键交互流程解析
  • 小浪助手·多智能体版
    • 新增能力:数字人集成、流式输出、TTS 语音合成、多智能体编排
    • 架构演进:从单一大模型到专家协作网络
  • 单智能体与多智能体方案对比
  • 代码实战:构建具备情绪感知能力的单智能体对话骨架
    • 技术选型:Python + OpenAI 兼容 API
    • 核心模块实现:多轮对话、情绪识别、日程解析与待办模拟
    • 完整可运行代码(含修正说明)
  • API 速览
  • 总结
  • 参考文档
  • 修订说明

项目全景:单智能体与多智能体架构

在 AI Agent 的技术演进中,从单智能体到多智能体的跃迁并非简单的数量叠加,而是架构范式的转变。本文以“小浪助手”为案例,剖析两个版本的实现方案:

  • 单智能体版:部署于钉钉环境的企业级助手,具备多轮对话、情绪识别、日历操作及 RAG 知识库检索能力。
  • 多智能体版:面向数字人客服场景,由多个专业 Agent 协作完成复杂任务,支持实时语音合成与流式输出。

两个版本由浅入深,覆盖 Agent 开发的核心模块。以下逐一拆解其设计与实现。

小浪助手·单智能体版

单智能体版本定位为钉钉企业内部助手,其目标是通过自然语言交互帮助员工管理日程、解答专业技术问题,并在检测到用户负面情绪时自动生成待办任务。

核心特性

  • 多轮对话上下文管理:维护完整对话历史,支持连续交互中的日程调整、意图修正等复杂场景。
  • 情绪识别与自动化联动:基于规则或轻量模型对用户输入进行情感分析,当判定为负面情绪(如投诉)时,自动在钉钉中创建待办事项,并根据情绪强度设定优先级。
  • 自然语言日历交互:支持通过对话完成日程的增删改查,所有变更操作在用户确认后执行,保障数据安全。
  • RAG 知识库检索:内置 LangChain 技术文档向量库,使其能够作为专业领域答疑助手。

技术架构与数据流

单智能体的逻辑流程如下所示:

日程操作

知识查询

普通对话

负面情绪

钉钉消息

Webhook 接收

单智能体核心

意图识别

日历 API

RAG 检索

大模型回复

情绪分析模块

钉钉待办 API

返回结果

回复用户

关键交互流程解析

以一次典型的日程调整场景为例:

  1. 用户输入:“帮我安排明天上午十点的面试。”
  2. 助手调用日历 API 创建事件,并回复:“已为您安排明天 10:00 的面试。”
  3. 用户继续:“后天我有事,把面试改到后天下午三点。”
  4. 助手结合上下文定位原事件,发起修改请求,并返回确认提示:“是否将原定明天 10:00 的面试调整至后天 15:00?请回复确认。”
  5. 用户确认后,助手执行更新并返回成功信息。

当用户输入负面情绪表述时(如“你们服务太差了,我要投诉!”),情绪分析模块触发,创建一条包含投诉内容和情绪评分的待办记录,供人工客服后续跟进。

小浪助手·多智能体版

多智能体版本在单智能体基础上进行了架构升级。它将一个总控客服 Agent 与多个后台专家 Agent(如代码专家、搜索专家、资料专家)组合成协作网络,并引入数字人交互界面,提供更沉浸的用户体验。

新增能力

  • 数字人形象与 TTS 语音合成:基于 WebRTC 实现实时数字人驱动,支持普通话及多种方言的语音回复。
  • 多智能体协作编排:客服 Agent 承担前台接待与意图分发职责,后端多个 Agent 各司其职,协同完成复杂任务。
  • 流式输出:回复内容以打字机效果逐字呈现,有效降低用户等待感知时间。
  • 可观测性:集成 LangSmith,提供多 Agent 调用链追踪、Token 消耗监控等运维能力。

架构演进:从单一大模型到专家协作网络

多智能体架构

用户

客服 Agent (总控)

搜索 Agent

代码 Agent

文档 Agent

向量数据库

代码执行环境

知识库

单智能体架构

用户

单一 Agent

工具 / API

多智能体协作的典型时序流程如下:

代码 Agent 文档 Agent 搜索 Agent 客服 Agent (总控) 用户 代码 Agent 文档 Agent 搜索 Agent 客服 Agent (总控) 用户 par [并行检索] 提交复杂问题 意图解析与任务分解 搜索最新资料 返回搜索结果 查询内部知识库 返回文档片段 请求生成代码示例 返回代码片段 汇总多源结果 输出综合回复

在单智能体架构中,所有逻辑集中于一个 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}")

运行说明

  1. 安装依赖:pip install openai
  2. API_KEY 替换为您的实际密钥;若使用智谱 API,可将 BASE_URL 改为 https://open.bigmodel.cn/api/paas/v4/MODEL 改为 glm-4
  3. 启动脚本后,尝试输入示例:
    • “明天下午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)

参考文档

官方文档

参考链接

总结

本文围绕“小浪助手”案例,完整剖析了单智能体与多智能体两种架构的设计思路、核心特性与实现要点。单智能体方案以简洁的架构满足聚焦场景下的自动化需求,通过工具集成和情绪感知增强人机交互的智能化程度。多智能体方案则通过专业化分工与协作编排,支撑更复杂的业务场景,并借助数字人、流式输出和可观测性组件提升用户体验与运维效率。

随文提供的 Python 代码骨架,演示了单智能体的核心闭环:上下文管理 → 意图解析 → 工具调用 → 结果整合。读者可在此基础上,将模拟函数替换为真实的日历 API、待办接口和 RAG 检索模块,快速构建生产级 Agent 应用。

后续的系列内容将进一步拆解多智能体协作框架的实现细节,涵盖 LangGraph 工作流编排、Agent 间通信协议以及可观测性系统的搭建等进阶主题。

更多推荐