一、前置条件

1.1 环境要求

  • Python 3.8 或更高版本

  • 稳定的网络连接(用于调用API)

1.2 依赖安装

bash

pip install langchain langchain-core langchain-deepseek

1.3 API密钥配置

需要获取以下密钥(可选):

  • DeepSeek API Key:必需,用于AI模型调用

  • LangSmith API Key:可选,用于监控和调试

二、代码结构解析

2.1 导入模块和初始化设置

python

from langchain_core.tools import tool, InjectedToolArg
from typing_extensions import Annotated
from langchain.agents import create_agent
import os
from langchain_deepseek import ChatDeepSeek

# 环境变量设置
os.environ["LANGSMITH_TRACING"] = "true"  # 启用LangSmith追踪
os.environ["DEEPSEEK_API_KEY"] = "your-deepseek-api-key"  # 必须设置

# 初始化DeepSeek模型
model = ChatDeepSeek(model="deepseek-chat", temperature=0)

解释

  • 导入必要的LangChain组件

  • 设置环境变量,包括API密钥

  • 初始化AI模型,temperature=0表示确定性输出

2.2 定义基础工具函数

日历事件创建工具

python

@tool
def create_calendar_event(
    title: str,
    start_time: str,  # ISO格式时间
    end_time: str,    # ISO格式时间  
    attendees: list[str],  # 邮箱地址列表
    location: str = ""
) -> str:
    """创建日历事件,需要准确的ISO时间格式"""
    return f"事件已创建: {title} 从 {start_time} 到 {end_time},参与人数: {len(attendees)}"
邮件发送工具

python

@tool
def send_email(
    to: list[str],      # 收件人邮箱
    subject: str,       # 邮件主题
    body: str,          # 邮件正文
    cc: list[str] = []  # 抄送列表
) -> str:
    """通过邮件API发送邮件,需要正确格式的邮箱地址"""
    return f"邮件已发送给 {', '.join(to)} - 主题: {subject}"
时间槽查询工具

python

@tool
def get_available_time_slots(
    attendees: list[str],
    date: str,  # ISO格式日期
    duration_minutes: int
) -> list[str]:
    """在特定日期检查参与者的日历可用性"""
    return ["09:00", "14:00", "16:00"]  # 模拟返回可用时间

关键点

  • @tool装饰器将普通函数转换为LangChain工具

  • 每个工具都有清晰的参数说明和文档字符串

  • 当前是模拟实现,实际使用时需要连接真实API

2.3 创建专业化子代理

日历代理

python

calendar_agent = create_agent(
    model,
    tools=[create_calendar_event, get_available_time_slots],
    system_prompt=(
        "你是日历调度助手。"
        "将自然语言调度请求解析为正确的ISO时间格式。"
        "需要时使用get_available_time_slots检查可用性。"
        "使用create_calendar_event安排事件。"
        "在最终响应中确认安排的内容。"
    )
)
邮件代理

python

email_agent = create_agent(
    model,
    tools=[send_email],
    system_prompt=(
        "你是邮件助手。"
        "根据自然语言请求撰写专业邮件。"
        "提取收件人信息并创建合适的主题和正文。"
        "使用send_email发送消息。"
        "在最终响应中确认发送的内容。"
    )
)

代理的作用

  • 日历代理:专门处理时间解析和事件安排

  • 邮件代理:专门处理邮件撰写和发送

  • 每个代理都有专门的系统提示词来指导行为

2.4 将子代理包装为监督代理的工具

python

@tool
def schedule_event(request: str) -> str:
    """使用自然语言安排日历事件
    
    当用户想要创建、修改或检查日历时使用此工具。
    处理日期/时间解析、可用性检查和事件创建。
    
    输入:自然语言调度请求
    """
    result = calendar_agent.invoke({
        "messages": [{"role": "user", "content": request}]
    })
    return result["messages"][-1].text

@tool
def manage_email(request: str) -> str:
    """使用自然语言发送邮件
    
    当用户想要发送通知、提醒或任何邮件通信时使用。
    处理收件人提取、主题生成和邮件撰写。
    
    输入:自然语言邮件请求
    """
    result = email_agent.invoke({
        "messages": [{"role": "user", "content": request}]
    })
    return result["messages"][-1].text

包装逻辑

  • 将复杂的子代理封装成简单的工具函数

  • 监督代理只需要调用这些工具,无需了解内部实现

2.5 创建监督代理

python

supervisor_agent = create_agent(
    model,
    tools=[schedule_event, manage_email],
    system_prompt=(
        "你是一个有用的个人助理。"
        "你可以安排日历事件和发送邮件。"
        "将用户请求分解为适当的工具调用并协调结果。"
        "当请求涉及多个操作时,按顺序使用多个工具。"
    )
)

监督代理特点

  • 协调多个专业化工具

  • 理解复杂指令并分解为步骤

  • 管理工具之间的执行顺序

2.6 使用监督代理处理请求

python

if __name__ == "__main__":
    # 示例:需要日历和邮件协调的用户请求
    user_request = (
        "为设计团队安排下周二(2025-11-26)下午2点开始1小时的会议,"
        "参与人[1@test.com, 2@test.com],"
        "并给admin@test.com发送关于审查新样式的邮件提醒。"
    )

    print("用户请求:", user_request)
    print("\n" + "="*80 + "\n")

    # 流式处理并显示结果
    for step in supervisor_agent.stream(
        {"messages": [{"role": "user", "content": user_request}]}
    ):
        for update in step.values():
            for message in update.get("messages", []):
                message.pretty_print()

三、完整运行步骤

3.1 设置环境

  1. 创建新的Python虚拟环境(推荐)

  2. 安装所需依赖

  3. 获取并设置DeepSeek API密钥

3.2 代码配置

  1. 将代码保存为personal_assistant.py

  2. 替换os.environ["DEEPSEEK_API_KEY"]中的占位符为真实API密钥

  3. 可选:配置LangSmith用于监控(非必需)

3.3 执行代码

bash

python personal_assistant.py

3.4 预期输出

程序将:

  1. 打印用户请求

  2. 显示监督代理的思考过程

  3. 展示日历安排的结果

  4. 显示邮件发送的结果

四、系统架构总结

这个多代理系统采用分层架构:

text

用户请求
    ↓
监督代理(协调者)
    ↓
专业工具层
    ├── 日历工具 → 日历代理 → 日历API工具
    └── 邮件工具 → 邮件代理 → 邮件API工具

优势

  • 模块化:每个组件职责单一

  • 可扩展:易于添加新的专业代理

  • 用户友好:使用自然语言交互

  • 智能化:AI自动解析和协调复杂请求

这个系统展示了如何使用LangChain构建复杂的AI应用,将大任务分解为小任务,并由专门的代理处理每个子任务。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