跳转至

2.Agent框架

总览

先回顾一下JSON型和code型Agent的区别。

用代码而非 JSON 编写操作提供了几个关键优势:

  • 可组合性(Composability):轻松组合和重用操作
  • 对象管理(Object Management):直接处理复杂结构,如图像
  • 通用性(Generality):表达任何计算上可能的任务
  • 适合大语言模型:高质量代码已存在于大语言模型的训练数据中

代码 vs. JSON 操作

smolagents

这个notebook可以进行实践。

  • multistep:每个step执行一次思考,一次调用工具。
  • code agent:编写代码调用外部工具

提供两种智能体:

  • 使用代码的智能体:写代码,然后在沙盘里运行
  • 调用工具的智能体:使用JSON调用其它tool函数

下面是一个例子:code agent会创建如此代码

for query in [
    "Best catering services in Gotham City", 
    "Party theme ideas for superheroes"
]:
    print(web_search(f"Search for: {query}"))

而tool calling agent会创建如此JSON:

[
    {"name": "web_search", "arguments": "Best catering services in Gotham City"},
    {"name": "web_search", "arguments": "Party theme ideas for superheroes"}
]

Memory与每次运行流程

总体上,如下图所示,Agent维护一个Memory,最开始是空的,每次思考后,将反馈添加到Memory中,然后再将`System_PromptMemory拼一起进行思考。Agent_ManimCE

多智体

多智体,其实很简单,一个智能体分配任务,其他的接受任务,各司其职。deepseek-R1利用下属模型完成搜索,最后能够画图。

多智体分工

实战细节

如下定义web agent,其中description给上层提供了它的职能。

web_agent = CodeAgent(
    model=model,
    tools=[
        GoogleSearchTool(provider="serper"),
        VisitWebpageTool(),
        calculate_cargo_travel_time,
    ],
    name="web_agent",
    description="Browses the web to find information",
    verbosity_level=0,
    max_steps=10,
)

如下定义manage agent,其中managed_agents列出了它的子智能体。planning_interval规定多少次行动后进行一次规划,是个能耗平衡的参数。

Note

沙盒环境中,本来没有额外库或包,但是可以手动授权导入。

manager_agent = CodeAgent(
    model=HfApiModel("deepseek-ai/DeepSeek-R1", provider="together", max_tokens=8096),
    tools=[calculate_cargo_travel_time],
    managed_agents=[web_agent],
    additional_authorized_imports=[
        "geopandas",
        "plotly",
        "shapely",
        "json",
        "pandas",
        "numpy",
    ],
    planning_interval=5,
    verbosity_level=2,
    final_answer_checks=[check_reasoning_and_plot],
    max_steps=15,
)

带图像视觉的

log就是执行的所有细节,包括过程,参数,结果等等。每一步最后都要callback,截个图,保留一定步数内的截图。

Dynamic image retrieval