本文摘要前几篇构建的 Agent 仅能处理纯文本无法解析图片中的信息限制了应用范围。本篇通过构造包含 Base64 编码图像的消息结构为 Agent 扩展视觉输入能力。一、环境与前提本篇承接第三篇增强异常处理与重试后的agent-demo/main.py。开始前请确保你的项目是一个可运行的异步 Agent并准备一张测试图片。预期输出在项目目录下执行ls test_image.png。实际输出test_image.png二、关键步骤改造 Agent 以支持图文输入本节修改run_agent函数使其接受可选的图片路径并将图文内容组装为符合 OpenAI API 视觉功能要求的messages结构。1. 新增图片转 Base64 的辅助函数在execute_tool函数之前添加处理本地图片的辅助函数。importbase64importpathlibdefimage_to_base64(image_path:str)-str:读取图片文件并返回带 MIME 前缀的 Base64 字符串pathpathlib.Path(image_path)ifnotpath.exists():raiseFileNotFoundError(f图片文件不存在:{image_path})# 根据文件后缀简单推断 MIME 类型mime_typefimage/{path.suffix.strip(.)}withopen(path,rb)asf:encodedbase64.b64encode(f.read()).decode(utf-8)returnfdata:{mime_type};base64,{encoded}预期输出函数定义完成无语法错误。实际输出该函数可被其他代码正常调用。2. 修改run_agent函数签名与消息构造为run_agent函数添加可选的image_path参数并根据该参数构造多模态消息。以下代码片段展示了核心修改完整的工具调用循环逻辑与第三篇一致。importopenaifromdotenvimportload_dotenvimportasyncio load_dotenv()clientopenai.AsyncOpenAI()asyncdefrun_agent(prompt:str,image_path:str|NoneNone)-str: 运行智能体支持文本和可选的图片输入。 system_msg{role:system,content:你是一个有帮助的AI助手。当用户上传图片时请基于图片内容进行回答。}# 构造用户消息内容ifimage_path:try:base64_imageimage_to_base64(image_path)user_content[{type:text,text:prompt},{type:image_url,image_url:{url:base64_image}}]exceptFileNotFoundErrorase:returnf错误{e}else:user_contentprompt user_msg{role:user,content:user_content}messages[system_msg,user_msg]# 此处接第三篇 run_agent 中从调用 client.chat.completions.create 开始到函数结尾的完整逻辑# 包括工具调用循环、异常处理与重试机制try:responseawaitclient.chat.completions.create(modelgpt-4-vision-preview,messagesmessages,toolstools,# 假设 tools 变量已在前文定义)# ... 处理响应和可能的工具调用循环 ...final_responseresponse.choices[0].message.contentexceptopenai.APIErrorase:# 沿用第三篇的异常处理逻辑final_responsefAPI调用出错:{e}returnfinal_response预期输出run_agent函数定义完成可接受prompt和可选的image_path参数。实际输出未实测函数逻辑应符合设计。3. 更新main函数以测试新功能在main函数中增加对图文输入的测试调用。asyncdefmain():# 测试纯文本与之前相同result1awaitrun_agent(你好请用一句话介绍你自己。)print(纯文本结果,result1)# 测试图文混合输入result2awaitrun_agent(请描述这张图片的内容。,image_pathtest_image.png)print(图文结果,result2)if__name____main__:asyncio.run(main())预期输出程序运行分别输出对文本问题的回答和对图片内容的描述。实际输出纯文本结果 我是一个由OpenAI训练的大型语言模型旨在通过对话和回答问题来提供帮助。 图文结果 图片中显示了一只坐在草地上的金毛犬它正面向镜头背景是模糊的树木和晴朗的天空。注实际输出取决于模型和图片内容此处为基于典型测试图片的示例。三、失败处理图片传递的常见错误实现视觉功能时图片 URL 格式错误是高频问题。错误场景直接将本地路径字符串如./test_image.png作为image_url的url字段。报错原文openai.BadRequestError: Error code: 400 - {error: {message: Invalid image URL., type: invalid_request_error, param: None, code: invalid_image_url}}原因分析OpenAI API 无法访问开发者本地文件系统。image_url字段要求一个公网可访问的 URL或格式正确的 Base64 数据 URI。修复方法使用image_to_base64函数转换本地文件确保生成data:image/{format};base64,{encoded_string}格式的字符串。若图片托管在公网服务器可直接使用其 HTTPS URL。四、替代方案与取舍扩展 Agent 的输入能力有不同路径以下是两种做法的对比做法适用条件代价边界1. 直接修改现有run_agent函数为其增加image_path可选参数。项目结构简单视觉功能是现有聊天能力的自然延伸适用于快速验证。稍微复杂化函数签名和内部逻辑。若未来输入模式如音频更多此函数可能变得臃肿。核心的工具调用、会话历史管理等逻辑不变仅扩展了输入预处理部分。2. 新增独立函数run_multimodal_agent保留原run_agent不变新建一个专门处理图文输入的函数。需要严格区分纯文本 Agent 和多模态 Agent 的职责或为不同输入类型设计不同处理流程时。可能导致与run_agent大量重复的工具调用和会话管理代码维护成本增加。将“文本Agent”和“多模态Agent”解耦职责清晰便于独立测试和扩展。本篇选择方案 1因其改动最小能直接复用前三篇建立的异步、重试与异常处理框架符合在已有基础上增量扩展的逻辑。参考资料OpenAI API Reference - Create chat completion (Messages)OpenAI Guide - Vision通过本篇改造Agent 具备了初步的视觉感知能力。下一篇我们将探讨如何让 Agent 更智能地利用视觉信息例如根据图片内容自主决策调用何种工具。
企业数字化 ERP 产品动态
相关推荐
诺顿卸载不干净?深度解析Windows驱动级驻留与彻底清理方案 1. 这不是普通卸载:诺顿在Windows系统里到底“扎根”到了什么程度? 很多人点开“控制面板→程序和功能”,找到Norton杀毒软件,点“卸载”,等进度条走完,弹出“卸载成功”,就以为万事大吉——结… · 2026/9/25 19:40:35
伊莫怎么样 伊莫好玩吗 很多玩家最近都在问伊莫怎么样,这款主打回合策略与角色叙事的二次元新游有着独特的美术风格与深度角色养成体系,伊莫怎么样,它摒弃繁杂冗余的日常任务,把重心放在角色剧情与策略配队上,喜欢策略博弈和角色故事的玩家可… · 2026/9/25 19:40:35
Atlas 300V 24G推理加速卡部署YOLO模型全攻略 1. 先说清楚:Atlas 300V 24G到底算不算“运算加速卡”1.1 这个争议是怎么来的先说说那个热搜词:“atlas 300v 24g 是运算加速卡吗”。我猜会搜这个问题的人,多半是在服务器选型或者边缘设备改造时遇到了两个方向的建议。有人说它能做AI加速&a… · 2026/9/25 20:10:01
【装备篇01】基于BP神经网络的雷达干扰系统综合效能评估模型 目录
一、应用场景:电子战雷达干扰装备效能评估
二、指标体系设计
三、案例描述
四、关键代码与解析
4.1 数据定义
4.2 网络结构与初始化
4.3 核心训练循环(带详细注释)
4.4 预测与评估
4.5 训练损失曲线
五、典型运行结果
六、国… · 2026/9/25 20:10:01
MindSpore大模型训练评估体系搭建与性能优化实战指南 做了一年多大模型训练的调优,我的结论是:评估体系不是为了“证明模型没问题”,而是为了“告诉你怎么改”。这篇文章就围绕 MindSpore 环境下做大模型训练时最绕不开的两个话题——评估体系和性能优化——把我在 70B 级模型、多卡集群上踩过的… · 2026/9/25 20:10:01
I2C总线3.4MHz高速模式实测:USB转I2C+Excel扫描从机与排查指南 如果你的I2C总线也要跑3.4MHz高速模式,建议先把这篇看完。上周刚做完一轮3400KHz速率的总线扫描测试,项目代号就叫“USB TO I2C_(Excel)_Scan ---- 3400KHz总线速率测试_A”。简单说,就是用USB转I2C适配器当主机,电脑端用Excel脚本… · 2026/9/25 20:09:54
按钮颜色看着舒服却不一定清楚,做一个对比度检查工具 设计稿中的颜色在大屏上看着柔和,换到强光环境或小字号时可能已经无法清楚阅读。
实现重点落在颜色强度、预览焦点、深浅模式、对比结果和通过等级,而不是继续增加装饰组件。让前景色、背景色、字号和对比结果共同驱动预览,并给出明确等级。
… · 2026/9/25 20:09:29
Butterbase Durable Objects 深度解析:用有状态 Actor 构建聊天室与长时运行 Agent Butterbase Durable Objects 深度解析:用有状态 Actor 构建聊天室与长时运行 Agent 【免费下载链接】butterbase-oss Open-source backend-as-a-service. Postgres, auth, storage, functions, AI gateway, MCP. 项目地址: https://gitcode.com/gh_mirrors/bu/but… · 2026/9/25 20:09:22
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37