【免费下载链接】VIGAVIGA: Vision-as-Inverse-Graphics Agent项目地址https://gitcode.com/gh_mirrors/viga/VIGA点击查看免费下载VIGAVision-as-Inverse-Graphics Agent是一个分析即合成的视觉代码智能体它通过 write-run-compare-revise 的自纠正主循环让 Generator 与 Verifier 两个角色交替写代码、跑渲染、比图像、改代码无需微调即可从一张目标图迭代重建出可运行的 3D 场景程序。本文带你逐行读懂这套自纠正主循环的实现细节。一图看懂VIGA 的自纠正主循环长什么样下面这张官方迭代轨迹图展示了主循环的真实工作过程左侧是输入的目标图像右侧是每一轮观察差异 → 修改属性 → 再渲染的 rollout 轨迹嘴部表情从 0.0 调至 1.0、主光颜色从黄色改成白色……每一格粉色文字就是 Verifier 给出的对比反馈蓝色文字是 Generator 对应的代码修改。整个循环可以概括为四个动作write写Generator 输出思考、代码 diff 与完整 Blender Python 代码run跑代码在 Blender 后台进程中执行并渲染出图像compare比Verifier 从多个视角对比渲染图与目标图给出结构化差异分析revise改反馈写回上下文记忆驱动下一轮修改也可调用end提前结束或undo_last_step回退主循环入口main.py 如何把两个 Agent 串起来入口文件 main.py 逻辑非常清晰核心只有三步verifier VerifierAgent(args) generator GeneratorAgent(args, verifier) await generator.run() # 进入 write-run-compare-revise 主循环对应 main.py 三行关键代码先初始化 VerifierL72因为 Generator 构造时需要持有 Verifier 实例在执行代码后随时请求看图对比再初始化 GeneratorL74GeneratorAgent内部创建独立的ExternalToolClient与 OpenAI 客户端并用PromptBuilder构建系统提示词写入记忆await generator.run()L81主循环完全由 Generator 驱动Verifier 只在需要时被回调最后finally中统一cleanup()关闭所有 MCP 工具服务器L85-L90。 新手提示所有运行参数--model、--max-rounds、--memory-length、--generator-tools等都在 main.py 的 argparse 中定义这是理解整套配置体系的地图。writeGenerator 如何产出一轮可执行代码主循环的心脏是 agents/generator.py 的run()方法外层是一个for i in range(max_rounds)轮次循环每轮做四件事1. 组装本轮上下文memory self.prompt_builder.build_memory(self.memory) # 滑窗截断 chat_args {model: ..., messages: memory, tools: tool_configs, tool_choice: auto} responses get_model_response(self.client, chat_args, ...) # L98build_memoryagents/prompt_builder.py实现了一个滑窗记忆固定保留前两条系统提示 目标图再从最新一轮向前取最近memory_length默认 12条消息并把被undo回退过的历史消息整段跳过——这既控制 token 成本又避免被撤销的旧方案干扰模型判断。2. 强制工具调用L103-L110 有一段防偷懒逻辑如果模型没有发起tool_call就只回了一句自然语言框架会往记忆里追加一条 user 消息Every single output must contain a tool_call field…Please reconsider.并continue重跑本轮。这保证了主循环永远以写代码 → 执行推进而不是模型空谈。3. 执行工具并触发 compare模型正常输出后L136-L149tool_name tool_call.function.name # 例如 execute_and_evaluate tool_response await self.tool_client.call_tool(tool_name, tool_arguments) if tool_response.get(require_verifier, False): # 渲染成功才会触发 verifier_result await self.verifier.run({...}) tool_response[verifier_result] verifier_result关键点require_verifier标志由工具端返回——只有代码执行成功且渲染出了图像才进入 compare 阶段如果执行报错反馈里只有错误文本Generator 直接基于报错 revise。4. 写回记忆、判断结束_update_memoryagents/generator.py把 assistant 的 tool_call、工具的渲染结果图base64 内联、以及 Verifier 的verifier_result一并追加进self.memory并落盘为generator_memory.json。最后 L156 检查tool_name end当 Verifier 判定场景已无剩余问题时Generator 调用end工具主循环break优雅退出。runtools/blender/exec.py 如何跑代码并渲染run 的执行者是 MCP 工具服务器 tools/blender/exec.py。它对 Generator 暴露三个工具L24-L74工具作用execute_and_evaluate执行代码并触发 Verifier 评估write-run-compare 的核心get_scene_info查询场景中对象、材质、灯光、相机信息undo_last_step撤销上一步恢复到上一个.blend状态注意execute_and_evaluate的参数设计L32-L43强制模型同时给出三段内容thought先逐步推理当前场景、说明下一步写什么代码code_diff仅列出最小行级改动-:删除、:新增code应用 diff 后的完整可运行脚本这种思考 diff 全量代码的三件套让模型既保持最小改动、又能保证脚本整体一致可执行。执行流程在Executor.execute()L192-L227中代码写入scripts/{count}.py清空renders/{count}/目录_execute_blenderL131-L173拼接命令blender --background 场景.blend --python 包装脚本 -- 代码路径 渲染目录用子进程后台执行扫描渲染目录无图片 → 返回提示you have added the camera in your code…提醒你必须在代码里摆好相机有图片 → 返回{image: [渲染图列表], require_verifier: True}正式进入 compare 阶段。compareVerifier 如何看图对比并给出结构化反馈Verifier 的实现在 agents/verifier.py它的run()被 Generator 按需调用接收{argument, execution}即本轮 thought/code_diff/code 渲染图。内部同样是一个max_rounds小循环流程为重载场景若配置了reload_scene工具则先调用保证 Verifier 看到最新场景多视角观察Verifier 有自己的工具集set_camera、investigate、get_scene_info等见 docs/architecture.md可以自由移动相机、调整视角去验看可疑区域输出结论观察充分后调用end工具按 tools/verifier_base.py 中定义的 schema 返回两个必填字段visual_difference从相机、物体、布局、环境以及动态模式下的动画五个维度描述当前渲染与目标的差异edit_suggestion给出可执行的修改建议例如精确的相机坐标、把桌子向 Y 移动 0.3m这类具体变换。 以data/dynamic_scene/artist任务为例目标图就是一张莫奈风格静物油画。Generator 的第一版代码往往只能得到粗糙的物体布局正是 Verifier 逐轮指出的颜色偏差、位置偏移、光影不符驱动场景逐渐逼近这张目标图。如果 Verifier 轮次耗尽仍未给出有效结论会兜底返回No valid response, please observe the output image…agents/verifier.py L160保证主循环不会被卡死。revise反馈如何驱动下一轮修改compare 的结果通过两条路径回流到 Generator完成revise路径一直接写回工具响应。在 agents/generator.py 的_update_memory中verifier_result会被封装成 tool 消息插入记忆tool_response.append({type: text, text: The following information is what the verifier agent returns to you: (1) Visual difference analysis … (2) Suggested code modifications to follow.})下一轮 Generator 拿到的上下文就包含渲染图 差异分析 修改建议自然据以重写code_diff与code。路径二记忆中的长期线索。记忆首条 user 消息中会持续维护两类全局信息Initial plan:—— Generator 首轮调用initialize_plan后初始计划被永久写入记忆L209-L218让长任务不偏离总目标Downloaded {object_name} to {object_path}—— 下载好的 3D 资产路径也记入其中供后续代码引用。兜底机制主动回退。如果某轮修改反而让画面离目标更远Generator 可调用undo_last_steptools/blender/exec.py L303-L320删除本轮脚本与渲染目录、把上一步保存的state.blend拷回计数器减一build_memory还会在滑窗时把已撤销的对话段整体跳过让走过的弯路不污染后续推理。主循环全景回顾与关键文件索引把四步串起来VIGA 的 write-run-compare-revise 自纠正主循环就是阶段触发者关键代码位置writeGeneratoragents/generator.py 组装上下文并发起工具调用runBlender 工具tools/blender/exec.py 子进程执行 渲染compareVerifieragents/verifier.py 多视角观察并输出结构化反馈revise记忆系统agents/prompt_builder.py 滑窗记忆 反馈回写值得关注的其他配套文件工具通信层agents/tool_client.py通过 MCP stdio 统一管理多个工具服务器各模式提示词prompts/ 目录含 generator/verifier 两套模板与示例批量运行脚本runners/ 与单任务入口 runners/dynamic_scene.py系统设计与输出目录结构docs/architecture.md一句话总结VIGA 把看图找茬、改代码重跑做成了一个有记忆、有回退、有强制工具调用的工程化循环——main.py搭骨架、generator.py跑循环、exec.py管执行、verifier.py出反馈、prompt_builder.py控上下文五者协同构成了完整的自纠正闭环。读懂这五个文件你就掌握了 VIGA 代码实现的核心脉络。赞分享【免费下载链接】VIGAVIGA: Vision-as-Inverse-Graphics Agent项目地址https://gitcode.com/gh_mirrors/viga/VIGA点击查看免费下载相关推荐VIGA核心架构深度解析Generator与Verifier双Agent如何协作实现自我纠正VIGA核心架构深度解析Generator与Verifier双Agent如何协作实现自我纠正 VIGAVision as Inverse GraphicsAttractor执行引擎深度揭秘6阶段生命周期与核心循环伪代码逐行拆解Attractor执行引擎深度揭秘6阶段生命周期与核心循环伪代码逐行拆解 Attractor 是 StrongDM 开源的非交互式 Coding AgentVidage 背景视频库代码实现原理详解init 与 handler 核心逻辑逐行拆解Vidage 背景视频库代码实现原理详解init 与 handler 核心逻辑逐行拆解 本文带你读懂 Vidage —— 一个把全屏视频变成网页背景、并在移动创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?