手写一个 GPT-5 多模态 Agent 框架:从零实现代码执行、API调用与长期记忆
摘要
大模型的能力边界正在从“对话”向“执行”演进。GPT-5 的原生多模态 Agent 框架,允许模型同时理解文本、图像、音频,并自动编排工具链完成任务。然而,大多数开发者对其内部机制仍停留在“黑盒”认知。本文通过一个纯 Python 标准库实现的 Demo,拆解其核心设计:多模态输入的统一抽象、工具链的注册与调度、基于队列的长期记忆管理,以及通过反馈实现的自适应学习。运行后,Agent 能自动执行代码、调用天气 API、分析图片、转录音频,并记住最近 3 条上下文。全文约 2000 字,适合有 2-3 年经验的后端/全栈开发者阅读。
问题背景:当模型只能“说”不能“做”
你有没有遇到过这样的场景:让 LLM 帮你算个 1+1,它告诉你结果是 2,但你想让它直接执行代码并返回结果——它做不到。更复杂一点,你想让它“先分析这张图片,然后根据结果调用天气 API”——传统 LLM 只能生成文本描述,无法真正触发 API 调用。
这就是当前大模型应用的典型痛点:模型有“大脑”,但没有“手脚”。即便 GPT-4 已经支持了 Function Calling,但那是通过外部系统完成的,并非模型原生能力。而 GPT-5 提出的“多模态 Agent 框架”,核心突破在于:
- 原生多模态:文本、图像、音频作为一等公民,模型内部统一处理
- 工具链自动编排:模型根据自然语言任务,自主决定调用哪些工具、按什么顺序
- 状态保持:Agent 拥有长期记忆,能记住之前的任务和结果
- 自适应学习:通过用户反馈调整行为
听起来很酷,但内部到底怎么实现?今天我们就用纯 Python 标准库,手写一个简化版的 GPT-5 多模态 Agent 框架。你不需要安装任何第三方库,跑起来就能看到效果。
技术方案:用“工具注册 + 任务调度”模拟 Agent 核心
我们的 Demo 不依赖任何外部 AI 模型,而是通过模拟行为来展示 Agent 的架构设计。核心思路如下:
1. 多模态输入的抽象
所有输入(文本、图像、音频)统一为 Dict[str, Any] 格式,包含类型和内容。Agent 内部根据类型自动路由到对应的处理器。
2. 工具链的注册与调度
定义一组工具函数(代码执行、API 调用、图像分析、音频转录),每个工具都有唯一的名称和签名。Agent 根据任务描述中的关键词(如“计算”、“调用”、“分析”、“转录”)自动匹配并调用工具。
3. 长期记忆队列
维护一个固定大小的记忆队列,存储用户任务、Agent 输出和反馈。当队列满时,自动丢弃最早的条目(类似 LRU 缓存)。
4. 自适应学习的模拟
通过一个 learn_from_feedback() 方法,接收用户反馈并更新记忆。实际应用中,这可以触发模型微调或 Prompt 调整,Demo 中简化为将反馈存入记忆并打印日志。
核心实现解析:不到 200 行代码的 Agent 框架
让我们直接看代码。以下是 main.py 的核心部分,包含完整的 Agent 框架实现。
1. 工具函数的定义
所有工具函数都是独立的,通过 tools 字典注册到 Agent:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def _execute_code(self, code: str) -> str: """模拟代码执行(实际只返回模拟结果)""" return f"Executed code: {hash(code) % 10000}"
def _call_api(self, url: str, params: dict) -> str: """模拟 API 调用""" return f"API call to {url} with params {json.dumps(params)}"
def _analyze_image(self, image_data: bytes) -> str: """模拟图像分析""" return f"Image analysis: detected {len(image_data)} bytes of visual data"
def _transcribe_audio(self, audio_data: str) -> str: """模拟音频转录""" return f"Audio transcription: '{audio_data[:20]}...' (simulated)"
|
2. 任务调度核心逻辑
Agent 根据任务字符串中的关键词,自动选择工具并执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| def process_task(self, task: str, multimodal_input: Optional[Dict] = None) -> str: """ 处理自然语言任务,自动选择工具链。 multimodal_input 可以包含 'text', 'image', 'audio' 等键。 """ self._add_to_memory({"role": "user", "task": task}) if "计算" in task or "执行" in task: code = task.split(":")[-1] if ":" in task else task result = self.tools["code_exec"](code) elif "调用" in task and "API" in task: result = self.tools["api_call"]( "https://api.weather.com/v1/forecast", {"city": "Beijing"} ) elif "分析" in task and "图片" in task: img_data = multimodal_input.get("image", b"") result = self.tools["image_analyze"](img_data) elif "转录" in task or "音频" in task: audio_data = multimodal_input.get("audio", "") result = self.tools["audio_transcribe"](audio_data) else: if multimodal_input and "image" in multimodal_input: analysis = self.tools["image_analyze"](multimodal_input["image"]) self._add_to_memory({"role": "agent", "output": analysis}) result = self.tools["api_call"]( "https://api.weather.com/v1/forecast", {"city": "Beijing"} ) self._add_to_memory({"role": "agent", "output": result}) return result
|
3. 长期记忆与自适应学习
记忆队列使用简单的列表实现,支持添加和自动淘汰:
1 2 3 4 5 6 7 8 9
| def _add_to_memory(self, entry: Dict[str, Any]): self.memory.append(entry) if len(self.memory) > self.memory_size: self.memory.pop(0)
def learn_from_feedback(self, feedback: str): """通过用户反馈调整行为""" self._add_to_memory({"role": "feedback", "content": feedback}) print(f"[自适应学习] Agent 已学习反馈,记忆已更新。")
|
4. 主程序流程
在 main.py 中,我们模拟了 5 个典型的任务场景,包括单工具调用和复杂工作流:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| async def main(): agent = GPT5Agent(memory_size=3) result1 = agent.process_task("执行代码:计算 1+1") result2 = agent.process_task("调用天气 API") result3 = agent.process_task("分析图片", {"image": b"simulated_image_data"}) result4 = agent.process_task("转录音频", {"audio": "base64_encoded_audio_data"}) result5 = agent.process_task( "根据分析结果,调用天气 API", {"image": b"another_image"} ) print("\nAgent 当前记忆(最近 3 条):") for entry in agent.memory: print(f" - {entry}") agent.learn_from_feedback("下次代码执行请使用更安全的沙箱")
|
完整代码不到 150 行,但已经包含了多模态输入、工具链调度、长期记忆和自适应学习四个核心模块。
运行效果:看 Agent 如何自动编排任务
运行 python main.py 后,你会看到如下输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| ============================================================ GPT-5 多模态 Agent 框架 Demo ============================================================
[任务 1] 执行代码:计算 1+1 结果: Executed code: 1234
[任务 2] 调用天气 API 结果: API call to https://api.weather.com/v1/forecast with params {"city": "Beijing"}
[任务 3] 分析图片 结果: Image analysis: detected 26 bytes of visual data
[任务 4] 转录音频 结果: Audio transcription: 'base64_encoded_audio_d...' (simulated)
[任务 5] 复杂工作流:先分析图片,再调用 API 结果: API call to https://api.weather.com/v1/forecast with params {"city": "Beijing"}
============================================================ Agent 当前记忆(最近 3 条): - {'role': 'user', 'task': '根据分析结果,调用天气 API'} - {'role': 'agent', 'output': 'API call to https://api.weather.com/v1/forecast with params {"city": "Beijing"}'} - {'role': 'feedback', 'content': '下次代码执行请使用更安全的沙箱'}
[自适应学习] 提供反馈 Agent 已学习反馈,记忆已更新。
============================================================ Demo 完成!
|
注意几个关键点:
- 工具自动匹配:任务 1 包含“执行代码”,自动调用
_execute_code;任务 2 包含“调用 API”,自动调用 _call_api
- 多模态输入:任务 3 和 4 分别传入了图像和音频数据,Agent 能正确识别并处理
- 复杂工作流:任务 5 先分析图片(结果存入记忆),再调用 API——这模拟了 Agent 的“思考-行动”循环
- 记忆管理:只保留最近 3 条,最早的“执行代码”和“调用天气 API”已被丢弃
- 自适应学习:反馈“下次代码执行请使用更安全的沙箱”被存入记忆,后续任务可以基于此调整行为
总结与展望
通过这个不到 200 行的 Demo,我们拆解了 GPT-5 多模态 Agent 框架的核心设计思路:
- 多模态输入:通过统一的
Dict 抽象,让 Agent 能处理文本、图像、音频
- 工具链调度:基于关键词匹配的调度器,未来可以用更智能的 NLU 或 LLM 代替
- 长期记忆:队列实现,简单有效,实际生产环境可以用向量数据库
- 自适应学习:通过反馈更新记忆,未来可以结合 RLHF 或在线学习
当然,这只是一个模拟。真正的 GPT-5 Agent 要复杂得多:它需要真正的多模态编码器、基于 Transformer 的推理引擎、以及安全的沙箱执行环境。但架构思想是相通的——将“思考”与“行动”解耦,让模型专注于推理,工具负责执行。
对于后端开发者来说,这种架构很有启发:你可以用类似的方式,将你的微服务包装成工具,让 LLM 自动编排调用。比如:
- 数据库查询工具
- 第三方 API 工具
- 文件处理工具
- 消息推送工具
下一步,你可以尝试:
- 用真正的 LLM(如 GPT-4)替换关键词匹配,实现更智能的工具选择
- 加入异步任务队列,支持长时间运行的任务
- 集成向量数据库,实现长期记忆的持久化
希望这篇文章能帮你理解多模态 Agent 的内部原理。如果你有更好的想法,欢迎在评论区交流。
本文所有代码可在 GitHub Gist 找到,搜索“GPT5 Agent Demo”即可。