微软生成式 AI 入门课第 17 课:Agent 怎么讲给刚入门的人

2026-08-18

翻这门课的人常常在第 17 课卡一下:前面几课讲的是提示词、函数调用、向量检索与 RAG、开源模型(微调排在第 18 课,在这一课之后),到这一课突然冒出来一个 Agent,而站外关于 Agent 的说法又五花八门。所以先问一个具体问题——这一课到底把 Agent 定义成了什么,这个定义能不能拿来判断手上的东西算不算 Agent。带着这个问题去读 17-ai-agents/README.md,会比按目录顺序读省事得多。

这一课给的定义只有三个词

课程正文在「What Are AI Agents?」一节里明说,为了把大多数自称 Agent 的工具都包进来,这里用的是一个刻意宽松的说法:Agent 就是给 LLM 一份 state 和一组 tools,让它能去完成任务。然后它逐条界定这三个词:

  • Large Language Models:正文在这里只是随手举了几个模型当例子,用来说明「模型」指的是这门课一路在用的那类模型。模型名会随版本更替,这个位置不必记,也别当成可用性清单。
  • State:LLM 工作时所处的上下文,包含它过去的动作和当前的语境,用来指导下一步决策。正文说 Agent 框架的作用之一,就是让开发者更容易维护这份上下文。
  • Tools:为完成用户请求,LLM 需要能调用的东西——正文列的例子是数据库、API、外部应用,甚至另一个 LLM

这个定义的价值不在于严谨,在于它可证伪。手上那个东西如果只有一次性的提示词、没有跨轮次的上下文承载,或者模型除了吐字之外碰不到任何外部东西,那按这一课的口径它就不算 Agent。反过来,凡是能指出「state 存在哪个对象里、tools 以什么形态注册进去」的,就落进这个定义。

用这把尺子量框架:state 和 tools 各落在什么对象上

课程正文接下来的几节其实是同一件事做了几遍:每讲一个框架,就回答一次 state 和 tools 分别由谁承载。把这层结构抽出来看,比顺着读省力:

框架(正文小节)state 的承载物tools 的形态
LangChain AgentsAgentExecutor,正文说它同时存放 chat history从工具目录里导入后传给 Agent Executor
AutoGen由 assistant Agent 生成 Python 代码来改变与管理状态模型给出建议调用,如示例里的 get_weather
Microsoft Agent Frameworkthreads,框架替你保存消息历史,且可持久化后恢复直接传入普通 Python 函数,带类型注解的参数自动转成 schema
TaskWeaverPlanner 拆解任务;另有 experience 把上下文长期存进 YAML 文件Plugins,可以是 Python 类或通用代码解释器,以 embedding 存储便于检索
JARVIS由 LLM 管理对话的 statetools 就是其它专用 AI 模型,如目标检测、转写、图像描述

几处值得单独记一笔的细节:AutoGen 那节区分了 conversablecustomizable 两个性质,前者对应 AssistantAgent 之间互相对话,后者对应 UserProxyAgent——正文写明它负责与人交互获取反馈,而这个反馈既可以让任务继续、也可以让它停下。TaskWeaver 被正文称作 code-first,理由是它不只处理 strings,还能直接处理 Python 的 DataFrame;正文还写明插件代码在执行前会先经过校验。

读 AutoGen 那节时留个心眼:正文里那段函数执行的输出示例,get_weather 返回的值带的单位是 EUR。它是文档里用来示意「函数被调用并把结果回传」的片段,不要按真实返回值去读。同样,JARVIS 那节最后一句写着「下面的例子展示用户请求描述并统计图片中物体时会怎么走」,但紧接着就是 Assignment 一节——承诺的那个例子在当前版本的文件里并不存在。你不是漏看了。

走一遍那段能落地的代码

这一课里唯一给到可运行形态的是 Microsoft Agent Framework 那节。正文自述它把 Semantic Kernel 的企业能力与 AutoGen 的多智能体编排合到一个框架里,并写明今天新开 Agent 项目时它是 AutoGen 的推荐后继者(这是仓库文档自述,照录)。单 agent 的示例照录如下(略去了开头的 import 与末尾那行 asyncio.run(main()),其余原样):

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)

这段代码里,工具注册这一步的关键是参数上的 Annotated[str, Field(description=...)]:正文写明带类型注解的参数会被自动转成 schema,模型据此判断何时调用、怎么传参。也就是说,函数签名与那句 description 就是模型看到的全部说明——写不清楚,模型也就调不准。上下文这一侧则不出现在这段代码里,由 threads 在框架内部承担。

换到 Azure OpenAI(Microsoft Foundry)时,正文给的是把 endpoint 与凭据传进同一个 client:

