结构化CodeAgents:结合代码执行与JSON输出提升AI代理性能
今日发布的研究结合了两种强大的AI代理设计范式:基于代码的行动的表达力和结构化生成的可靠性。研究表明,强制CodeAgents在结构化的JSON格式中生成思维和代码可以显著优于传统方法,在多个基准测试上的表现尤为突出。 AI代理行动的发展历程 AI代理需要在现实世界中采取行动,无论是调用API、处理数据,还是解决复杂问题。代理如何表达这些行动已经经历了几代变化: 传统JSON代理:代理生成结构化的JSON来调用工具。虽然可靠,但功能有限,只能从预定义的工具列表中选择。 json { "tool": "get_weather", "arguments": { "city": "Paris" } } 代码代理(Code Agents):代理利用其内在的编程能力,直接编写可执行的Python代码。这种方法首次在论文“Executable Code Actions Elicit Better LLM Agents”中提出,赋予代理更高的灵活性,可以直接在代码中调用工具,管理变量和状态,从而生成动态的工具执行图。 ```python temperature_sum = 0 for city in ["Paris", "Tokyo", "New York"]: temp = get_weather(city) temperature_sum += temp print(f"Average temperature: {temperature_sum / 3:.1f}°C") ``` 优点包括更高的灵活性和更可靠的变量管理,但缺点是Markdown中的代码解析容易出错。 结构化输出增强代码代理 通过结构化输出,我们可以强制模型生成显式的思维和代码作为JSON对象: json { "thoughts": "我需要计算三个城市的平均温度。", "code": "temperature_sum = 0\nfor city in [\"Paris\", \"Tokyo\", \"New York\"]:\n temp = get_weather(city)\n temperature_sum += temp\n\nprint(f\"Average temperature: {temperature_sum / 3:.1f}°C\")" } 这种做法将结构化生成的可靠性与代码执行的灵活性结合起来,取得了最佳效果。 基准测试结果 我们在GAIA、MATH、SimpleQA和Frames等基准上比较了这三种范式。结果显示,结构化代码代理在大多数情况下都比普通的CodeAgent高出2到7个百分点。特别是,没有解析错误的代理轨迹成功概率比有解析错误的高出21.3%,并且平均步骤数从3.18减少到4.63。 为什么结构化生成重要 结构化生成不仅提高了解析的可靠性,还迫使代理在行动前明示其推理过程。我们分析了15,724个代理轨迹,发现: 解析问题确实存在:没有解析错误的轨迹成功概率更高。 明确的推理过程:结构化生成使模型在行动前清晰地阐述其思路,有助于保持问题解决的正确路径。 结构化生成的弊端 结构化生成也有其代价。较小的模型由于认知负荷过高,可能会在生成结构化代码时出现语法错误。例如,一个较小的模型(如mistralai/Mistral-7B-Instruct-v0.3)可能会生成如下错误的Python代码: json { "thought": "我需要找到高度...", "code": "web_search(query=\"Eiffel Tower height\")\", " } 这会导致即刻的语法错误和执行失败。因此,结构化生成更适合具备强大指令跟随能力和JSON覆盖训练数据的模型。 何时使用结构化CodeAgents 建议使用: 模型具有较强的结构化生成能力。 需要高可靠性和准确性的情况。 考虑替代方案: 模型较小,可能会因为认知负荷而生成错误的代码。 简单任务,不需要复杂的推理过程。 如何在smolagents中使用 使用smolagents启用结构化输出非常简单: ```python from smolagents import CodeAgent, InferenceClientModel, GoogleSearchTool 配置支持结构化生成的代理 agent = CodeAgent( tools=[GoogleSearchTool(provider="serper")], model=InferenceClientModel("Qwen/Qwen3-235B-A22B", provider='nebius'), use_structured_outputs_internally=True # 启用结构化输出 ) result = agent.run("计算猎豹跑过金门大桥的时间") 模型生成如下内容: { "thoughts": "我需要找到金门大桥的长度和猎豹的最高速度,然后计算时间。", "code": "bridge_info = web_search('Golden Gate Bridge length meters')\ncheetah_speed = web_search('Cheetah top speed') ..." } ``` 实现技巧 清晰提示:确保你的提示清楚地指明期望的JSON结构。 模型选择:选择具有强结构化生成能力的模型。 合适的提供商:某些API提供商如OpenAI或Anthropic支持结构化生成。如果使用Hugging Face的推理提供商,各提供商的支持情况可能有所不同。 未来展望 这项研究表明,我们对代理架构的理解正在变得更加细致,不仅是“代理能做什么”,还包括“代理如何思考”。无论是提高模型的跟踪能力还是简化解析,结构化输出都是一个胜利。但这仅仅是开始,还有许多问题值得探索。 行业评价 业内人士普遍认为,这一研究对于提高AI代理的可靠性和性能具有重要意义。结构化生成不仅可以减少解析错误,还可以帮助代理更好地组织其思维过程。smolagents团队表示,他们将继续优化这一方法,使其更加适用于各种场景和更广泛的模型。 smolagents是一家专注于开发轻量级AI代理系统的公司,致力于通过创新的技术手段简化AI应用的开发过程,提高其在实际应用中的性能和可靠性。