【如何做一个简单的Agent(原理、示例)】
在AI领域,Agent是一个能自主思考、调用工具、完成复杂任务的程序,而不仅仅是简单的一问一答。
本文结合DeepSeek大模型,讲解如何制作一个简单的Agent,基本原理比较简单。
一、Agent的核心思想(原理)
一个完整的AI Agent,通常包含几个核心模块,这就像一个人,不但需要有大脑和还需要有四肢。
1、大脑(LLM):就是Agent的“大脑”。它不负责具体干活,而是负责理解你的指令,进行逻辑推理,并做出决策,是Agent的核心,它让Agent有了“智能”。这里我使用的是DeepSeek大模型。,当然你也可以使用其他的大模型,例如:GPT、Gemini、豆包、通义千问等等。
2、记忆(Memory):让Agent能记住事情,分为2种。
短期记忆:记住当前的对话,比如你们刚刚聊到了哪里。
长期记忆:用向量数据库(如Chroma)存储过去的对话或知识,在需要时可以检索出来。
3、计划(Planning):当接到一个复杂任务(比如“帮我写一份工作总结报告”)时,Agent会把它分解成小步骤:先搜索资料、再整理数据、最后撰写报告。
4、工具(Tools):这是Agent的“手脚”,让它能跟外部世界互动。比如,它可以调用联网搜索API获取最新信息,或者调用计算器做精确计算。
Agent = 大模型(大脑) + 规划(思考) + 记忆(经验) + 工具(手脚)
这里有个关键模式叫ReAct(Reason + Act):Agent不是一次性生成答案,而是循环进行“思考 -> 行动 -> 观察结果”的过程,直到完成目标。这让它比普通聊天更智能、更可靠
二、开发实战(一步步来做)
一个超简单的Agent例子
这个例子将构建一个“万能查询小助手”。它能回答两类问题:
普通问题:直接回答。
天气问题:调用一个模拟的天气API工具来获取结果。
这正是Agent的核心工作流:决策 → 调用工具 → 返回结果。
第一步:准备环境
安装DeepSeek的Python库
pip install openai # DeepSeek API兼容OpenAI的接口格式
第二步:获取API Key
前往 DeepSeek平台 注册并创建您的API Key(地址:https://platform.deepseek.com/)。
第三步:编写完整代码(复制即可运行)
创建一个 my_first_agent.py 文件,粘贴以下代码:
import json # 导入json模块,用于处理JSON格式的数据
from openai import OpenAI # 从openai库导入OpenAI客户端类
# ==================== 1. 初始化DeepSeek客户端 ====================
# 创建OpenAI客户端实例,配置API密钥和基础URL
client = OpenAI(
api_key="sk-", # API密钥,需要替换为真实的DeepSeek API密钥
base_url="https://api.deepseek.com/v1" # DeepSeek API的基础URL地址
)
# ==================== 2. 定义模拟的天气查询工具 ====================
def get_weather(city):
"""
模拟查询天气的函数(实际项目中可替换为真实API调用)
参数:
city (str): 要查询天气的城市名称
返回:
str: 该城市的天气描述字符串,如果城市不存在则返回提示信息
"""
# 预定义的模拟天气数据字典(键为城市名,值为天气描述)
weather_data = {
"北京": "晴天,25°C", # 北京的模拟天气数据
"上海": "小雨,22°C", # 上海的模拟天气数据
"广州": "多云,30°C" # 广州的模拟天气数据
}
# 从字典中获取对应城市的天气,如果不存在则返回提示信息
return weather_data.get(city, f"未找到{city}的天气数据")
# ==================== 3. 工具描述(Function Calling定义) ====================
# 定义可供AI调用的工具列表,遵循OpenAI的Function Calling规范
tools = [
{
"type": "function", # 工具类型为函数
"function": {
"name": "get_weather", # 函数名称,需与Python函数名匹配
"description": "查询指定城市的实时天气情况", # 函数功能描述,帮助AI理解何时调用
"parameters": { # 函数参数的定义
"type": "object", # 参数类型为对象
"properties": { # 对象的属性定义
"city": { # 城市参数
"type": "string", # 参数类型为字符串
"description": "城市名称,例如:北京", # 参数描述
}
},
"required": ["city"], # 必填参数列表
},
},
}
]
# ==================== 4. Agent主函数 ====================
def run_agent(user_question):
"""
运行AI Agent的主函数,处理用户问题并可能调用工具
参数:
user_question (str): 用户提出的问题
"""
# 打印用户问题,方便调试和追踪
print(f"用户问题: {user_question}")
# 初始化消息列表,包含用户问题
messages = [{"role": "user", "content": user_question}]
# ===== 第一次调用:让AI决定是否需要调用工具 =====
# 调用DeepSeek API,传入消息、工具列表和工具调用策略
response = client.chat.completions.create(
model="deepseek-chat", # 使用的模型名称
messages=messages, # 消息历史
tools=tools, # 可用的工具列表
tool_choice="auto" # 让AI自动决定是否调用工具以及调用哪个工具
)
# 获取AI的回复消息
assistant_message = response.choices[0].message
# ===== 判断AI是否决定调用工具 =====
if assistant_message.tool_calls:
# 如果AI决定调用工具,提取第一个工具调用信息
tool_call = assistant_message.tool_calls[0]
tool_name = tool_call.function.name # 获取工具名称
tool_args = json.loads(tool_call.function.arguments) # 解析工具参数(JSON字符串转字典)
# 打印AI的决定和参数,方便调试
print(f"Agent决定调用工具: {tool_name}")
print(f"工具参数: {tool_args}")
# ===== 执行对应的工具函数 =====
if tool_name == "get_weather":
# 调用天气查询函数,使用解包操作将参数字典传入
tool_result = get_weather(**tool_args)
print(f"工具返回: {tool_result}") # 打印工具执行结果
# ===== 第二次调用:将工具结果返回给AI =====
# 将AI的首次回复(包含工具调用指令)添加到消息历史中
messages.append(assistant_message)
# 添加工具执行结果到消息历史(role为tool)
messages.append({
"role": "tool", # 角色为工具
"tool_call_id": tool_call.id, # 工具调用ID,用于关联请求
"content": tool_result # 工具返回的内容
})
# 再次调用API,让AI基于工具结果生成最终回答
final_response = client.chat.completions.create(
model="deepseek-chat", # 使用的模型名称
messages=messages, # 包含工具结果的完整消息历史
)
# 提取AI的最终回答内容
final_answer = final_response.choices[0].message.content
print(f"Agent最终回答: {final_answer}") # 打印最终回答
else:
# 如果AI没有调用工具,直接打印AI的回答
print(f"Agent直接回答: {assistant_message.content}")
# ==================== 5. 测试部分 ====================
if __name__ == "__main__":
# 测试场景1:查询天气(会触发工具调用)
run_agent("今天上海天气怎么样?")
print("\n" + "-"*50 + "\n") # 打印分隔线,使输出更清晰
# 测试场景2:询问AI知识(不会触发工具调用)
run_agent("什么是人工智能?")
更多推荐

所有评论(0)