LLM成长笔记(八):Agent 智能体开发 Agent 智能体开发学习博客通俗原理 详细注释 · AI应用强化版Agent 是让大模型从“只会聊天”进化为“能自主执行任务”的关键技术。这篇博客从实际问题出发用生活化类比建立直觉通过术语详解深入概念本质再用原理剖析、图解演示和可运行代码带你一步步理解。重点覆盖 Agent 面试中的高频考点。一、初级篇让模型“动起来”1. ReAct 模式思考-行动-观察循环问题传统的 LLM 只能回答静态问题如何让它能够自主地使用工具、分步完成任务比如“帮我查一下北京天气然后写一段周末出行建议”生活化类比ReAct 就像你教一个实习生处理复杂任务你告诉他“先思考需要什么信息然后去执行查资料、打电话观察结果再根据结果思考下一步直到完成”。实习生不断循环这三步最终交付成果。术语详解ReAct Reasoning推理 Acting行动。它将大模型的思考和工具调用交织在一起形成一个循环思考Thought分析当前状态决定下一步做什么。行动Action执行一个工具调用如搜索、计算、API 调用。观察Observation接收工具返回的结果作为下一次思考的输入。这个循环一直重复直到模型决定“任务完成”并输出最终答案。原理ReAct 模式的核心是把工具调用和推理过程统一成一个文本序列。每次循环模型都会在上下文中追加一段“思考…行动…观察…”然后继续生成。这样模型能利用之前的观察结果动态调整后续行为而不是一次性地预测所有步骤。相比固定流程的 ChainReAct 更灵活、更抗干扰。图解演示ReAct 循环流程用户问题 │ ▼ ┌─────────────┐ │ 思考 (Thought) │ ← 分析现状制定计划 └──────┬──────┘ │ 决定调用工具 ▼ ┌─────────────┐ │ 行动 (Action) │ ← 执行具体工具搜索、计算... └──────┬──────┘ │ 工具返回结果 ▼ ┌─────────────┐ │ 观察 (Observation)│ ← 接收结果更新上下文 └──────┬──────┘ │ 任务未完成回到思考 ▼ 重复 │ 任务完成 ▼ 输出最终答案演示用例手写一个极简 ReAct Agent伪代码 可运行简化版为了直观理解我们用一个手动循环来模拟 ReAct不使用任何 Agent 框架。模型通过解析输出中的特殊标记来决定是否调用工具。# 模拟 ReAct 循环演示核心思想实际可用 OpenAI Function Calling 更稳健fromopenaiimportOpenAIimportjson clientOpenAI()# 模拟外部工具一个简单的词典查询deflookup_word(word:str)-str:模拟查询词典返回词义dictionary{苹果:一种水果通常是红色或绿色。,香蕉:一种长条形黄色水果。,天气:大气状况如晴、雨、雪等。}returndictionary.get(word,未找到该词)# 工具列表用文本形式告诉模型可调用的工具tools_desc 你可以调用以下工具 - lookup_word(word)查询一个词的含义返回字符串。 当你需要查词时输出格式为 Action: lookup_word Action Input: 要查的词 当你能直接回答时输出格式为 Action: Finish Final Answer: 最终答案 # ReAct 循环defreact_agent(user_query:str,max_steps:int5):# 初始消息系统指令 用户问题messages[{role:system,content:f你是一个智能助理。{tools_desc}\n请严格遵循格式输出。},{role:user,content:user_query}]forstepinrange(max_steps):# 调用 LLM 生成思考行动responseclient.chat.completions.create(modelgpt-3.5-turbo,messagesmessages,temperature0.0)replyresponse.choices[0].message.contentprint(f--- Step{step1}---)print(f模型输出:\n{reply})# 将模型的输出作为新消息加入对话模拟上下文扩展messages.append({role:assistant,content:reply})# 简单解析查找 Action 和 Action InputifAction: Finishinreply:# 提取最终答案final_answerreply.split(Final Answer:)[-1].strip()returnfinal_answerelifAction: lookup_wordinreply:# 提取要查的词wordreply.split(Action Input:)[-1].strip()# 执行工具observationlookup_word(word)print(f工具返回:{observation})# 将观察结果作为新消息通常以 Observation: ... 形式messages.append({role:user,content:fObservation:{observation}})else:# 格式不符合预期强行结束returnAgent 输出格式错误无法继续。return达到最大步数任务未完成。# 测试resultreact_agent(苹果是什么)print(\n最终答案:,result)输出结果示例实际可能略有差异--- Step 1 --- 模型输出: Thought: 用户想知道“苹果”的含义我需要查词典。 Action: lookup_word Action Input: 苹果 工具返回: 一种水果通常是红色或绿色。 --- Step 2 --- 模型输出: Thought: 我已获得词义可以回答用户。 Action: Finish Final Answer: 苹果是一种水果通常是红色或绿色。 最终答案: 苹果是一种水果通常是红色或绿色。面试要点ReAct 循环的核心是思考-行动-观察的交互模式面试官常问“ReAct 和普通的 Chain 有什么区别”——Chain 是固定流程ReAct 是动态决策。AI 应用场景ReAct 是构建能自主使用工具、搜索、计算、操作数据库的 Agent 的基础模式也是 OpenAI Assistant API、LangChain Agent 等框架的底层逻辑。2. ⭐ 记忆管理缓冲记忆、摘要记忆、向量长期记忆问题对话越来越长Agent 需要记住之前的交互内容。但直接把所有历史塞进上下文会导致 token 爆炸。如何高效管理记忆生活化类比缓冲记忆就像你的草稿纸——只记最近几句话用完就擦。摘要记忆就像你的课堂笔记——每隔一段时间把前面的内容总结成要点。向量长期记忆就像你的外部硬盘——把重要信息存到向量数据库需要时再检索出来。术语详解缓冲记忆Buffer Memory直接保存最近 K 轮对话原文。简单但占空间适合短对话。摘要记忆Summary Memory用 LLM 将长对话逐步总结为一段摘要只保留摘要。省 token 但可能丢失细节。向量长期记忆Vector Long-term Memory将对话片段转为向量存入数据库需要时用语义检索。保留细节且可扩展但实现复杂。原理记忆管理的本质是在上下文窗口有限的情况下尽可能保留对后续推理最有用的信息。缓冲记忆利用“最近性”最近的信息最重要摘要记忆利用“概括性”压缩信息向量记忆利用“相关性”只提取与当前问题相关的历史。三种方式常组合使用短期用缓冲长期用摘要或向量。演示用例使用 LangChain 实现三种记忆# pip install langchain langchain-openaifromlangchain.memoryimportConversationBufferMemory,ConversationSummaryMemoryfromlangchain_openaiimportChatOpenAIfromlangchain.chainsimportConversationChain llmChatOpenAI(modelgpt-3.5-turbo,temperature0.3)# ---- 1. 缓冲记忆保留所有对话原文 ----buffer_memoryConversationBufferMemory(return_messagesTrue)chain_bufferConversationChain(llmllm,memorybuffer_memory)chain_buffer.predict(input你好我是小明。)chain_buffer.predict(input我喜欢吃苹果。)# 查看当前记忆中的消息完整历史print(缓冲记忆中的消息数量:,len(buffer_memory.chat_memory.messages))# ---- 2. 摘要记忆逐步压缩历史为摘要 ----summary_memoryConversationSummaryMemory(llmllm,return_messagesTrue)chain_summaryConversationChain(llmllm,memorysummary_memory)chain_summary.predict(input你好我是小明。)chain_summary.predict(input我今天去了公园看到了很多花。)# 记忆内部存储的是摘要而非原文print(摘要记忆中的摘要内容:,summary_memory.buffer)# ---- 3. 向量长期记忆概念演示 ----# 实际实现通常将对话片段存入向量库如 ChromaDB# 查询时用当前问题去检索相关的历史记忆片段拼接到上下文# 伪代码# relevant_memories vector_store.similarity_search(query, k3)# context \n.join(relevant_memories)输出结果缓冲记忆中的消息数量: 4 (用户2条AI2条) 摘要记忆中的摘要内容: The human introduces themselves as Xiao Ming. They mention going to the park and seeing many flowers.AI 应用场景缓冲记忆适合短期对话摘要记忆适合长对话但可丢失细节向量长期记忆是构建能“记住用户偏好”的 Agent 的关键技术。二、中级篇让 Agent 更聪明、更可靠1. 多 Agent 协作角色分工、状态传递问题复杂任务如“调研市场并生成报告”需要多个专业角色协作一个搜索员、一个分析师、一个作家。如何让多个 Agent 分工合作生活化类比多 Agent 协作就像公司部门会议每个 Agent 是一个专家市场部、技术部、财务部他们各自完成分内工作然后通过“会议纪要”状态传递将结果汇总给下一个部门。术语详解多 Agent 系统由多个具有不同角色和目标的 Agent 组成通过通信协作完成任务。AutoGen微软和CrewAI是两个主流多 Agent 框架。CrewAI 的核心概念是Agent角色Task任务Crew协作组。状态传递上一个 Agent 的产出作为下一个 Agent 的输入通过共享上下文或消息队列实现。原理多 Agent 协作的关键是清晰的角色定义和有序的任务分配。每个 Agent 有自己的系统提示描述角色和职责、工具集以及一个“委派”机制。框架会自动将上一个任务的输出和当前任务的需求拼接成提示词驱动下一个 Agent 工作。这比单个 Agent 反复切换角色更高效、更可控。演示用例用 CrewAI 构建一个调研报告的多 Agent 系统# pip install crewai langchain-openaifromcrewaiimportAgent,Task,Crew,Process# 定义两个专业 AgentresearcherAgent(role研究员,goal找到关于{topic}的最新信息,backstory你是一个经验丰富的研究员擅长挖掘深度内容。,verboseTrue,# 打印详细日志allow_delegationFalse,# 不允许委托给其他 Agentllmgpt-3.5-turbo)writerAgent(role撰稿人,goal根据研究员的发现撰写一份简洁的报告,backstory你是一个专业撰稿人擅长将复杂信息转化为流畅文章。,verboseTrue,allow_delegationFalse,llmgpt-3.5-turbo)# 定义两个任务并指定执行者task_researchTask(description搜索并总结关于{topic}的三个关键点。,expected_output一个包含三个要点的列表每个要点一段说明。,agentresearcher# 由研究员执行)task_writeTask(description根据研究员提供的要点撰写一份简短报告不超过200字。,expected_output一份结构清晰的报告。,agentwriter,# 由撰稿人执行context[task_research]# 将研究任务的输出作为本任务的上下文)# 组建 CrewcrewCrew(agents[researcher,writer],tasks[task_research,task_write],processProcess.sequential,# 顺序执行先研究后写报告verboseTrue)# 启动协作resultcrew.kickoff(inputs{topic:2024年人工智能发展趋势})print(最终报告:\n,result)输出结果[研究员] 搜索相关信息... [研究员] 找到三个关键点 1. 多模态模型成为主流... 2. 开源模型性能逼近闭源... 3. AI 代理Agent开始商业化应用... [撰稿人] 根据要点撰写报告... 最终报告: 2024年人工智能发展呈现三大趋势多模态模型成熟文本、图像、语音统一处理开源模型如Llama 3缩小了与闭源模型的差距AI Agent开始在客服、编程等领域商业化落地。AI 应用场景多 Agent 适合需要多角色协作的复杂流程如自动生成市场研究报告、代码审查 修复、多轮辩论等。2. Plan-and-Execute 与反思机制问题ReAct 模式中 Agent 一边想一边做容易“走一步看一步”而忽略全局规划导致任务完成率低。如何让 Agent 先制定计划再执行并且能从失败中反思生活化类比Plan-and-Execute就像建筑蓝图先画好整个房子的设计图Plan再按图施工Execute而不是砌一块砖想一块。反思机制就像考试后复盘做完题后检查一遍发现错误就修正总结教训下次不再犯。术语详解Plan-and-Execute将 Agent 的决策分为两阶段——先由规划器Planner生成完整步骤列表再由执行器Executor逐步完成。反思ReflectionAgent 完成一个步骤或整个任务后自我评估结果的质量如果不符合要求就重新规划或修正。ReWOOReason Without Observation一种变体规划时避免频繁等待工具结果减少循环次数。原理ReAct 的问题在于决策碎片化每执行一个工具就要重新调用 LLM 思考下一步耗时且容易偏离目标。Plan-and-Execute 将“思考全局计划”和“执行具体步骤”解耦Planner 一次性生成完整计划如 1.搜索资料 2.分析数据 3.写报告Executor 顺序执行中间不需要 LLM 再次规划。反思机制则在执行后引入校验循环如果结果不理想如搜索返回空Executor 可以请求 Planner 修改计划。演示用例模拟 Plan-and-Execute 流程伪代码# 模拟 Plan-and-Execute 的核心思想defplan_and_execute(user_query:str):# ---- 阶段1规划 ----planner_promptf你是一个任务规划器。请将以下用户请求分解为不超过5个步骤每步描述动作和预期结果\n{user_query}plan_responseclient.chat.completions.create(modelgpt-3.5-turbo,messages[{role:user,content:planner_prompt}])plan_textplan_response.choices[0].message.contentprint(生成的计划:\n,plan_text)# 将计划解析为步骤列表简化实际可解析JSONsteps[line.strip()forlineinplan_text.split(\n)ifline.strip().startswith((1.,2.,3.,4.,5.))]# ---- 阶段2执行简化打印步骤实际会调用工具 ----results[]forstepinsteps:print(f执行:{step})# 这里执行具体的工具调用并将结果存入 results# 例如如果步骤是“搜索xxx”就调用搜索工具# 省略具体实现results.append(f[完成]{step})# ---- 阶段3反思可选 ----# 检查是否有步骤失败若有则重新规划return任务完成plan_and_execute(调研LangChain框架的优缺点并给出总结)提升任务完成率的关键规划时要明确每个步骤的输入和输出。执行中出错时不要全盘重来只修正失败步骤。加入反思环节用 LLM 评估“当前结果是否满足用户需求”。面试考点面试官常问“ReAct 有什么缺点如何改进”——答ReAct 缺少全局规划Plan-and-Execute 或 ReWOO 可以弥补反思机制能显著提高成功率。3. MCP 协议概念、资源/工具/提示的标准化暴露问题不同的 AI 应用各自定义工具接口开发者需要为每个模型或框架适配一遍。有没有一种标准协议让所有模型都能以统一方式调用工具和资源生活化类比MCP 就像 USB 接口以前每种设备有自己独特的接口打印机用并口鼠标用 PS/2现在统一成 USB任何设备都能即插即用。MCP 就是 AI 应用和工具之间的“USB 标准”。术语详解MCPModel Context Protocol由 Anthropic 提出定义了 AI 模型与外部工具、资源交互的标准协议。它规定了三类暴露端点工具Tools可执行的函数如搜索、计算。资源Resources可读取的数据源如文件、数据库记录。提示Prompts预设的提示模板。MCP Server实现了 MCP 协议的服务端负责暴露工具和资源。MCP ClientAI 应用如 Claude Desktop通过 MCP 客户端连接到 Server自动发现并调用这些工具。原理MCP 使用 JSON-RPC 2.0 作为传输协议Server 启动后注册自己支持的工具。Client 连接后可以通过tools/list获取所有可用工具通过tools/call调用具体工具并传参。这样任何支持 MCP 的模型都能无缝调用任何 MCP Server 提供的工具无需定制开发。2024-2025 年MCP 正成为 Agent 生态的热点。演示用例写一个简单的 MCP ServerPython# pip install mcpfrommcp.server.fastmcpimportFastMCP# 初始化 MCP 服务器命名为 DemoServermcpFastMCP(DemoServer)# 注册一个工具加法计算器mcp.tool()# 装饰器表示这是一个 MCP 工具defadd(a:int,b:int)-int:返回两个整数的和。参数 a 和 b 是加数。returnab# 注册一个资源模拟读取配置文件mcp.resource(config://app)# 资源标识符defget_config()-str:返回应用的配置信息。return{theme: dark, language: zh}# 启动服务器在终端中运行此脚本if__name____main__:mcp.run(transportstdio)# 使用标准输入输出传输可改为 sse 或 streamable http客户端连接示例概念演示# 客户端代码概念实际通过 MCP Client SDK 调用# from mcp import Client# client Client(transportstdio, commandpython server.py)# tools client.list_tools() # 获取工具列表# result client.call_tool(add, {a: 3, b: 5}) # 调用工具# print(result) # 8AI 应用场景MCP 让 Agent 的工具生态从“封闭花园”走向“标准化市场”未来开发者可以像安装插件一样为 Agent 添加新能力。4. ⭐ 会话持久化与检查点恢复问题Agent 执行一个长任务如持续几分钟的数据分析时如果服务崩溃或用户断开连接所有中间状态都丢失了必须从头开始。如何让 Agent 能“断点续传”生活化类比检查点就像游戏存档玩到一半时保存进度即使电脑关机下次还能从存档处继续不用重打已经通过的关卡。术语详解会话持久化将 Agent 运行中的状态消息历史、中间结果、计划进度保存到外部存储如数据库、文件。检查点Checkpoint在关键步骤后保存的状态快照。Agent 可以从最近的检查点恢复执行。LangGraph等框架内置了检查点机制可以在每个节点步骤后自动保存状态。原理持久化的核心是状态的序列化和反序列化。Agent 的完整状态包括对话历史、当前任务计划、已完成的步骤、工具调用结果等。将这些保存为 JSON 或数据库记录恢复时重新加载并继续执行下一步。LangGraph 使用checkpointer参数在编译图时传入框架自动在每一步执行后调用检查点保存。演示用例概念性伪代码LangGraph 检查点# 伪代码展示 LangGraph 的检查点机制fromlanggraph.checkpointimportMemorySaver# 创建一个内存检查点实际可用 SqliteSaver 持久化到磁盘checkpointerMemorySaver()# 编译图时传入检查点graphcreate_agent_graph()# 构建 Agent 的状态图appgraph.compile(checkpointercheckpointer)# 第一次运行指定 thread_id 作为会话标识config{configurable:{thread_id:user-session-123}}app.invoke({input:开始一个长任务...},config)# 模拟中断... 随后用相同的 thread_id 恢复# app.invoke({input: None}, config) # 从上次检查点继续执行AI 应用场景在需要长时间运行的 Agent 服务如自动化数据分析、代码重构中检查点恢复是保证可靠性的关键。AI 应用场景速查表知识点核心用途典型场景ReAct 模式让 Agent 动态使用工具搜索问答、自动化操作缓冲记忆记住最近对话短期上下文感知摘要记忆压缩长对话历史客服长对话向量长期记忆持久化个性化记忆用户偏好学习多 Agent 协作复杂任务分工调研报告、代码审查Plan-and-Execute提升任务规划能力多步骤数据分析反思机制自我纠错提高任务成功率MCP 协议工具标准化暴露跨模型工具复用会话持久化断点续传长任务可靠性面试模拟题1. 原理型什么是 ReAct 模式它和普通的 Chain 有什么区别答案要点ReAct 将推理和行动交织在一起通过思考-行动-观察循环动态决策。Chain 是固定的流程不能根据中间结果调整后续步骤。ReAct 更灵活但调用次数更多。2. 场景型你的 Agent 执行一个需要 10 步的任务但经常在第 6 步出错后全部重来。如何改进答案要点引入检查点机制在每步后保存状态出错后从最近的检查点恢复而非从头开始。同时加入反思机制让 Agent 分析失败原因并调整后续步骤。3. 原理型Plan-and-Execute 相比 ReAct 有什么优势什么情况下应该使用它答案要点Plan-and-Execute 先生成全局计划再执行减少了 LLM 调用次数任务完成率更高。适合步骤清晰、依赖关系明确的任务。ReAct 适合不确定性高、需灵活应对的场景。4. 对比型缓冲记忆、摘要记忆和向量长期记忆各有什么优缺点如何组合使用答案要点缓冲记忆简单但占空间适合短期摘要记忆省 token 但丢失细节向量记忆保细节且可扩展但实现复杂。组合方式短期用缓冲长期用摘要向量检索时先用向量召回相关历史。593 热点型什么是 MCP 协议它解决了 AI Agent 开发中的什么痛点答案要点MCP 是模型上下文协议标准化了 AI 模型与外部工具、资源的交互方式。它让任何支持 MCP 的模型都能调用任何 MCP Server 提供的工具避免了每个模型/工具组合都需要定制开发的碎片化问题。总结从 ReAct 的思考-行动循环到记忆管理、多 Agent 协作再到 Plan-and-Execute 的全局规划和 MCP 的标准化工具暴露你已掌握 Agent 开发的核心技术栈。面试中的高频考点——ReAct 的原理、Plan-and-Execute 的改进思路、MCP 的概念——都已覆盖。现在你可以开始构建自己的智能体并让它可靠地完成复杂任务了。