1. 引言
智能体(Agent)是当前 AI 领域最热门的话题之一。简单来说,智能体是一个能够感知环境、做出决策并执行动作的程序。它不只是被动地回答问题,而是能够主动调用工具、规划步骤、完成任务。
本文将从零开始,用 Python 带你开发第一个智能体。我们会从一个最简单的"问答机器人"开始,逐步加入工具调用、记忆和规划能力,最终构建一个能完成实际任务的智能体。
2. 准备工作
2.1 环境要求
- Python 3.9 及以上版本
- 一个 OpenAI 兼容的 API Key(可以是 OpenAI、DeepSeek、通义千问等)
2.2 安装依赖
我们使用 openai 官方 SDK 来调用大模型接口:
bash
pip install openai
如果你希望后续支持更多功能,还可以安装:
bash
pip install python-dotenv
2.3 配置 API Key
在项目根目录创建 .env 文件:
bash
OPENAI_API_KEY=你的API密钥
OPENAI_BASE_URL=https://api.openai.com/v1
然后在代码中加载:
python
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
base_url = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
3. 第一个智能体:最简单的问答机器人
我们先实现一个最基础的版本:接收用户输入,调用大模型,返回回答。
python
from openai import OpenAI
client = OpenAI(
api_key=api_key,
base_url=base_url,
)
def chat(user_input: str) -> str:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是一个乐于助人的智能助手。"},
{"role": "user", "content": user_input},
],
)
return response.choices[0].message.content
if __name__ == "__main__":
while True:
user_input = input("你:")
if user_input.lower() in ("exit", "quit"):
break
print("智能体:", chat(user_input))
运行这个脚本,你就拥有了第一个能对话的智能体。但这还只是一个"聊天机器人",它没有记忆,也不能调用工具。
4. 给智能体加上记忆
真正的智能体需要记住上下文。我们通过维护 messages 列表来实现多轮对话记忆:
python
messages = [
{"role": "system", "content": "你是一个乐于助人的智能助手。"},
]
def chat_with_memory(user_input: str) -> str:
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
)
reply = response.choices[0].message.content
messages.append({"role": "assistant", "content": reply})
return reply
这样智能体就能记住之前的对话内容了。
5. 让智能体学会调用工具
这是智能体与普通聊天机器人的关键区别:工具调用(Function Calling)。智能体可以根据用户需求,自主决定调用哪个函数。
5.1 定义一个工具函数
我们以"查询天气"为例:
python
def get_weather(city: str) -> str:
"""模拟查询天气"""
weather_data = {
"北京": "晴,25°C",
"上海": "多云,28°C",
"广州": "小雨,30°C",
}
return weather_data.get(city, f"暂无{city}的天气数据")
5.2 声明工具
python
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称",
}
},
"required": ["city"],
},
},
}
]
5.3 实现工具调用循环
python
def run_agent(user_input: str) -> str:
messages.append({"role": "user", "content": user_input})
# 第一步:让模型决定是否调用工具
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
tools=tools,
)
message = response.choices[0].message
# 第二步:如果模型要求调用工具
if message.tool_calls:
for tool_call in message.tool_calls:
function_name = tool_call.function.name
arguments = eval(tool_call.function.arguments)
if function_name == "get_weather":
result = get_weather(**arguments)
# 把工具结果返回给模型
messages.append(message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(result),
})
# 第三步:让模型基于工具结果生成最终回答
final_response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
tools=tools,
)
return final_response.choices[0].message.content
return message.content
现在,当你问"北京天气怎么样"时,智能体会自动调用 get_weather 工具,再基于结果回答你。
6. 完整智能体框架
把以上能力整合成一个类,方便扩展:
python
class Agent:
def __init__(self, system_prompt: str, tools: list):
self.messages = [{"role": "system", "content": system_prompt}]
self.tools = tools
self.tool_map = {}
def register_tool(self, name: str, func):
self.tool_map[name] = func
def run(self, user_input: str) -> str:
self.messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=self.messages,
tools=self.tools,
)
message = response.choices[0].message
if message.tool_calls:
for tool_call in message.tool_calls:
func = self.tool_map.get(tool_call.function.name)
if func:
args = eval(tool_call.function.arguments)
result = func(**args)
self.messages.append(message)
self.messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(result),
})
final_response = client.chat.completions.create(
model="gpt-4o-mini",
messages=self.messages,
tools=self.tools,
)
return final_response.choices[0].message.content
return message.content
使用示例:
python
agent = Agent(
system_prompt="你是一个智能助手,可以查询天气。",
tools=tools,
)
agent.register_tool("get_weather", get_weather)
print(agent.run("北京今天天气怎么样?"))
7. 进阶方向
到这里,你已经拥有了一个具备记忆和工具调用能力的智能体。接下来可以继续探索:
- 多工具编排:注册更多工具,让智能体自主选择。
- 规划能力:让智能体先拆解任务,再逐步执行(ReAct 模式)。
- 长期记忆:使用向量数据库存储历史对话。
- 多智能体协作:让多个智能体分工合作完成复杂任务。
8. 总结
本文从零开始,用 Python 实现了第一个智能体:
- 基础对话能力
- 多轮对话记忆
- 工具调用能力
- 可扩展的 Agent 类封装
智能体的核心思想并不复杂:大模型 + 记忆 + 工具。掌握了这个框架,你就可以在此基础上构建各种强大的应用。