[{"data":1,"prerenderedAt":4627},["ShallowReactive",2],{"note:\u002Fagent\u002F03-agent智能体":3},{"id":4,"title":5,"body":6,"date":4609,"description":4610,"draft":4611,"extension":4612,"featured":4611,"kind":4613,"lastmod":4609,"meta":4614,"navigation":130,"path":4618,"planned":4619,"section":4620,"seo":4621,"source":4622,"stem":4623,"tags":4624,"toc":130,"weight":239,"__hash__":4626},"notes\u002Fagent\u002F03-Agent智能体.md","Agent 智能体：从工具调用到多智能体协作的五种模式",{"type":7,"value":8,"toc":4586},"minimark",[9,16,21,26,34,45,51,85,95,101,284,311,315,403,409,424,428,435,438,441,497,500,511,518,528,623,638,642,646,656,661,693,765,780,785,847,854,858,865,874,879,911,1004,1023,1075,1079,1086,1095,1099,1137,1230,1245,1268,1272,1299,1303,1309,1315,1434,1449,1453,1492,1496,1499,1508,1629,1652,1656,1701,1705,1708,1780,1791,1796,1810,1813,1840,1844,1848,1997,2023,2031,2381,2385,2492,2525,2532,2986,2990,3073,3099,3106,3429,3433,3575,3597,3604,3970,3974,4159,4178,4185,4533,4537,4582],[10,11,12],"blockquote",{},[13,14,15],"p",{},"一句话总结：Agent = 大模型（大脑）+ 工具使用（手脚）+ 规划能力（策略）+ 记忆（经验）。而 Agentic 不是某种实体，而是“像 Agent 的程度”——越 Agentic，越自主、越目标导向、越主动。",[17,18,20],"h2",{"id":19},"_1-什么是-agent","1. 什么是 Agent",[22,23,25],"h3",{"id":24},"_11-从一个生活场景说起","1.1 从一个生活场景说起",[13,27,28,29,33],{},"想象你雇了一位",[30,31,32],"strong",{},"私人助理","。你给他一个任务：\"帮我筹备下周六的生日派对，大概 30 个人。\"",[13,35,36,37,40,41,44],{},"一位",[30,38,39],{},"普通的助手","（相当于基础 LLM）会这样回答：\"好的，建议您提前两周预订场地，再准备蛋糕和伴手礼，预算按人均 100 元估算。\"——这个回答基于他自己的经验，但",[30,42,43],{},"没有真的去查档期、没问过报价、也没发出一条邀请","。",[13,46,36,47,50],{},[30,48,49],{},"优秀的助理","（相当于 Agent）会这样做：",[52,53,54,61,67,73,79],"ol",{},[55,56,57,60],"li",{},[30,58,59],{},"理解目标","：下周六、30 人，需要场地、蛋糕、邀请和预算",[55,62,63,66],{},[30,64,65],{},"主动查询","：调用场地档期系统查那天的空位 → 问蛋糕店 8 寸能不能订、多少钱 → 查当天的天气决定室内还是露台",[55,68,69,72],{},[30,70,71],{},"规划步骤","：先定场地（锁定日期）→ 再订蛋糕（按人数定尺寸）→ 发邀请统计回执 → 汇总预算清单",[55,74,75,78],{},[30,76,77],{},"检查修正","：发现金桂厅当天已被订走 → 改订同商圈的桂花厅，并重算预算",[55,80,81,84],{},[30,82,83],{},"交付结果","：一份完整的派对筹备方案，包含场地、蛋糕、预算和邀约话术",[13,86,87,90,91,94],{},[30,88,89],{},"这就是 Agent 与普通 LLM 的区别","：Agent 不仅能\"想\"，还能",[30,92,93],{},"主动调用工具、自主规划步骤、检查结果并修正","，最终完成一个完整的目标。",[13,96,97,98,44],{},"用一句话定义：",[30,99,100],{},"Agent = 大模型（大脑）+ 工具使用（手脚）+ 规划能力（策略）+ 记忆（经验）",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n    U[\"👤 用户\u003Cbr\u002F>筹备生日派对\"]\n\n    subgraph AG[\"🤖 Agent（智能体）\"]\n        P[\"🗺 规划能力\u003Cbr\u002F>1. 先定场地（锁定日期）\u003Cbr\u002F>2. 再订蛋糕（按人数定尺寸）\u003Cbr\u002F>3. 发邀请（统计回执）\u003Cbr\u002F>4. 汇总预算清单\"]\n        L[\"🧠 大模型（LLM）\u003Cbr\u002F>语义理解 + 推理决策\u003Cbr\u002F>理解目标、选择工具、组织回复\"]\n        T[\"🔧 工具使用\u003Cbr\u002F>场地档期系统 \u002F 蛋糕店系统\u003Cbr\u002F>日历日程 \u002F 记账表\"]\n        M[\"💾 记忆\u003Cbr\u002F>工作记忆：当前对话上下文\u003Cbr\u002F>情景记忆：上次聚会的场地偏好\u003Cbr\u002F>语义记忆：家里人的忌口清单\"]\n\n        P -->|规划步骤| L\n        L -->|调用| T\n        T -.->|结果| L\n        L -.->|检查修正| M\n        L -.->|存储| M\n        M -.->|读取经验| L\n    end\n\n    R[\"✅ 输出结果\u003Cbr\u002F>场地：桂花厅（可容 40 人）\u003Cbr\u002F>蛋糕：8 寸已下单\u003Cbr\u002F>完整预算与邀请清单\"]\n\n    U --> AG\n    AG --> R\n\n    style AG fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style P fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style L fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style T fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style M fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style U fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style R fill:#ECFDF5,stroke:#059669,stroke-width:2px\n","mermaid","",[109,110,111,119,125,132,138,144,150,156,162,167,173,179,185,191,197,203,209,214,220,225,231,237,242,248,254,260,266,272,278],"code",{"__ignoreMap":107},[112,113,116],"span",{"class":114,"line":115},"line",1,[112,117,118],{},"flowchart LR\n",[112,120,122],{"class":114,"line":121},2,[112,123,124],{},"    U[\"👤 用户\u003Cbr\u002F>筹备生日派对\"]\n",[112,126,128],{"class":114,"line":127},3,[112,129,131],{"emptyLinePlaceholder":130},true,"\n",[112,133,135],{"class":114,"line":134},4,[112,136,137],{},"    subgraph AG[\"🤖 Agent（智能体）\"]\n",[112,139,141],{"class":114,"line":140},5,[112,142,143],{},"        P[\"🗺 规划能力\u003Cbr\u002F>1. 先定场地（锁定日期）\u003Cbr\u002F>2. 再订蛋糕（按人数定尺寸）\u003Cbr\u002F>3. 发邀请（统计回执）\u003Cbr\u002F>4. 汇总预算清单\"]\n",[112,145,147],{"class":114,"line":146},6,[112,148,149],{},"        L[\"🧠 大模型（LLM）\u003Cbr\u002F>语义理解 + 推理决策\u003Cbr\u002F>理解目标、选择工具、组织回复\"]\n",[112,151,153],{"class":114,"line":152},7,[112,154,155],{},"        T[\"🔧 工具使用\u003Cbr\u002F>场地档期系统 \u002F 蛋糕店系统\u003Cbr\u002F>日历日程 \u002F 记账表\"]\n",[112,157,159],{"class":114,"line":158},8,[112,160,161],{},"        M[\"💾 记忆\u003Cbr\u002F>工作记忆：当前对话上下文\u003Cbr\u002F>情景记忆：上次聚会的场地偏好\u003Cbr\u002F>语义记忆：家里人的忌口清单\"]\n",[112,163,165],{"class":114,"line":164},9,[112,166,131],{"emptyLinePlaceholder":130},[112,168,170],{"class":114,"line":169},10,[112,171,172],{},"        P -->|规划步骤| L\n",[112,174,176],{"class":114,"line":175},11,[112,177,178],{},"        L -->|调用| T\n",[112,180,182],{"class":114,"line":181},12,[112,183,184],{},"        T -.->|结果| L\n",[112,186,188],{"class":114,"line":187},13,[112,189,190],{},"        L -.->|检查修正| M\n",[112,192,194],{"class":114,"line":193},14,[112,195,196],{},"        L -.->|存储| M\n",[112,198,200],{"class":114,"line":199},15,[112,201,202],{},"        M -.->|读取经验| L\n",[112,204,206],{"class":114,"line":205},16,[112,207,208],{},"    end\n",[112,210,212],{"class":114,"line":211},17,[112,213,131],{"emptyLinePlaceholder":130},[112,215,217],{"class":114,"line":216},18,[112,218,219],{},"    R[\"✅ 输出结果\u003Cbr\u002F>场地：桂花厅（可容 40 人）\u003Cbr\u002F>蛋糕：8 寸已下单\u003Cbr\u002F>完整预算与邀请清单\"]\n",[112,221,223],{"class":114,"line":222},19,[112,224,131],{"emptyLinePlaceholder":130},[112,226,228],{"class":114,"line":227},20,[112,229,230],{},"    U --> AG\n",[112,232,234],{"class":114,"line":233},21,[112,235,236],{},"    AG --> R\n",[112,238,240],{"class":114,"line":239},22,[112,241,131],{"emptyLinePlaceholder":130},[112,243,245],{"class":114,"line":244},23,[112,246,247],{},"    style AG fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,249,251],{"class":114,"line":250},24,[112,252,253],{},"    style P fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,255,257],{"class":114,"line":256},25,[112,258,259],{},"    style L fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,261,263],{"class":114,"line":262},26,[112,264,265],{},"    style T fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,267,269],{"class":114,"line":268},27,[112,270,271],{},"    style M fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,273,275],{"class":114,"line":274},28,[112,276,277],{},"    style U fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[112,279,281],{"class":114,"line":280},29,[112,282,283],{},"    style R fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[10,285,286],{},[13,287,288,291,292,295,296,299,300,303,304,306,307,310],{},[30,289,290],{},"图示解读："," 大模型（LLM）位于中心，四个方向各挂一个能力：",[30,293,294],{},"规划能力","向下发步骤、",[30,297,298],{},"工具使用","提供外部手脚、",[30,301,302],{},"记忆","既存又取（存储与读取经验是双向的）、",[30,305,77],{},"形成回路。",[30,308,309],{},"注意 Agent 与普通 LLM 的差别就藏在这些箭头里","——普通 LLM 只有中间那个方块，Agent 多了周围三圈，且能自己驱动它们循环运转。",[22,312,314],{"id":313},"_12-agent-与普通-llm-的对比","1.2 Agent 与普通 LLM 的对比",[316,317,318,334],"table",{},[319,320,321],"thead",{},[322,323,324,328,331],"tr",{},[325,326,327],"th",{},"对比维度",[325,329,330],{},"普通 LLM（如 ChatGPT 对话）",[325,332,333],{},"Agent（智能体）",[335,336,337,351,364,377,390],"tbody",{},[322,338,339,345,348],{},[340,341,342],"td",{},[30,343,344],{},"能力边界",[340,346,347],{},"只能用训练数据中已有的知识回答",[340,349,350],{},"能调用外部工具获取实时信息、操作外部系统",[322,352,353,358,361],{},[340,354,355],{},[30,356,357],{},"任务处理",[340,359,360],{},"一问一答，被动响应",[340,362,363],{},"主动拆解复杂任务、规划步骤、逐步执行",[322,365,366,371,374],{},[340,367,368],{},[30,369,370],{},"错误处理",[340,372,373],{},"回答错了也不知道",[340,375,376],{},"能自我检查、发现问题后主动修正",[322,378,379,384,387],{},[340,380,381],{},[30,382,383],{},"多步任务",[340,385,386],{},"无法自主完成多步骤任务",[340,388,389],{},"能协调多个工具、多次调用，完成端到端任务",[322,391,392,397,400],{},[340,393,394],{},[30,395,396],{},"类比",[340,398,399],{},"一个博学但不出门的顾问",[340,401,402],{},"一个能跑腿、能打电话、能帮你把事情办成的助理",[13,404,405,408],{},[30,406,407],{},"一个具体例子","：用户问\"帮我看看金桂厅下周六还有没有档期，如果没有就换一家能坐 40 人的\"。",[410,411,412,418],"ul",{},[55,413,414,417],{},[30,415,416],{},"普通 LLM","：只能回答\"我无法查询实时档期\"或凭印象编一个（幻觉）。",[55,419,420,423],{},[30,421,422],{},"Agent","：调用场地系统查到\"金桂厅下周六已订满\" → 判断需要换场地 → 调用同商圈备选查询 → 找到\"桂花厅可容纳 40 人\" → 调用日历工具同步日程 → 返回更新后的方案。",[17,425,427],{"id":426},"_2-什么是-agentic","2. 什么是 Agentic",[13,429,430,431,434],{},"Agentic 是一个形容词，它描述的是一个系统所表现出的\"",[30,432,433],{},"像 Agent 一样的程度","\"。",[13,436,437],{},"一个系统越是 Agentic，它就越表现出自主性、目标导向性和主动性。它不是一个具体的实体，而是一种行为模式或设计思想。",[13,439,440],{},"用一张表来感受\"Agentic 程度\"的梯度：",[316,442,443,456],{},[319,444,445],{},[322,446,447,450,453],{},[325,448,449],{},"Agentic 程度",[325,451,452],{},"系统表现",[325,454,455],{},"生活类比",[335,457,458,471,484],{},[322,459,460,465,468],{},[340,461,462],{},[30,463,464],{},"低 Agentic",[340,466,467],{},"简单的聊天机器人，只能根据预设规则回答问题",[340,469,470],{},"自动应答客服（只能按关键词回复固定话术）",[322,472,473,478,481],{},[340,474,475],{},[30,476,477],{},"中 Agentic",[340,479,480],{},"能调用工具完成单步任务，但不会自主规划和反思",[340,482,483],{},"便利店店员（能帮你结账取货，但不会替你算怎么组单更划算）",[322,485,486,491,494],{},[340,487,488],{},[30,489,490],{},"高 Agentic",[340,492,493],{},"能自主规划、调用多工具、检查修正、多 Agent 协作",[340,495,496],{},"资深活动策划（能从零操办一场活动，遇到突发状况主动调整）",[13,498,499],{},"正如 OpenAI 的 AI 主管 Lilian Weng（翁丽莲）在她那篇关于**自主智能体（Autonomous Agents）**的里程碑式博客文章《LLM Powered Autonomous Agents》中所强调的，具备智能体特性（agentic）的 AI，不会傻傻地等待下一步指令，而是会主动进行思考：",[410,501,502,505,508],{},[55,503,504],{},"发现自己犯了错，然后自己去修正。",[55,506,507],{},"意识到需要外部信息，然后主动去调用工具。",[55,509,510],{},"面对复杂任务时，自己去拆解成小步骤。",[13,512,513,514,517],{},"所以，智能体是载体，而它拥有的、让它变得强大的核心能力，正是这篇文章系统阐述的",[30,515,516],{},"规划、记忆和工具使用等关键组件","。文章《LLM Powered Autonomous Agents》是智能体系统领域的里程碑之作，其价值在于系统化梳理了智能体的核心概念，提出 ReAct 等模式，奠定了理论框架；通过案例和细节为工程实践提供了指导；推动了从被动响应到主动解决问题的 AI 范式转变；并以通俗语言连接了学术与工业，促进了技术普及，影响了智能体系统的研究与应用。",[13,519,520,523,524,527],{},[30,521,522],{},"Agentic 特性并非凭空出现","，它通过多种具体的工作模式来实现。下面我们将深入探索五种最常见的 Agentic 模式，它们定义了 Agent 在不同场景下的\"工作风格\"。值得一提的是，这些模式的演化路径与 ",[30,525,526],{},"ReAct"," 思想有着紧密的联系，后者被视为开启了 Agentic 系统设计的大门。",[102,529,531],{"className":104,"code":530,"language":106,"meta":107,"style":107},"flowchart TB\n    LLM[\"🧠 LLM 大模型\u003Cbr\u002F>语义理解 · 推理决策 · 文本生成\"]\n\n    P[\"🗺 任务规划（Planning）\u003Cbr\u002F>分解复杂任务为子步骤\u003Cbr\u002F>ReAct \u002F Chain-of-Thought\"]\n    T[\"🔧 工具调用（Tools）\u003Cbr\u002F>Function Call \u002F MCP 协议\u003Cbr\u002F>查询数据库 · 调用 API\"]\n    M[\"💾 记忆（Memory）\u003Cbr\u002F>短期对话 · 长期偏好\u003Cbr\u002F>查询历史 · 用户画像\"]\n\n    W[\"🌍 外部世界\u003Cbr\u002F>MySQL · 场地档期 API · Milvus 向量库 · 第三方服务\"]\n\n    LLM --> P\n    LLM --> T\n    LLM --> M\n    T -->|调用| W\n\n    style LLM fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style P fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style T fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style M fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style W fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[109,532,533,538,543,547,552,557,562,566,571,575,580,585,590,595,599,604,609,614,618],{"__ignoreMap":107},[112,534,535],{"class":114,"line":115},[112,536,537],{},"flowchart TB\n",[112,539,540],{"class":114,"line":121},[112,541,542],{},"    LLM[\"🧠 LLM 大模型\u003Cbr\u002F>语义理解 · 推理决策 · 文本生成\"]\n",[112,544,545],{"class":114,"line":127},[112,546,131],{"emptyLinePlaceholder":130},[112,548,549],{"class":114,"line":134},[112,550,551],{},"    P[\"🗺 任务规划（Planning）\u003Cbr\u002F>分解复杂任务为子步骤\u003Cbr\u002F>ReAct \u002F Chain-of-Thought\"]\n",[112,553,554],{"class":114,"line":140},[112,555,556],{},"    T[\"🔧 工具调用（Tools）\u003Cbr\u002F>Function Call \u002F MCP 协议\u003Cbr\u002F>查询数据库 · 调用 API\"]\n",[112,558,559],{"class":114,"line":146},[112,560,561],{},"    M[\"💾 记忆（Memory）\u003Cbr\u002F>短期对话 · 长期偏好\u003Cbr\u002F>查询历史 · 用户画像\"]\n",[112,563,564],{"class":114,"line":152},[112,565,131],{"emptyLinePlaceholder":130},[112,567,568],{"class":114,"line":158},[112,569,570],{},"    W[\"🌍 外部世界\u003Cbr\u002F>MySQL · 场地档期 API · Milvus 向量库 · 第三方服务\"]\n",[112,572,573],{"class":114,"line":164},[112,574,131],{"emptyLinePlaceholder":130},[112,576,577],{"class":114,"line":169},[112,578,579],{},"    LLM --> P\n",[112,581,582],{"class":114,"line":175},[112,583,584],{},"    LLM --> T\n",[112,586,587],{"class":114,"line":181},[112,588,589],{},"    LLM --> M\n",[112,591,592],{"class":114,"line":187},[112,593,594],{},"    T -->|调用| W\n",[112,596,597],{"class":114,"line":193},[112,598,131],{"emptyLinePlaceholder":130},[112,600,601],{"class":114,"line":199},[112,602,603],{},"    style LLM fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,605,606],{"class":114,"line":205},[112,607,608],{},"    style P fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,610,611],{"class":114,"line":211},[112,612,613],{},"    style T fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,615,616],{"class":114,"line":216},[112,617,271],{},[112,619,620],{"class":114,"line":222},[112,621,622],{},"    style W fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[10,624,625],{},[13,626,627,629,630,633,634,637],{},[30,628,290],{}," 这是 Agent 的概念模型：",[109,631,632],{},"Agent = 大模型 + 任务规划 + 工具调用 + 记忆","。LLM 作为中枢向外分出三条支撑线，其中只有",[30,635,636],{},"工具调用","会真正触达外部世界（数据库、场地档期 API、向量库、第三方服务），规划与记忆则发生在模型侧。五种模式（工具使用 → ReAct → 反思 → 规划 → 多智能体）就是围绕这三个支点逐步长出来的，复杂度递增。",[17,639,641],{"id":640},"_3-agent-五种模式","3. Agent 五种模式",[22,643,645],{"id":644},"_31-工具使用模式tool-use-pattern","3.1 工具使用模式（Tool use pattern）",[13,647,648,651,652,655],{},[30,649,650],{},"核心精髓："," 工具使用模式可以看作是 ",[30,653,654],{},"ReAct 模式的前身或简化版","。它允许 Agent 调用外部工具来弥补自身知识的不足，但通常缺乏 ReAct 模式中那种细致入微的\"思考-行动-观察\"循环。它的局限在于其推理能力较弱，通常只适用于单步、直接的任务，缺乏动态调整和迭代的能力。",[13,657,658],{},[30,659,660],{},"工作流程（像请教专家）：",[52,662,663,669,675,681,687],{},[55,664,665,668],{},[30,666,667],{},"用户问问题","：提出一个问题。",[55,670,671,674],{},[30,672,673],{},"LLM 想想","：小助手判断需要外援。",[55,676,677,680],{},[30,678,679],{},"调用工具","：它找来数据库或 API 查资料。",[55,682,683,686],{},[30,684,685],{},"给出答案","：根据查到的东西，生成回复。",[55,688,689,692],{},[30,690,691],{},"交给你","：答案回到你手里。",[102,694,696],{"className":104,"code":695,"language":106,"meta":107,"style":107},"flowchart LR\n    S1[\"① 用户提问\u003Cbr\u002F>我的退款到哪一步了\"]\n    S2[\"② LLM 判断\u003Cbr\u002F>需要调用工具\"]\n    S3[\"③ 调用工具\u003Cbr\u002F>query_refund(id)\"]\n    S4[\"④ 获取结果\u003Cbr\u002F>已退款，2 小时内到账\"]\n    S5[\"⑤ 生成回答\u003Cbr\u002F>退款已提交，预计 2 小时内到账\"]\n\n    S1 --> S2 --> S3 --> S4 --> S5\n\n    style S1 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style S2 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style S3 fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style S4 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style S5 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[109,697,698,702,707,712,717,722,727,731,736,740,745,750,755,760],{"__ignoreMap":107},[112,699,700],{"class":114,"line":115},[112,701,118],{},[112,703,704],{"class":114,"line":121},[112,705,706],{},"    S1[\"① 用户提问\u003Cbr\u002F>我的退款到哪一步了\"]\n",[112,708,709],{"class":114,"line":127},[112,710,711],{},"    S2[\"② LLM 判断\u003Cbr\u002F>需要调用工具\"]\n",[112,713,714],{"class":114,"line":134},[112,715,716],{},"    S3[\"③ 调用工具\u003Cbr\u002F>query_refund(id)\"]\n",[112,718,719],{"class":114,"line":140},[112,720,721],{},"    S4[\"④ 获取结果\u003Cbr\u002F>已退款，2 小时内到账\"]\n",[112,723,724],{"class":114,"line":146},[112,725,726],{},"    S5[\"⑤ 生成回答\u003Cbr\u002F>退款已提交，预计 2 小时内到账\"]\n",[112,728,729],{"class":114,"line":152},[112,730,131],{"emptyLinePlaceholder":130},[112,732,733],{"class":114,"line":158},[112,734,735],{},"    S1 --> S2 --> S3 --> S4 --> S5\n",[112,737,738],{"class":114,"line":164},[112,739,131],{"emptyLinePlaceholder":130},[112,741,742],{"class":114,"line":169},[112,743,744],{},"    style S1 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[112,746,747],{"class":114,"line":175},[112,748,749],{},"    style S2 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,751,752],{"class":114,"line":181},[112,753,754],{},"    style S3 fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,756,757],{"class":114,"line":187},[112,758,759],{},"    style S4 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,761,762],{"class":114,"line":193},[112,763,764],{},"    style S5 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[10,766,767],{},[13,768,769,771,772,775,776,779],{},[30,770,290],{}," 五步是一条",[30,773,774],{},"直线","，没有任何回环箭头——这就是工具使用模式的特点：",[30,777,778],{},"单步调用，无循环","。LLM 判断需要工具 → 调用一次 → 根据结果回答，不迭代、不修正。适用于简单、直接的任务。",[13,781,782],{},[30,783,784],{},"应用场景示例：",[316,786,787,800],{},[319,788,789],{},[322,790,791,794,797],{},[325,792,793],{},"场景",[325,795,796],{},"用户提问",[325,798,799],{},"Agent 内部过程",[335,801,802,817,832],{},[322,803,804,807,810],{},[340,805,806],{},"电商售后",[340,808,809],{},"\"我的退款到哪一步了\"",[340,811,812,813,816],{},"判断需要查退款单 → 调用 ",[109,814,815],{},"query_refund(order_id)"," → 返回退款进度",[322,818,819,822,825],{},[340,820,821],{},"门店助手",[340,823,824],{},"\"望京店现在排队多久\"",[340,826,827,828,831],{},"判断需要排队数据 → 调用 ",[109,829,830],{},"get_queue_length(store=\"望京店\")"," → 返回等候时长",[322,833,834,837,840],{},[340,835,836],{},"图书借阅",[340,838,839],{},"\"《三体》现在在馆吗\"",[340,841,842,843,846],{},"判断需要查馆藏 → 调用 ",[109,844,845],{},"search_book(title=\"三体\")"," → 返回在馆册数",[13,848,849,850,853],{},"这些场景的共同点：",[30,851,852],{},"单步直接","，用户的问题对应一个明确的工具调用，Agent 不需要多步推理。",[22,855,857],{"id":856},"_32-react-模式react-pattern","3.2 ReAct 模式（ReAct Pattern）",[13,859,860,861,864],{},"几乎所有高级的 Agent 模式都离不开一个核心思想——",[30,862,863],{},"ReAct（Reason + Act）","。这是 Agent 实现\"思考\"与\"行动\"循环的基础。",[13,866,867,869,870,873],{},[30,868,650],{}," ReAct（Reasoning and Acting）模式是 Agentic 思想的",[30,871,872],{},"奠基性贡献","。它将\"思考\"（Reasoning）和\"行动\"（Acting）紧密地结合在一起，形成一个动态的循环。这个模式让 Agent 不再是简单地调用工具，而是像人类一样\"边想边做\"。ReAct 模式最早由 Yao 等人于 2022 年提出（论文《ReAct: Synergizing Reasoning and Acting in Language Models》），并在 Lilian Weng 的博客中得到系统阐述，成为 Agentic 系统设计的基础。",[13,875,876],{},[30,877,878],{},"工作流程：",[52,880,881,887,893,899,905],{},[55,882,883,886],{},[30,884,885],{},"思考","：Agent 接收用户请求，推理任务需求并制定初步行动计划。",[55,888,889,892],{},[30,890,891],{},"行动","：根据思考结果，决定并执行具体行动（如调用工具）。",[55,894,895,898],{},[30,896,897],{},"行动输入","：为选定的工具提供必要参数。",[55,900,901,904],{},[30,902,903],{},"观察","：接收工具执行结果，作为对环境的\"观察\"。",[55,906,907,910],{},[30,908,909],{},"循环迭代","：将观察结果反馈给自己，再次思考并决定下一步，直到达到目标。",[102,912,914],{"className":104,"code":913,"language":106,"meta":107,"style":107},"flowchart TD\n    R[\"用户请求\u003Cbr\u002F>接收任务\"]\n    TH[\"① Thought 思考\u003Cbr\u002F>推理并制定行动计划\"]\n    AC[\"② Action 行动\u003Cbr\u002F>调用工具 \u002F 执行动作\"]\n    OB[\"③ Observation 观察\u003Cbr\u002F>接收工具执行结果\"]\n    Q{\"达到目标？\u003Cbr\u002F>判断\"}\n    F[\"最终回答\u003Cbr\u002F>返回给用户\"]\n\n    R --> TH --> AC --> OB --> Q\n    Q -->|否\u003Cbr\u002F>回到思考，继续迭代| TH\n    Q -->|是| F\n\n    style R fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style TH fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style AC fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style OB fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style Q fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style F fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[109,915,916,921,926,931,936,941,946,951,955,960,965,970,974,979,984,989,994,999],{"__ignoreMap":107},[112,917,918],{"class":114,"line":115},[112,919,920],{},"flowchart TD\n",[112,922,923],{"class":114,"line":121},[112,924,925],{},"    R[\"用户请求\u003Cbr\u002F>接收任务\"]\n",[112,927,928],{"class":114,"line":127},[112,929,930],{},"    TH[\"① Thought 思考\u003Cbr\u002F>推理并制定行动计划\"]\n",[112,932,933],{"class":114,"line":134},[112,934,935],{},"    AC[\"② Action 行动\u003Cbr\u002F>调用工具 \u002F 执行动作\"]\n",[112,937,938],{"class":114,"line":140},[112,939,940],{},"    OB[\"③ Observation 观察\u003Cbr\u002F>接收工具执行结果\"]\n",[112,942,943],{"class":114,"line":146},[112,944,945],{},"    Q{\"达到目标？\u003Cbr\u002F>判断\"}\n",[112,947,948],{"class":114,"line":152},[112,949,950],{},"    F[\"最终回答\u003Cbr\u002F>返回给用户\"]\n",[112,952,953],{"class":114,"line":158},[112,954,131],{"emptyLinePlaceholder":130},[112,956,957],{"class":114,"line":164},[112,958,959],{},"    R --> TH --> AC --> OB --> Q\n",[112,961,962],{"class":114,"line":169},[112,963,964],{},"    Q -->|否\u003Cbr\u002F>回到思考，继续迭代| TH\n",[112,966,967],{"class":114,"line":175},[112,968,969],{},"    Q -->|是| F\n",[112,971,972],{"class":114,"line":181},[112,973,131],{"emptyLinePlaceholder":130},[112,975,976],{"class":114,"line":187},[112,977,978],{},"    style R fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[112,980,981],{"class":114,"line":193},[112,982,983],{},"    style TH fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,985,986],{"class":114,"line":199},[112,987,988],{},"    style AC fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,990,991],{"class":114,"line":205},[112,992,993],{},"    style OB fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,995,996],{"class":114,"line":211},[112,997,998],{},"    style Q fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,1000,1001],{"class":114,"line":216},[112,1002,1003],{},"    style F fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[10,1005,1006],{},[13,1007,1008,1010,1011,1014,1015,1018,1019,1022],{},[30,1009,290],{}," 与工具使用模式相比，这里多了一条",[30,1012,1013],{},"紫色的回环","：当判断\"未达到目标\"时，流程回到 ① 思考继续迭代。这条回环就是 ReAct 的灵魂——",[30,1016,1017],{},"循环迭代：将观察结果反馈给自己，再次思考并决定下一步，直到达到目标","。\n",[30,1020,1021],{},"应用场景示例","：",[410,1024,1025],{},[55,1026,1027,1030,1031],{},[30,1028,1029],{},"找房 Agent","：任务是\"帮我找一下公司附近 3 公里内、月租 6000 元以内的两居室\"。\n",[410,1032,1033,1039,1047,1053,1058,1065,1070],{},[55,1034,1035,1038],{},[30,1036,1037],{},"Thought","：先按区域和价格条件捞一批房源。",[55,1040,1041,1022,1044],{},[30,1042,1043],{},"Action",[109,1045,1046],{},"search_listings(district=\"滨江\", max_rent=6000, rooms=2)",[55,1048,1049,1052],{},[30,1050,1051],{},"Observation","：（返回了 18 条房源）",[55,1054,1055,1057],{},[30,1056,1037],{},"：结果太多了，需要过滤掉楼层过低和没有电梯的。",[55,1059,1060,1022,1062],{},[30,1061,1043],{},[109,1063,1064],{},"filter_listings(results, min_floor=5, need_elevator=True)",[55,1066,1067,1069],{},[30,1068,1051],{},"：（剩下 3 套候选房源）",[55,1071,1072,1074],{},[30,1073,1037],{},"：候选已经收敛了，整理成对比表回答用户。",[22,1076,1078],{"id":1077},"_33-反思模式reflection-pattern","3.3 反思模式（Reflection pattern）",[13,1080,1081,1082,1085],{},"为了提高任务完成的质量，Agent 在完成一个步骤或整个任务后，会进行",[30,1083,1084],{},"自我评估和反思","，并根据反思结果进行修正。",[13,1087,1088,1090,1091,1094],{},[30,1089,650],{}," 反思模式是 ",[30,1092,1093],{},"ReAct 模式中\"思考\"环节的深化","。它强调 Agent 在完成任务后，能够像人类一样进行自我审查和评估。这个过程让 Agent 能够从错误中学习，持续优化自己的表现。",[13,1096,1097],{},[30,1098,878],{},[52,1100,1101,1107,1113,1119,1125,1131],{},[55,1102,1103,1106],{},[30,1104,1105],{},"用户提出任务","：给小助手提个问题。",[55,1108,1109,1112],{},[30,1110,1111],{},"生成初稿","：小助手先试着回答，写一个初步答案。",[55,1114,1115,1118],{},[30,1116,1117],{},"自我评估","：小助手自己审查答案哪里不对（Self-Critique，即自我批评）。",[55,1120,1121,1124],{},[30,1122,1123],{},"自我修正","：根据评估发现的问题，改进答案。",[55,1126,1127,1130],{},[30,1128,1129],{},"反复调整","：自我评估与修正循环迭代，直到答案满意。",[55,1132,1133,1136],{},[30,1134,1135],{},"输出最终回答","：把最终答案交付给用户。",[102,1138,1140],{"className":104,"code":1139,"language":106,"meta":107,"style":107},"flowchart TD\n    U[\"用户提出任务\u003Cbr\u002F>下达问题\"]\n    D[\"生成初稿\u003Cbr\u002F>LLM 第一次回答\"]\n    E[\"自我评估\u003Cbr\u002F>LLM 审查自己的答案\"]\n    C[\"自我修正\u003Cbr\u002F>根据问题改进答案\"]\n    Q{\"是否满意？\u003Cbr\u002F>判断\"}\n    F[\"最终回答\u003Cbr\u002F>交付给用户\"]\n\n    U --> D --> E --> Q\n    Q -->|否| C\n    C -->|修正后再评估| E\n    Q -->|是| F\n\n    style U fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style D fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style E fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style C fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style Q fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style F fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[109,1141,1142,1146,1151,1156,1161,1166,1171,1176,1180,1185,1190,1195,1199,1203,1207,1212,1217,1222,1226],{"__ignoreMap":107},[112,1143,1144],{"class":114,"line":115},[112,1145,920],{},[112,1147,1148],{"class":114,"line":121},[112,1149,1150],{},"    U[\"用户提出任务\u003Cbr\u002F>下达问题\"]\n",[112,1152,1153],{"class":114,"line":127},[112,1154,1155],{},"    D[\"生成初稿\u003Cbr\u002F>LLM 第一次回答\"]\n",[112,1157,1158],{"class":114,"line":134},[112,1159,1160],{},"    E[\"自我评估\u003Cbr\u002F>LLM 审查自己的答案\"]\n",[112,1162,1163],{"class":114,"line":140},[112,1164,1165],{},"    C[\"自我修正\u003Cbr\u002F>根据问题改进答案\"]\n",[112,1167,1168],{"class":114,"line":146},[112,1169,1170],{},"    Q{\"是否满意？\u003Cbr\u002F>判断\"}\n",[112,1172,1173],{"class":114,"line":152},[112,1174,1175],{},"    F[\"最终回答\u003Cbr\u002F>交付给用户\"]\n",[112,1177,1178],{"class":114,"line":158},[112,1179,131],{"emptyLinePlaceholder":130},[112,1181,1182],{"class":114,"line":164},[112,1183,1184],{},"    U --> D --> E --> Q\n",[112,1186,1187],{"class":114,"line":169},[112,1188,1189],{},"    Q -->|否| C\n",[112,1191,1192],{"class":114,"line":175},[112,1193,1194],{},"    C -->|修正后再评估| E\n",[112,1196,1197],{"class":114,"line":181},[112,1198,969],{},[112,1200,1201],{"class":114,"line":187},[112,1202,131],{"emptyLinePlaceholder":130},[112,1204,1205],{"class":114,"line":193},[112,1206,277],{},[112,1208,1209],{"class":114,"line":199},[112,1210,1211],{},"    style D fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1213,1214],{"class":114,"line":205},[112,1215,1216],{},"    style E fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,1218,1219],{"class":114,"line":211},[112,1220,1221],{},"    style C fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,1223,1224],{"class":114,"line":216},[112,1225,998],{},[112,1227,1228],{"class":114,"line":222},[112,1229,1003],{},[10,1231,1232],{},[13,1233,1234,1236,1237,1240,1241,1244],{},[30,1235,290],{}," 这里出现了一个",[30,1238,1239],{},"双节点回环","：不满意 → 自我修正 → 修正后再评估 → 回到自我评估。也就是说反思循环迭代的是\"评估-修正\"这一对动作，而生成初稿只做一次。",[30,1242,1243],{},"反思的核心是 LLM 自我评估（Self-Critique）","，闭环在 Agent 内部完成。",[10,1246,1247],{},[13,1248,1249,1252,1253,1256,1257,1260,1261,1264,1265,44],{},[30,1250,1251],{},"关于\"自我评估\"与\"用户反馈\"","：反思的核心是 ",[30,1254,1255],{},"LLM 自我评估","（Self-Critique），评估与修正的循环在 Agent ",[30,1258,1259],{},"内部","完成。部分场景会额外引入",[30,1262,1263],{},"用户反馈","作为外部评估依据（用户看答案是否满意、提出修改意见），两者并不矛盾——",[30,1266,1267],{},"自我评估是主循环，用户反馈是可选的辅助手段",[13,1269,1270,1022],{},[30,1271,1021],{},[410,1273,1274],{},[55,1275,1276,1279,1280],{},[30,1277,1278],{},"AI 周报助手","：任务是\"根据本周的工作记录写一份周报\"。\n",[410,1281,1282,1287,1293],{},[55,1283,1284,1286],{},[30,1285,1043],{},"：Agent 先输出了一份周报，按时间顺序把本周做过的事列了一遍。",[55,1288,1289,1292],{},[30,1290,1291],{},"Reflection（Self-Critique）","：Agent 开始反思这份周报。\"它是流水账，只写了做了什么，没写清结果和价值，也没有下周计划。我应该按'本周成果 \u002F 遇到的问题 \u002F 下周计划'重写。\"",[55,1294,1295,1298],{},[30,1296,1297],{},"Action（Refinement）","：Agent 重写为三段式结构，为每条事项补上量化结果（如\"接口平均耗时从 800ms 降到 220ms\"），并列出下周计划，作为最终答案。",[22,1300,1302],{"id":1301},"_34-规划模式planning-pattern","3.4 规划模式（Planning Pattern）",[13,1304,1305,1306,44],{},"当任务非常复杂，无法通过简单的 ReAct 循环一步到位时，Agent 需要先进行",[30,1307,1308],{},"宏观规划",[13,1310,1311,1314],{},[30,1312,1313],{},"核心思想","：先将一个大目标分解成一个详细的、有序的计划（Plan），然后再逐一执行计划中的每个步骤（每个步骤可能是一个 ReAct 循环）。",[102,1316,1318],{"className":104,"code":1317,"language":106,"meta":107,"style":107},"flowchart LR\n    S1[\"① 用户提出复杂任务\u003Cbr\u002F>筹备一场 30 人的生日派对\"]\n    S2[\"② 规划器分解任务\u003Cbr\u002F>生成有序步骤列表\"]\n    PL[\"📋 计划\u003Cbr\u002F>1. 确认日期、人数与总预算\u003Cbr\u002F>2. 比较场地档期与报价\u003Cbr\u002F>3. 预订蛋糕与餐饮\u003Cbr\u002F>4. 拟定邀请名单与话术\u003Cbr\u002F>5. 汇总生成筹备清单\"]\n    S3[\"③ 逐步执行\u003Cbr\u002F>每步可能是一个 ReAct 循环\"]\n    E1[\"步骤 1：定预算\"] --> E2[\"步骤 2：挑场地\"] --> E3[\"步骤 3：订蛋糕\"] --> E4[\"步骤 N：…\"]\n    S4[\"④ 汇总所有步骤结果\u003Cbr\u002F>整合为完整方案\"]\n    S5[\"⑤ 输出最终方案\u003Cbr\u002F>派对筹备清单文档\"]\n\n    S1 --> S2 --> PL\n    S2 --> S3\n    S3 --> E1\n    E1 --> S4 --> S5\n\n    style S1 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style S2 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style PL fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style S3 fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style E1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style E2 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style E3 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style E4 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style S4 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style S5 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[109,1319,1320,1324,1329,1334,1339,1344,1349,1354,1359,1363,1368,1373,1378,1383,1387,1391,1396,1401,1405,1410,1415,1420,1425,1430],{"__ignoreMap":107},[112,1321,1322],{"class":114,"line":115},[112,1323,118],{},[112,1325,1326],{"class":114,"line":121},[112,1327,1328],{},"    S1[\"① 用户提出复杂任务\u003Cbr\u002F>筹备一场 30 人的生日派对\"]\n",[112,1330,1331],{"class":114,"line":127},[112,1332,1333],{},"    S2[\"② 规划器分解任务\u003Cbr\u002F>生成有序步骤列表\"]\n",[112,1335,1336],{"class":114,"line":134},[112,1337,1338],{},"    PL[\"📋 计划\u003Cbr\u002F>1. 确认日期、人数与总预算\u003Cbr\u002F>2. 比较场地档期与报价\u003Cbr\u002F>3. 预订蛋糕与餐饮\u003Cbr\u002F>4. 拟定邀请名单与话术\u003Cbr\u002F>5. 汇总生成筹备清单\"]\n",[112,1340,1341],{"class":114,"line":140},[112,1342,1343],{},"    S3[\"③ 逐步执行\u003Cbr\u002F>每步可能是一个 ReAct 循环\"]\n",[112,1345,1346],{"class":114,"line":146},[112,1347,1348],{},"    E1[\"步骤 1：定预算\"] --> E2[\"步骤 2：挑场地\"] --> E3[\"步骤 3：订蛋糕\"] --> E4[\"步骤 N：…\"]\n",[112,1350,1351],{"class":114,"line":152},[112,1352,1353],{},"    S4[\"④ 汇总所有步骤结果\u003Cbr\u002F>整合为完整方案\"]\n",[112,1355,1356],{"class":114,"line":158},[112,1357,1358],{},"    S5[\"⑤ 输出最终方案\u003Cbr\u002F>派对筹备清单文档\"]\n",[112,1360,1361],{"class":114,"line":164},[112,1362,131],{"emptyLinePlaceholder":130},[112,1364,1365],{"class":114,"line":169},[112,1366,1367],{},"    S1 --> S2 --> PL\n",[112,1369,1370],{"class":114,"line":175},[112,1371,1372],{},"    S2 --> S3\n",[112,1374,1375],{"class":114,"line":181},[112,1376,1377],{},"    S3 --> E1\n",[112,1379,1380],{"class":114,"line":187},[112,1381,1382],{},"    E1 --> S4 --> S5\n",[112,1384,1385],{"class":114,"line":193},[112,1386,131],{"emptyLinePlaceholder":130},[112,1388,1389],{"class":114,"line":199},[112,1390,744],{},[112,1392,1393],{"class":114,"line":205},[112,1394,1395],{},"    style S2 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,1397,1398],{"class":114,"line":211},[112,1399,1400],{},"    style PL fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,1402,1403],{"class":114,"line":216},[112,1404,754],{},[112,1406,1407],{"class":114,"line":222},[112,1408,1409],{},"    style E1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1411,1412],{"class":114,"line":227},[112,1413,1414],{},"    style E2 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1416,1417],{"class":114,"line":233},[112,1418,1419],{},"    style E3 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1421,1422],{"class":114,"line":239},[112,1423,1424],{},"    style E4 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1426,1427],{"class":114,"line":244},[112,1428,1429],{},"    style S4 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,1431,1432],{"class":114,"line":250},[112,1433,764],{},[10,1435,1436],{},[13,1437,1438,1440,1441,1444,1445,1448],{},[30,1439,290],{}," 规划模式把流程切成明显的",[30,1442,1443],{},"上下两段","：上半段是\"规划器分解任务\"，产出一份有序的计划清单；下半段是\"逐步执行\"，把清单里的每一步交给执行器（每步内部可能又是一个 ReAct 循环）。",[30,1446,1447],{},"核心是先规划、后执行","——规划器负责\"做什么\"，执行器负责\"怎么做\"。适用于无法一步到位的复杂任务。",[13,1450,1451],{},[30,1452,784],{},[410,1454,1455],{},[55,1456,1457,1460,1461],{},[30,1458,1459],{},"活动策划 Agent","：任务是\"帮我筹备一场 30 人的生日派对\"。\n",[410,1462,1463,1486],{},[55,1464,1465,1468,1469],{},[30,1466,1467],{},"Planning Phase","：Agent 首先生成一个计划：\n",[52,1470,1471,1474,1477,1480,1483],{},[55,1472,1473],{},"步骤一：确认日期、人数和总预算。",[55,1475,1476],{},"步骤二：比对 2-3 个场地的档期与报价，锁定其中一个。",[55,1478,1479],{},"步骤三：按人数预订蛋糕与餐饮，并确认忌口。",[55,1481,1482],{},"步骤四：拟定邀请名单与邀约话术，统计回执。",[55,1484,1485],{},"步骤五：汇总所有信息，生成一份筹备清单文档。",[55,1487,1488,1491],{},[30,1489,1490],{},"Execution Phase","：Agent 开始按顺序执行上述步骤，每一步都可能调用档期查询、比价、日历等工具。",[22,1493,1495],{"id":1494},"_35-多智能体模式multi-agent-pattern","3.5 多智能体模式（Multi-agent Pattern）",[13,1497,1498],{},"对于极其复杂的系统性任务，单个 Agent 可能难以胜任。这时，可以设计多个具有不同角色和能力的 Agent，让它们协同工作。",[13,1500,1501,1503,1504,1507],{},[30,1502,650],{}," 多智能体模式是 Agentic 思想的",[30,1505,1506],{},"终极体现","，它模拟了人类团队协作的工作方式。它不再依赖一个 Agent 单打独斗，而是创建多个具有不同专长的 Agent，让它们各司其职、相互协作，共同完成一个复杂的任务。尽管多智能体模式功能强大，但实现时需要解决 Agent 间的通信效率、任务冲突等问题，这对系统设计提出了更高要求。",[102,1509,1511],{"className":104,"code":1510,"language":106,"meta":107,"style":107},"flowchart TB\n    U[\"① 用户提出需求\u003Cbr\u002F>算 30×68，再查场地档期和今天日期\"]\n    PM[\"② PM Agent（项目经理）\u003Cbr\u002F>分析需求，分配任务，汇总结果\"]\n    MA[\"④ 预算专家 Agent\u003Cbr\u002F>工具：calc_total, sum_amounts\"]\n    IA[\"④ 场地信息 Agent\u003Cbr\u002F>工具：book_venue, get_current_date\"]\n    R1[\"结果：2040 元\"]\n    R2[\"结果：桂花厅有余位，今天是 9 月 15 日\"]\n    SUM[\"⑥ PM 整合结果，输出最终回答\"]\n\n    U --> PM\n    PM -->|③ 委派计算任务| MA\n    PM -->|③ 委派查询任务| IA\n    MA --> R1\n    IA --> R2\n    R1 -->|⑤ 汇报结果| SUM\n    R2 -->|⑤ 汇报结果| SUM\n\n    style U fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style PM fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style MA fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style IA fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style R1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style R2 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style SUM fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[109,1512,1513,1517,1522,1527,1532,1537,1542,1547,1552,1556,1561,1566,1571,1576,1581,1586,1591,1595,1599,1604,1609,1614,1619,1624],{"__ignoreMap":107},[112,1514,1515],{"class":114,"line":115},[112,1516,537],{},[112,1518,1519],{"class":114,"line":121},[112,1520,1521],{},"    U[\"① 用户提出需求\u003Cbr\u002F>算 30×68，再查场地档期和今天日期\"]\n",[112,1523,1524],{"class":114,"line":127},[112,1525,1526],{},"    PM[\"② PM Agent（项目经理）\u003Cbr\u002F>分析需求，分配任务，汇总结果\"]\n",[112,1528,1529],{"class":114,"line":134},[112,1530,1531],{},"    MA[\"④ 预算专家 Agent\u003Cbr\u002F>工具：calc_total, sum_amounts\"]\n",[112,1533,1534],{"class":114,"line":140},[112,1535,1536],{},"    IA[\"④ 场地信息 Agent\u003Cbr\u002F>工具：book_venue, get_current_date\"]\n",[112,1538,1539],{"class":114,"line":146},[112,1540,1541],{},"    R1[\"结果：2040 元\"]\n",[112,1543,1544],{"class":114,"line":152},[112,1545,1546],{},"    R2[\"结果：桂花厅有余位，今天是 9 月 15 日\"]\n",[112,1548,1549],{"class":114,"line":158},[112,1550,1551],{},"    SUM[\"⑥ PM 整合结果，输出最终回答\"]\n",[112,1553,1554],{"class":114,"line":164},[112,1555,131],{"emptyLinePlaceholder":130},[112,1557,1558],{"class":114,"line":169},[112,1559,1560],{},"    U --> PM\n",[112,1562,1563],{"class":114,"line":175},[112,1564,1565],{},"    PM -->|③ 委派计算任务| MA\n",[112,1567,1568],{"class":114,"line":181},[112,1569,1570],{},"    PM -->|③ 委派查询任务| IA\n",[112,1572,1573],{"class":114,"line":187},[112,1574,1575],{},"    MA --> R1\n",[112,1577,1578],{"class":114,"line":193},[112,1579,1580],{},"    IA --> R2\n",[112,1582,1583],{"class":114,"line":199},[112,1584,1585],{},"    R1 -->|⑤ 汇报结果| SUM\n",[112,1587,1588],{"class":114,"line":205},[112,1589,1590],{},"    R2 -->|⑤ 汇报结果| SUM\n",[112,1592,1593],{"class":114,"line":211},[112,1594,131],{"emptyLinePlaceholder":130},[112,1596,1597],{"class":114,"line":216},[112,1598,277],{},[112,1600,1601],{"class":114,"line":222},[112,1602,1603],{},"    style PM fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,1605,1606],{"class":114,"line":227},[112,1607,1608],{},"    style MA fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,1610,1611],{"class":114,"line":233},[112,1612,1613],{},"    style IA fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,1615,1616],{"class":114,"line":239},[112,1617,1618],{},"    style R1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1620,1621],{"class":114,"line":244},[112,1622,1623],{},"    style R2 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1625,1626],{"class":114,"line":250},[112,1627,1628],{},"    style SUM fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[10,1630,1631],{},[13,1632,1633,1635,1636,1639,1640,1643,1644,1647,1648,1651],{},[30,1634,290],{}," 结构上是一个",[30,1637,1638],{},"先分叉、再汇聚","的菱形：PM Agent 作为协调者把需求拆成\"算预算\"和\"查场地\"两条支线，交给各自持有一套专属工具的专家 Agent（预算专家只有 ",[109,1641,1642],{},"calc_total\u002Fsum_amounts","，场地专家只有 ",[109,1645,1646],{},"book_venue\u002Fget_current_date","），两边跑完后把结果汇报回 PM，由 PM 统一整合成最终回答。",[30,1649,1650],{},"关键点：每个 Agent 有独立的工具集","，这正是多智能体比单 Agent 更擅长复杂任务的原因——职责隔离带来了工具隔离。",[13,1653,1654],{},[30,1655,784],{},[410,1657,1658],{},[55,1659,1660,1663,1664],{},[30,1661,1662],{},"内容生产流水线","：把\"写一篇公众号推文\"拆成一条多智能体流水线，模拟真实编辑部协作。\n",[410,1665,1666,1672,1678,1684,1690,1696],{},[55,1667,1668,1671],{},[30,1669,1670],{},"用户提需求","：给一个题目（比如\"写一篇介绍 MCP 的推文\"）。",[55,1673,1674,1677],{},[30,1675,1676],{},"PM Agent","：拆解需求并分配任务（协调整条流水线）。",[55,1679,1680,1683],{},[30,1681,1682],{},"委托任务","：任务分给选题 Agent 和写作 Agent（选题负责找角度，写作负责成稿）。",[55,1685,1686,1689],{},[30,1687,1688],{},"执行任务","：写作 Agent 产出初稿，配图 Agent 生成封面图（各司其职）。",[55,1691,1692,1695],{},[30,1693,1694],{},"结果汇总","：各环节产出统一汇报给 PM Agent（集中收集）。",[55,1697,1698,1700],{},[30,1699,691],{},"：PM Agent 整合定稿，交付给用户（可直接发布的内容）。",[22,1702,1704],{"id":1703},"_36-agent-模式的演进关系","3.6 Agent 模式的演进关系",[13,1706,1707],{},"上述 5 种模式构成了一个从简单到复杂的演进阶梯。",[102,1709,1711],{"className":104,"code":1710,"language":106,"meta":107,"style":107},"flowchart LR\n    M1[\"工具使用\u003Cbr\u002F>LLM 选择并调用预定义的工具函数\u003Cbr\u002F>\u003Cbr\u002F>基础能力\"]\n    M2[\"ReAct\u003Cbr\u002F>思考 → 行动 → 观察 循环推理\u003Cbr\u002F>\u003Cbr\u002F>+ 循环推理\"]\n    M3[\"反思\u003Cbr\u002F>生成 → 评估 → 修正 自我改进\u003Cbr\u002F>\u003Cbr\u002F>+ 自我修正\"]\n    M4[\"规划\u003Cbr\u002F>先分解任务再逐步执行\u003Cbr\u002F>\u003Cbr\u002F>+ 任务分解\"]\n    M5[\"多智能体\u003Cbr\u002F>多个 Agent 分工协作\u003Cbr\u002F>\u003Cbr\u002F>+ 多角色协作\"]\n\n    M1 --> M2 --> M3 --> M4 --> M5\n\n    style M1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style M2 fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n    style M3 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style M4 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style M5 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[109,1712,1713,1717,1722,1727,1732,1737,1742,1746,1751,1755,1760,1765,1770,1775],{"__ignoreMap":107},[112,1714,1715],{"class":114,"line":115},[112,1716,118],{},[112,1718,1719],{"class":114,"line":121},[112,1720,1721],{},"    M1[\"工具使用\u003Cbr\u002F>LLM 选择并调用预定义的工具函数\u003Cbr\u002F>\u003Cbr\u002F>基础能力\"]\n",[112,1723,1724],{"class":114,"line":127},[112,1725,1726],{},"    M2[\"ReAct\u003Cbr\u002F>思考 → 行动 → 观察 循环推理\u003Cbr\u002F>\u003Cbr\u002F>+ 循环推理\"]\n",[112,1728,1729],{"class":114,"line":134},[112,1730,1731],{},"    M3[\"反思\u003Cbr\u002F>生成 → 评估 → 修正 自我改进\u003Cbr\u002F>\u003Cbr\u002F>+ 自我修正\"]\n",[112,1733,1734],{"class":114,"line":140},[112,1735,1736],{},"    M4[\"规划\u003Cbr\u002F>先分解任务再逐步执行\u003Cbr\u002F>\u003Cbr\u002F>+ 任务分解\"]\n",[112,1738,1739],{"class":114,"line":146},[112,1740,1741],{},"    M5[\"多智能体\u003Cbr\u002F>多个 Agent 分工协作\u003Cbr\u002F>\u003Cbr\u002F>+ 多角色协作\"]\n",[112,1743,1744],{"class":114,"line":152},[112,1745,131],{"emptyLinePlaceholder":130},[112,1747,1748],{"class":114,"line":158},[112,1749,1750],{},"    M1 --> M2 --> M3 --> M4 --> M5\n",[112,1752,1753],{"class":114,"line":164},[112,1754,131],{"emptyLinePlaceholder":130},[112,1756,1757],{"class":114,"line":169},[112,1758,1759],{},"    style M1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1761,1762],{"class":114,"line":175},[112,1763,1764],{},"    style M2 fill:#FFF7ED,stroke:#EA580C,stroke-width:2px\n",[112,1766,1767],{"class":114,"line":181},[112,1768,1769],{},"    style M3 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,1771,1772],{"class":114,"line":187},[112,1773,1774],{},"    style M4 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,1776,1777],{"class":114,"line":193},[112,1778,1779],{},"    style M5 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[10,1781,1782],{},[13,1783,1784,1786,1787,1790],{},[30,1785,290],{}," 演进逻辑是",[30,1788,1789],{},"每种模式解决前一种模式的局限","：工具使用只能单步 → ReAct 能循环 → 反思能自纠 → 规划能拆解 → 多智能体能分工。每一步都在前一步的基础上叠加一项新能力，而不是替换掉前一步。",[13,1792,1793],{},[30,1794,1795],{},"Tool Use（基础）→ ReAct（核心循环）→ Planning（宏观规划）→ Reflection（质量保证）→ Multi-Agent（规模化协作）",[410,1797,1798,1801,1804,1807],{},[55,1799,1800],{},"ReAct 是 Tool Use 的规范化和显式化，让工具使用变得有迹可循。",[55,1802,1803],{},"Planning 是在执行多个 ReAct 循环之前的高层战略制定。",[55,1805,1806],{},"Reflection 是对 ReAct 或 Planning 执行结果的检查与优化。",[55,1808,1809],{},"Multi-Agent 是将多个可能使用上述所有模式的 Agent 组织起来，形成一个系统。",[13,1811,1812],{},"通过上述的 Agent 模式的演进过程，它清晰地指明了\"如何一步步构建一个更强大的 Agent\"。",[10,1814,1815,1837],{},[13,1816,1817,1820,1821,1824,1825,1828,1829,1832,1833,1836],{},[30,1818,1819],{},"TIPS："," 一个真正强大的 Agent 系统，并不会只使用其中一种模式。它会根据任务的复杂性，灵活地将这些模式组合起来。例如，一个 Agent 面对一个复杂问题时，可能会先启动",[30,1822,1823],{},"规划模式","来分解任务，然后将子任务交给一个使用 ",[30,1826,1827],{},"ReAct 模式","的执行者，而这个执行者在执行过程中又会调用各种",[30,1830,1831],{},"工具","，并在遇到困难时启动",[30,1834,1835],{},"反思模式","来修正自己的策略。",[13,1838,1839],{},"这种组合和嵌套的能力，正是 Agentic 系统能够处理现实世界中各种复杂任务的关键。",[17,1841,1843],{"id":1842},"_4-代码实战","4. 代码实战",[22,1845,1847],{"id":1846},"_41-工具使用模式","4.1 工具使用模式",[102,1849,1851],{"className":104,"code":1850,"language":106,"meta":107,"style":107},"flowchart LR\n    subgraph P1[\"① 创建组件\"]\n        A1[\"LLM 模型（ChatOpenAI）\"]\n        A2[\"tools[] 工具列表\"]\n        A3[\"prompt 提示模板\"]\n    end\n    A1 --> P2\n    A2 --> P2\n    A3 --> P2\n    subgraph P2[\"② 创建 Agent\"]\n        B1[\"create_tool_calling_agent()\u003Cbr\u002F>绑定 LLM + tools + prompt\u003Cbr\u002F>输出 tool_calling_agent\u003Cbr\u002F>可自动判断何时调用工具\"]\n    end\n    subgraph P3[\"③ 创建 AgentExecutor\"]\n        C1[\"AgentExecutor(agent=, tools=, verbose=True)\u003Cbr\u002F>负责 Agent 和工具之间的协调\u003Cbr\u002F>verbose=True → 打印完整执行过程\"]\n    end\n    P1 --> P2 --> P3\n\n    subgraph P4[\"④ 执行流程（executor.invoke）\"]\n        D1[\"用户输入\"] --> D2[\"Agent 思考\u003Cbr\u002F>需要调用工具吗？\"]\n        D2 -->|需要| D3[\"调用工具 calc_total(68, 30)\"]\n        D3 --> D4[\"工具结果 2040\"]\n        D4 -->|将结果传回 Agent| D2\n        D2 -.->|不需要| D5[\"生成回复\u003Cbr\u002F>30 份共 2040 元\"]\n        D5 --> D6[\"输出结果 response[output]\"]\n    end\n\n    style P1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style P2 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style P3 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style P4 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[109,1852,1853,1857,1862,1867,1872,1877,1881,1886,1891,1896,1901,1906,1910,1915,1920,1924,1929,1933,1938,1943,1948,1953,1958,1963,1968,1972,1976,1981,1986,1991],{"__ignoreMap":107},[112,1854,1855],{"class":114,"line":115},[112,1856,118],{},[112,1858,1859],{"class":114,"line":121},[112,1860,1861],{},"    subgraph P1[\"① 创建组件\"]\n",[112,1863,1864],{"class":114,"line":127},[112,1865,1866],{},"        A1[\"LLM 模型（ChatOpenAI）\"]\n",[112,1868,1869],{"class":114,"line":134},[112,1870,1871],{},"        A2[\"tools[] 工具列表\"]\n",[112,1873,1874],{"class":114,"line":140},[112,1875,1876],{},"        A3[\"prompt 提示模板\"]\n",[112,1878,1879],{"class":114,"line":146},[112,1880,208],{},[112,1882,1883],{"class":114,"line":152},[112,1884,1885],{},"    A1 --> P2\n",[112,1887,1888],{"class":114,"line":158},[112,1889,1890],{},"    A2 --> P2\n",[112,1892,1893],{"class":114,"line":164},[112,1894,1895],{},"    A3 --> P2\n",[112,1897,1898],{"class":114,"line":169},[112,1899,1900],{},"    subgraph P2[\"② 创建 Agent\"]\n",[112,1902,1903],{"class":114,"line":175},[112,1904,1905],{},"        B1[\"create_tool_calling_agent()\u003Cbr\u002F>绑定 LLM + tools + prompt\u003Cbr\u002F>输出 tool_calling_agent\u003Cbr\u002F>可自动判断何时调用工具\"]\n",[112,1907,1908],{"class":114,"line":181},[112,1909,208],{},[112,1911,1912],{"class":114,"line":187},[112,1913,1914],{},"    subgraph P3[\"③ 创建 AgentExecutor\"]\n",[112,1916,1917],{"class":114,"line":193},[112,1918,1919],{},"        C1[\"AgentExecutor(agent=, tools=, verbose=True)\u003Cbr\u002F>负责 Agent 和工具之间的协调\u003Cbr\u002F>verbose=True → 打印完整执行过程\"]\n",[112,1921,1922],{"class":114,"line":199},[112,1923,208],{},[112,1925,1926],{"class":114,"line":205},[112,1927,1928],{},"    P1 --> P2 --> P3\n",[112,1930,1931],{"class":114,"line":211},[112,1932,131],{"emptyLinePlaceholder":130},[112,1934,1935],{"class":114,"line":216},[112,1936,1937],{},"    subgraph P4[\"④ 执行流程（executor.invoke）\"]\n",[112,1939,1940],{"class":114,"line":222},[112,1941,1942],{},"        D1[\"用户输入\"] --> D2[\"Agent 思考\u003Cbr\u002F>需要调用工具吗？\"]\n",[112,1944,1945],{"class":114,"line":227},[112,1946,1947],{},"        D2 -->|需要| D3[\"调用工具 calc_total(68, 30)\"]\n",[112,1949,1950],{"class":114,"line":233},[112,1951,1952],{},"        D3 --> D4[\"工具结果 2040\"]\n",[112,1954,1955],{"class":114,"line":239},[112,1956,1957],{},"        D4 -->|将结果传回 Agent| D2\n",[112,1959,1960],{"class":114,"line":244},[112,1961,1962],{},"        D2 -.->|不需要| D5[\"生成回复\u003Cbr\u002F>30 份共 2040 元\"]\n",[112,1964,1965],{"class":114,"line":250},[112,1966,1967],{},"        D5 --> D6[\"输出结果 response[output]\"]\n",[112,1969,1970],{"class":114,"line":256},[112,1971,208],{},[112,1973,1974],{"class":114,"line":262},[112,1975,131],{"emptyLinePlaceholder":130},[112,1977,1978],{"class":114,"line":268},[112,1979,1980],{},"    style P1 fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,1982,1983],{"class":114,"line":274},[112,1984,1985],{},"    style P2 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,1987,1988],{"class":114,"line":280},[112,1989,1990],{},"    style P3 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,1992,1994],{"class":114,"line":1993},30,[112,1995,1996],{},"    style P4 fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[10,1998,1999],{},[13,2000,2001,2003,2004,2007,2008,2011,2012,2015,2016,2018,2019,2022],{},[30,2002,290],{}," 上半部分是",[30,2005,2006],{},"装配线","：组件 → Agent → Executor，三者职责依次收敛，",[109,2009,2010],{},"AgentExecutor"," 是最终对外的执行入口；下半部分是",[30,2013,2014],{},"运行时的循环","，",[109,2017,2010],{}," 自动处理「思考 → 调用工具 → 获取结果 → 再思考」，",[109,2020,2021],{},"agent_scratchpad"," 占位符负责保存 Agent 的思考过程和工具调用历史。多工具场景下，Agent 会自动判断该用哪个工具。",[10,2024,2025],{},[13,2026,2027,2028],{},"代码位置：",[109,2029,2030],{},"agent_learn\u002Fagent_types\u002FC01_ToolUsePattern.py",[102,2032,2036],{"className":2033,"code":2034,"language":2035,"meta":107,"style":107},"language-python shiki shiki-themes github-light github-dark","from langchain_core.prompts import ChatPromptTemplate\nfrom langchain_openai import ChatOpenAI\nfrom langchain_core.tools import tool\nfrom langchain.agents import AgentExecutor, create_tool_calling_agent, create_react_agent\nfrom agent_learn.config import Config\n\nconf = Config()\n\n# 1.创建模型\nllm = ChatOpenAI(base_url=conf.base_url,\n                 api_key=conf.api_key,\n                 model=conf.model_name,\n                 temperature=0.1)\n\n# 2.定义工具\n@tool\ndef calc_total(unit_price: int, quantity: int) -> int:\n    \"\"\"用于计算总价：单价乘以数量。\"\"\"\n    print(f\"正在计算总价: {unit_price} * {quantity}\")\n    return unit_price * quantity\n\n@tool\ndef book_venue(date: str) -> str:\n    \"\"\"用于查询指定日期的场地档期。\"\"\"\n    print(f\"正在查询场地档期: {date}\")\n    if \"6月20日\" in date:\n        return \"6月20日桂花厅尚有余位，可容纳40人，报价1200元。\"\n    elif \"6月21日\" in date:\n        return \"6月21日桂花厅已订满，金桂厅可容纳20人。\"\n    else:\n        return f\"抱歉，暂时查不到'{date}'的场地档期。\"\n\n# 将工具列表放入一个变量\ntools = [calc_total, book_venue]\n\n# 3.定义一个提示模板，用于控制Agent的思考过程和工具调用\ntool_use_prompt = ChatPromptTemplate.from_messages([\n    (\"system\", \"你是一个强大的AI助手，可以访问和使用各种工具来回答问题。请根据用户的问题，决定是否需要调用工具。当需要调用工具时，请使用正确的JSON格式。\"),\n    (\"user\", \"{input}\"),\n    (\"placeholder\", \"{agent_scratchpad}\")  # 保存 Agent 的思考过程和工具调用历史\n])\n\n# 4.创建一个 LLM 能够识别和使用的 Agent\ntool_calling_agent = create_tool_calling_agent(llm, tools, tool_use_prompt)\n\n# 5.创建 Agent Executor\ntool_use_executor = AgentExecutor(\n    agent=tool_calling_agent,\n    tools=tools,\n    verbose=True  # 开启 verbose 模式，可以打印详细的执行过程\n)\n\n# 6.通用的执行函数，用于运行agent并打印结果\ndef run_agent_and_print(agent_executor, query):\n    \"\"\"一个通用函数，用于运行Agent并打印结果。\"\"\"\n    print(f\"--- 运行Agent，查询: {query} ---\")\n    response = agent_executor.invoke({\"input\": query})\n    print(f\"\\n--- Agent响应: ---\")\n    print(response.get(\"output\", \"没有找到输出。\"))\n    print(\"-\" * 30 + \"\\n\")\n\nif __name__ == \"__main__\":\n    run_agent_and_print(tool_use_executor, \"6月20日的场地还有位置吗？\")\n    run_agent_and_print(tool_use_executor, \"30乘以68等于多少？ 6月20日的场地什么情况\")\n","python",[109,2037,2038,2043,2048,2053,2058,2063,2067,2072,2076,2081,2086,2091,2096,2101,2105,2110,2115,2120,2125,2130,2135,2139,2143,2148,2153,2158,2163,2168,2173,2178,2183,2189,2194,2200,2206,2211,2217,2223,2229,2235,2241,2247,2252,2258,2264,2269,2275,2281,2287,2293,2299,2305,2310,2316,2322,2328,2334,2340,2346,2352,2358,2363,2369,2375],{"__ignoreMap":107},[112,2039,2040],{"class":114,"line":115},[112,2041,2042],{},"from langchain_core.prompts import ChatPromptTemplate\n",[112,2044,2045],{"class":114,"line":121},[112,2046,2047],{},"from langchain_openai import ChatOpenAI\n",[112,2049,2050],{"class":114,"line":127},[112,2051,2052],{},"from langchain_core.tools import tool\n",[112,2054,2055],{"class":114,"line":134},[112,2056,2057],{},"from langchain.agents import AgentExecutor, create_tool_calling_agent, create_react_agent\n",[112,2059,2060],{"class":114,"line":140},[112,2061,2062],{},"from agent_learn.config import Config\n",[112,2064,2065],{"class":114,"line":146},[112,2066,131],{"emptyLinePlaceholder":130},[112,2068,2069],{"class":114,"line":152},[112,2070,2071],{},"conf = Config()\n",[112,2073,2074],{"class":114,"line":158},[112,2075,131],{"emptyLinePlaceholder":130},[112,2077,2078],{"class":114,"line":164},[112,2079,2080],{},"# 1.创建模型\n",[112,2082,2083],{"class":114,"line":169},[112,2084,2085],{},"llm = ChatOpenAI(base_url=conf.base_url,\n",[112,2087,2088],{"class":114,"line":175},[112,2089,2090],{},"                 api_key=conf.api_key,\n",[112,2092,2093],{"class":114,"line":181},[112,2094,2095],{},"                 model=conf.model_name,\n",[112,2097,2098],{"class":114,"line":187},[112,2099,2100],{},"                 temperature=0.1)\n",[112,2102,2103],{"class":114,"line":193},[112,2104,131],{"emptyLinePlaceholder":130},[112,2106,2107],{"class":114,"line":199},[112,2108,2109],{},"# 2.定义工具\n",[112,2111,2112],{"class":114,"line":205},[112,2113,2114],{},"@tool\n",[112,2116,2117],{"class":114,"line":211},[112,2118,2119],{},"def calc_total(unit_price: int, quantity: int) -> int:\n",[112,2121,2122],{"class":114,"line":216},[112,2123,2124],{},"    \"\"\"用于计算总价：单价乘以数量。\"\"\"\n",[112,2126,2127],{"class":114,"line":222},[112,2128,2129],{},"    print(f\"正在计算总价: {unit_price} * {quantity}\")\n",[112,2131,2132],{"class":114,"line":227},[112,2133,2134],{},"    return unit_price * quantity\n",[112,2136,2137],{"class":114,"line":233},[112,2138,131],{"emptyLinePlaceholder":130},[112,2140,2141],{"class":114,"line":239},[112,2142,2114],{},[112,2144,2145],{"class":114,"line":244},[112,2146,2147],{},"def book_venue(date: str) -> str:\n",[112,2149,2150],{"class":114,"line":250},[112,2151,2152],{},"    \"\"\"用于查询指定日期的场地档期。\"\"\"\n",[112,2154,2155],{"class":114,"line":256},[112,2156,2157],{},"    print(f\"正在查询场地档期: {date}\")\n",[112,2159,2160],{"class":114,"line":262},[112,2161,2162],{},"    if \"6月20日\" in date:\n",[112,2164,2165],{"class":114,"line":268},[112,2166,2167],{},"        return \"6月20日桂花厅尚有余位，可容纳40人，报价1200元。\"\n",[112,2169,2170],{"class":114,"line":274},[112,2171,2172],{},"    elif \"6月21日\" in date:\n",[112,2174,2175],{"class":114,"line":280},[112,2176,2177],{},"        return \"6月21日桂花厅已订满，金桂厅可容纳20人。\"\n",[112,2179,2180],{"class":114,"line":1993},[112,2181,2182],{},"    else:\n",[112,2184,2186],{"class":114,"line":2185},31,[112,2187,2188],{},"        return f\"抱歉，暂时查不到'{date}'的场地档期。\"\n",[112,2190,2192],{"class":114,"line":2191},32,[112,2193,131],{"emptyLinePlaceholder":130},[112,2195,2197],{"class":114,"line":2196},33,[112,2198,2199],{},"# 将工具列表放入一个变量\n",[112,2201,2203],{"class":114,"line":2202},34,[112,2204,2205],{},"tools = [calc_total, book_venue]\n",[112,2207,2209],{"class":114,"line":2208},35,[112,2210,131],{"emptyLinePlaceholder":130},[112,2212,2214],{"class":114,"line":2213},36,[112,2215,2216],{},"# 3.定义一个提示模板，用于控制Agent的思考过程和工具调用\n",[112,2218,2220],{"class":114,"line":2219},37,[112,2221,2222],{},"tool_use_prompt = ChatPromptTemplate.from_messages([\n",[112,2224,2226],{"class":114,"line":2225},38,[112,2227,2228],{},"    (\"system\", \"你是一个强大的AI助手，可以访问和使用各种工具来回答问题。请根据用户的问题，决定是否需要调用工具。当需要调用工具时，请使用正确的JSON格式。\"),\n",[112,2230,2232],{"class":114,"line":2231},39,[112,2233,2234],{},"    (\"user\", \"{input}\"),\n",[112,2236,2238],{"class":114,"line":2237},40,[112,2239,2240],{},"    (\"placeholder\", \"{agent_scratchpad}\")  # 保存 Agent 的思考过程和工具调用历史\n",[112,2242,2244],{"class":114,"line":2243},41,[112,2245,2246],{},"])\n",[112,2248,2250],{"class":114,"line":2249},42,[112,2251,131],{"emptyLinePlaceholder":130},[112,2253,2255],{"class":114,"line":2254},43,[112,2256,2257],{},"# 4.创建一个 LLM 能够识别和使用的 Agent\n",[112,2259,2261],{"class":114,"line":2260},44,[112,2262,2263],{},"tool_calling_agent = create_tool_calling_agent(llm, tools, tool_use_prompt)\n",[112,2265,2267],{"class":114,"line":2266},45,[112,2268,131],{"emptyLinePlaceholder":130},[112,2270,2272],{"class":114,"line":2271},46,[112,2273,2274],{},"# 5.创建 Agent Executor\n",[112,2276,2278],{"class":114,"line":2277},47,[112,2279,2280],{},"tool_use_executor = AgentExecutor(\n",[112,2282,2284],{"class":114,"line":2283},48,[112,2285,2286],{},"    agent=tool_calling_agent,\n",[112,2288,2290],{"class":114,"line":2289},49,[112,2291,2292],{},"    tools=tools,\n",[112,2294,2296],{"class":114,"line":2295},50,[112,2297,2298],{},"    verbose=True  # 开启 verbose 模式，可以打印详细的执行过程\n",[112,2300,2302],{"class":114,"line":2301},51,[112,2303,2304],{},")\n",[112,2306,2308],{"class":114,"line":2307},52,[112,2309,131],{"emptyLinePlaceholder":130},[112,2311,2313],{"class":114,"line":2312},53,[112,2314,2315],{},"# 6.通用的执行函数，用于运行agent并打印结果\n",[112,2317,2319],{"class":114,"line":2318},54,[112,2320,2321],{},"def run_agent_and_print(agent_executor, query):\n",[112,2323,2325],{"class":114,"line":2324},55,[112,2326,2327],{},"    \"\"\"一个通用函数，用于运行Agent并打印结果。\"\"\"\n",[112,2329,2331],{"class":114,"line":2330},56,[112,2332,2333],{},"    print(f\"--- 运行Agent，查询: {query} ---\")\n",[112,2335,2337],{"class":114,"line":2336},57,[112,2338,2339],{},"    response = agent_executor.invoke({\"input\": query})\n",[112,2341,2343],{"class":114,"line":2342},58,[112,2344,2345],{},"    print(f\"\\n--- Agent响应: ---\")\n",[112,2347,2349],{"class":114,"line":2348},59,[112,2350,2351],{},"    print(response.get(\"output\", \"没有找到输出。\"))\n",[112,2353,2355],{"class":114,"line":2354},60,[112,2356,2357],{},"    print(\"-\" * 30 + \"\\n\")\n",[112,2359,2361],{"class":114,"line":2360},61,[112,2362,131],{"emptyLinePlaceholder":130},[112,2364,2366],{"class":114,"line":2365},62,[112,2367,2368],{},"if __name__ == \"__main__\":\n",[112,2370,2372],{"class":114,"line":2371},63,[112,2373,2374],{},"    run_agent_and_print(tool_use_executor, \"6月20日的场地还有位置吗？\")\n",[112,2376,2378],{"class":114,"line":2377},64,[112,2379,2380],{},"    run_agent_and_print(tool_use_executor, \"30乘以68等于多少？ 6月20日的场地什么情况\")\n",[22,2382,2384],{"id":2383},"_42-react-模式","4.2 ReAct 模式",[102,2386,2388],{"className":104,"code":2387,"language":106,"meta":107,"style":107},"flowchart TD\n    T[\"ReAct Prompt 模板\u003Cbr\u002F>react_prompt_template\"]\n    R[\"📘 角色定义\u003Cbr\u002F>你是一个有用的 AI 助手，可以访问以下工具：{tools}\"]\n    RULE[\"📗 ReAct 规则（5 条）\u003Cbr\u002F>1. 每次输出只能包含一个动作或一个最终答案\u003Cbr\u002F>2. 多任务时依次处理，不要一次性输出所有步骤\u003Cbr\u002F>3. 每次行动前说明思考（Thought）\u003Cbr\u002F>4. 需用工具时格式：Thought → Action → Action Input\u003Cbr\u002F>5. 可直接回答时格式：Thought → Final Answer\"]\n    FMT[\"📙 工具调用格式\u003Cbr\u002F>Thought: [你的思考]\u003Cbr\u002F>Action: [工具名称]\u003Cbr\u002F>Action Input: [输入参数，例 100,25]\"]\n    FIN[\"📘 最终答案格式\u003Cbr\u002F>Thought: [你的思考]\u003Cbr\u002F>Final Answer: [最终答案]\u003Cbr\u002F>所有任务完成后输出\"]\n    VAR[\"🔖 动态占位符\u003Cbr\u002F>{input} 用户输入 | {agent_scratchpad} Agent 的思考历史\"]\n\n    T --> R --> RULE\n    RULE --> FMT\n    RULE --> FIN\n    FMT --> VAR\n    FIN --> VAR\n    VAR -->|循环迭代| RULE\n\n    style T fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style R fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style RULE fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style FMT fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style FIN fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style VAR fill:#FDF2F8,stroke:#DB2777,stroke-width:2px\n",[109,2389,2390,2394,2399,2404,2409,2414,2419,2424,2428,2433,2438,2443,2448,2453,2458,2462,2467,2472,2477,2482,2487],{"__ignoreMap":107},[112,2391,2392],{"class":114,"line":115},[112,2393,920],{},[112,2395,2396],{"class":114,"line":121},[112,2397,2398],{},"    T[\"ReAct Prompt 模板\u003Cbr\u002F>react_prompt_template\"]\n",[112,2400,2401],{"class":114,"line":127},[112,2402,2403],{},"    R[\"📘 角色定义\u003Cbr\u002F>你是一个有用的 AI 助手，可以访问以下工具：{tools}\"]\n",[112,2405,2406],{"class":114,"line":134},[112,2407,2408],{},"    RULE[\"📗 ReAct 规则（5 条）\u003Cbr\u002F>1. 每次输出只能包含一个动作或一个最终答案\u003Cbr\u002F>2. 多任务时依次处理，不要一次性输出所有步骤\u003Cbr\u002F>3. 每次行动前说明思考（Thought）\u003Cbr\u002F>4. 需用工具时格式：Thought → Action → Action Input\u003Cbr\u002F>5. 可直接回答时格式：Thought → Final Answer\"]\n",[112,2410,2411],{"class":114,"line":140},[112,2412,2413],{},"    FMT[\"📙 工具调用格式\u003Cbr\u002F>Thought: [你的思考]\u003Cbr\u002F>Action: [工具名称]\u003Cbr\u002F>Action Input: [输入参数，例 100,25]\"]\n",[112,2415,2416],{"class":114,"line":146},[112,2417,2418],{},"    FIN[\"📘 最终答案格式\u003Cbr\u002F>Thought: [你的思考]\u003Cbr\u002F>Final Answer: [最终答案]\u003Cbr\u002F>所有任务完成后输出\"]\n",[112,2420,2421],{"class":114,"line":152},[112,2422,2423],{},"    VAR[\"🔖 动态占位符\u003Cbr\u002F>{input} 用户输入 | {agent_scratchpad} Agent 的思考历史\"]\n",[112,2425,2426],{"class":114,"line":158},[112,2427,131],{"emptyLinePlaceholder":130},[112,2429,2430],{"class":114,"line":164},[112,2431,2432],{},"    T --> R --> RULE\n",[112,2434,2435],{"class":114,"line":169},[112,2436,2437],{},"    RULE --> FMT\n",[112,2439,2440],{"class":114,"line":175},[112,2441,2442],{},"    RULE --> FIN\n",[112,2444,2445],{"class":114,"line":181},[112,2446,2447],{},"    FMT --> VAR\n",[112,2449,2450],{"class":114,"line":187},[112,2451,2452],{},"    FIN --> VAR\n",[112,2454,2455],{"class":114,"line":193},[112,2456,2457],{},"    VAR -->|循环迭代| RULE\n",[112,2459,2460],{"class":114,"line":199},[112,2461,131],{"emptyLinePlaceholder":130},[112,2463,2464],{"class":114,"line":205},[112,2465,2466],{},"    style T fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[112,2468,2469],{"class":114,"line":211},[112,2470,2471],{},"    style R fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,2473,2474],{"class":114,"line":216},[112,2475,2476],{},"    style RULE fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,2478,2479],{"class":114,"line":222},[112,2480,2481],{},"    style FMT fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,2483,2484],{"class":114,"line":227},[112,2485,2486],{},"    style FIN fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,2488,2489],{"class":114,"line":233},[112,2490,2491],{},"    style VAR fill:#FDF2F8,stroke:#DB2777,stroke-width:2px\n",[10,2493,2494],{},[13,2495,2496,2498,2499,2502,2503,2506,2507,2510,2511,2514,2515,2518,2519,2521,2522],{},[30,2497,290],{}," 一份 ReAct Prompt 由四块构成：",[30,2500,2501],{},"角色定义","（告诉模型有哪些工具）、",[30,2504,2505],{},"5 条规则","（约束输出格式与节奏）、",[30,2508,2509],{},"两套输出格式","（工具调用 vs 最终答案），以及",[30,2512,2513],{},"动态占位符","（",[109,2516,2517],{},"input"," 是用户输入，",[109,2520,2021],{}," 是思考历史）。那条从占位符回到规则的粉色箭头就是循环迭代的入口。",[30,2523,2524],{},"与工具调用模式的关键区别：ReAct 显式要求 Thought-Action-Observation 循环，每一步都有可见的思考过程。",[10,2526,2527],{},[13,2528,2027,2529],{},[109,2530,2531],{},"agent_learn\u002Fagent_types\u002FC02_ReActPattern.py",[102,2533,2535],{"className":2033,"code":2534,"language":2035,"meta":107,"style":107},"from langchain_openai import ChatOpenAI\nfrom langchain_core.tools import tool\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain.agents import AgentExecutor, create_react_agent\nfrom agent_learn.config import Config\n\nconf = Config()\n\n# 1.创建模型\nllm = ChatOpenAI(base_url=conf.base_url,\n                 api_key=conf.api_key,\n                 model=conf.model_name,\n                 temperature=0.1)\n\n# 2.定义工具\n# 关键修改：重写 calc_total 工具，使其只接受一个字符串参数，并在内部解析。\n@tool\ndef calc_total(pair_str: str) -> int:\n    \"\"\"用于计算总价：单价乘以数量。\n\n    参数:\n        pair_str (str): 包含单价和数量两个整数，用逗号分隔，例如：\"68,30\"。\n    返回:\n        int: 总价。\n    \"\"\"\n    print(f\"正在计算总价: {pair_str}\")\n    try:\n        price_str, qty_str = pair_str.split(',')\n        unit_price = int(price_str.strip())\n        quantity = int(qty_str.strip())\n        return unit_price * quantity\n    except ValueError:\n        return \"输入的格式不正确，请确保是两个用逗号分隔的整数，例如：'68,30'\"\n\n@tool\ndef book_venue(date: str) -> str:\n    \"\"\"用于查询指定日期的场地档期。\"\"\"\n    print(f\"正在查询场地档期: {date}\")\n    if \"6月20日\" in date:\n        return \"6月20日桂花厅尚有余位，可容纳40人，报价1200元。\"\n    elif \"6月21日\" in date:\n        return \"6月21日桂花厅已订满，金桂厅可容纳20人。\"\n    else:\n        return f\"抱歉，暂时查不到'{date}'的场地档期。\"\n\ntools = [calc_total, book_venue]\n\n# 3.自定义 ReAct 风格的 Prompt\nreact_prompt_template = \"\"\"你是一个有用的 AI 助手，可以访问以下工具：\n\n{tools}\n\n请根据用户输入一步步推理，并按以下规则操作：\n1. 每次输出只能包含一个动作（Action 和 Action Input）或一个最终答案（Final Answer）。\n2. 如果用户输入包含多个任务，依次处理每个任务，不要一次性输出所有步骤。\n3. 每次行动前，说明你的思考（Thought），并选择合适的工具或直接给出最终答案。\n4. 如果需要使用工具，格式必须为：\n   Thought: [你的思考]\n   Action: [工具名称]\n   Action Input: [工具的输入参数，例如对于calc_total工具，使用'68,30'格式]\n5. 如果可以直接回答或所有任务都完成，格式为：\n   Thought: [你的思考]\n   Final Answer: [最终答案]\n\n可用的工具名称有: {tool_names}\n\n用户输入: {input}\n{agent_scratchpad}\n\"\"\"\n\nreact_prompt = ChatPromptTemplate.from_template(react_prompt_template)\n\n# 4.创建 ReAct 风格的 Agent\nreact_agent = create_react_agent(llm, tools, react_prompt)\n\n# 5.创建 Agent Executor\nreact_executor = AgentExecutor(\n    agent=react_agent,\n    tools=tools,\n    verbose=True,\n    handle_parsing_errors=True  # 启用错误处理，自动重试解析错误\n)\n\n# 6.运行并测试 Agent\nif __name__ == \"__main__\":\n    response_venue = react_executor.invoke({\"input\": \"6月20日的场地还有位置吗？\"})\n    print(response_venue.get(\"output\", \"没有找到输出。\"))\n\n    response_price = react_executor.invoke({\"input\": \"68乘以30等于多少？\"})\n    print(response_price.get(\"output\", \"没有找到输出。\"))\n\n    response_multi = react_executor.invoke({\"input\": \"68乘以30等于多少？ 6月20日的场地什么情况？\"})\n    print(response_multi.get(\"output\", \"没有找到输出。\"))\n",[109,2536,2537,2541,2545,2549,2554,2558,2562,2566,2570,2574,2578,2582,2586,2590,2594,2598,2603,2607,2612,2617,2621,2626,2631,2636,2641,2646,2651,2656,2661,2666,2671,2676,2681,2686,2690,2694,2698,2702,2706,2710,2714,2718,2722,2726,2730,2734,2738,2742,2747,2752,2756,2761,2765,2770,2775,2780,2785,2790,2795,2800,2805,2810,2814,2819,2823,2829,2834,2840,2846,2852,2857,2863,2868,2874,2880,2885,2890,2896,2902,2907,2913,2919,2924,2929,2935,2940,2946,2952,2957,2963,2969,2974,2980],{"__ignoreMap":107},[112,2538,2539],{"class":114,"line":115},[112,2540,2047],{},[112,2542,2543],{"class":114,"line":121},[112,2544,2052],{},[112,2546,2547],{"class":114,"line":127},[112,2548,2042],{},[112,2550,2551],{"class":114,"line":134},[112,2552,2553],{},"from langchain.agents import AgentExecutor, create_react_agent\n",[112,2555,2556],{"class":114,"line":140},[112,2557,2062],{},[112,2559,2560],{"class":114,"line":146},[112,2561,131],{"emptyLinePlaceholder":130},[112,2563,2564],{"class":114,"line":152},[112,2565,2071],{},[112,2567,2568],{"class":114,"line":158},[112,2569,131],{"emptyLinePlaceholder":130},[112,2571,2572],{"class":114,"line":164},[112,2573,2080],{},[112,2575,2576],{"class":114,"line":169},[112,2577,2085],{},[112,2579,2580],{"class":114,"line":175},[112,2581,2090],{},[112,2583,2584],{"class":114,"line":181},[112,2585,2095],{},[112,2587,2588],{"class":114,"line":187},[112,2589,2100],{},[112,2591,2592],{"class":114,"line":193},[112,2593,131],{"emptyLinePlaceholder":130},[112,2595,2596],{"class":114,"line":199},[112,2597,2109],{},[112,2599,2600],{"class":114,"line":205},[112,2601,2602],{},"# 关键修改：重写 calc_total 工具，使其只接受一个字符串参数，并在内部解析。\n",[112,2604,2605],{"class":114,"line":211},[112,2606,2114],{},[112,2608,2609],{"class":114,"line":216},[112,2610,2611],{},"def calc_total(pair_str: str) -> int:\n",[112,2613,2614],{"class":114,"line":222},[112,2615,2616],{},"    \"\"\"用于计算总价：单价乘以数量。\n",[112,2618,2619],{"class":114,"line":227},[112,2620,131],{"emptyLinePlaceholder":130},[112,2622,2623],{"class":114,"line":233},[112,2624,2625],{},"    参数:\n",[112,2627,2628],{"class":114,"line":239},[112,2629,2630],{},"        pair_str (str): 包含单价和数量两个整数，用逗号分隔，例如：\"68,30\"。\n",[112,2632,2633],{"class":114,"line":244},[112,2634,2635],{},"    返回:\n",[112,2637,2638],{"class":114,"line":250},[112,2639,2640],{},"        int: 总价。\n",[112,2642,2643],{"class":114,"line":256},[112,2644,2645],{},"    \"\"\"\n",[112,2647,2648],{"class":114,"line":262},[112,2649,2650],{},"    print(f\"正在计算总价: {pair_str}\")\n",[112,2652,2653],{"class":114,"line":268},[112,2654,2655],{},"    try:\n",[112,2657,2658],{"class":114,"line":274},[112,2659,2660],{},"        price_str, qty_str = pair_str.split(',')\n",[112,2662,2663],{"class":114,"line":280},[112,2664,2665],{},"        unit_price = int(price_str.strip())\n",[112,2667,2668],{"class":114,"line":1993},[112,2669,2670],{},"        quantity = int(qty_str.strip())\n",[112,2672,2673],{"class":114,"line":2185},[112,2674,2675],{},"        return unit_price * quantity\n",[112,2677,2678],{"class":114,"line":2191},[112,2679,2680],{},"    except ValueError:\n",[112,2682,2683],{"class":114,"line":2196},[112,2684,2685],{},"        return \"输入的格式不正确，请确保是两个用逗号分隔的整数，例如：'68,30'\"\n",[112,2687,2688],{"class":114,"line":2202},[112,2689,131],{"emptyLinePlaceholder":130},[112,2691,2692],{"class":114,"line":2208},[112,2693,2114],{},[112,2695,2696],{"class":114,"line":2213},[112,2697,2147],{},[112,2699,2700],{"class":114,"line":2219},[112,2701,2152],{},[112,2703,2704],{"class":114,"line":2225},[112,2705,2157],{},[112,2707,2708],{"class":114,"line":2231},[112,2709,2162],{},[112,2711,2712],{"class":114,"line":2237},[112,2713,2167],{},[112,2715,2716],{"class":114,"line":2243},[112,2717,2172],{},[112,2719,2720],{"class":114,"line":2249},[112,2721,2177],{},[112,2723,2724],{"class":114,"line":2254},[112,2725,2182],{},[112,2727,2728],{"class":114,"line":2260},[112,2729,2188],{},[112,2731,2732],{"class":114,"line":2266},[112,2733,131],{"emptyLinePlaceholder":130},[112,2735,2736],{"class":114,"line":2271},[112,2737,2205],{},[112,2739,2740],{"class":114,"line":2277},[112,2741,131],{"emptyLinePlaceholder":130},[112,2743,2744],{"class":114,"line":2283},[112,2745,2746],{},"# 3.自定义 ReAct 风格的 Prompt\n",[112,2748,2749],{"class":114,"line":2289},[112,2750,2751],{},"react_prompt_template = \"\"\"你是一个有用的 AI 助手，可以访问以下工具：\n",[112,2753,2754],{"class":114,"line":2295},[112,2755,131],{"emptyLinePlaceholder":130},[112,2757,2758],{"class":114,"line":2301},[112,2759,2760],{},"{tools}\n",[112,2762,2763],{"class":114,"line":2307},[112,2764,131],{"emptyLinePlaceholder":130},[112,2766,2767],{"class":114,"line":2312},[112,2768,2769],{},"请根据用户输入一步步推理，并按以下规则操作：\n",[112,2771,2772],{"class":114,"line":2318},[112,2773,2774],{},"1. 每次输出只能包含一个动作（Action 和 Action Input）或一个最终答案（Final Answer）。\n",[112,2776,2777],{"class":114,"line":2324},[112,2778,2779],{},"2. 如果用户输入包含多个任务，依次处理每个任务，不要一次性输出所有步骤。\n",[112,2781,2782],{"class":114,"line":2330},[112,2783,2784],{},"3. 每次行动前，说明你的思考（Thought），并选择合适的工具或直接给出最终答案。\n",[112,2786,2787],{"class":114,"line":2336},[112,2788,2789],{},"4. 如果需要使用工具，格式必须为：\n",[112,2791,2792],{"class":114,"line":2342},[112,2793,2794],{},"   Thought: [你的思考]\n",[112,2796,2797],{"class":114,"line":2348},[112,2798,2799],{},"   Action: [工具名称]\n",[112,2801,2802],{"class":114,"line":2354},[112,2803,2804],{},"   Action Input: [工具的输入参数，例如对于calc_total工具，使用'68,30'格式]\n",[112,2806,2807],{"class":114,"line":2360},[112,2808,2809],{},"5. 如果可以直接回答或所有任务都完成，格式为：\n",[112,2811,2812],{"class":114,"line":2365},[112,2813,2794],{},[112,2815,2816],{"class":114,"line":2371},[112,2817,2818],{},"   Final Answer: [最终答案]\n",[112,2820,2821],{"class":114,"line":2377},[112,2822,131],{"emptyLinePlaceholder":130},[112,2824,2826],{"class":114,"line":2825},65,[112,2827,2828],{},"可用的工具名称有: {tool_names}\n",[112,2830,2832],{"class":114,"line":2831},66,[112,2833,131],{"emptyLinePlaceholder":130},[112,2835,2837],{"class":114,"line":2836},67,[112,2838,2839],{},"用户输入: {input}\n",[112,2841,2843],{"class":114,"line":2842},68,[112,2844,2845],{},"{agent_scratchpad}\n",[112,2847,2849],{"class":114,"line":2848},69,[112,2850,2851],{},"\"\"\"\n",[112,2853,2855],{"class":114,"line":2854},70,[112,2856,131],{"emptyLinePlaceholder":130},[112,2858,2860],{"class":114,"line":2859},71,[112,2861,2862],{},"react_prompt = ChatPromptTemplate.from_template(react_prompt_template)\n",[112,2864,2866],{"class":114,"line":2865},72,[112,2867,131],{"emptyLinePlaceholder":130},[112,2869,2871],{"class":114,"line":2870},73,[112,2872,2873],{},"# 4.创建 ReAct 风格的 Agent\n",[112,2875,2877],{"class":114,"line":2876},74,[112,2878,2879],{},"react_agent = create_react_agent(llm, tools, react_prompt)\n",[112,2881,2883],{"class":114,"line":2882},75,[112,2884,131],{"emptyLinePlaceholder":130},[112,2886,2888],{"class":114,"line":2887},76,[112,2889,2274],{},[112,2891,2893],{"class":114,"line":2892},77,[112,2894,2895],{},"react_executor = AgentExecutor(\n",[112,2897,2899],{"class":114,"line":2898},78,[112,2900,2901],{},"    agent=react_agent,\n",[112,2903,2905],{"class":114,"line":2904},79,[112,2906,2292],{},[112,2908,2910],{"class":114,"line":2909},80,[112,2911,2912],{},"    verbose=True,\n",[112,2914,2916],{"class":114,"line":2915},81,[112,2917,2918],{},"    handle_parsing_errors=True  # 启用错误处理，自动重试解析错误\n",[112,2920,2922],{"class":114,"line":2921},82,[112,2923,2304],{},[112,2925,2927],{"class":114,"line":2926},83,[112,2928,131],{"emptyLinePlaceholder":130},[112,2930,2932],{"class":114,"line":2931},84,[112,2933,2934],{},"# 6.运行并测试 Agent\n",[112,2936,2938],{"class":114,"line":2937},85,[112,2939,2368],{},[112,2941,2943],{"class":114,"line":2942},86,[112,2944,2945],{},"    response_venue = react_executor.invoke({\"input\": \"6月20日的场地还有位置吗？\"})\n",[112,2947,2949],{"class":114,"line":2948},87,[112,2950,2951],{},"    print(response_venue.get(\"output\", \"没有找到输出。\"))\n",[112,2953,2955],{"class":114,"line":2954},88,[112,2956,131],{"emptyLinePlaceholder":130},[112,2958,2960],{"class":114,"line":2959},89,[112,2961,2962],{},"    response_price = react_executor.invoke({\"input\": \"68乘以30等于多少？\"})\n",[112,2964,2966],{"class":114,"line":2965},90,[112,2967,2968],{},"    print(response_price.get(\"output\", \"没有找到输出。\"))\n",[112,2970,2972],{"class":114,"line":2971},91,[112,2973,131],{"emptyLinePlaceholder":130},[112,2975,2977],{"class":114,"line":2976},92,[112,2978,2979],{},"    response_multi = react_executor.invoke({\"input\": \"68乘以30等于多少？ 6月20日的场地什么情况？\"})\n",[112,2981,2983],{"class":114,"line":2982},93,[112,2984,2985],{},"    print(response_multi.get(\"output\", \"没有找到输出。\"))\n",[22,2987,2989],{"id":2988},"_43-反思模式","4.3 反思模式",[102,2991,2993],{"className":104,"code":2992,"language":106,"meta":107,"style":107},"flowchart LR\n    Q[\"用户查询\u003Cbr\u002F>question\"] --> C1[\"initial_response_chain\u003Cbr\u002F>prompt | llm | StrOutputParser\u003Cbr\u002F>请根据问题给出初步回答\"]\n    C1 --> R1[\"初步响应\u003Cbr\u002F>initial_response\u003Cbr\u002F>可能不够完善\"]\n    F[\"用户反馈\u003Cbr\u002F>user_feedback\u003Cbr\u002F>太简单了，详细解释…\"]\n    R1 --> IN[\"输入参数\u003Cbr\u002F>previous_response\u003Cbr\u002F>user_feedback\"]\n    F --> IN\n    IN --> C2[\"reflection_chain\u003Cbr\u002F>prompt | llm | StrOutputParser\u003Cbr\u002F>根据反馈，反思之前的回答\"]\n    C2 --> R2[\"优化后的回答\u003Cbr\u002F>refined_response\u003Cbr\u002F>更准确、更完善\"]\n\n    style Q fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style C1 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style R1 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style F fill:#FDF2F8,stroke:#DB2777,stroke-width:2px\n    style IN fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style C2 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style R2 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[109,2994,2995,2999,3004,3009,3014,3019,3024,3029,3034,3038,3043,3048,3053,3058,3063,3068],{"__ignoreMap":107},[112,2996,2997],{"class":114,"line":115},[112,2998,118],{},[112,3000,3001],{"class":114,"line":121},[112,3002,3003],{},"    Q[\"用户查询\u003Cbr\u002F>question\"] --> C1[\"initial_response_chain\u003Cbr\u002F>prompt | llm | StrOutputParser\u003Cbr\u002F>请根据问题给出初步回答\"]\n",[112,3005,3006],{"class":114,"line":127},[112,3007,3008],{},"    C1 --> R1[\"初步响应\u003Cbr\u002F>initial_response\u003Cbr\u002F>可能不够完善\"]\n",[112,3010,3011],{"class":114,"line":134},[112,3012,3013],{},"    F[\"用户反馈\u003Cbr\u002F>user_feedback\u003Cbr\u002F>太简单了，详细解释…\"]\n",[112,3015,3016],{"class":114,"line":140},[112,3017,3018],{},"    R1 --> IN[\"输入参数\u003Cbr\u002F>previous_response\u003Cbr\u002F>user_feedback\"]\n",[112,3020,3021],{"class":114,"line":146},[112,3022,3023],{},"    F --> IN\n",[112,3025,3026],{"class":114,"line":152},[112,3027,3028],{},"    IN --> C2[\"reflection_chain\u003Cbr\u002F>prompt | llm | StrOutputParser\u003Cbr\u002F>根据反馈，反思之前的回答\"]\n",[112,3030,3031],{"class":114,"line":158},[112,3032,3033],{},"    C2 --> R2[\"优化后的回答\u003Cbr\u002F>refined_response\u003Cbr\u002F>更准确、更完善\"]\n",[112,3035,3036],{"class":114,"line":164},[112,3037,131],{"emptyLinePlaceholder":130},[112,3039,3040],{"class":114,"line":169},[112,3041,3042],{},"    style Q fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[112,3044,3045],{"class":114,"line":175},[112,3046,3047],{},"    style C1 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,3049,3050],{"class":114,"line":181},[112,3051,3052],{},"    style R1 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,3054,3055],{"class":114,"line":187},[112,3056,3057],{},"    style F fill:#FDF2F8,stroke:#DB2777,stroke-width:2px\n",[112,3059,3060],{"class":114,"line":193},[112,3061,3062],{},"    style IN fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,3064,3065],{"class":114,"line":199},[112,3066,3067],{},"    style C2 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,3069,3070],{"class":114,"line":205},[112,3071,3072],{},"    style R2 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[10,3074,3075],{},[13,3076,3077,3079,3080,2514,3083,3086,3087,3090,3091,3094,3095,3098],{},[30,3078,290],{}," 反思模式其实是",[30,3081,3082],{},"两条 LC 链",[109,3084,3085],{},"prompt | llm | StrOutputParser","）：第一条 ",[109,3088,3089],{},"initial_response_chain"," 负责出初稿，第二条 ",[109,3092,3093],{},"reflection_chain"," 接收\"初稿 + 反馈\"两个输入后产出优化稿。",[30,3096,3097],{},"注意它没有调用任何外部工具","——对比工具调用模式，这里全靠 LLM 自我评估 + 修正，是典型的两阶段 LLM Chain。",[10,3100,3101],{},[13,3102,2027,3103],{},[109,3104,3105],{},"agent_learn\u002Fagent_types\u002FC03_ReflectionPattern.py",[102,3107,3109],{"className":2033,"code":3108,"language":2035,"meta":107,"style":107},"from langchain_openai import ChatOpenAI\nfrom langchain_core.prompts import ChatPromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\nfrom agent_learn.config import Config\n\nconf = Config()\n\n# 1.创建模型\nllm = ChatOpenAI(base_url=conf.base_url,\n                 api_key=conf.api_key,\n                 model=conf.model_name,\n                 temperature=0.1)\n\n# 3.初始响应 Prompt: 用于生成第一次的回答\ninitial_response_prompt = ChatPromptTemplate.from_template(\n    \"请根据以下问题给出你的初步回答: {question}\"\n)\ninitial_response_chain = initial_response_prompt | llm | StrOutputParser()\n\n# 4.反思 Prompt: 用于接收用户反馈并优化回答\nreflection_prompt = ChatPromptTemplate.from_template(\n    \"\"\"你是一个专业的、善于反思的AI助手。你之前给出了以下回答：\n---\n{previous_response}\n---\n现在，你收到了用户对你的回答给出的反馈：\n---\n{user_feedback}\n---\n请根据用户的反馈，认真反思你之前的回答，并生成一个更准确、更完善的新回答。\n新回答:\"\"\"\n)\nreflection_chain = reflection_prompt | llm | StrOutputParser()\n\n# 5.模拟反射过程\ndef reflect_and_refine(query: str, feedback: str):\n    \"\"\"模拟一个完整的反射过程，从初始响应到优化后的响应。\"\"\"\n\n    print(\"--- 启动反射模式 ---\")\n    print(f\"用户查询: {query}\")\n\n    # LLM 生成初步响应\n    print(\"\\n生成初步响应...\")\n    initial_response = initial_response_chain.invoke({\"question\": query})\n    print(f\"LLM 初步响应:\\n{initial_response}\")\n\n    # 模拟用户反馈\n    print(f\"\\n用户反馈:\\n{feedback}\")\n\n    # LLM 进行反思，并生成新的回答\n    print(\"\\nLLM 正在反思并生成新响应...\")\n    refined_response = reflection_chain.invoke({\n        \"previous_response\": initial_response,\n        \"user_feedback\": feedback\n    })\n\n    print(\"\\n--- LLM 经过反思后的新响应 ---\")\n    print(refined_response)\n\n    return refined_response\n\n# 6.运行并测试\nif __name__ == \"__main__\":\n    # 模拟用户查询\n    initial_question = \"请用一句话介绍一下什么是 RAG。\"\n    # 模拟用户反馈，指出初步回答的不足\n    user_feedback_text = \"太笼统了，请展开说明检索和生成这两步是怎么配合的，最好举一个实际的问答例子。\"\n    # 运行反射过程\n    reflect_and_refine(initial_question, user_feedback_text)\n",[109,3110,3111,3115,3119,3124,3128,3132,3136,3140,3144,3148,3152,3156,3160,3164,3169,3174,3179,3183,3188,3192,3197,3202,3207,3212,3217,3221,3226,3230,3235,3239,3244,3249,3253,3258,3262,3267,3272,3277,3281,3286,3291,3295,3300,3305,3310,3315,3319,3324,3329,3333,3338,3343,3348,3353,3358,3363,3367,3372,3377,3381,3386,3390,3395,3399,3404,3409,3414,3419,3424],{"__ignoreMap":107},[112,3112,3113],{"class":114,"line":115},[112,3114,2047],{},[112,3116,3117],{"class":114,"line":121},[112,3118,2042],{},[112,3120,3121],{"class":114,"line":127},[112,3122,3123],{},"from langchain_core.output_parsers import StrOutputParser\n",[112,3125,3126],{"class":114,"line":134},[112,3127,2062],{},[112,3129,3130],{"class":114,"line":140},[112,3131,131],{"emptyLinePlaceholder":130},[112,3133,3134],{"class":114,"line":146},[112,3135,2071],{},[112,3137,3138],{"class":114,"line":152},[112,3139,131],{"emptyLinePlaceholder":130},[112,3141,3142],{"class":114,"line":158},[112,3143,2080],{},[112,3145,3146],{"class":114,"line":164},[112,3147,2085],{},[112,3149,3150],{"class":114,"line":169},[112,3151,2090],{},[112,3153,3154],{"class":114,"line":175},[112,3155,2095],{},[112,3157,3158],{"class":114,"line":181},[112,3159,2100],{},[112,3161,3162],{"class":114,"line":187},[112,3163,131],{"emptyLinePlaceholder":130},[112,3165,3166],{"class":114,"line":193},[112,3167,3168],{},"# 3.初始响应 Prompt: 用于生成第一次的回答\n",[112,3170,3171],{"class":114,"line":199},[112,3172,3173],{},"initial_response_prompt = ChatPromptTemplate.from_template(\n",[112,3175,3176],{"class":114,"line":205},[112,3177,3178],{},"    \"请根据以下问题给出你的初步回答: {question}\"\n",[112,3180,3181],{"class":114,"line":211},[112,3182,2304],{},[112,3184,3185],{"class":114,"line":216},[112,3186,3187],{},"initial_response_chain = initial_response_prompt | llm | StrOutputParser()\n",[112,3189,3190],{"class":114,"line":222},[112,3191,131],{"emptyLinePlaceholder":130},[112,3193,3194],{"class":114,"line":227},[112,3195,3196],{},"# 4.反思 Prompt: 用于接收用户反馈并优化回答\n",[112,3198,3199],{"class":114,"line":233},[112,3200,3201],{},"reflection_prompt = ChatPromptTemplate.from_template(\n",[112,3203,3204],{"class":114,"line":239},[112,3205,3206],{},"    \"\"\"你是一个专业的、善于反思的AI助手。你之前给出了以下回答：\n",[112,3208,3209],{"class":114,"line":244},[112,3210,3211],{},"---\n",[112,3213,3214],{"class":114,"line":250},[112,3215,3216],{},"{previous_response}\n",[112,3218,3219],{"class":114,"line":256},[112,3220,3211],{},[112,3222,3223],{"class":114,"line":262},[112,3224,3225],{},"现在，你收到了用户对你的回答给出的反馈：\n",[112,3227,3228],{"class":114,"line":268},[112,3229,3211],{},[112,3231,3232],{"class":114,"line":274},[112,3233,3234],{},"{user_feedback}\n",[112,3236,3237],{"class":114,"line":280},[112,3238,3211],{},[112,3240,3241],{"class":114,"line":1993},[112,3242,3243],{},"请根据用户的反馈，认真反思你之前的回答，并生成一个更准确、更完善的新回答。\n",[112,3245,3246],{"class":114,"line":2185},[112,3247,3248],{},"新回答:\"\"\"\n",[112,3250,3251],{"class":114,"line":2191},[112,3252,2304],{},[112,3254,3255],{"class":114,"line":2196},[112,3256,3257],{},"reflection_chain = reflection_prompt | llm | StrOutputParser()\n",[112,3259,3260],{"class":114,"line":2202},[112,3261,131],{"emptyLinePlaceholder":130},[112,3263,3264],{"class":114,"line":2208},[112,3265,3266],{},"# 5.模拟反射过程\n",[112,3268,3269],{"class":114,"line":2213},[112,3270,3271],{},"def reflect_and_refine(query: str, feedback: str):\n",[112,3273,3274],{"class":114,"line":2219},[112,3275,3276],{},"    \"\"\"模拟一个完整的反射过程，从初始响应到优化后的响应。\"\"\"\n",[112,3278,3279],{"class":114,"line":2225},[112,3280,131],{"emptyLinePlaceholder":130},[112,3282,3283],{"class":114,"line":2231},[112,3284,3285],{},"    print(\"--- 启动反射模式 ---\")\n",[112,3287,3288],{"class":114,"line":2237},[112,3289,3290],{},"    print(f\"用户查询: {query}\")\n",[112,3292,3293],{"class":114,"line":2243},[112,3294,131],{"emptyLinePlaceholder":130},[112,3296,3297],{"class":114,"line":2249},[112,3298,3299],{},"    # LLM 生成初步响应\n",[112,3301,3302],{"class":114,"line":2254},[112,3303,3304],{},"    print(\"\\n生成初步响应...\")\n",[112,3306,3307],{"class":114,"line":2260},[112,3308,3309],{},"    initial_response = initial_response_chain.invoke({\"question\": query})\n",[112,3311,3312],{"class":114,"line":2266},[112,3313,3314],{},"    print(f\"LLM 初步响应:\\n{initial_response}\")\n",[112,3316,3317],{"class":114,"line":2271},[112,3318,131],{"emptyLinePlaceholder":130},[112,3320,3321],{"class":114,"line":2277},[112,3322,3323],{},"    # 模拟用户反馈\n",[112,3325,3326],{"class":114,"line":2283},[112,3327,3328],{},"    print(f\"\\n用户反馈:\\n{feedback}\")\n",[112,3330,3331],{"class":114,"line":2289},[112,3332,131],{"emptyLinePlaceholder":130},[112,3334,3335],{"class":114,"line":2295},[112,3336,3337],{},"    # LLM 进行反思，并生成新的回答\n",[112,3339,3340],{"class":114,"line":2301},[112,3341,3342],{},"    print(\"\\nLLM 正在反思并生成新响应...\")\n",[112,3344,3345],{"class":114,"line":2307},[112,3346,3347],{},"    refined_response = reflection_chain.invoke({\n",[112,3349,3350],{"class":114,"line":2312},[112,3351,3352],{},"        \"previous_response\": initial_response,\n",[112,3354,3355],{"class":114,"line":2318},[112,3356,3357],{},"        \"user_feedback\": feedback\n",[112,3359,3360],{"class":114,"line":2324},[112,3361,3362],{},"    })\n",[112,3364,3365],{"class":114,"line":2330},[112,3366,131],{"emptyLinePlaceholder":130},[112,3368,3369],{"class":114,"line":2336},[112,3370,3371],{},"    print(\"\\n--- LLM 经过反思后的新响应 ---\")\n",[112,3373,3374],{"class":114,"line":2342},[112,3375,3376],{},"    print(refined_response)\n",[112,3378,3379],{"class":114,"line":2348},[112,3380,131],{"emptyLinePlaceholder":130},[112,3382,3383],{"class":114,"line":2354},[112,3384,3385],{},"    return refined_response\n",[112,3387,3388],{"class":114,"line":2360},[112,3389,131],{"emptyLinePlaceholder":130},[112,3391,3392],{"class":114,"line":2365},[112,3393,3394],{},"# 6.运行并测试\n",[112,3396,3397],{"class":114,"line":2371},[112,3398,2368],{},[112,3400,3401],{"class":114,"line":2377},[112,3402,3403],{},"    # 模拟用户查询\n",[112,3405,3406],{"class":114,"line":2825},[112,3407,3408],{},"    initial_question = \"请用一句话介绍一下什么是 RAG。\"\n",[112,3410,3411],{"class":114,"line":2831},[112,3412,3413],{},"    # 模拟用户反馈，指出初步回答的不足\n",[112,3415,3416],{"class":114,"line":2836},[112,3417,3418],{},"    user_feedback_text = \"太笼统了，请展开说明检索和生成这两步是怎么配合的，最好举一个实际的问答例子。\"\n",[112,3420,3421],{"class":114,"line":2842},[112,3422,3423],{},"    # 运行反射过程\n",[112,3425,3426],{"class":114,"line":2848},[112,3427,3428],{},"    reflect_and_refine(initial_question, user_feedback_text)\n",[22,3430,3432],{"id":3431},"_44-规划模式","4.4 规划模式",[102,3434,3436],{"className":104,"code":3435,"language":106,"meta":107,"style":107},"flowchart TB\n    Q[\"用户查询\u003Cbr\u002F>算 68×30，查 6\u002F20 场地档期\"]\n    PL[\"Planner（规划器）\u003Cbr\u002F>planner_chain = prompt | llm | StrOutputParser\u003Cbr\u002F>将复杂任务分解为可执行步骤\"]\n    TL[\"📋 任务列表\u003Cbr\u002F>1. 计算 68 乘以 30 的总额\u003Cbr\u002F>2. 查询 6 月 20 日的场地档期\"]\n\n    subgraph EX[\"Executor（执行者）— 每个任务都是一个 ReAct 循环\"]\n        T1[\"任务 1：计算 68 乘以 30\u003Cbr\u002F>Thought → Action: calc_total(68,30) → 2040\"]\n        T2[\"任务 2：查询场地档期\u003Cbr\u002F>Thought → Action: book_venue(6月20日) → 桂花厅有余位\"]\n    end\n    COMP[\"Executor 组件\u003Cbr\u002F>executor_react_prompt（ReAct 提示）→ create_react_agent(llm, tools, prompt) → AgentExecutor(verbose=True, handle_parsing_errors=True)\"]\n    FIN[\"汇总所有任务结果 → 最终回答\"]\n\n    Q --> PL --> TL\n    TL -->|逐一执行| EX\n    T1 --> COMP\n    T2 --> COMP\n    COMP --> FIN\n\n    NOTE[\"🔍 规划 vs ReAct 的区别\u003Cbr\u002F>规划模式：先分解，再逐一执行\u003Cbr\u002F>ReAct 模式：边想边做，单步循环\u003Cbr\u002F>规划适合多步骤复杂任务\u003Cbr\u002F>每个子任务内部仍可用 ReAct\u003Cbr\u002F>Planner 只负责分解，不负责执行\"]\n\n    style Q fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style PL fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style TL fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style EX fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n    style T1 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style T2 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style COMP fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style FIN fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style NOTE fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[109,3437,3438,3442,3447,3452,3457,3461,3466,3471,3476,3480,3485,3490,3494,3499,3504,3509,3514,3519,3523,3528,3532,3536,3541,3546,3551,3556,3561,3566,3570],{"__ignoreMap":107},[112,3439,3440],{"class":114,"line":115},[112,3441,537],{},[112,3443,3444],{"class":114,"line":121},[112,3445,3446],{},"    Q[\"用户查询\u003Cbr\u002F>算 68×30，查 6\u002F20 场地档期\"]\n",[112,3448,3449],{"class":114,"line":127},[112,3450,3451],{},"    PL[\"Planner（规划器）\u003Cbr\u002F>planner_chain = prompt | llm | StrOutputParser\u003Cbr\u002F>将复杂任务分解为可执行步骤\"]\n",[112,3453,3454],{"class":114,"line":134},[112,3455,3456],{},"    TL[\"📋 任务列表\u003Cbr\u002F>1. 计算 68 乘以 30 的总额\u003Cbr\u002F>2. 查询 6 月 20 日的场地档期\"]\n",[112,3458,3459],{"class":114,"line":140},[112,3460,131],{"emptyLinePlaceholder":130},[112,3462,3463],{"class":114,"line":146},[112,3464,3465],{},"    subgraph EX[\"Executor（执行者）— 每个任务都是一个 ReAct 循环\"]\n",[112,3467,3468],{"class":114,"line":152},[112,3469,3470],{},"        T1[\"任务 1：计算 68 乘以 30\u003Cbr\u002F>Thought → Action: calc_total(68,30) → 2040\"]\n",[112,3472,3473],{"class":114,"line":158},[112,3474,3475],{},"        T2[\"任务 2：查询场地档期\u003Cbr\u002F>Thought → Action: book_venue(6月20日) → 桂花厅有余位\"]\n",[112,3477,3478],{"class":114,"line":164},[112,3479,208],{},[112,3481,3482],{"class":114,"line":169},[112,3483,3484],{},"    COMP[\"Executor 组件\u003Cbr\u002F>executor_react_prompt（ReAct 提示）→ create_react_agent(llm, tools, prompt) → AgentExecutor(verbose=True, handle_parsing_errors=True)\"]\n",[112,3486,3487],{"class":114,"line":175},[112,3488,3489],{},"    FIN[\"汇总所有任务结果 → 最终回答\"]\n",[112,3491,3492],{"class":114,"line":181},[112,3493,131],{"emptyLinePlaceholder":130},[112,3495,3496],{"class":114,"line":187},[112,3497,3498],{},"    Q --> PL --> TL\n",[112,3500,3501],{"class":114,"line":193},[112,3502,3503],{},"    TL -->|逐一执行| EX\n",[112,3505,3506],{"class":114,"line":199},[112,3507,3508],{},"    T1 --> COMP\n",[112,3510,3511],{"class":114,"line":205},[112,3512,3513],{},"    T2 --> COMP\n",[112,3515,3516],{"class":114,"line":211},[112,3517,3518],{},"    COMP --> FIN\n",[112,3520,3521],{"class":114,"line":216},[112,3522,131],{"emptyLinePlaceholder":130},[112,3524,3525],{"class":114,"line":222},[112,3526,3527],{},"    NOTE[\"🔍 规划 vs ReAct 的区别\u003Cbr\u002F>规划模式：先分解，再逐一执行\u003Cbr\u002F>ReAct 模式：边想边做，单步循环\u003Cbr\u002F>规划适合多步骤复杂任务\u003Cbr\u002F>每个子任务内部仍可用 ReAct\u003Cbr\u002F>Planner 只负责分解，不负责执行\"]\n",[112,3529,3530],{"class":114,"line":227},[112,3531,131],{"emptyLinePlaceholder":130},[112,3533,3534],{"class":114,"line":233},[112,3535,3042],{},[112,3537,3538],{"class":114,"line":239},[112,3539,3540],{},"    style PL fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,3542,3543],{"class":114,"line":244},[112,3544,3545],{},"    style TL fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,3547,3548],{"class":114,"line":250},[112,3549,3550],{},"    style EX fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[112,3552,3553],{"class":114,"line":256},[112,3554,3555],{},"    style T1 fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,3557,3558],{"class":114,"line":262},[112,3559,3560],{},"    style T2 fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,3562,3563],{"class":114,"line":268},[112,3564,3565],{},"    style COMP fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,3567,3568],{"class":114,"line":274},[112,3569,2486],{},[112,3571,3572],{"class":114,"line":280},[112,3573,3574],{},"    style NOTE fill:#F8FAFC,stroke:#64748B,stroke-width:2px\n",[10,3576,3577],{},[13,3578,3579,3581,3582,3585,3586,3589,3590,44,3593,3596],{},[30,3580,290],{}," 上半段用一条普通的 LC 链（",[109,3583,3584],{},"planner_chain","）产出文本化的任务列表——",[30,3587,3588],{},"规划器只负责分解，不负责执行","；下半段的 Executor 是一个 ReAct Agent + AgentExecutor 组合，把列表里的每一条当成一个独立任务去跑，因此",[30,3591,3592],{},"每个子任务内部仍是一个完整的 ReAct 循环",[109,3594,3595],{},"handle_parsing_errors=True"," 让执行器在格式解析失败时自动重试。",[10,3598,3599],{},[13,3600,2027,3601],{},[109,3602,3603],{},"agent_learn\u002Fagent_types\u002FC04_PlanningPattern.py",[102,3605,3607],{"className":2033,"code":3606,"language":2035,"meta":107,"style":107},"# …… 模型与工具定义同工具使用模式（calc_total \u002F book_venue）……\ntools = [calc_total, book_venue]\n\n# 3.定义规划器 (Planner) 和执行者 (Executor) 的 Prompt\n# 3.1 规划器的 Prompt\n# 规划器的职责是分析用户任务，并将其分解成一系列简单的、可执行的子任务。\nplanner_prompt = ChatPromptTemplate.from_template(\n    \"\"\"你是一个任务规划师，你的工作是将用户提出的一个复杂任务分解成一系列清晰、可执行的步骤。\n    你的输出应该是一个简单的任务列表，每行一个任务。\n\n    例子:\n    用户任务: \"请先查 6 月 20 日的场地档期，然后计算 68 乘以 30。\"\n    任务列表:\n    - 查询 6 月 20 日的场地档期\n    - 计算 68 乘以 30 的结果\n\n    用户任务: {user_input}\n    任务列表:\n    \"\"\"\n)\n# 规划器链，它只负责生成文本化的任务列表\nplanner_chain = planner_prompt | llm | StrOutputParser()\n\n# 3.2 执行者的 Prompt\n# 执行者的职责是执行单个任务。这里使用 ReAct 模式作为执行者，因为它能根据任务描述选择并调用正确的工具。\nexecutor_react_prompt_template = \"\"\"你是一个专业的工具执行者，可以访问以下工具：\n\n{tools}\n\n根据你的思考（Thought）决定下一步的行动（Action）。你的行动必须遵循以下格式：\nThought: 我需要思考如何完成任务。\nAction: [工具名称]\nAction Input: [工具的输入参数，对于calc_total工具，请使用'68,30'这样的格式]\n\n可用的工具名称有: {tool_names}\n\n当你获取了所有必要信息并可以给出最终答案时，请以以下格式结束：\nThought: 我已经有了最终答案。\nFinal Answer: [最终答案]\n\n请执行以下任务：\n{input}\n{agent_scratchpad}\n\"\"\"\nexecutor_prompt = ChatPromptTemplate.from_template(executor_react_prompt_template)\n\n# 4.创建 ReAct Agent 作为执行者\nexecutor_agent = create_react_agent(llm, tools, executor_prompt)\nexecutor_executor = AgentExecutor(\n    agent=executor_agent,\n    tools=tools,\n    verbose=True,\n    handle_parsing_errors=True  # 启用错误处理，自动重试解析错误\n)\n\n# 5.定义并运行规划模式的工作流\ndef execute_planning_pattern(query: str):\n    print(\"--- 启动规划模式 ---\")\n\n    # 规划器分解任务\n    print(\"\\n规划器正在分解任务...\")\n    plan = planner_chain.invoke({\"user_input\": query})\n    tasks = [task.strip() for task in plan.split('\\n') if task.strip()]\n    print(\"规划器生成的任务列表:\")\n    for i, task in enumerate(tasks):\n        print(f\"  {i + 1}. {task}\")\n\n    # 执行者逐一执行任务\n    print(\"\\n执行者正在逐一执行任务...\")\n    for i, task in enumerate(tasks):\n        print(f\"\\n--- 执行任务 {i + 1}: {task} ---\")\n        executor_executor.invoke({\"input\": task})\n\n    print(\"\\n--- 所有任务执行完毕！---\")\n\nif __name__ == \"__main__\":\n    test_query = \"请先计算 68 乘以 30 的结果，然后告诉我 6 月 20 日的场地档期怎么样？\"\n    execute_planning_pattern(test_query)\n",[109,3608,3609,3614,3618,3622,3627,3632,3637,3642,3647,3652,3656,3661,3666,3671,3676,3681,3685,3690,3694,3698,3702,3707,3712,3716,3721,3726,3731,3735,3739,3743,3748,3753,3758,3763,3767,3771,3775,3780,3785,3790,3794,3799,3804,3808,3812,3817,3821,3826,3831,3836,3841,3845,3849,3853,3857,3861,3866,3871,3876,3880,3885,3890,3895,3900,3905,3910,3915,3919,3924,3929,3933,3938,3943,3947,3952,3956,3960,3965],{"__ignoreMap":107},[112,3610,3611],{"class":114,"line":115},[112,3612,3613],{},"# …… 模型与工具定义同工具使用模式（calc_total \u002F book_venue）……\n",[112,3615,3616],{"class":114,"line":121},[112,3617,2205],{},[112,3619,3620],{"class":114,"line":127},[112,3621,131],{"emptyLinePlaceholder":130},[112,3623,3624],{"class":114,"line":134},[112,3625,3626],{},"# 3.定义规划器 (Planner) 和执行者 (Executor) 的 Prompt\n",[112,3628,3629],{"class":114,"line":140},[112,3630,3631],{},"# 3.1 规划器的 Prompt\n",[112,3633,3634],{"class":114,"line":146},[112,3635,3636],{},"# 规划器的职责是分析用户任务，并将其分解成一系列简单的、可执行的子任务。\n",[112,3638,3639],{"class":114,"line":152},[112,3640,3641],{},"planner_prompt = ChatPromptTemplate.from_template(\n",[112,3643,3644],{"class":114,"line":158},[112,3645,3646],{},"    \"\"\"你是一个任务规划师，你的工作是将用户提出的一个复杂任务分解成一系列清晰、可执行的步骤。\n",[112,3648,3649],{"class":114,"line":164},[112,3650,3651],{},"    你的输出应该是一个简单的任务列表，每行一个任务。\n",[112,3653,3654],{"class":114,"line":169},[112,3655,131],{"emptyLinePlaceholder":130},[112,3657,3658],{"class":114,"line":175},[112,3659,3660],{},"    例子:\n",[112,3662,3663],{"class":114,"line":181},[112,3664,3665],{},"    用户任务: \"请先查 6 月 20 日的场地档期，然后计算 68 乘以 30。\"\n",[112,3667,3668],{"class":114,"line":187},[112,3669,3670],{},"    任务列表:\n",[112,3672,3673],{"class":114,"line":193},[112,3674,3675],{},"    - 查询 6 月 20 日的场地档期\n",[112,3677,3678],{"class":114,"line":199},[112,3679,3680],{},"    - 计算 68 乘以 30 的结果\n",[112,3682,3683],{"class":114,"line":205},[112,3684,131],{"emptyLinePlaceholder":130},[112,3686,3687],{"class":114,"line":211},[112,3688,3689],{},"    用户任务: {user_input}\n",[112,3691,3692],{"class":114,"line":216},[112,3693,3670],{},[112,3695,3696],{"class":114,"line":222},[112,3697,2645],{},[112,3699,3700],{"class":114,"line":227},[112,3701,2304],{},[112,3703,3704],{"class":114,"line":233},[112,3705,3706],{},"# 规划器链，它只负责生成文本化的任务列表\n",[112,3708,3709],{"class":114,"line":239},[112,3710,3711],{},"planner_chain = planner_prompt | llm | StrOutputParser()\n",[112,3713,3714],{"class":114,"line":244},[112,3715,131],{"emptyLinePlaceholder":130},[112,3717,3718],{"class":114,"line":250},[112,3719,3720],{},"# 3.2 执行者的 Prompt\n",[112,3722,3723],{"class":114,"line":256},[112,3724,3725],{},"# 执行者的职责是执行单个任务。这里使用 ReAct 模式作为执行者，因为它能根据任务描述选择并调用正确的工具。\n",[112,3727,3728],{"class":114,"line":262},[112,3729,3730],{},"executor_react_prompt_template = \"\"\"你是一个专业的工具执行者，可以访问以下工具：\n",[112,3732,3733],{"class":114,"line":268},[112,3734,131],{"emptyLinePlaceholder":130},[112,3736,3737],{"class":114,"line":274},[112,3738,2760],{},[112,3740,3741],{"class":114,"line":280},[112,3742,131],{"emptyLinePlaceholder":130},[112,3744,3745],{"class":114,"line":1993},[112,3746,3747],{},"根据你的思考（Thought）决定下一步的行动（Action）。你的行动必须遵循以下格式：\n",[112,3749,3750],{"class":114,"line":2185},[112,3751,3752],{},"Thought: 我需要思考如何完成任务。\n",[112,3754,3755],{"class":114,"line":2191},[112,3756,3757],{},"Action: [工具名称]\n",[112,3759,3760],{"class":114,"line":2196},[112,3761,3762],{},"Action Input: [工具的输入参数，对于calc_total工具，请使用'68,30'这样的格式]\n",[112,3764,3765],{"class":114,"line":2202},[112,3766,131],{"emptyLinePlaceholder":130},[112,3768,3769],{"class":114,"line":2208},[112,3770,2828],{},[112,3772,3773],{"class":114,"line":2213},[112,3774,131],{"emptyLinePlaceholder":130},[112,3776,3777],{"class":114,"line":2219},[112,3778,3779],{},"当你获取了所有必要信息并可以给出最终答案时，请以以下格式结束：\n",[112,3781,3782],{"class":114,"line":2225},[112,3783,3784],{},"Thought: 我已经有了最终答案。\n",[112,3786,3787],{"class":114,"line":2231},[112,3788,3789],{},"Final Answer: [最终答案]\n",[112,3791,3792],{"class":114,"line":2237},[112,3793,131],{"emptyLinePlaceholder":130},[112,3795,3796],{"class":114,"line":2243},[112,3797,3798],{},"请执行以下任务：\n",[112,3800,3801],{"class":114,"line":2249},[112,3802,3803],{},"{input}\n",[112,3805,3806],{"class":114,"line":2254},[112,3807,2845],{},[112,3809,3810],{"class":114,"line":2260},[112,3811,2851],{},[112,3813,3814],{"class":114,"line":2266},[112,3815,3816],{},"executor_prompt = ChatPromptTemplate.from_template(executor_react_prompt_template)\n",[112,3818,3819],{"class":114,"line":2271},[112,3820,131],{"emptyLinePlaceholder":130},[112,3822,3823],{"class":114,"line":2277},[112,3824,3825],{},"# 4.创建 ReAct Agent 作为执行者\n",[112,3827,3828],{"class":114,"line":2283},[112,3829,3830],{},"executor_agent = create_react_agent(llm, tools, executor_prompt)\n",[112,3832,3833],{"class":114,"line":2289},[112,3834,3835],{},"executor_executor = AgentExecutor(\n",[112,3837,3838],{"class":114,"line":2295},[112,3839,3840],{},"    agent=executor_agent,\n",[112,3842,3843],{"class":114,"line":2301},[112,3844,2292],{},[112,3846,3847],{"class":114,"line":2307},[112,3848,2912],{},[112,3850,3851],{"class":114,"line":2312},[112,3852,2918],{},[112,3854,3855],{"class":114,"line":2318},[112,3856,2304],{},[112,3858,3859],{"class":114,"line":2324},[112,3860,131],{"emptyLinePlaceholder":130},[112,3862,3863],{"class":114,"line":2330},[112,3864,3865],{},"# 5.定义并运行规划模式的工作流\n",[112,3867,3868],{"class":114,"line":2336},[112,3869,3870],{},"def execute_planning_pattern(query: str):\n",[112,3872,3873],{"class":114,"line":2342},[112,3874,3875],{},"    print(\"--- 启动规划模式 ---\")\n",[112,3877,3878],{"class":114,"line":2348},[112,3879,131],{"emptyLinePlaceholder":130},[112,3881,3882],{"class":114,"line":2354},[112,3883,3884],{},"    # 规划器分解任务\n",[112,3886,3887],{"class":114,"line":2360},[112,3888,3889],{},"    print(\"\\n规划器正在分解任务...\")\n",[112,3891,3892],{"class":114,"line":2365},[112,3893,3894],{},"    plan = planner_chain.invoke({\"user_input\": query})\n",[112,3896,3897],{"class":114,"line":2371},[112,3898,3899],{},"    tasks = [task.strip() for task in plan.split('\\n') if task.strip()]\n",[112,3901,3902],{"class":114,"line":2377},[112,3903,3904],{},"    print(\"规划器生成的任务列表:\")\n",[112,3906,3907],{"class":114,"line":2825},[112,3908,3909],{},"    for i, task in enumerate(tasks):\n",[112,3911,3912],{"class":114,"line":2831},[112,3913,3914],{},"        print(f\"  {i + 1}. {task}\")\n",[112,3916,3917],{"class":114,"line":2836},[112,3918,131],{"emptyLinePlaceholder":130},[112,3920,3921],{"class":114,"line":2842},[112,3922,3923],{},"    # 执行者逐一执行任务\n",[112,3925,3926],{"class":114,"line":2848},[112,3927,3928],{},"    print(\"\\n执行者正在逐一执行任务...\")\n",[112,3930,3931],{"class":114,"line":2854},[112,3932,3909],{},[112,3934,3935],{"class":114,"line":2859},[112,3936,3937],{},"        print(f\"\\n--- 执行任务 {i + 1}: {task} ---\")\n",[112,3939,3940],{"class":114,"line":2865},[112,3941,3942],{},"        executor_executor.invoke({\"input\": task})\n",[112,3944,3945],{"class":114,"line":2870},[112,3946,131],{"emptyLinePlaceholder":130},[112,3948,3949],{"class":114,"line":2876},[112,3950,3951],{},"    print(\"\\n--- 所有任务执行完毕！---\")\n",[112,3953,3954],{"class":114,"line":2882},[112,3955,131],{"emptyLinePlaceholder":130},[112,3957,3958],{"class":114,"line":2887},[112,3959,2368],{},[112,3961,3962],{"class":114,"line":2892},[112,3963,3964],{},"    test_query = \"请先计算 68 乘以 30 的结果，然后告诉我 6 月 20 日的场地档期怎么样？\"\n",[112,3966,3967],{"class":114,"line":2898},[112,3968,3969],{},"    execute_planning_pattern(test_query)\n",[22,3971,3973],{"id":3972},"_45-多智能体模式","4.5 多智能体模式",[102,3975,3977],{"className":104,"code":3976,"language":106,"meta":107,"style":107},"flowchart TB\n    Q[\"用户查询\u003Cbr\u002F>算 68×30，查场地档期…\"]\n    MAIN[\"主程序（multi_agent_workflow）\u003Cbr\u002F>协调和总结工作流\"]\n\n    subgraph BUDGET[\"预算专家（budget_executor）\"]\n        MA1[\"budget_tools = [calc_total, sum_amounts]\"]\n        MA2[\"budget_prompt（SystemMessage）\"]\n        MA3[\"create_tool_calling_agent → AgentExecutor\"]\n        MA4[\"📋 子任务：计算 68 乘以 30\u003Cbr\u002F>✅ 结果：2040 元\"]\n        MA1 --> MA2 --> MA3 --> MA4\n    end\n\n    subgraph VENUE[\"场地信息专家（venue_executor）\"]\n        IA1[\"venue_tools = [book_venue, get_current_date]\"]\n        IA2[\"venue_prompt（SystemMessage）\"]\n        IA3[\"create_tool_calling_agent → AgentExecutor\"]\n        IA4[\"📋 子任务：查询场地档期和今天的日期\u003Cbr\u002F>✅ 结果：桂花厅有余位 + 2026 年 9 月 15 日\"]\n        IA1 --> IA2 --> IA3 --> IA4\n    end\n\n    SUM[\"LLM 总结（summarize_chain）\u003Cbr\u002F>整合预算结果 + 场地信息 → 生成完整回答\u003Cbr\u002F>prompt | llm | StrOutputParser\"]\n    FIN[\"最终回答\"]\n\n    Q --> MAIN\n    MAIN -->|分配任务| BUDGET\n    MAIN -->|分配任务| VENUE\n    MA4 --> SUM\n    IA4 --> SUM\n    SUM --> FIN\n\n    style Q fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n    style MAIN fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style BUDGET fill:#ECFDF5,stroke:#059669,stroke-width:2px\n    style VENUE fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n    style MA4 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style IA4 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n    style SUM fill:#FDF2F8,stroke:#DB2777,stroke-width:2px\n    style FIN fill:#EFF6FF,stroke:#2563EB,stroke-width:2px\n",[109,3978,3979,3983,3988,3993,3997,4002,4007,4012,4017,4022,4027,4031,4035,4040,4045,4050,4055,4060,4065,4069,4073,4078,4083,4087,4092,4097,4102,4107,4112,4117,4121,4125,4130,4135,4140,4145,4150,4155],{"__ignoreMap":107},[112,3980,3981],{"class":114,"line":115},[112,3982,537],{},[112,3984,3985],{"class":114,"line":121},[112,3986,3987],{},"    Q[\"用户查询\u003Cbr\u002F>算 68×30，查场地档期…\"]\n",[112,3989,3990],{"class":114,"line":127},[112,3991,3992],{},"    MAIN[\"主程序（multi_agent_workflow）\u003Cbr\u002F>协调和总结工作流\"]\n",[112,3994,3995],{"class":114,"line":134},[112,3996,131],{"emptyLinePlaceholder":130},[112,3998,3999],{"class":114,"line":140},[112,4000,4001],{},"    subgraph BUDGET[\"预算专家（budget_executor）\"]\n",[112,4003,4004],{"class":114,"line":146},[112,4005,4006],{},"        MA1[\"budget_tools = [calc_total, sum_amounts]\"]\n",[112,4008,4009],{"class":114,"line":152},[112,4010,4011],{},"        MA2[\"budget_prompt（SystemMessage）\"]\n",[112,4013,4014],{"class":114,"line":158},[112,4015,4016],{},"        MA3[\"create_tool_calling_agent → AgentExecutor\"]\n",[112,4018,4019],{"class":114,"line":164},[112,4020,4021],{},"        MA4[\"📋 子任务：计算 68 乘以 30\u003Cbr\u002F>✅ 结果：2040 元\"]\n",[112,4023,4024],{"class":114,"line":169},[112,4025,4026],{},"        MA1 --> MA2 --> MA3 --> MA4\n",[112,4028,4029],{"class":114,"line":175},[112,4030,208],{},[112,4032,4033],{"class":114,"line":181},[112,4034,131],{"emptyLinePlaceholder":130},[112,4036,4037],{"class":114,"line":187},[112,4038,4039],{},"    subgraph VENUE[\"场地信息专家（venue_executor）\"]\n",[112,4041,4042],{"class":114,"line":193},[112,4043,4044],{},"        IA1[\"venue_tools = [book_venue, get_current_date]\"]\n",[112,4046,4047],{"class":114,"line":199},[112,4048,4049],{},"        IA2[\"venue_prompt（SystemMessage）\"]\n",[112,4051,4052],{"class":114,"line":205},[112,4053,4054],{},"        IA3[\"create_tool_calling_agent → AgentExecutor\"]\n",[112,4056,4057],{"class":114,"line":211},[112,4058,4059],{},"        IA4[\"📋 子任务：查询场地档期和今天的日期\u003Cbr\u002F>✅ 结果：桂花厅有余位 + 2026 年 9 月 15 日\"]\n",[112,4061,4062],{"class":114,"line":216},[112,4063,4064],{},"        IA1 --> IA2 --> IA3 --> IA4\n",[112,4066,4067],{"class":114,"line":222},[112,4068,208],{},[112,4070,4071],{"class":114,"line":227},[112,4072,131],{"emptyLinePlaceholder":130},[112,4074,4075],{"class":114,"line":233},[112,4076,4077],{},"    SUM[\"LLM 总结（summarize_chain）\u003Cbr\u002F>整合预算结果 + 场地信息 → 生成完整回答\u003Cbr\u002F>prompt | llm | StrOutputParser\"]\n",[112,4079,4080],{"class":114,"line":239},[112,4081,4082],{},"    FIN[\"最终回答\"]\n",[112,4084,4085],{"class":114,"line":244},[112,4086,131],{"emptyLinePlaceholder":130},[112,4088,4089],{"class":114,"line":250},[112,4090,4091],{},"    Q --> MAIN\n",[112,4093,4094],{"class":114,"line":256},[112,4095,4096],{},"    MAIN -->|分配任务| BUDGET\n",[112,4098,4099],{"class":114,"line":262},[112,4100,4101],{},"    MAIN -->|分配任务| VENUE\n",[112,4103,4104],{"class":114,"line":268},[112,4105,4106],{},"    MA4 --> SUM\n",[112,4108,4109],{"class":114,"line":274},[112,4110,4111],{},"    IA4 --> SUM\n",[112,4113,4114],{"class":114,"line":280},[112,4115,4116],{},"    SUM --> FIN\n",[112,4118,4119],{"class":114,"line":1993},[112,4120,131],{"emptyLinePlaceholder":130},[112,4122,4123],{"class":114,"line":2185},[112,4124,3042],{},[112,4126,4127],{"class":114,"line":2191},[112,4128,4129],{},"    style MAIN fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,4131,4132],{"class":114,"line":2196},[112,4133,4134],{},"    style BUDGET fill:#ECFDF5,stroke:#059669,stroke-width:2px\n",[112,4136,4137],{"class":114,"line":2202},[112,4138,4139],{},"    style VENUE fill:#F5F3FF,stroke:#7C3AED,stroke-width:2px\n",[112,4141,4142],{"class":114,"line":2208},[112,4143,4144],{},"    style MA4 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,4146,4147],{"class":114,"line":2213},[112,4148,4149],{},"    style IA4 fill:#FFFBEB,stroke:#D97706,stroke-width:2px\n",[112,4151,4152],{"class":114,"line":2219},[112,4153,4154],{},"    style SUM fill:#FDF2F8,stroke:#DB2777,stroke-width:2px\n",[112,4156,4157],{"class":114,"line":2225},[112,4158,2486],{},[10,4160,4161],{},[13,4162,4163,4165,4166,4169,4170,4173,4174,4177],{},[30,4164,290],{}," 每个专家 Agent 内部都是\"",[30,4167,4168],{},"独立的工具集 + 独立的 System Prompt + 独立的 Executor","\"三件套，",[30,4171,4172],{},"每个 Agent 有独立工具集","——这是多 Agent 设计的核心前提，工具不混用才能让职责真正隔离。主程序只做三件事：分配任务、收集结果、调用一条 ",[109,4175,4176],{},"summarize_chain"," 把结果整合成最终回答，不参与具体执行。",[10,4179,4180],{},[13,4181,2027,4182],{},[109,4183,4184],{},"agent_learn\u002Fagent_types\u002FC05_MultiAgent.py",[102,4186,4188],{"className":2033,"code":4187,"language":2035,"meta":107,"style":107},"from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder, SystemMessagePromptTemplate, \\\n    HumanMessagePromptTemplate  # 导入所有必需的 Prompt 类\nfrom langchain_openai import ChatOpenAI\nfrom langchain_core.tools import tool\nfrom langchain.agents import AgentExecutor, create_tool_calling_agent\nfrom langchain_core.output_parsers import StrOutputParser\nfrom agent_learn.config import Config\n\nconf = Config()\n\n# 1.创建模型\n# 2.定义工具（2.1 预算工具 calc_total \u002F sum_amounts，2.2 场地信息工具 book_venue \u002F get_current_date）\n\n# 3 创建两个独立的 Agent\n# 3.1 创建“预算专家” Agent\nbudget_tools = [calc_total, sum_amounts]\n# 创建完整的 Tool Calling Prompt\n# 这包括一个系统消息，一个用户消息占位符，以及一个 Agent 中间思考过程的占位符。\nbudget_prompt = ChatPromptTemplate.from_messages([\n    SystemMessagePromptTemplate.from_template(\"你是一个强大的预算计算专家，可以访问和使用各种计算工具。\"),\n    HumanMessagePromptTemplate.from_template(\"{input}\"),\n    MessagesPlaceholder(variable_name=\"agent_scratchpad\")\n])\nbudget_agent = create_tool_calling_agent(llm, budget_tools, budget_prompt)\nbudget_executor = AgentExecutor(agent=budget_agent, tools=budget_tools, verbose=True)\n\n# 3.2 创建“场地信息专家” Agent\nvenue_tools = [book_venue, get_current_date]\nvenue_prompt = ChatPromptTemplate.from_messages([\n    SystemMessagePromptTemplate.from_template(\"你是一个强大的场地信息查询专家，可以访问和使用各种查询工具。\"),\n    HumanMessagePromptTemplate.from_template(\"{input}\"),\n    MessagesPlaceholder(variable_name=\"agent_scratchpad\")\n])\nvenue_agent = create_tool_calling_agent(llm, venue_tools, venue_prompt)\nvenue_executor = AgentExecutor(agent=venue_agent, tools=venue_tools, verbose=True)\n\n# 4.协调和总结工作流\ndef multi_agent_workflow(query: str, budget_task: str, venue_task: str):\n    print(\"--- 启动多智能体协作流程 ---\")\n    print(f\"\\n用户原始请求: {query}\")\n\n    # 4.1 让“预算专家”执行任务\n    print(\"\\n[主程序] -> 将任务分配给预算专家...\")\n    budget_result = budget_executor.invoke({\"input\": budget_task}).get(\"output\")\n    print(f\"\\n[主程序] -> 预算专家返回结果: {budget_result}\")\n\n    # 4.2 让“场地信息专家”执行任务\n    print(\"\\n[主程序] -> 将任务分配给场地信息专家...\")\n    venue_result = venue_executor.invoke({\"input\": venue_task}).get(\"output\")\n    print(f\"\\n[主程序] -> 场地信息专家返回结果: {venue_result}\")\n\n    # 4.3 使用 LLM 进行最终结果总结\n    print(\"\\n[主程序] -> 使用大模型进行最终总结...\")\n    summarize_prompt = ChatPromptTemplate.from_messages([\n        (\"system\", \"你是一个善于总结和整合信息的助手。请根据以下信息，为用户原始请求生成一个完整的回答。\"),\n        (\"human\",\n         f\"用户请求: {query}\\n\\n预算计算结果: {budget_result}\\n\\n场地查询结果: {venue_result}\\n\\n请整合以上信息，生成一个连贯的最终回答。\")\n    ])\n    summarize_chain = summarize_prompt | llm | StrOutputParser()\n    final_answer = summarize_chain.invoke({\"query\": query})\n\n    print(\"\\n--- 协作流程已完成！---\")\n    print(f\"最终综合回答:\\n{final_answer}\")\n    return final_answer\n\nif __name__ == \"__main__\":\n    # 定义用户原始请求和分配给每个Agent的子任务\n    original_query = \"请先计算 68 乘以 30 的总额，然后告诉我 6 月 20 日桂花厅的档期和今天的日期。\"\n    budget_task = \"计算 68 乘以 30 的总额\"\n    venue_task = \"查询 6 月 20 日桂花厅的档期和今天的日期\"\n\n    # 启动工作流\n    multi_agent_workflow(original_query, budget_task, venue_task)\n",[109,4189,4190,4195,4200,4204,4208,4213,4217,4221,4225,4229,4233,4237,4242,4246,4251,4256,4261,4266,4271,4276,4281,4286,4291,4295,4300,4305,4309,4314,4319,4324,4329,4333,4337,4341,4346,4351,4355,4360,4365,4370,4375,4379,4384,4389,4394,4399,4403,4408,4413,4418,4423,4427,4432,4437,4442,4447,4452,4457,4462,4467,4472,4476,4481,4486,4491,4495,4499,4504,4509,4514,4519,4523,4528],{"__ignoreMap":107},[112,4191,4192],{"class":114,"line":115},[112,4193,4194],{},"from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder, SystemMessagePromptTemplate, \\\n",[112,4196,4197],{"class":114,"line":121},[112,4198,4199],{},"    HumanMessagePromptTemplate  # 导入所有必需的 Prompt 类\n",[112,4201,4202],{"class":114,"line":127},[112,4203,2047],{},[112,4205,4206],{"class":114,"line":134},[112,4207,2052],{},[112,4209,4210],{"class":114,"line":140},[112,4211,4212],{},"from langchain.agents import AgentExecutor, create_tool_calling_agent\n",[112,4214,4215],{"class":114,"line":146},[112,4216,3123],{},[112,4218,4219],{"class":114,"line":152},[112,4220,2062],{},[112,4222,4223],{"class":114,"line":158},[112,4224,131],{"emptyLinePlaceholder":130},[112,4226,4227],{"class":114,"line":164},[112,4228,2071],{},[112,4230,4231],{"class":114,"line":169},[112,4232,131],{"emptyLinePlaceholder":130},[112,4234,4235],{"class":114,"line":175},[112,4236,2080],{},[112,4238,4239],{"class":114,"line":181},[112,4240,4241],{},"# 2.定义工具（2.1 预算工具 calc_total \u002F sum_amounts，2.2 场地信息工具 book_venue \u002F get_current_date）\n",[112,4243,4244],{"class":114,"line":187},[112,4245,131],{"emptyLinePlaceholder":130},[112,4247,4248],{"class":114,"line":193},[112,4249,4250],{},"# 3 创建两个独立的 Agent\n",[112,4252,4253],{"class":114,"line":199},[112,4254,4255],{},"# 3.1 创建“预算专家” Agent\n",[112,4257,4258],{"class":114,"line":205},[112,4259,4260],{},"budget_tools = [calc_total, sum_amounts]\n",[112,4262,4263],{"class":114,"line":211},[112,4264,4265],{},"# 创建完整的 Tool Calling Prompt\n",[112,4267,4268],{"class":114,"line":216},[112,4269,4270],{},"# 这包括一个系统消息，一个用户消息占位符，以及一个 Agent 中间思考过程的占位符。\n",[112,4272,4273],{"class":114,"line":222},[112,4274,4275],{},"budget_prompt = ChatPromptTemplate.from_messages([\n",[112,4277,4278],{"class":114,"line":227},[112,4279,4280],{},"    SystemMessagePromptTemplate.from_template(\"你是一个强大的预算计算专家，可以访问和使用各种计算工具。\"),\n",[112,4282,4283],{"class":114,"line":233},[112,4284,4285],{},"    HumanMessagePromptTemplate.from_template(\"{input}\"),\n",[112,4287,4288],{"class":114,"line":239},[112,4289,4290],{},"    MessagesPlaceholder(variable_name=\"agent_scratchpad\")\n",[112,4292,4293],{"class":114,"line":244},[112,4294,2246],{},[112,4296,4297],{"class":114,"line":250},[112,4298,4299],{},"budget_agent = create_tool_calling_agent(llm, budget_tools, budget_prompt)\n",[112,4301,4302],{"class":114,"line":256},[112,4303,4304],{},"budget_executor = AgentExecutor(agent=budget_agent, tools=budget_tools, verbose=True)\n",[112,4306,4307],{"class":114,"line":262},[112,4308,131],{"emptyLinePlaceholder":130},[112,4310,4311],{"class":114,"line":268},[112,4312,4313],{},"# 3.2 创建“场地信息专家” Agent\n",[112,4315,4316],{"class":114,"line":274},[112,4317,4318],{},"venue_tools = [book_venue, get_current_date]\n",[112,4320,4321],{"class":114,"line":280},[112,4322,4323],{},"venue_prompt = ChatPromptTemplate.from_messages([\n",[112,4325,4326],{"class":114,"line":1993},[112,4327,4328],{},"    SystemMessagePromptTemplate.from_template(\"你是一个强大的场地信息查询专家，可以访问和使用各种查询工具。\"),\n",[112,4330,4331],{"class":114,"line":2185},[112,4332,4285],{},[112,4334,4335],{"class":114,"line":2191},[112,4336,4290],{},[112,4338,4339],{"class":114,"line":2196},[112,4340,2246],{},[112,4342,4343],{"class":114,"line":2202},[112,4344,4345],{},"venue_agent = create_tool_calling_agent(llm, venue_tools, venue_prompt)\n",[112,4347,4348],{"class":114,"line":2208},[112,4349,4350],{},"venue_executor = AgentExecutor(agent=venue_agent, tools=venue_tools, verbose=True)\n",[112,4352,4353],{"class":114,"line":2213},[112,4354,131],{"emptyLinePlaceholder":130},[112,4356,4357],{"class":114,"line":2219},[112,4358,4359],{},"# 4.协调和总结工作流\n",[112,4361,4362],{"class":114,"line":2225},[112,4363,4364],{},"def multi_agent_workflow(query: str, budget_task: str, venue_task: str):\n",[112,4366,4367],{"class":114,"line":2231},[112,4368,4369],{},"    print(\"--- 启动多智能体协作流程 ---\")\n",[112,4371,4372],{"class":114,"line":2237},[112,4373,4374],{},"    print(f\"\\n用户原始请求: {query}\")\n",[112,4376,4377],{"class":114,"line":2243},[112,4378,131],{"emptyLinePlaceholder":130},[112,4380,4381],{"class":114,"line":2249},[112,4382,4383],{},"    # 4.1 让“预算专家”执行任务\n",[112,4385,4386],{"class":114,"line":2254},[112,4387,4388],{},"    print(\"\\n[主程序] -> 将任务分配给预算专家...\")\n",[112,4390,4391],{"class":114,"line":2260},[112,4392,4393],{},"    budget_result = budget_executor.invoke({\"input\": budget_task}).get(\"output\")\n",[112,4395,4396],{"class":114,"line":2266},[112,4397,4398],{},"    print(f\"\\n[主程序] -> 预算专家返回结果: {budget_result}\")\n",[112,4400,4401],{"class":114,"line":2271},[112,4402,131],{"emptyLinePlaceholder":130},[112,4404,4405],{"class":114,"line":2277},[112,4406,4407],{},"    # 4.2 让“场地信息专家”执行任务\n",[112,4409,4410],{"class":114,"line":2283},[112,4411,4412],{},"    print(\"\\n[主程序] -> 将任务分配给场地信息专家...\")\n",[112,4414,4415],{"class":114,"line":2289},[112,4416,4417],{},"    venue_result = venue_executor.invoke({\"input\": venue_task}).get(\"output\")\n",[112,4419,4420],{"class":114,"line":2295},[112,4421,4422],{},"    print(f\"\\n[主程序] -> 场地信息专家返回结果: {venue_result}\")\n",[112,4424,4425],{"class":114,"line":2301},[112,4426,131],{"emptyLinePlaceholder":130},[112,4428,4429],{"class":114,"line":2307},[112,4430,4431],{},"    # 4.3 使用 LLM 进行最终结果总结\n",[112,4433,4434],{"class":114,"line":2312},[112,4435,4436],{},"    print(\"\\n[主程序] -> 使用大模型进行最终总结...\")\n",[112,4438,4439],{"class":114,"line":2318},[112,4440,4441],{},"    summarize_prompt = ChatPromptTemplate.from_messages([\n",[112,4443,4444],{"class":114,"line":2324},[112,4445,4446],{},"        (\"system\", \"你是一个善于总结和整合信息的助手。请根据以下信息，为用户原始请求生成一个完整的回答。\"),\n",[112,4448,4449],{"class":114,"line":2330},[112,4450,4451],{},"        (\"human\",\n",[112,4453,4454],{"class":114,"line":2336},[112,4455,4456],{},"         f\"用户请求: {query}\\n\\n预算计算结果: {budget_result}\\n\\n场地查询结果: {venue_result}\\n\\n请整合以上信息，生成一个连贯的最终回答。\")\n",[112,4458,4459],{"class":114,"line":2342},[112,4460,4461],{},"    ])\n",[112,4463,4464],{"class":114,"line":2348},[112,4465,4466],{},"    summarize_chain = summarize_prompt | llm | StrOutputParser()\n",[112,4468,4469],{"class":114,"line":2354},[112,4470,4471],{},"    final_answer = summarize_chain.invoke({\"query\": query})\n",[112,4473,4474],{"class":114,"line":2360},[112,4475,131],{"emptyLinePlaceholder":130},[112,4477,4478],{"class":114,"line":2365},[112,4479,4480],{},"    print(\"\\n--- 协作流程已完成！---\")\n",[112,4482,4483],{"class":114,"line":2371},[112,4484,4485],{},"    print(f\"最终综合回答:\\n{final_answer}\")\n",[112,4487,4488],{"class":114,"line":2377},[112,4489,4490],{},"    return final_answer\n",[112,4492,4493],{"class":114,"line":2825},[112,4494,131],{"emptyLinePlaceholder":130},[112,4496,4497],{"class":114,"line":2831},[112,4498,2368],{},[112,4500,4501],{"class":114,"line":2836},[112,4502,4503],{},"    # 定义用户原始请求和分配给每个Agent的子任务\n",[112,4505,4506],{"class":114,"line":2842},[112,4507,4508],{},"    original_query = \"请先计算 68 乘以 30 的总额，然后告诉我 6 月 20 日桂花厅的档期和今天的日期。\"\n",[112,4510,4511],{"class":114,"line":2848},[112,4512,4513],{},"    budget_task = \"计算 68 乘以 30 的总额\"\n",[112,4515,4516],{"class":114,"line":2854},[112,4517,4518],{},"    venue_task = \"查询 6 月 20 日桂花厅的档期和今天的日期\"\n",[112,4520,4521],{"class":114,"line":2859},[112,4522,131],{"emptyLinePlaceholder":130},[112,4524,4525],{"class":114,"line":2865},[112,4526,4527],{},"    # 启动工作流\n",[112,4529,4530],{"class":114,"line":2870},[112,4531,4532],{},"    multi_agent_workflow(original_query, budget_task, venue_task)\n",[17,4534,4536],{"id":4535},"_5-本节小结","5. 本节小结",[410,4538,4539,4545,4551,4558,4575],{},[55,4540,4541,4544],{},[30,4542,4543],{},"Agent = 大模型 + 工具使用 + 规划能力 + 记忆","，与普通 LLM 的差别在于它能主动调用工具、自主规划、检查修正",[55,4546,4547,4550],{},[30,4548,4549],{},"Agentic 是一种程度而非实体","：从低（规则应答）到中（单步工具调用）再到高（自主规划 + 多 Agent 协作）",[55,4552,4553,4554,4557],{},"五种模式构成演进阶梯：",[30,4555,4556],{},"工具使用 → ReAct → 反思 → 规划 → 多智能体","，每种模式解决前一种的局限，而不是相互替代",[55,4559,4560,4561,4564,4565,4567,4568,4571,4572,4574],{},"实战落地上的对应关系：",[109,4562,4563],{},"create_tool_calling_agent"," + ",[109,4566,2010],{}," 对应工具使用模式，",[109,4569,4570],{},"create_react_agent"," 对应 ReAct 模式，两条 LC 链对应反思模式，",[109,4573,3584],{}," + ReAct 执行者对应规划模式，多个 Executor + 总结链对应多智能体模式",[55,4576,4577,4578,4581],{},"真实系统",[30,4579,4580],{},"不会只用一种模式","，而是按任务复杂度把它们组合嵌套起来",[4583,4584,4585],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":107,"searchDepth":121,"depth":121,"links":4587},[4588,4592,4593,4601,4608],{"id":19,"depth":121,"text":20,"children":4589},[4590,4591],{"id":24,"depth":127,"text":25},{"id":313,"depth":127,"text":314},{"id":426,"depth":121,"text":427},{"id":640,"depth":121,"text":641,"children":4594},[4595,4596,4597,4598,4599,4600],{"id":644,"depth":127,"text":645},{"id":856,"depth":127,"text":857},{"id":1077,"depth":127,"text":1078},{"id":1301,"depth":127,"text":1302},{"id":1494,"depth":127,"text":1495},{"id":1703,"depth":127,"text":1704},{"id":1842,"depth":121,"text":1843,"children":4602},[4603,4604,4605,4606,4607],{"id":1846,"depth":127,"text":1847},{"id":2383,"depth":127,"text":2384},{"id":2988,"depth":127,"text":2989},{"id":3431,"depth":127,"text":3432},{"id":3972,"depth":127,"text":3973},{"id":4535,"depth":121,"text":4536},"2026-06-30","用一个“筹备生日派对”的例子讲清 Agent 与普通 LLM 的差别，梳理 Agentic 的能力梯度，并逐一拆解工具使用、ReAct、反思、规划、多智能体五种模式。",false,"md","article",{"migration":4615},{"generator":4616,"sourceSha256":4617},"nuxt-site\u002Fscripts\u002Fmigrate-content.mjs","a421a4f448ceccb8cc1e4327034bbbc9f8e677cd9bb6c41b04653e7091def806","\u002Fagent\u002F03-agent智能体",null,"agent",{"title":5,"description":4610},"content\u002Fagent\u002F03-Agent智能体.md","agent\u002F03-Agent智能体",[422,526,4625],"多智能体","rdUixXqrDJqnKG9yx5yD_Hnjl2p1fekRbxOZT-jfDHQ",1791279145023]