第 6 篇11-12 章智能代理协议与 AI 代理的上下文工程文章目录第 6 篇11-12 章智能代理协议与 AI 代理的上下文工程一、第 11 章使用智能代理协议MCP、A2A 和 NLWeb1. 模型上下文协议MCP2. 代理间协议A2A3. 自然语言网页NLWeb二、第 12 章AI 代理的上下文工程1. 什么是上下文工程2. 有效上下文工程的策略3. 检查上下文4. 常见上下文失败三、代码示例讲解上下文如何被记住与管理示例一上下文感知代理第 12 章① 创建上下文感知代理② 实际运行结果多轮上下文保持译为中文节选③ 上下文压缩总结工具④ 实际运行结果总结工具 基于记录推荐译为中文节选⑤ 机制总结上下文工程如何工作⑥ 完整代码示例一示例二外部能力接入第 11 章协议思想落地① 定义外部工具② 完整代码示例二本系列「微软《AI Agents for Beginners》实战解读」基于微软官方课程逐章讲解并结合实践扩展。本篇覆盖第 11 章《使用智能代理协议MCP、A2A 和 NLWeb》与第 12 章《AI 代理的上下文工程》。文中子标题沿用官方课程原文示例基于 Microsoft Agent FrameworkMAF模型后端为 DeepSeekOpenAI 兼容协议。本篇代码讲解基于真实运行结果结果已译为中文每个示例末尾附完整可运行代码。一、第 11 章使用智能代理协议MCP、A2A 和 NLWeb随着代理使用增多标准化、安全与开放创新的协议需求上升。本章介绍三种协议MCP连接 LLM 与工具/数据、A2A连接代理与代理、NLWeb连接代理与网站。1. 模型上下文协议MCP模型上下文协议MCP是开放标准为应用向 LLM 提供上下文与工具提供标准化方法使代理通过通用适配器一致地连接不同数据源与工具。为什么需要 MCP。MCP 出现之前每个工具/数据源数据库、搜索服务、内部 API都需一套专属集成代码且彼此不通用——模型无法即插即用外部能力。MCP 的目标是统一模型 ↔ 外部能力的接入协议任何服务只要实现一个 MCP 服务器任何支持 MCP 的代理即可发现并使用它无需为每个服务编写定制适配代码。MCP 协议是什么样。技术上MCP 基于JSON-RPC 2.0消息格式采用客户端-服务器架构主机Host启动与 MCP 服务器连接的 LLM 应用如代码编辑器 VSCode。客户端Client主机应用内维护与服务器一对一连接的组件负责发起请求。服务器Server提供具体功能的轻量级程序可运行于本地stdio或远程HTTP。连接与使用遵循固定生命周期① initialize初始化握手→ 双方交换协议版本与能力 ② 能力协商 → 客户端了解服务器支持哪些功能 ③ 工具发现 tools/list → 客户端获取可用工具清单名称/描述/参数 Schema ④ 工具调用 tools/call → 客户端把模型选中的工具名与参数发给服务器 ⑤ 服务器执行真实逻辑 → 返回结果 → 注入模型上下文协议定义三类核心原语作为服务器的能力工具Tools代理可调用的离散动作服务器公布名称、描述与输入/输出格式。资源Resources服务器提供的只读数据项或文档客户端按需获取文本或二进制。提示Prompts预定义模板支持更复杂的工作流。具体网络交互示例。以调用搜索航班工具为例客户端向服务器发送 JSON-RPC 请求POST /mcp HTTP/1.1 Host: flights.example.com Content-Type: application/json Authorization: Bearer token { jsonrpc: 2.0, id: 1, method: tools/call, params: { name: search_flights, arguments: {origin: PDX, destination: HNL, date: 2026-06-15} } }服务器执行真实逻辑后返回结果供客户端回传给模型{jsonrpc:2.0,id:1,result:{content:[{type:text,text:找到 3 个航班UA 231 08:00-11:30 $450HA 47 09:15-12:00 $380AS 12 13:20-16:45 $520}],isError:false}}MCP 的优势。动态工具发现代理可获取服务器可用工具列表无需静态编码集成、跨 LLM 互操作性可切换核心模型、标准化安全统一认证方法简化多服务器访问管理。MCP 示例。以 AI 助手预订航班为例助手MCP 客户端连接航空公司 MCP 服务器 → 通过tools/list发现搜索航班/预订航班工具 → 用户请求时通过tools/call调用搜索工具 → 服务器作为包装层调用真实预订 API → 返回结果 → 用户选定后调用预订工具完成预订。理论扩展MCP 与直接 API 的对比。直接 API 集成需为每个服务编写适配代码且 API 变更需更新代码MCP 以一次集成、动态发现取代之——新增服务只需其提供 MCP 服务器代理即可发现并使用显著降低集成成本。MCP 已捐赠给 Linux 基金会成为工具连接的事实标准。2. 代理间协议A2A代理间协议A2A实现不同 AI 代理之间的通信与协作将不同组织、环境与技术栈的代理连接起来共同完成共享任务。为什么需要 A2A。MCP 解决了模型 ↔ 工具的问题但代理之间如何协作仍是空白——不同组织/技术栈的代理如一家公司的订票代理与另一家公司的酒店代理缺乏统一通信方式。A2A 的目标是统一代理 ↔ 代理的协作协议让不同厂商的代理能互相发现、发起任务、交换消息与成果从而把原本孤立的代理组织成协作网络。A2A 协议是什么样。A2A 采用基于 JSON 的 HTTP 协议围绕代理卡 任务 消息建模代理卡Agent Card代理的名片以 JSON 描述名称、任务描述、技能列表、端点 URL、版本与能力——其他代理通过它了解该找谁、它擅长什么、怎么联系。任务Task一次协作单元由发起方向接收方创建任务状态进行中/完成/失败驱动协作流程。消息Message任务内交换的上下文用户聊天内容、中间结果。工件Artifacts远程代理完成任务的成果包含结果、描述与文本上下文。事件队列处理任务完成前的更新与消息传递防止长任务期间连接被关闭。协作流程① 通过代理卡发现/选择远程代理了解其能力与端点 ② 发起方创建任务Task并传递用户上下文Message ③ 接收方以自身 LLM 解析请求、调用自身工具执行 ④ 通过事件队列推送进展完成后产出工件Artifacts ⑤ 发起方汇总结果返回用户具体网络交互示例。先通过代理卡发现酒店代理的能力与端点GET /.well-known/agent.json HTTP/1.1 Host: hotel-agent.example.com{name:HotelBookingAgent,description:预订酒店房间,skills:[{id:hotel.search,name:搜索酒店,description:按城市与日期查找酒店}],endpoint:https://hotel-agent.example.com/a2a,version:1.2}随后发起协作任务并传递用户上下文POST /a2a/task HTTP/1.1 Host: hotel-agent.example.com Content-Type: application/json { jsonrpc: 2.0, id: 1, method: tasks/send, params: { task_id: task-9041, message: {role: user, content: 预订火奴鲁鲁酒店6月15-22日2位客人} } }A2A 的优势。增强协作跨厂商与平台代理互动共享上下文、模型选择灵活性每个代理可自主选择 LLM、内置认证协议内建安全框架。A2A 示例。用户请求预订下周飞往火奴鲁鲁的全程旅行旅游代理协调 → 用 A2A 连接航空代理、酒店代理、租车代理 → 各专职代理运行自身 LLM 与工具完成预订 → 旅游代理汇总结果返回用户。理论扩展协议分层。MCP 与 A2A 解决不同层级问题MCP 是能力接入层LLM ↔ 外部能力A2A 是协作编排层代理 ↔ 代理。二者可组合使用——A2A 连接的各专职代理内部可再通过 MCP 接入各自的数据源。3. 自然语言网页NLWebNLWeb为任何网站带来自然语言界面使代理能够发现并与内容互动将网站纳入更广泛的代理生态系统。为什么需要 NLWeb。网站存储了海量信息但只能由人通过菜单、表单与页面导航访问——AI 代理无法直接读懂或查询网站内容。NLWeb 的目标是让网站具备对代理可访问的自然语言接口网站不再只是给人看的页面而是也可被 AI 查询的数据源从而让代理能利用互联网上已有的海量内容。NLWeb 协议是什么样。NLWeb 为网站定义一个统一接口核心要素NLWeb 应用处理自然语言查询的系统是网站的自然语言引擎。NLWeb 协议网站自然语言交互的规则集响应以 JSON 返回常用 Schema.org 结构化数据网站在.well-known/nlweb暴露配置供代理发现。MCP 服务器端点每个 NLWeb 配置也充当 MCP 服务器——通过ask方法向其他 AI 系统暴露查询能力。嵌入模型与向量数据库把网站内容转为向量并存储检索时按相似度返回结果。工作机制① 内容摄取网站产品目录以 Schema.org/RSS 提供 → 嵌入 → 存入向量库 ② 查询处理用户/代理以自然语言提问 → NLWeb 在向量库检索相关片段 ③ 生成响应LLM 结合检索结果生成引用真实内容的 JSON 响应 ④ ask 方法外部代理通过 MCP ask() 直接查询网站具体网络交互示例。外部代理通过 NLWeb 的自然语言接口查询网站POST /nlweb HTTP/1.1 Host: travel-site.example.com Content-Type: application/json { query: 火奴鲁鲁带泳池的适合家庭的酒店 }网站返回引用真实内容的 Schema.org 结构化响应{context:https://schema.org,results:[{type:Hotel,name:Waikiki Beach Resort,address:{addressLocality:Honolulu,addressRegion:HI},amenityFeature:[{name:Pool},{name:Kids Club}]},{type:Hotel,name:Aloha Garden Hotel,address:{addressLocality:Honolulu},amenityFeature:[{name:Pool}]}]}NLWeb 示例。旅行网站以 Schema.org 格式提供产品目录 → 用户以自然语言查询找一个有泳池的适合家庭的火奴鲁鲁酒店 → NLWeb 处理查询、在向量库搜索相关酒店 → 生成引用真实酒店的自然语言响应 → 外部代理可通过 MCPask方法直接查询该网站。理论扩展向量检索在 NLWeb 中的角色。NLWeb 的检索机制依赖嵌入与向量数据库——将网站内容嵌入为向量语义相近的查询与内容向量距离近从而以相似度排序返回结果。这与第 05 章 RAG 管线的检索阶段同构。二、第 12 章AI 代理的上下文工程上下文驱动代理制定行动计划。上下文工程是确保代理拥有完成任务所需正确信息的实践——上下文窗口大小有限需管理系统化地添加、删除与压缩信息。1. 什么是上下文工程提示工程与上下文工程的区别。提示工程专注于静态指令用规则引导代理上下文工程管理包含初始提示在内的动态信息集合确保代理随时间推移拥有所需信息核心是使过程可重复且可靠。上下文类型。上下文并非单一内容代理需管理多种来源指令规则——提示、系统消息、少量示例、工具描述。知识事实、数据库检索结果、长期记忆含 RAG 系统。工具外部函数/API/MCP 服务器定义及其反馈结果。对话历史持续对话随时间增长并占用窗口空间。用户偏好随时间学到的偏好可在关键决策时调用。理论扩展上下文窗口的有限性。模型的上下文窗口以 Token 计是硬约束。上下文工程的本质是对有限窗口的分配问题——将有限的 Token 预算分配给当前任务最相关的信息而非历史全量。2. 有效上下文工程的策略规划策略。良好上下文工程始于规划三步定义明确的结果代理完成任务后的状态、绘制上下文图谱完成任务需要哪些信息、信息在何处、创建上下文流水线代理如何获取信息——RAG、MCP 服务器、工具。实用策略。信息流入窗口后的管理手段代理便签Scratchpad单次会话内记笔记存于上下文窗口外需要时检索。记忆Memories跨会话存储与检索摘要、偏好、反馈。压缩上下文窗口接近极限时用摘要与裁剪技术保留最相关信息、删除旧消息。多代理系统每个代理有独立窗口规划如何共享与传递上下文。沙箱环境代理在沙箱执行代码/处理大文档仅将结果读入窗口。运行时状态对象复杂任务逐步存储子任务结果使上下文仅关联当前子任务。3. 检查上下文应用策略后应检查模型实际收到的内容。关键调试问题代理加载了过多、错误还是缺少所需上下文生产环境优选包含计数、ID、哈希与策略标签的小型检查记录选择、压缩、隔离、记忆与 RAG、安全隐私而非记录原始提示或输出兼顾可审计性与隐私。4. 常见上下文失败失败类型定义缓解上下文中毒幻觉或错误进入上下文并被反复引用上下文验证与隔离验证失败开启新线程上下文分心上下文过大模型过度关注历史而非当前任务上下文摘要定期压缩重置注意力上下文混淆工具过多导致模型调用错误工具工具载入管理用 RAG 动态只选最相关工具上下文冲突上下文含矛盾信息导致推理不一致上下文修剪覆盖旧指令便签先调和冲突理论扩展上下文失败的共性。四类失败共同指向一个原则——上下文应当是当前决策的最小充分集过少则信息不足过多则引入噪声与矛盾。上下文工程即在充分与精炼之间寻求平衡。三、代码示例讲解上下文如何被记住与管理以下代码取自课程官方示例已适配 DeepSeek 后端并附实际运行结果译为中文。重点回答多轮对话中代理如何保持上下文连续性上下文过长时又如何压缩示例一上下文感知代理第 12 章① 创建上下文感知代理系统提示明确要求代理对话变长时总结前文、跟踪早期偏好、引用先前决策agentclient.as_agent(nameContextAwareAgent,instructions你是具备优秀记忆管理的旅行规划助手。 当对话变长时 1. 将先前上下文总结为要点 2. 跟踪之前提到的用户偏好 3. 引用先前的决策而不重复全部细节 始终在简洁的前提下保持连续性。,)sessionagent.create_session()# 会话线程 上下文容器② 实际运行结果多轮上下文保持译为中文节选输入请求依次为规划日本之旅寿司/寺庙/摄影→ 预算 3000 美元、单人 10 天 4 月 → 综合所有信息推荐必去之处 → 偏好传统日式旅馆 → 改期 10 月。代理各轮输出译为中文节选第 1 轮日本是同时满足你三大爱好的绝佳目的地。寿司别局限于筑地市场 试试传送带寿司或高级 omakase寺庙京都是精神中心推荐金阁寺与伏见稻荷大社摄影清晨是你的好朋友…… 第 2 轮这个预算和时间非常可行3000 美元 10 天 4 月——4 月是樱花旺季价格偏高、需求大尽早预订是关键。 骨架计划东京4晚 京都4晚 大阪2晚预算指导住宿 $300-450、餐饮 $500-600、JR Pass…… 第 3 轮综合你告诉我的所有信息我最推荐的是京都伏见稻荷大社的日出—— 既是寺庙又是摄影胜地下山后还能去锦市场吃新鲜寿司。4 月的樱花让画面更完美。 第 4 轮传统日式旅馆很棒但日本 ryokan 一般不算平价。策略是混搭 东京住商务酒店省预算京都 2 晚 ryokan 2 晚经济旅馆大阪住经济型。京都预算 ryokan 约 $80-120/晚…… 第 5 轮改到 10 月很棒10 月秋色渐起、光线更柔和、人群少于樱花季 而且秋刀鱼和肥金枪鱼正当时令——你的寿司时机很幸运。枫叶推荐东福寺、清水寺…… 第 6 轮你的完整旅行计划总结日本东京/京都/大阪预算 3000 美元机票是否包含待确认 10 天单人10 月出行兴趣为寿司/寺庙/摄影住宿偏好 ryokan京都 2 晚……观察要点六轮对话中代理始终记得第 1 轮的寿司/寺庙/摄影、第 2 轮的3000 美元/10 天/4 月、第 4 轮的ryokan 偏好、第 5 轮的改期 10 月——这是会话线程Session提供的短期记忆在起作用。但历史越长Token 成本越高这正是上下文压缩的必要性所在。③ 上下文压缩总结工具对话增长后用总结工具把积累的偏好压成紧凑摘要即使旧消息被丢弃也能保留关键信息tool(approval_modenever_require)defsummarize_preferences(conversation_notes:str)-str:把积累的用户偏好总结为紧凑格式。returnf[SUMMARY] User preferences recorded:{conversation_notes}④ 实际运行结果总结工具 基于记录推荐译为中文节选用户我要去希腊喜欢海鲜、历史与跳岛游。预算 4000 美元两周6 月和伴侣同行。请用总结工具记录这些偏好。 代理已记录你的偏好已保存希腊、海鲜/历史/跳岛、预算 4000 美元、两周 6 月、与伴侣同行。 用户基于你记录的推荐 3 个必去的岛屿。 代理基于你的记录——海鲜、历史、跳岛、4000 美元双人 6 月——我的三大推荐 1. 克里特岛历史重镇克诺索斯宫殿、干尼亚威尼斯老城海鲜出色且岛大更实惠 2. 圣托里尼火山口景观 阿克罗蒂里被火山灰保存的米诺斯古城但价格偏高建议最多 3-4 晚 3. 纳克索斯完美的松弛中间值波塔拉古城门、极佳性价比烤鱼、主要渡轮枢纽观察要点总结工具把散落各处的偏好浓缩为一条记录后续推荐直接基于该记录——这正是摘要 便签策略即使对话历史被裁剪关键信息仍在。⑤ 机制总结上下文工程如何工作结合代码与运行结果会话线程Session→ 短期记忆多轮保持上下文 → 总结工具summarize_preferences→ 把积累偏好压缩为紧凑摘要 → 便签/记忆 → 关键信息持久化可跨历史裁剪存活 → 防止上下文分心/中毒/冲突四类失败三个关键机制会话线程是短期记忆create_session()让多轮对话共享上下文代理才能记得早期偏好。总结工具是压缩杠杆summarize_preferences把长历史压成摘要降低 Token 成本对应第 10 章成本管理同时保留要点。压缩防失败对话无限增长会导致上下文分心——总结工具定期重置注意力正是四类上下文失败的标准缓解。⑥ 完整代码示例一importasynciofromagent_frameworkimporttoolfrom_deepseekimportmake_clientasyncdefmain():clientmake_client()# 上下文感知代理多轮对话保持连续性agentclient.as_agent(nameContextAwareAgent,instructions你是具备优秀记忆管理的旅行规划助手。 当对话变长时 1. 将先前上下文总结为要点 2. 跟踪之前提到的用户偏好 3. 引用先前的决策而不重复全部细节 始终在简洁的前提下保持连续性。,)sessionagent.create_session()print(awaitagent.run(Im planning a trip to Japan. I love sushi, temples, and photography.,sessionsession))print(\nawaitagent.run(My budget is $3000 and Ill be traveling solo for 10 days in April.,sessionsession))print(\nawaitagent.run(Based on everything Ive told you so far, whats the one thing youd recommend I not miss?,sessionsession))# 总结工具压缩上下文tool(approval_modenever_require)defsummarize_preferences(conversation_notes:str)-str:把积累的用户偏好总结为紧凑格式。returnf[SUMMARY] User preferences recorded:{conversation_notes}summarizing_agentclient.as_agent(nameSummarizingTravelAgent,instructions你是主动管理对话上下文的旅行规划助手。 1. 收集几条偏好后调用 summarize_preferences() 记录紧凑摘要 2. 用户要求回忆时引用已记录的摘要 3. 保持回答简洁避免复述全部历史,tools[summarize_preferences],)summary_sessionsummarizing_agent.create_session()print(\nawaitsummarizing_agent.run(I want to visit Greece. I love seafood, history, and island hopping. Budget is $4000 for two weeks. Traveling with my partner in June. Please record these preferences using your summarization tool.,sessionsummary_session,))print(\nawaitsummarizing_agent.run(Now, based on what youve recorded, suggest the top 3 islands we should visit.,sessionsummary_session,))if__name____main__:asyncio.run(main())示例二外部能力接入第 11 章协议思想落地① 定义外部工具将外部能力封装为工具模拟通过标准接口连接外部数据源——这是 MCP 将外部服务统一为可调用工具的思想tool(approval_modenever_require)defsearch_hotels(query:Annotated[str,查询位置/设施/标签])-str:查询酒店数据库中的匹配房产。hotels[{name:Le Meurice Paris,location:Paris,price:850,tags:[luxury,romantic]},{name:Four Seasons Maui,location:Maui,price:695,tags:[beach,family]},]qquery.lower()matches[hforhinhotelsifqinh[location].lower()orany(qintfortinh[tags])]returnjson.dumps(matchesorhotels[:2],indent2)② 完整代码示例二importasyncio,jsonfromtypingimportAnnotatedfromagent_frameworkimporttoolfrom_deepseekimportmake_clienttool(approval_modenever_require)defsearch_hotels(query:Annotated[str,查询位置/设施/标签])-str:查询酒店数据库中的匹配房产。hotels[{name:Le Meurice Paris,location:Paris,price:850,tags:[luxury,romantic]},{name:Four Seasons Maui,location:Maui,price:695,tags:[beach,family]},{name:Hotel Sacher Vienna,location:Vienna,price:420,tags:[historic,accessible]},]qquery.lower()matches[hforhinhotelsifqinh[location].lower()orany(qintfortinh[tags])]returnjson.dumps(matchesorhotels[:2],indent2)asyncdefmain():agentmake_client().as_agent(name旅行代理,instructions你是旅行代理通过 search_hotels 工具为用户查找酒店并给出推荐。,tools[search_hotels],)print(awaitagent.run(帮我找一家巴黎的浪漫酒店))if__name____main__:asyncio.run(main())运行前提已按第 1 篇完成环境配置——创建.envDEEPSEEK_API_KEY填入开发者自有密钥与_deepseek.py共享客户端并执行pip install agent-framework python-dotenv openai。