从零搭建你的第一个 AI Agent:用 LangChain + OpenAI 实现智能助手

16 阅读10分钟

2026 年,AI Agent 正在改变软件开发的游戏规则。本文将手把手教你从零搭建一个能自动处理任务的智能助手。

🎯 你将学到什么

  • 什么是 AI Agent,为什么它这么火
  • 如何用 LangChain 构建 Agent 框架
  • 实战:搭建一个能自动回复邮件的智能助手
  • 进阶:添加记忆、工具调用、多轮对话
  • 生产环境部署的最佳实践

技术栈: Python 3.10+, LangChain, OpenAI API


一、什么是 AI Agent?

1.1 传统 AI vs AI Agent

传统 AI 应用:

用户提问 → AI 回答 → 结束

AI Agent:

用户提问 → AI 分析 → 调用工具 → 执行任务 → 反馈结果 → 继续对话

关键区别:

  • ❌ 传统 AI:被动回答,一问一答
  • ✅ AI Agent:主动思考,自主决策,调用工具完成任务

1.2 AI Agent 的核心能力

  1. 推理能力 — 理解用户意图,制定执行计划
  2. 工具调用 — 调用外部 API、数据库、文件系统
  3. 记忆能力 — 记住上下文,支持多轮对话
  4. 自主决策 — 根据情况选择合适的工具和策略

1.3 为什么 AI Agent 这么火?

实际应用场景:

  • 📧 自动回复邮件 — 分析邮件内容,自动起草回复
  • 📊 数据分析助手 — 自动查询数据库,生成报表
  • 🛠️ 代码审核助手 — 自动检查代码,提出改进建议
  • 📅 日程管理助手 — 自动安排会议,发送提醒

市场趋势:

  • OpenAI 推出 GPT-4 Turbo with Function Calling
  • Anthropic 推出 Claude 3 with Tool Use
  • Google 推出 Gemini with Extensions
  • 各大厂都在押注 AI Agent

二、技术栈选择

2.1 核心组件

组件选择理由
大模型OpenAI GPT-4推理能力强,API 稳定
框架LangChain生态完善,工具丰富
语言Python 3.10+生态成熟,开发效率高
向量数据库Chroma轻量级,易上手

2.2 环境准备

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装依赖
pip install langchain openai chromadb python-dotenv

# 创建 .env 文件
echo "OPENAI_API_KEY=your_api_key_here" > .env

三、实战:搭建邮件回复助手

3.1 项目结构

email-agent/
├── .env                 # API 密钥
├── agent.py            # Agent 核心逻辑
├── tools.py            # 工具定义
├── memory.py           # 记忆管理
└── main.py             # 入口文件

3.2 定义工具(tools.py)

from langchain.tools import tool
from typing import List
import smtplib
from email.mime.text import MIMEText

