从助手到执行者:生成式 AI 入门课程第 17 课的 AI Agent 框架详解——LangChain、AutoGen、TaskWeaver 与 JARVIS
本文基于《Generative AI for Beginners》课程第 17 课 “AI Agents” 的阿拉伯语版教学文档(translations/ar/17-ai-agents/README.md)撰写,对应课程英文版 17-ai-agents/README.md。文章系统讲解 AI Agent “状态 + 工具” 的核心模型、LangChain / AutoGen / TaskWeaver / JARVIS 四大框架的设计差异与典型代码模式。读完之后,你将能够独立解释 AI Agent 与聊天机器人的区别,理解每个框架如何管理状态(state)与工具(tools),并可以按课后作业的要求,用 AutoGen 搭建一个多角色的“创业公司商务会议”多智能体应用。
课程背景与学习目标
AI Agent 代表了生成式 AI 领域中一项激动人心的进展:它使大语言模型(LLM)从“只会回答的助手”进化为“能够执行动作的代理人(Agent)”。AI Agent 框架让开发者能够构建这样的应用——为 LLM 提供对工具(tools)的访问权限与状态(state)管理能力;同时,这些框架还增强了过程的可见性(visibility),使用户和开发者可以监控 LLM 规划并即将执行的动作,从而改善整体体验管理。
本课程的这一课覆盖三个核心领域:
- 理解什么是 AI Agent——AI Agent 究竟是什么?
- 探索不同的 AI Agent 框架——每个框架的独特之处在哪里?
- 将这些 Agent 应用于不同使用场景——什么时候应该使用 AI Agent?
完成本课学习后,你将能够:
- 解释什么是 AI Agent,以及它们如何被使用;
- 理解一些流行 AI Agent 框架之间的差异,以及它们各自的定位;
- 理解 AI Agent 的工作机制,从而能够基于这些框架构建应用。
AI Agent 是什么:状态与工具两大支柱
AI Agent 是生成式 AI 世界中非常激动人心的领域。随着热度上升,术语的使用经常相互混淆。为了保持简单,并尽可能涵盖所有自称“AI Agent”的工具,课程采用了如下定义:
AI Agent 通过赋予大语言模型(LLM)对「状态(state)」和「工具(tools)」的访问权限,使其能够执行任务。
下面逐一明确这些术语:
- 大语言模型(Large Language Models)——即本课程全程引用的那些模型,例如 GPT-3.5、GPT-4、Llama-2 等。
- 状态(State)——指 LLM 所处的上下文(context)。LLM 会利用自己过去动作的上下文以及当前上下文,来引导它做出后续动作的决策。AI Agent 框架让开发者更容易维护这一上下文。
- 工具(Tools)——为了完成用户请求的、且已被 LLM 规划好的任务,LLM 需要访问工具。工具的示例包括:数据库、API、外部应用程序,甚至可以是另一个 LLM!
这些定义为理解后续各框架的实现方式打下了基础。值得注意的是,“工具”的底层机制与本课程第 11 课讲解的 function calling(函数调用)一脉相承——function calling 让模型以一致的结构化格式调用外部函数并获取外部数据(参见 11-integrating-with-function-calling/README.md);而 Agent 框架则在此基础上进一步加入了状态管理与多步编排。
LangChain Agents:用 AgentExecutor 管理状态与工具
LangChain 的 Agent 是上述定义的一种直接实现。
状态管理。 LangChain 使用一个内置函数 AgentExecutor 来管理状态。该函数接收已定义的 agent 以及可供该 agent 使用的 tools:
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
AgentExecutor 同时会存储聊天历史(chat history),以此提供对话上下文。课程配图展示了完整链条:使用 ChatOpenAI 初始化 LLM → 通过 create_openai_functions_agent(llm, tools) 创建 agent → 交给 AgentExecutor 执行并维护聊天历史。
工具目录(Tools Catalog)。 LangChain 提供了一个工具目录,其中收录的工具可以由社区和 LangChain 团队开发,并被直接导入到你的应用供 LLM 调用。例如可以先导入搜索类工具:
from langchain_community.tools.tavily_search import TavilySearchResults
search, retriever_tool = TavilySearchResults()
随后定义这些工具并传递给 AgentExecutor 即可。
可见性:LangSmith。 在讨论 AI Agent 时,可见性同样重要。对应用开发者而言,理解 LLM 正在使用哪个工具、以及为什么使用它,至关重要。为此,LangChain 团队开发了 LangSmith 工具,用于观测和调试 Agent 的推理与工具调用链路。
AutoGen:以“会话”为核心的可定制多智能体框架
接下来讨论的框架是 AutoGen。AutoGen 的核心焦点是会话(conversations):其中的 Agent 同时具备**可会话(conversable)和可定制(customizable)**两大特性。
可会话(Conversable)——LLM 之间可以主动发起并持续对话,以协作完成任务。实现方式是创建 AssistantAgent 并为它们指定各自的系统消息(system message):
coder = autogen.AssistantAgent(
name="Coder",
llm_config=llm_config,
)
pm = autogen.AssistantAgent(
name="Product_manager",
system_message="Creative in software product ideas.",
llm_config=llm_config,
)
可定制(Customizable)——Agent 不仅可以是 LLM,还可以定义为用户或工具。开发者可以定义 UserProxyAgent,它负责与真实用户交互、收集反馈,以推进任务的完成;用户的反馈既可以继续任务的执行,也可以终止它:
user_proxy = UserProxyAgent(name="user_proxy")
状态与工具:以“纽约出行穿衣建议”为例
在 AutoGen 中,为了改变和管理状态,assistant Agent 会生成 Python 代码来完成具体任务。下面用一个完整流程演示这一点。
第一步:用系统消息定义 LLM 的职责边界
system_message="For weather related tasks, only use the functions you have been provided with. Reply TERMINATE when the task is done."
这条系统消息将特定 LLM 引导到与其任务相关的函数上,并要求任务完成后回复 TERMINATE。请记住:在 AutoGen 中你可以定义多个带有不同系统消息的 AssistantAgent,每个 Agent 各司其职。
第二步:由用户发起会话
user_proxy.initiate_chat(
chatbot,
message="I am planning a trip to NYC next week, can you help me pick out what to wear?",
)
这条来自 user_proxy(人类)的消息,将触发 Agent 开始探索它应当执行哪些可能的函数。
第三步:执行函数(工具调用)
会话处理完成后,Agent 会发出建议的工具调用。课程给出的实际运行输出如下:
chatbot (to user_proxy):
***** Suggested tool Call: get_weather ***** Arguments: {"location":"New York City, NY","time_periond:"7","temperature_unit":"Celsius"} ******************************************************** --------------------------------------------------------------------------------
>>>>>>>> EXECUTING FUNCTION get_weather... user_proxy (to chatbot): ***** Response from calling function "get_weather" ***** 112.22727272727272 EUR ****************************************************************
可以看到 Agent 自动构造了 get_weather 的参数(地点、时间范围、温度单位)并执行了函数调用。根据你的配置,该函数可以被自动执行并由 Agent 直接读取结果,也可以基于用户输入来触发执行。
这一“模型提议工具 → 框架执行函数 → 结果回灌给模型”的闭环,正是第 11 课 function calling 在 Agent 场景中的工程化封装:课程英文版中还整理了 AutoGen 的官方代码样例索引,可结合 17-ai-agents/README.md 中引用的样例入口继续探索如何上手构建。
TaskWeaver:代码优先(Code-First)的数据分析 Agent
接下来介绍的框架是 TaskWeaver。它以“代码优先(code-first)”著称:与只处理 strings 的 Agent 不同,TaskWeaver 可以直接操作 Python 的 DataFrame。这一点在数据分析和数据生成任务中极其有用,例如创建图表、生成随机数等。
状态与工具:Planner 与 Plugins
状态管理——Planner。 为了管理会话状态,TaskWeaver 使用 Planner 这一概念。Planner 是一个 LLM,它接收用户的请求,并规划出为满足该请求需要完成的任务清单(task map)。
工具——Plugins。 为了完成任务,Planner 会暴露给一组被称为 Plugins 的工具集合。这些插件可以是 Python 类,也可以是一个通用的代码解释器(general code interpreter)。插件以**嵌入向量(embeddings)**的形式存储,这样 LLM 就能更好地检索到正确的插件。课程配图中可以看到:LLM 接到请求后经过 Planner 规划,调用 random_numbers = np.random.rand(10) 这类代码,再由代码解释器执行并返回结果。
课程给出了一个处理异常检测的插件示例:
class AnomalyDetectionPlugin(Plugin):
def __call__(self, df: pd.DataFrame, time_col_name: str, value_col_name: str):
# 在 DataFrame 上执行异常检测逻辑
...
执行前的代码校验。 与“直接让 LLM 写代码并运行”的朴素做法不同,TaskWeaver 会在执行之前对生成的代码进行校验(verified),这是其安全性设计的关键一环。
长期上下文——experience。 TaskWeaver 管理上下文的另一特性是 experience:它允许将会话上下文以 YAML 文件的形式存储为长期记忆。通过配置,LLM 在反复接触过往会话之后,可以在特定任务上随时间不断改进——相当于给 Agent 增加了“经验积累”机制。
JARVIS:LLM 做编排者,专业 AI 模型做工具
最后一个框架是 JARVIS。JARVIS 的独特之处在于:它使用一个 LLM 来管理会话的状态,而它的工具则是其他 AI 模型。每个 AI 模型都是一个专攻特定任务的专业模型,例如目标检测(object detection)、语音转写(transcription)或图片描述(image captioning)。
作为通用模型,LLM 接收用户的请求,识别出具体任务以及完成该任务所需的参数/数据,然后将请求格式化为专业模型可以解释的结构(如 JSON):
[{"task": "object-detection", "id": 0, "dep": [-1], "args": {"image": "e1.jpg"}}]
其中 task 指明要执行的任务类型,id 标识任务节点,dep 表示任务依赖(-1 表示无前置依赖),args 是传给专业模型的输入参数。专业 AI 模型基于任务返回预测结果后,LLM 接收该响应。
如果完成一个任务需要多个模型协作,LLM 还会先解读各个模型的响应,再将它们整合起来,生成给用户的最终回复。课程以“请描述图片中的物体并统计其数量”为例说明:LLM 分别调用目标检测模型(得到物体及数量)与图像描述模型(得到文字描述),再聚合两者生成第一人称的最终答复。
这一架构给出了一个重要的设计启示:工具不必都是函数调用,专业 AI 模型本身就可以是 Agent 的工具,由通用 LLM 充当“调度中枢”。
补充:英文原版同课新增的 Microsoft Agent Framework 小节
需要说明的是,课程英文版 17-ai-agents/README.md 相较阿拉伯语版已新增第五个框架——Microsoft Agent Framework:微软面向 Python 与 .NET 的开源 Agent SDK,将 Semantic Kernel 的企业级能力与 AutoGen 的多智能体编排整合为一体,是 AutoGen 的推荐后继者。其状态通过 threads 管理(保存消息历史并可持久化、暂停与恢复);工具则是带类型注解的普通 Python 函数——参数注解会自动转成 schema 供模型进行 function calling,同时支持 MCP 服务器与托管工具。最小示例如下:
import asyncio
from typing import Annotated
from pydantic import Field
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
def get_weather(
location: Annotated[str, Field(description="The location to get the weather for.")],
) -> str:
"""Get the weather for a given location."""
return f"The weather in {location} is sunny with a high of 22°C."
async def main():
agent = Agent(
client=OpenAIChatClient(),
instructions="You are a helpful assistant that can answer weather questions.",
tools=[get_weather],
)
response = await agent.run("What's the weather in Amsterdam?")
print(response)
asyncio.run(main())
多智能体编排则通过 Sequential / Concurrent 构建器实现:
from agent_framework.orchestrations import SequentialBuilder, ConcurrentBuilder
# 顺序执行:每个 agent 将上下文传递给下一个
sequential = SequentialBuilder(participants=[researcher, writer, editor]).build()
# 并行扇出:多个 agent 同时执行,再聚合结果
concurrent = ConcurrentBuilder(participants=[analyst_a, analyst_b, analyst_c]).build()
安装方式为:
pip install agent-framework-core
# 可选集成
pip install agent-framework-openai # OpenAI 与 Azure OpenAI
pip install agent-framework-foundry # Microsoft Foundry
这与课程 docs/ENHANCED_FEATURES_ROADMAP.md 中“为第 17 课 AI Agents 增加多智能体编排(multi-agent orchestration)内容”的规划方向一致。
课后作业:用 AutoGen 模拟一场创业公司商务会议
按照课程阿拉伯语版文档的布置,你可以继续使用 AutoGen 巩固对 AI Agent 的理解,构建如下应用:
- 构建一个模拟教育类创业公司内部不同部门商务会议的应用;
- 编写引导性的系统消息(system messages),让各 LLM 理解不同部门的人格设定(personas)与优先级,并让用户能够提出(pitch)一个新产品创意;
- 各 LLM 应代表各自部门生成追问(follow-up questions),用以打磨和改进这次产品提案与创意。
这个作业恰好综合了本课的全部关键概念:多个 AssistantAgent 对应不同部门(可会话)、系统消息定义角色边界(可定制)、UserProxyAgent 承载用户提案输入(人机反馈闭环),以及多轮对话中状态的持续维护。
课程资源索引
- 本课阿拉伯语版文档(本文主体依据):translations/ar/17-ai-agents/README.md
- 本课英文版文档(含 Microsoft Agent Framework 新增小节):17-ai-agents/README.md
- 前置知识:函数调用(function calling)一课,11-integrating-with-function-calling/README.md
- 课程改进路线图(含对本课多智能体编排内容的规划):docs/ENHANCED_FEATURES_ROADMAP.md
完成本课后,课程建议继续浏览配套的生成式 AI 学习资源集合,持续进阶你的生成式 AI 知识体系。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00