client = OpenAIChatClient(
    model="my-gpt-5-mini-deployment",
    azure_endpoint="https://my-resource.openai.azure.com",
    credential=AzureCliCredential(),
)

my-gpt-5-mini-deployment 与那个 endpoint 都是仓库里的占位示例值,换成你自己的部署名与资源地址。多 agent 那节给的是 SequentialBuilderConcurrentBuilder 两个构造器,前者让 agent 依次执行并把对话上下文顺着链条传下去,后者扇出到多个 agent 再聚合结果,两者都用 participants=[...] 接收参与方并以 .build() 收尾。以上写法均照录自 17-ai-agents/README.md,我们没有跑过,以仓库最新代码为准。

安装这一步有个容易踩的落差:这一课写的是 pip install agent-framework-core,可选装 agent-framework-openai(对应 OpenAI 与 Azure OpenAI)与 agent-framework-foundry(对应 Microsoft Foundry)。而仓库根目录的 requirements.txt 里并没有这几个包——你照 AGENTS.md 的标准流程建好虚拟环境、装完课程依赖,这一课的代码依然缺依赖。Windows 侧激活虚拟环境用 venv\Scripts\activate,macOS/Linux 侧是 source venv/bin/activate,两条都写在 AGENTS.md 的 Python 环境一节里。

provider 这一层要另外交代

第 17 课的代码全部写在 README 正文里,没有课程其它章节惯用的 oai- / aoai- / githubmodels- 前缀示例文件,所以这一课本身不告诉你 provider 该怎么配;总说明在 00-course-setup/03-providers.md。有一条必须说清:该文件写明 githubmodels 这个标签现在要的是 Microsoft Foundry Models 的 endpoint 与 key,GitHub Models 将在 2026 年 7 月底退役——今天这个时间点已经过去了。也就是说前缀名与实际接入目标已经脱节,.env.copy 里对应的变量是 AZURE_INFERENCE_ENDPOINTAZURE_INFERENCE_CREDENTIAL,密钥请写成 <YOUR_API_KEY> 这类占位再入库,别把真实 key 提交进仓库。

另外,如果你打算在 agent 上顺手加采样参数,先读 06-text-generation-apps/README.md 那条提醒:当前 Microsoft Foundry 上未废弃的是 reasoning 模型(GPT-5 家族、o 系列),它们不支持 temperaturetop_p,也不支持 max_tokens,改用 max_output_tokens,传了会拿到参数不支持的报错。

它和另一门 Agent 课的分工

17-ai-agents/ 这个目录下只有 README.mdimages/没有 code samples 目录;而仓库根 README 的课程表把第 17 课标成 Build 类。这一课的 Assignment 也是一段文字命题——用 Microsoft Agent Framework 做一个模拟教育创业公司各部门开会的应用,让各部门角色对你的产品提案追问。换句话说,这一课给的是地图和一个练手方向,不是脚手架。

另一门课 github.com/microsoft/ai-agents-for-beginners 是独立仓库,多数课自带 code_samples 目录(例如 04-tool-use/code_samples/ 下同时放着 04-python-agent-framework.ipynb04-dotnet-agent-framework.cs,Python 与 .NET 两条线是分开的两份文件,别混着读),课程目录里能看到 02-explore-agentic-frameworks04-tool-use13-agent-memory14-microsoft-agent-framework18-securing-ai-agents 这些独立成课的题目;它的 README 写明代码示例使用 Microsoft Agent Framework 搭配 Microsoft Foundry Agent Service V2,并且明确建议:如果你是第一次用生成式 AI 模型做开发,先去看 Generative AI for Beginners

两边自己把分界线划在这儿了,照着选就行:想弄明白 Agent 是什么、把 state / tools / plugin / planner 这些词对上号、判断某个框架属于哪一类,第 17 课一节读完就够;要真正落到工具调用怎么写、记忆怎么分层、协议怎么接、上线怎么守,就该切到那门专门的课去。把第 17 课当成 Agent 的完整教程读,会觉得它薄——它本来就不是。


本文依据 github.com/microsoft/generative-ai-for-beginners 仓库于 2026-08-18 的公开内容整理, 事实来自仓库内的课程正文与代码示例。我们没有跑过文中涉及的代码, 因此不涉及运行结果、耗时与生成质量的任何描述。 该课程持续更新,文中涉及的文件路径、依赖与接口写法随版本变动,请以仓库最新内容为准。 文中涉及的云端服务调用会产生费用并可能上传数据,请自行评估密钥与数据边界。

文中关于另一门课的内容依据其公开仓库整理(github.com/microsoft/ai-agents-for-beginners)。 本文只对照两个仓库各自公开写明的结构与说明,不推断未公开的实现,也不对两门课做优劣排名

安全与合规相关做法请结合自身环境评估,本文不构成安全方案建议。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。