@tool
def read_emails(folder: str = "inbox") -> List[dict]:
    """
    读取邮箱中的邮件
    
    Args:
        folder: 邮箱文件夹名称(inbox, sent, draft)
    
    Returns:
        邮件列表,每封邮件包含 subject, from, body
    "
    # 这里简化处理,实际应该连接 IMAP 服务器
    mock_emails = [
        {
            "id": "001",
            "subject": "关于项目进度的询问",
            "from": "client@example.com",
            "body": "你好,请问项目什么时候能完成?"
        },
        {
            "id": "002",
            "subject": "技术方案讨论",
            "from": "team@example.com",
            "body": "我们需要讨论一下数据库设计方案。"
        }
    ]
    return mock_emails

@tool
def send_email(to: str, subject: str, body: str) -> str:
    """
    发送邮件
    
    Args:
        to: 收件人邮箱
        subject: 邮件主题
        body: 邮件正文
    
    Returns:
        发送结果
    """
    # 这里简化处理,实际应该连接 SMTP 服务器
    print(f"\n📧 发送邮件:")
    print(f"收件人: {to}")
    print(f"主题: {subject}")
    print(f"正文:\n{body}\n")
    
    return f"邮件已发送到 {to}"

@tool
def draft_reply(email_id: str, content: str) -> str:
    """
    起草邮件回复
    
    Args:
        email_id: 原邮件 ID
        content: 回复内容
    
    Returns:
        草稿保存结果
    """
    print(f"\n📝 保存草稿:")
    print(f"回复邮件 ID: {email_id}")
  int(f"内容:\n{content}\n")
    
    return f"草稿已保存,邮件 ID: {email_id}"

# 工具列表
tools = [read_emails, send_email, draft_reply]

3.3 构建 Agent(agent.py)

from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
from tools import tools
import os
from dotenv import load_dotenv

load_dotenv()

class EmailAgent:
    def __init__(self):
        # 初始化大模型
        self.llm = ChatOpenAI(
            model="gpt-4-turbo-preview",
            temperature=0.7,
            api_key=os.getenv("OPENAI_API_KEY")
        )
        
        # 定义 Prompt
        self.prompt = ChatPromptTemplate.from_messages([
            ("system", """你是一个智能邮件助手,负责帮助用户处理邮件。

你的职责:
1. 读取用户的邮件
2. 分析邮件内容和紧急程度
3. 根据邮件内容起草合适的回复
4. 征求用户确认后发送邮件

工作流程:
1. 先调用 read_emails 工具读取邮件
2. 分析每封邮件的内容和优先级
3. 对于需要回复的邮件,起草回复内容
4. 向用户展示草稿,等待确认
5. 确认后调用 send_email 发送

