1. 从零构建AI Agent的核心思路
如果你曾经尝试过构建一个AI Agent,很可能遇到过这些问题:它要么陷入无限思考循环,要么像个无头苍蝇一样反复调用工具,或者像个复读机一样不断重复相同内容,更糟的是token消耗速度堪比漏水的管道。这些都不是真正的AI Agent,充其量只是个带着工具的聊天机器人。
真正的AI Agent应该是一个闭环系统:规划→行动(工具调用)→观察→记忆→重新规划→停止。这个循环机制让它能够自主决策下一步行动,而不仅仅是单次响应。关键在于控制而非智能——一个优秀的Agent不是靠"聪明",而是靠严谨的结构化输出、安全的工具调用、高效的内存管理和可靠的停止条件。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最小化Agent架构设计
2.1 核心组件分解
我们的最小化Agent包含五个关键子系统:
-
工具系统:每个工具都是独立的Python函数,包含名称、描述、输入JSON模式和执行函数。工具注册中心管理所有可用工具,并提供给模型清晰的工具描述。
-
记忆系统:
- 短期记忆:保存最近18条对话和工具结果
- 长期记忆:持久化存储到JSONL文件的紧凑笔记,支持基于关键词的检索
-
规划系统:
- 高层规划:3-6个要点的任务分解
- 下一步行动:具体到单个工具调用或最终回答
-
停止条件:
- 硬限制:最大步数、最大工具调用次数、最长时间
- 软限制:无进展检测、计划稳定性判断
-
LLM交互:直接调用OpenAI API,强制结构化JSON输出
2.2 控制流设计
Agent的核心工作流程如下:
- 初始化时加载工具、记忆和配置
- 接收用户目标后进入循环:
a. 检查停止条件
b. 构建包含记忆和当前状态的提示
c. 获取模型决策(强制JSON输出)
d. 执行工具调用或存储记忆
e. 更新状态和追踪日志 - 直到满足停止条件或获得最终答案
这个设计的关键在于每次迭代都严格限制模型只能输出预定义结构的JSON,从根本上避免了自由文本导致的不可预测行为。
3. 核心代码实现解析
3.1 工具系统实现
工具注册中心使用装饰器模式,每个工具都是独立的Python函数:
python复制@dataclass
class Tool:
name: str
description: str
schema: Dict[str, Any] # JSON Schema
fn: Callable[[Dict[str, Any]], Any]
safe: bool = True # 危险工具需要特别授权
class ToolRegistry:
def __init__(self):
self._tools = {}
def register(self, tool: Tool):
if tool.name in self._tools:
raise ValueError(f"重复的工具名称: {tool.name}")
self._tools[tool.name] = tool
def get(self, name: str) -> Optional[Tool]:
return self._tools.get(name)
示例工具实现(安全计算器):
python复制def tool_calc(args: Dict[str, Any]) -> Any:
expr = str(args.get("expression", "")).strip()
if not re.fullmatch(r"[0-9\.\+\-\*\/\(\)\s]+", expr):
raise ValueError("表达式包含不安全字符")
return eval(expr, {"__builtins__": {}}, {})
3.2 记忆系统实现
长期记忆使用JSON
