Python 实现 AI Agent
在深入代码之前,让我们先建立一个清晰的认知,可以把 AI Agent 想象成一个拥有大脑和手脚的智能程序。
- 大脑(核心):一个能够理解、推理和决策的模型(比如大型语言模型 LLM)。它负责处理信息,制定计划。
- 感知(输入):Agent 通过感官获取外部信息,如用户的指令、数据库查询结果、网页内容、传感器数据等。
- 行动(输出):Agent 通过手脚影响外部世界,例如调用一个函数、发送一封邮件、在屏幕上输出文本、控制机械臂等。
- 目标:Agent 的一切行为都围绕着一个明确的目标展开,比如:帮我查一下北京明天的天气。
其核心工作流程是一个经典的 感知-思考-行动 循环,如下图所示:

简单的测试案例
agent-demo/ agent.py # 主实现(下面给出) tools.py # 工具实现(可单独文件) memory.py # 简单记忆实现(可单独文件) README.md
实例
"""
agent.py - 极简 AI Agent 原型(可直接运行)
说明:
- LLM 部分用一个非常简单的"规则回答器"模拟,实际接入 LLM 时替换 LLMInterface.generate(...)
- 包含组件:LLM 抽象、大脑(解析/决策)、规划器、工具注册器、内存、执行器
"""
from typing import Any, Dict, List, Callable
import time
# -----------------------------
# Memory(非常轻量)
# -----------------------------
class Memory:
def __init__(self):
self.short = {} # 当前会话上下文
self.long = {} # 长期偏好/联系人等
def get_short(self, k, default=None):
return self.short.get(k, default)
def set_short(self, k, v):
self.short[k] = v
def get_long(self, k, default=None):
return self.long.get(k, default)
def set_long(self, k, v):
self.long[k] = v
# -----------------------------
# LLM 抽象(替换点)
# -----------------------------
class LLMInterface:
def generate(self, prompt: str) -> str:
"""
这里给出一个非常简单的规则式模拟回答器。
真实使用时:替换为 OpenAI/其它模型的调用代码,返回 model 文本。
"""
# 极简解析示例:识别是否需要判断"下雨"
if "是否下雨" in prompt or "下雨" in prompt:
return "请先查询天气;如果有雨,请生成提醒并发送给目标联系人。"
if "生成提醒" in prompt:
return "请提醒小王:明天北京有雨,请带伞。"
return "我理解了。"
# -----------------------------
# 工具注册与模拟工具
# -----------------------------
class ToolRegistry:
def __init__(self):
self.tools: Dict[str, Callable[..., Any]] = {}
def register(self, name: str, fn: Callable[..., Any]):
self.tools[name] = fn
def call(self, name: str, *args, **kwargs):
if name not in self.tools:
raise ValueError(f"工具未注册: {name}")
return self.tools[name](*args, **kwargs)
# 模拟工具:天气查询(真实情况会调用天气 API)
def mock_weather_api(city: str, date: str) -> Dict[str, Any]:
# 简单规则:如果 city 包含 "北京" 且 date 包含 "明天",返回下雨示例
if "北京" in city and "明天" in date:
return {"city": city, "date": date, "cond": "雨", "precip_mm": 5}
return {"city": city, "date": date, "cond": "晴", "precip_mm": 0}
# 模拟工具:发送消息(真实情况会调用短信/邮件/企业微信等)
def mock_send_message(contact: str, message: str) -> bool:
print(f"[发送消息] to={contact} message={message}")
return True
# 模拟工具:简单搜索(示意)
def mock_search(query: str) -> str:
return f"模拟搜索结果:关于 `{query}` 的信息摘要。"
# -----------------------------
# Planner / Executor
# -----------------------------
class SimplePlanner:
def plan(self, goal: str) -> List
agent.py - 极简 AI Agent 原型(可直接运行)
说明:
- LLM 部分用一个非常简单的"规则回答器"模拟,实际接入 LLM 时替换 LLMInterface.generate(...)
- 包含组件:LLM 抽象、大脑(解析/决策)、规划器、工具注册器、内存、执行器
"""
from typing import Any, Dict, List, Callable
import time
# -----------------------------
# Memory(非常轻量)
# -----------------------------
class Memory:
def __init__(self):
self.short = {} # 当前会话上下文
self.long = {} # 长期偏好/联系人等
def get_short(self, k, default=None):
return self.short.get(k, default)
def set_short(self, k, v):
self.short[k] = v
def get_long(self, k, default=None):
return self.long.get(k, default)
def set_long(self, k, v):
self.long[k] = v
# -----------------------------
# LLM 抽象(替换点)
# -----------------------------
class LLMInterface:
def generate(self, prompt: str) -> str:
"""
这里给出一个非常简单的规则式模拟回答器。
真实使用时:替换为 OpenAI/其它模型的调用代码,返回 model 文本。
"""
# 极简解析示例:识别是否需要判断"下雨"
if "是否下雨" in prompt or "下雨" in prompt:
return "请先查询天气;如果有雨,请生成提醒并发送给目标联系人。"
if "生成提醒" in prompt:
return "请提醒小王:明天北京有雨,请带伞。"
return "我理解了。"
# -----------------------------
# 工具注册与模拟工具
# -----------------------------
class ToolRegistry:
def __init__(self):
self.tools: Dict[str, Callable[..., Any]] = {}
def register(self, name: str, fn: Callable[..., Any]):
self.tools[name] = fn
def call(self, name: str, *args, **kwargs):
if name not in self.tools:
raise ValueError(f"工具未注册: {name}")
return self.tools[name](*args, **kwargs)
# 模拟工具:天气查询(真实情况会调用天气 API)
def mock_weather_api(city: str, date: str) -> Dict[str, Any]:
# 简单规则:如果 city 包含 "北京" 且 date 包含 "明天",返回下雨示例
if "北京" in city and "明天" in date:
return {"city": city, "date": date, "cond": "雨", "precip_mm": 5}
return {"city": city, "date": date, "cond": "晴", "precip_mm": 0}
# 模拟工具:发送消息(真实情况会调用短信/邮件/企业微信等)
def mock_send_message(contact: str, message: str) -> bool:
print(f"[发送消息] to={contact} message={message}")
return True
# 模拟工具:简单搜索(示意)
def mock_search(query: str) -> str:
return f"模拟搜索结果:关于 `{query}` 的信息摘要。"
# -----------------------------
# Planner / Executor
# -----------------------------
class SimplePlanner:
def plan(self, goal: str) -> List