注意事项:
- 回复要专业、礼貌、简洁
- 紧急邮件优先处理
- 不确定的内容要询问用户
- 发送前必须得到用户确认
"""),
            MessagesPlaceholder(varme="chat_history"),
            ("human", "{input}"),
            MessagesPlaceholder(variable_name="agent_scratchpad"),
        ])
        
        # 创建记忆
        self.memory = ConversationBufferMemory(
            memory_key="chat_history",
            return_messages=True
        )
        
        # 创建 Agent
        self.agent = create_openai_functions_agent(
            llm=self.llm,
            tools=tools,
            prompt=self.prompt
        )
        
        # 创建 Agent Executor
        self.agent_executor = AgentExecutor(
            agent=self.agent,
            tools=tools,
            memory=seory,
            verbose=True,
            max_iterations=5
        )
    
    def run(self, user_input: str) -> str:
        """
        执行 Agent
        
        Args:
            user_input: 用户输入
        
        Returns:
            Agent 响应
        """
        result = self.agent_executor.invoke({"input": user_input})
        return result["output"]

3.4 主程序(main.py)

from agent import EmailAgent

def main():
    print("🤖 邮件助手已启动!")
    print("=" * 50)
    
    agent = EmailAgent()
    
    # 示例对话
    conversations = [
        "帮我查看一下收件箱里的邮件",
        "帮我回复第一封邮件,告诉他项目预计下周完成",
        "好的,发送吧   
    for user_input in conversations:
        print(f"\n👤 用户: {user_input}")
        print("-" * 50)
        
        response = agent.run(user_input)
        
        print(f"\n🤖 助手: {response}")
        print("=" * 50)

if __name__ == "__main__":
    main()

3.5 运行效果

python main.py

输出示例:

🤖 邮件助手已启动!
==================================================

👤 用户: 帮我查看一下收件箱里的邮件
--------------------------------------------------

> Entering new AgentExecutor chain...

Invoking: `read_emails` with `{'folder': 'inbox'}`

[{'id': '001', 'subject': '关于项目进度的询问', 'from': 'client@example.com', 'body': '你好,请问项目什么时候能完成?'}, ...]

🤖 助手: 我查看了你的收件箱,有 2 封邮件:

1. **关于项目进度的询问**
   - 发件人:client@example.com
   - 内容:询问项目完成时间
   - 优先级:高(客户邮件)

2. **技术方案讨论**
   - 发件人:team@example.com
   - 内容:讨论数据库设计
   - 优先级:中

需要我帮你回复哪封邮件吗?
==================================================

👤 用户: 帮我回复第一封邮件,告诉他项目预计下周完成
--------------------------------------------------

Invoking: `draft_reply` with `{'email_id': '001', 'content': '您好,\n\n感谢您的关注。项目目前进展顺利,预计下周可以完成。届时我会第一时间通知您。\n\n如有任何问题,请随时联系我。\n\n祝好!'}`

📝 保存草稿:
回复邮件 ID: 001
内容:
您好,

感谢您的关注。项目目前进展顺利,预计下周可以完成。届时我会第一时间通知您。

如有任何问题,请随时联系我。

祝好!

🤖 助手: 我已经起草了回复内容:

---
您好,

感谢您的关注。项目目前进展顺利,预计下周可以完成。届时我会第一时间通知您。

如有任何问题,请随时联系我。

祝好!
---

这个回复可以吗?如果可以,我就发送给 client@example.com。
==================================================

👤 用户: 好的,发送吧
--------------------------------------------------

Invoking: `send_email` with `{'to': 'client@example.com', 'subject': 'Re: 关于项目进度的询问', 'body': '您好,\n\n感谢您的关注。项目目前进展顺利,预计下周可以完成。届时我会第一时间通知您。\n\n如有任何问题,请随时联系我。\n\n祝好!'}`

📧 发送邮件:
收件人: client@example.com
主题: Re: 关于项目进度的询问
正文:
您好,

感谢您的关注。项目目前进展顺利,预计下周可以完成。届时我会第一时间通知您。

如有任何问题,请随时联系我。

祝好!

🤖 助手: ✅ 邮件已成功发送到 client@example.com!

还需要处理其他邮件吗?
==================================================

四、进阶功能

4.1 添加记忆能力

from langchain.memory import ConversationBufferMemory
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

class EnhancedEmailAgent(EmailAgent):
    def __init__(self):
        super().__init__()
        
        # 添加向量存储(长期记忆)
        self.vectorstore = Chroma(
            embedding_function=OpenAIEmbeddings(),
            persist_directory="./chroma_db"
        )
    
    def remember(self, key: str, value: str):
        """保存长期记忆"""
        self.vectorstore.add_texts(
            texts=[value],
            metadatas=[{"key": key}]
        )
    
    def recall(self, query: str, k: int = 3):
        """检索相关记忆"""
        docs = self.vectorstore.similarity_search(query, k=k)
        return [doc.page_content for doc in docs]

4.2 添加更多工具

@tool
def search_contacts(name: str) -> dict:
    """搜索联系人信息"""
    # 实际应该连接通讯录数据库
    contacts = {
        "张三": {"email": "zhangsan@example.com", "phone": "138****1234"},
        "李四": {"email": "lisi@example.com", "phone": "139****5678"}
    }
    return contacts.get(name, {})

@tool
def schedule_meeting(attendees: List[str], time: str, topic: str) -> str:
    """安排会议"""
    # 实际应该连接日历 API
    return f"会议已安排:{topic},参会人:{', '.join(attendees)},时间:{time}"

@tool
def analyze_sentiment(text: str) -> str:
    """分析邮件情绪"""
    # 实际应该调用情感分析 API
    if "紧急" in text or "尽快" in text:
        return "紧急"
    elif "谢谢" in text or "感谢" in text:
        return "友好"
    else:
        return "中性"

4.3 错误处理和重试

from tenacity import retry, stop_after_attempt, exponential

class RobustEmailAgent(EnhancedEmailAgent):
    (
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=2, max=10)
    )
    def run_with_retry(self, user_input: str) -> str:
        """带重试机制的执行"""
        try:
            return self.run(user_input)
        except Exception as e:
            print(f"❌ 错误: {e}")
            raise

五、生产环境部署

5.1 性能优化

1. 使用流式响应

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

llm = ChatOpenAI(
    model="gpt-4-turbo-preview",
    streaming=True,
    callbacks=[StreamingStdOutCallbackHandler()]
)

2. 询

from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache

set_llm_cache(InMemoryCache())

3. 并发处理

import asyncio
from langchain.agents import AgentExecutor

async def process_multiple_emails(emails: List[str]):
    tasks = [agent.arun(email) for email in emails]
    results = await asyncio.gather(*tasks)
    return results

5.2 安全性

1. API 密钥管理

from cryptography.fernet import Fernet

def encrypt_api_key(key: str) -> bytes:
    f = Fernet(Fernet.generate_key())
    return f.encrypt(key.encode())

def decrypt_api_key(encrypted_key: bytes, fernet_key: bytes) -> str:
    f = Fernet(fernet_key)
    return f.decrypt(encrypted_key).decode()

2. 输入验证

from pydantic import BaseModel, validator

class EmailInput(BaseModel):
    to: str
    subject: str
    body: str
    
    @validator('to')
    def validate_email(cls, v):
        if '@' not in v:
            raise ValueError('无效的邮箱地址')
        return v

5.3 监控和日志

import logging
time import datetime

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler(f'agent_{datetime.now().strftime("%Y%m%d")}.log'),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)

class MonitoredEmailAgent(RobustEmailAgent):
    def run(self, user_input: str) -> str:
        logger.info(f"用户输入: {user_input}")
        
        start_time = datetime.now()
        result = super().run(user_input)
        end_time = datetime.now()
        
        logger.info(f"执行时间: {(end_tistart_time).total_seconds()}秒")
        logger.info(f"Agent 响应: {result}")
        
        return result

六、常见问题

Q1: 如何降低 API 成本?

A:

  1. 使用 GPT-3.5-turbo 替代 GPT-4(成本降低 90%)
  2. 实现请求缓存,避免重复调用
  3. 优化 Prompt,减少 token 消耗
  4. 使用流式响应,提前终止不必要的生成

Q2: Agent 响应太慢怎么办?

A:

  1. 使用异步处理
  2. 减少工具数量(每次只加载必要的工具)
  3. 优化工具执行逻辑
  4. 使用更快的模型(如 GPT-3.5-turbo)

Q3: 如何提高 Agent 的准确性?

A:

  1. 优化 System Prompt,明确任务和约束
  2. 提供更多示例(Few-shot Learning)
  3. 添加输入验证和输出检查
  4. 使用 Chain-of-Thought 提示词

Q4: 如何处理多语言?

A:

@tool
def detect_language(text: str) -> str:
    """检测文本语言"""
    # 使用 langdetect 库
    from langdetect import detect
    return detect(text)

# 在 Prompt 中添加
"""
如果邮件是英文,用英文回复;
如果是中文,用中文回复。
"""

七、总结

7.1 关键要点

  1. AI Agent = LLM + 工具 + 记忆 + 推理
  2. LangChain 提供了完整的 Agent 开发框架
  3. 工具设计是 Agent 能力的关键
  4. 记忆管理决定了 Agent 的智能程度
  5. 生产环境需要考虑性能、安全、监控

7.2 下一步

  • 🔧 扩展工具 — 添加更多实用工具(日历、文件、数据库)
  • 🧠 优化记忆 — 实现更智能的记忆检索和管理
  • 🚀 部署上线 — 使用 FastAPI + Docker 部署
  • 📊 监控优化 — 添加性能监控和成本追踪

7.3 参考资源


🎉 结语

AI Agent 不是未来,而是现在。

从简单的聊天机器人到能自主决策的智能助手,AI Agent 正在重新定义软件的边界。

现在就开始构建你的第一个 AI Agent 吧!


关注我,获取更多 AI 开发干货! 🚀


如果觉得有帮助,欢迎点赞、收藏、转发! ❤️