首页 / 资讯中心 / 文章详情

Agent面试第一问刷掉一半人?从Planning、Memory到状态管理深度拆解

Agent面试第一问刷掉一半人?从Planning、Memory到状态管理深度拆解 ★ FEATURED ARTICLE
1. 为什么“Agent面试第一问”能筛掉一半人1.1 这道题到底在问什么“Agent面试第一问就刷掉一半人”——这个标题在技术圈里流传很广但很多人第一次看到会误以为是在问某个具体框架的API怎么调。实际上这道题的核心不是考你背没背过某个库的文档而是考你对Agent本质的理解它和普通的LLM调用有什么区别它凭什么能自主完成任务它的边界在哪里我面过不少人也被人面过。这道题通常以这样的形式出现“你觉得Agent和普通的Chatbot有什么本质区别”或者“如果让你从零设计一个Agent你会怎么拆解它的核心模块”看起来很简单对吧但恰恰是这种开放性问题最能暴露一个人是真正动手做过Agent还是只看了几篇公众号文章就来面试了。一半人被刷掉不是因为答不上来而是因为答得太“教科书”。比如很多人会背“Agent LLM Planning Memory Tools”。这句话本身没错但如果你只能说出这句话面试官接下来问一句“那Planning具体怎么实现Memory怎么存Tools调用失败怎么处理”你就卡住了。面试官想听的不是定义而是你在实际项目中踩过的坑、做过的取舍。1.2 面试官真正想考察的三个维度根据我和身边同行的交流这道题背后其实藏着三个维度的考察第一你是否理解Agent的“自主性”从何而来。普通LLM调用是“输入-输出”的一次性映射而Agent需要在没有人类干预的情况下自己决定下一步做什么。这个“决定”的过程就是Planning。面试官想看你是否理解ReAct、Plan-and-Execute、Reflection这些模式的本质区别而不是只知道名字。第二你是否处理过“不确定性”。Agent调用工具可能失败LLM输出可能格式错误任务可能中途需要调整。一个合格的Agent开发者必须有一套完整的错误处理和重试机制。面试官会通过追问细节来判断你是不是真的写过生产级代码。第三你是否清楚Agent的能力边界。很多人把Agent吹得天花乱坠但真正做过的人知道当前Agent在长链路任务、复杂推理、多模态场景下还有大量局限。能客观说出“什么场景不适合用Agent”的人反而更容易通过面试。1.3 一个真实的面试场景还原我拿自己经历过的一次面试举例。面试官上来就问“你做过Agent项目那你说说如果用户问‘帮我订一张明天从北京到上海的机票’你的Agent会怎么处理”我当时没有直接回答“调用订票API”而是先反问了一句“这个Agent有没有访问用户日历和支付工具的权限”面试官眼睛一亮说“你继续。”然后我拆解了流程首先需要解析用户意图提取时间、出发地、目的地然后查询航班信息这里要考虑是调用外部API还是用RAG检索接着需要确认用户偏好比如时间偏好、航司偏好最后才是下单而下单又涉及支付授权和确认环节。关键来了——我说“这里面最难的其实不是调用API而是状态管理。如果用户中途说‘算了改成高铁’Agent需要能回滚之前的航班查询状态重新规划。很多Demo级别的Agent在这里就崩了因为它们没有设计好状态机。”面试官后来告诉我就是这句话让他决定给我发offer。因为大部分候选人只会说“调用API”而真正做过的人才知道状态管理才是Agent的命门。2. Agent核心模块的深度拆解与实操要点2.1 Planning模块从ReAct到Plan-and-Execute的取舍Planning是Agent的大脑。没有Planning的Agent就是一个只会被动响应的Chatbot。但Planning的实现方式有很多种选错了会让你的Agent又慢又笨。ReAct模式是最常见的入门方案。它的核心思想是“思考-行动-观察”循环LLM先输出一段思考Thought然后决定调用哪个工具Action工具返回结果后ObservationLLM再根据结果决定下一步。这个模式的优点是实现简单适合任务步骤不多、每步依赖前一步结果的场景。但缺点也很明显每一步都要调用一次LLM延迟高而且容易陷入循环。我实测过一个ReAct Agent处理“查天气并推荐穿搭”的任务平均需要4-5轮LLM调用耗时约8-12秒。如果换成Plan-and-Execute模式先让LLM一次性生成完整计划然后按计划执行同样的任务只需要2轮LLM调用耗时降到3-4秒。Plan-and-Execute模式适合步骤明确、可以提前规划的任务。但它的风险在于如果执行过程中出现意外比如某个工具返回了预期之外的结果整个计划可能失效需要重新规划。所以我在实际项目中通常采用混合模式先用Plan-and-Execute生成高层计划然后在每个步骤内部用ReAct处理细节。注意不要盲目追求复杂的Planning模式。如果你的任务只有2-3步ReAct完全够用。引入Plan-and-Execute反而会增加系统复杂度和调试难度。2.2 Memory模块短期记忆与长期记忆的分层设计Memory是Agent最容易出问题的模块。很多人以为Memory就是“把对话历史塞进Context”但这样做有两个致命问题一是Context长度有限二是无关信息会干扰LLM的判断。我的做法是把Memory分成三层第一层是工作记忆Working Memory。只保留当前任务相关的最近几轮对话和工具调用结果。这一层直接放在Prompt里容量控制在2000 token以内。超过这个长度就触发摘要压缩。第二层是会话记忆Session Memory。保存整个会话的关键信息比如用户偏好、已确认的事实、未完成的任务。这一层用向量数据库存储需要时通过语义检索召回。我常用的是Chroma或Qdrant轻量且够用。第三层是长期记忆Long-term Memory。跨会话保存用户的历史行为和偏好。这一层需要设计遗忘机制否则数据库会无限膨胀。我的策略是高频访问的记忆保留超过30天未访问的记忆归档或删除。这里有个实操细节摘要压缩的Prompt设计很关键。我试过让LLM直接总结对话历史结果它经常丢掉关键的工具调用参数。后来我改成结构化摘要要求LLM按“用户意图、已执行动作、当前状态、待办事项”四个字段输出信息保留率明显提升。2.3 Tools模块工具调用的容错与重试机制Tools是Agent的手脚。但很多Demo只展示了“成功调用”的情况真实生产环境中工具调用失败是常态。我统计过自己项目中的工具调用失败率网络超时占40%参数格式错误占30%权限不足占15%其他占15%。这意味着如果没有完善的容错机制你的Agent有将近一半的概率会卡住。我的解决方案是三级重试机制第一级是参数校验重试。在调用工具前先用一个轻量级的校验函数检查参数格式。如果格式错误让LLM重新生成参数最多重试2次。这一步能拦截大部分低级错误。第二级是网络重试。对于超时或5xx错误采用指数退避策略重试初始间隔1秒最大间隔8秒最多重试3次。第三级是降级策略。如果某个工具连续失败Agent需要能切换到备用方案。比如查询航班API失败可以降级到用搜索引擎检索航班信息虽然精度下降但至少能给出一个参考答案。实操心得给每个工具设置独立的超时时间。我见过有人把所有工具的超时都设成30秒结果一个慢工具拖垮了整个Agent的响应速度。我的经验值是查询类工具5-8秒写入类工具10-15秒复杂计算类工具20-30秒。2.4 状态管理Agent的“命门”所在状态管理是区分Demo级Agent和生产级Agent的分水岭。Demo级Agent通常是无状态的每次调用都是独立的。但真实任务往往需要跨多轮对话保持状态。我设计状态机时遵循三个原则原则一状态显式化。不要依赖LLM的Context来隐式保存状态而是用一个独立的状态对象来管理。这个对象包含当前任务ID、已完成步骤、待执行步骤、中间结果、错误信息。每次LLM调用时把状态对象序列化后注入Prompt。原则二状态可回滚。用户随时可能改变主意。如果用户说“算了不订机票了”Agent需要能回滚到任务开始前的状态。我的做法是每次状态变更前先做快照回滚时恢复到最近的快照。原则三状态可观测。生产环境中你需要能随时查看Agent的当前状态来排查问题。我会把状态变更日志输出到独立的日志系统包含时间戳、变更前后的状态、触发变更的事件。3. 从零搭建一个可用的Agent完整实操流程3.1 环境准备与技术选型假设我们要搭建一个“智能日程助手”Agent能帮用户安排会议、查询空闲时间、发送邀请。我以这个场景为例展示完整的搭建流程。技术选型方面我的建议是模块推荐方案备选方案选择理由LLMGPT-4o或Claude 3.5本地部署Qwen2.5工具调用能力强格式遵循度高框架LangGraphAutoGen状态管理灵活支持循环和分支向量库ChromaQdrant轻量适合中小规模记忆存储工具协议OpenAI Function CallingMCP生态成熟调试方便日志LangSmith自建日志系统可视化追踪Agent执行链路这里重点说一下框架选择。LangGraph和AutoGen我都深度使用过。AutoGen适合多Agent协作场景比如模拟一个团队开会。但如果你做的是单Agent任务型应用LangGraph的状态图模型更直观调试也更方便。它的核心概念是“节点”和“边”每个节点是一个处理步骤比如调用LLM、执行工具边定义了步骤之间的流转条件。3.2 定义Agent的状态结构在LangGraph中第一步是定义状态结构。我用Python的TypedDict来定义from typing import TypedDict, Annotated, List from langgraph.graph.message import add_messages class AgentState(TypedDict): messages: Annotated[List, add_messages] current_task: str completed_steps: List[str] pending_steps: List[str] tool_results: dict error_count: int user_preferences: dict这个状态结构包含了前面提到的所有关键要素对话消息、当前任务、已完成步骤、待执行步骤、工具结果、错误计数、用户偏好。每次状态流转时LangGraph会自动合并新状态和旧状态。注意add_messages是一个特殊的注解它告诉LangGraph把新消息追加到消息列表而不是覆盖。这个细节很容易被忽略导致对话历史丢失。3.3 实现Planning节点Planning节点的职责是根据用户输入和当前状态决定下一步做什么。我的实现逻辑是def planning_node(state: AgentState): prompt f 当前任务{state[current_task]} 已完成步骤{state[completed_steps]} 待执行步骤{state[pending_steps]} 最近工具结果{state[tool_results]} 请决定下一步行动。可选行动 1. 调用工具输出工具名和参数 2. 请求用户确认输出确认问题 3. 任务完成输出最终答案 以JSON格式输出你的决定。 response llm.invoke(prompt) decision parse_json(response) return {pending_steps: [decision]}这里的关键是强制JSON输出。我试过让LLM自由输出结果它经常夹杂自然语言解释导致解析失败。后来我在Prompt里明确要求“只输出JSON不要任何其他文字”并在代码里加了JSON解析的异常处理。3.4 实现工具执行节点工具执行节点负责调用实际工具并处理结果def tool_node(state: AgentState): action state[pending_steps][0] tool_name action[tool] tool_args action[args] try: result tools[tool_name].invoke(tool_args) return { tool_results: {tool_name: result}, completed_steps: state[completed_steps] [tool_name], error_count: 0 } except Exception as e: new_error_count state[error_count] 1 if new_error_count 3: return { messages: [f工具{tool_name}连续失败3次任务终止], error_count: new_error_count } return { tool_results: {tool_name: f错误{str(e)}}, error_count: new_error_count }这段代码里有两个关键设计一是错误计数连续失败3次就终止任务避免无限重试二是错误信息注入状态让Planning节点能看到错误信息并决定是否换一种方式。3.5 组装完整的Agent图最后用LangGraph把节点组装起来from langgraph.graph import StateGraph, END workflow StateGraph(AgentState) workflow.add_node(planning, planning_node) workflow.add_node(tool_exec, tool_node) workflow.set_entry_point(planning) workflow.add_conditional_edges( planning, should_continue, { tool: tool_exec, end: END } ) workflow.add_edge(tool_exec, planning) agent workflow.compile()should_continue函数根据Planning节点的输出决定下一步如果决定调用工具就跳到tool_exec节点如果任务完成就结束。这个图的结构是“Planning → Tool → Planning”的循环直到任务完成或达到最大迭代次数。我通常会设置最大迭代次数为10防止Agent陷入死循环。3.6 实测效果与性能数据我用这个Agent处理了50个真实日程安排任务统计结果如下指标数值任务完成率86%平均响应时间6.2秒平均LLM调用次数3.8次工具调用失败率12%需要人工干预的比例14%失败的14%主要集中在两类任务一是需要访问外部日历系统但权限配置错误的二是用户需求模糊导致Agent反复确认的。这两类问题后来通过改进权限校验和增加“模糊需求澄清”节点得到了改善。4. 常见问题与排查技巧实录4.1 Agent陷入死循环怎么办这是最常见的问题。Agent反复调用同一个工具或者Planning节点一直输出相同的决定。我的排查思路是第一步检查状态更新逻辑。很多时候是状态没有正确更新导致Planning节点看到的信息始终不变。比如工具执行后没有把结果写入tool_resultsPlanning节点就会以为工具没执行过再次调用。第二步检查Prompt中的循环检测。我会在Prompt里加入“已执行动作列表”并明确告诉LLM“不要重复执行已完成的动作”。这个简单的改动能减少80%的循环问题。第三步设置硬性迭代上限。无论Agent是否完成任务达到最大迭代次数就强制终止并返回当前的最佳结果。这是最后的兜底方案。4.2 工具调用参数格式错误怎么解LLM生成的工具参数经常不符合预期格式。比如要求传入ISO格式的日期它传了“明天下午三点”。我的解决方案是双层校验第一层是Schema校验。用Pydantic定义每个工具的参数模型LLM输出后先过一遍Pydantic校验。如果失败把校验错误信息返回给LLM让它重新生成。第二层是语义校验。对于日期、时间、金额这类有业务含义的参数额外做一次语义检查。比如日期不能是过去的时间金额不能为负数。语义校验失败时不是让LLM重试而是直接向用户确认。实操心得在工具描述里写清楚参数格式要求比在Prompt里写更有效。因为工具描述是LLM每次调用时都会看到的而Prompt可能被截断。我习惯在工具描述的docstring里用例子说明参数格式比如“date: 日期格式为YYYY-MM-DD例如2024-01-15”。4.3 Agent响应太慢怎么优化响应速度是用户体验的关键。我总结了几条优化经验优化一并行调用无依赖的工具。如果Agent需要同时查询天气和航班这两个工具没有依赖关系可以并行调用。LangGraph支持并行节点能把总耗时从串行的10秒降到并行的6秒。优化二缓存高频查询结果。对于“查询会议室空闲时间”这类高频且结果变化不快的查询加一层Redis缓存TTL设为5分钟。实测能减少30%的工具调用。优化三用小模型做意图分类。不是所有步骤都需要GPT-4。我通常用一个微调过的小模型比如Qwen2.5-7B做意图分类和参数提取只在Planning和最终回答时用大模型。这样能把平均成本降低60%速度提升40%。4.4 常见问题速查表问题现象可能原因排查方法解决方案Agent不调用工具Prompt中工具描述不清晰检查工具描述是否包含使用场景在工具描述中增加示例工具调用参数错误LLM未理解参数格式打印LLM原始输出增加Schema校验和重试响应时间超过30秒串行调用过多工具查看执行链路耗时并行化无依赖的工具调用对话历史丢失状态未正确合并检查状态更新逻辑使用add_messages注解Agent重复相同回答状态未更新检查completed_steps强制更新状态并注入Prompt任务中途卡住工具连续失败查看error_count设置最大重试次数和降级策略4.5 几个容易被忽略的细节细节一工具描述里的“负面示例”很重要。除了告诉LLM这个工具能做什么还要告诉它不能做什么。比如“查询航班工具只能查询未来30天内的航班不能查询历史航班”。这能减少无效调用。细节二给Agent设置“求助”机制。当Agent连续失败或遇到无法处理的情况时应该能主动向用户求助而不是硬撑。我在状态里加了一个need_help标志Planning节点检测到这个标志为True时直接生成求助消息返回给用户。细节三日志要记录LLM的原始输出。很多问题只有看到LLM的原始输出才能定位。我会把每次LLM调用的完整Prompt和Response都记录到日志系统排查问题时非常有用。细节四定期评估Agent的表现。我每周会抽10个真实任务做人工评估检查Agent的回答质量、工具调用准确性、响应速度。这个习惯帮我发现了很多自动化测试覆盖不到的问题。5. 面试中如何回答“Agent第一问”5.1 回答框架从定义到实践再到边界如果你在面试中遇到这道题我建议用“定义-实践-边界”三段式来回答。第一段用一句话定义Agent的本质。比如“Agent是一个能自主感知环境、做出决策并执行动作的系统。和普通LLM调用的最大区别在于Agent有自主性——它能在没有人类逐步指令的情况下自己决定下一步做什么。”第二段用你实际项目中的例子说明你理解Planning、Memory、Tools的协作。不要泛泛而谈要具体。比如“我在上一个项目中用LangGraph搭建了一个日程助手Agent。Planning模块用ReAct模式Memory分三层管理Tools模块有三级重试机制。实测任务完成率86%。”第三段客观说明Agent的局限性。比如“当前Agent在长链路任务和复杂推理上还有明显不足。我的经验是超过10步的任务Agent的成功率会显著下降。所以我在设计时会尽量把任务拆解成多个短链路子任务。”5.2 避免踩的三个坑坑一不要背定义。面试官听了一百遍“Agent LLM Planning Memory Tools”你再背一遍只会减分。要用自己的话重新组织并加上实际经验。坑二不要只谈成功案例。主动说一个你踩过的坑比如“我一开始没做状态管理结果用户改需求时Agent完全懵了”。这比只谈成功更能体现你的实战经验。坑三不要回避“不知道”。如果面试官问到一个你没接触过的技术点坦诚说“这个我没在生产环境中用过但我的理解是……”。强行编造反而容易露馅。5.3 一个加分的回答示例“我觉得Agent和Chatbot的本质区别在于决策权。Chatbot的决策权在用户手里用户问什么它答什么。Agent的决策权在系统手里用户给一个目标Agent自己决定怎么达成。我做过一个会议安排Agent用户说‘帮我安排下周和团队的复盘会’。这句话里没有时间、没有时长、没有参会人。Chatbot会直接反问用户要这些信息。但我的Agent会先查团队日历找共同空闲时间再根据历史会议时长推荐一个默认时长然后生成一个草案让用户确认。这个‘先查再问’的决策就是Agent的价值。但我也踩过坑。有一次Agent查日历的API挂了它没有降级方案直接卡死了。后来我加了降级策略日历查不到就用默认工作时间段至少能给用户一个可用的建议。所以我现在面试别人时特别看重候选人有没有处理过这类‘不完美情况’的经验。”这段回答既展示了技术理解又体现了实战经验还主动暴露了踩坑经历比单纯背定义有说服力得多。5.4 面试官可能追问的问题根据我的经验这道题之后面试官通常会追问“你的Agent怎么处理多轮对话中的上下文丢失”“如果工具返回的结果和预期不符Agent怎么调整”“你怎么评估Agent的好坏有没有量化指标”“多Agent协作你了解吗和单Agent比有什么优劣”这些问题都没有标准答案面试官想看的是你的思考过程。我的建议是先给出你的方案然后说明这个方案的适用场景和局限性最后提一下你考虑过的备选方案。这种“方案-边界-备选”的回答结构能体现你的系统思维。6. 从面试题到生产级Agent的进阶路径6.1 从Demo到生产的五个阶段很多人能做出Demo级Agent但一到生产环境就崩。我总结了自己走过的五个阶段阶段一单轮工具调用。能根据用户输入调用一个工具并返回结果。这是最简单的形态大部分教程都停在这里。阶段二多轮ReAct循环。能根据工具结果决定下一步支持多步任务。这个阶段需要处理状态管理和循环检测。阶段三错误处理与降级。工具失败时有重试和降级策略任务不会因为单点故障而完全失败。阶段四记忆与个性化。能跨会话记住用户偏好提供个性化服务。这个阶段需要设计记忆的存储、检索和遗忘机制。阶段五可观测与可评估。有完整的日志、监控和评估体系能持续优化Agent的表现。这个阶段是从“能用”到“好用”的关键。大部分面试者停留在阶段一或阶段二能讲到阶段三的就已经很少了。如果你能在面试中展示你对阶段四和阶段五的理解基本就能脱颖而出。6.2 持续优化的三个方向Agent上线只是开始持续优化才是长期工作。我通常从三个方向入手方向一Prompt迭代。收集失败案例分析是Prompt哪里没写清楚然后针对性改进。我每周会做一次Prompt Review把本周的失败案例归类找出共性问题。方向二工具增强。根据用户反馈增加新工具或者改进现有工具的参数设计。比如用户经常问“附近有什么餐厅”我就加了一个地图搜索工具。方向三模型微调。当Prompt优化到瓶颈时考虑用积累的数据微调一个小模型专门负责意图分类和参数提取。这能显著降低成本并提升速度。6.3 一个值得关注的趋势Agent评估标准化目前Agent评估还没有统一标准每个团队都有自己的评估方法。但我观察到一些共识正在形成任务完成率、平均响应时间、工具调用准确率、人工干预率这四个指标基本是标配。我建议在做Agent项目时从第一天就开始记录这四个指标后续优化时才有数据支撑。另外我个人的经验是不要追求100%的自动化。当前技术条件下Agent能处理80%的常见情况就已经很好了剩下的20%交给人工兜底。强行追求100%只会让系统变得极其复杂且脆弱。我在实际项目中会设计一个“转人工”的触发条件当Agent连续失败或用户明确要求人工时无缝切换到人工处理。这个设计反而让用户满意度更高因为他们知道有兜底方案。这个内容后续还可以这样扩展如果你对多Agent协作感兴趣可以研究一下Agent之间的通信协议和任务分配策略如果你想深入Memory模块可以看看MemGPT的思路它把Memory管理做成了一个独立的操作系统层。这两个方向都是当前Agent领域比较活跃的研究方向也是面试中能加分的知识点。
阅读完成 · 觉得有帮助?
咨询建站