前言

最近AI智能体(Agent)这个概念真的火到不行。从高考志愿填报智能体到企业级客服Agent,到处都在聊这个东西。说实话,很多人觉得Agent很高大上,其实拆开来看,核心逻辑并不复杂。

今天就带大家从零搭建一个简单的AI智能体,用Python + LangChain实现,代码可以直接跑。

AI智能体架构图

什么是AI智能体?

说白了,智能体就是一个能自主思考、规划、执行任务的AI程序。跟普通的ChatBot不一样,它不只是回答问题,还能:

  • 调用外部工具(搜索、数据库、API)
  • 拆解复杂任务为多个子步骤
  • 根据中间结果动态调整策略

你想啊,你问ChatGPT"帮我查一下明天北京天气然后提醒我带伞",普通模型只能告诉你天气信息。但Agent会:查天气API → 判断是否需要带伞 → 设置提醒 → 完成。

环境准备

先装好依赖:

pip install langchain langchain-openai langchain-community
pip install duckduckgo-search  # 搜索工具

设置API Key:

import os
os.environ["OPENAI_API_KEY"] = "sk-your-key-here"

如果用国内模型,可以换成 Moonshot、DeepSeek 等兼容 OpenAI 接口的服务。

第一步:定义工具

Agent的能力来自工具。我们先定义几个常用工具:

from langchain_community.tools import DuckDuckGoSearchRun
from langchain.tools import tool

# 搜索工具
search = DuckDuckGoSearchRun()

# 自定义计算工具
@tool
def calculator(expression: str) -> str:
    """计算数学表达式"""
    try:
        result = eval(expression)
        return str(result)
    except Exception as e:
        return f"计算出错: {e}"

# 自定义天气查询工具
@tool
def get_weather(city: str) -> str:
    """查询指定城市的天气信息"""
    # 实际项目中对接天气API
    weather_data = {
        "北京": "晴,25°C,适合出行",
        "上海": "多云,22°C,可能有雨",
        "深圳": "阵雨,28°C,记得带伞",
    }
    return weather_data.get(city, f"暂无{city}的天气数据")

工具调用流程

第二步:创建Agent

有了工具,接下来组装Agent:

from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate

# 初始化大模型
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# 定义提示词模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个智能助手,善于使用工具帮助用户解决问题。回答要简洁明了。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

# 组装工具列表
tools = [search, calculator, get_weather]

# 创建Agent
agent = create_tool_calling_agent(llm, tools, prompt)

# 创建执行器(带调试模式)
executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,  # 打印思考过程
    max_iterations=5,  # 最多执行5步
    handle_parsing_errors=True,  # 自动处理解析错误
)

第三步:运行测试

# 测试1:简单问答
result = executor.invoke({"input": "你好,你是谁?"})
print(result["output"])

# 测试2:需要调用搜索工具
result = executor.invoke({"input": "最近有什么AI领域的大新闻?"})
print(result["output"])

# 测试3:多工具协作
result = executor.invoke({"input": "查一下北京今天天气,再帮我算一下 365 * 24 * 60"})
print(result["output"])

运行verbose模式下,你能看到Agent的完整思考链:

> Entering new AgentExecutor chain...
Thought: 用户想知道北京天气和一个计算结果,我需要分别调用两个工具。
Action: get_weather
Action Input: 北京
Observation: 晴,25°C,适合出行
Thought: 天气信息拿到了,现在计算数学表达式。
Action: calculator
Action Input: 365 * 24 * 60
Observation: 525600
Thought: 两个结果都拿到了,可以回复用户了。
> Finished chain.

进阶:加入记忆能力

上面的Agent每次对话都是独立的,加个记忆模块就能多轮对话了:

from langchain.memory import ConversationBufferWindowMemory

memory = ConversationBufferWindowMemory(
    k=10,  # 保留最近10轮对话
    memory_key="chat_history",
    return_messages=True,
)

executor_with_memory = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True,
)

# 多轮对话
executor_with_memory.invoke({"input": "我叫小明,记住我"})
executor_with_memory.invoke({"input": "我叫什么?"})
# Agent会回答"你叫小明"

Agent多轮对话流程

常见问题 Q&A

Q1: Agent一直循环调用工具怎么办?

设置 max_iterations 限制最大步数,或者在prompt里明确告诉Agent"如果找不到答案就直接说不知道"。

Q2: 工具调用报错怎么处理?

AgentExecutorhandle_parsing_errors=True 可以自动重试,但最好在工具函数里做好异常处理。

Q3: 国内模型能用吗?

完全可以。DeepSeek、Moonshot、GLM-5.2 都兼容 OpenAI 接口,换个 base_url 就行:

llm = ChatOpenAI(
    model="deepseek-chat",
    base_url="https://api.deepseek.com",
    api_key="your-deepseek-key",
)

Q4: 生产环境部署要注意什么?

  • 加入超时和重试机制
  • 限制工具调用权限(不要让Agent执行任意代码)
  • 记录完整的调用链路用于排查问题
  • 考虑并发和成本控制

总结

AI智能体的核心其实就是:大模型 + 工具 + 规划能力。LangChain帮你把这些组件串起来了,上手很快。

下一步建议:

  1. 尝试接入更多工具(数据库查询、文件操作、API调用)
  2. 学习 ReAct 和 Plan-and-Execute 两种规划模式的区别
  3. 关注 Function Calling 的最新进展

代码已整理到GitHub,有问题评论区见。


相关标签: AI Agent、LangChain、智能体开发、Python AI、大模型应用

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