92-Agent面试题精讲:Agent篇
前言
什么是 Agent?与大模型有什么本质不同?
我理解Agent本质上是一个能自主完成目标的AI系统,跟传统AI最核心的区别在于「自主性」和「能行动」。
传统AI是你问一个问题它回答一个问题,每次都是独立的,被动响应
而Agent有自己的规划能力,你给它一个复杂目标,它会自己把任务拆成多步,通过调工具、访问记忆、感知环境来一步步执行,直到完成。
Agent 的基本架构由哪些核心组件构成?
我理解Agent的基本架构有四个核心组件:LLM、工具、记忆、规划模块。
LLM是整个系统的大脑,负责理解任务和做决策
工具让Agent能跟外部世界交互,搜索、执行代码、调API都靠它
记忆让Agent在任务执行过程中保持状态,不会失忆
规划模块负责把复杂目标拆解成可执行的步骤。
这四个组合在一起,才让Agent具备了自主完成任务的能力。
Workflow,Agent,Tools 这三个的概念和区别介绍一下?
我理解这三个概念是粒度从小到大的三层结构。
Tools是最小的能力单元,就是封装好的可调用函数,比如搜索、执行代码、发邮件,它只负责「执行」,本身没有任何决策能力。
Agent是一个完整的决策系统,内部用LLM做大脑,自己判断什么时候调哪个Tool、要不要继续、什么时候结束,是主动的。
Workflow是更上层的编排框架,是开发者预先定义执行路径,把Agent、LLM、Tools组织成一条确定性流程,每个节点做什么、按什么顺序流转都是开发者事先写死的。
三者最核心的区别就一句话:Tools不做决策只执行,Agent自己做决策,Workflow是开发者替所有节点把决策提前写好。
了解哪些其他的 Agent 设计范式?Agent 和 Workflow的区别是什么?
我理解Agent和Workflow最核心的区别是「谁来决定下一步」。
Workflow是开发者预先定义执行路径,每一步怎么走都是固定的,确定性高、好控制
Agent是让LLM自己决定下一步做什么,灵活但不可控。
常见的设计范式除了纯 Agent 之外, 还有 ReAct、 Plan-and-Execute、Reflection 这几种。
我在实际工程里用得最多的反而是把两者混用,固定流程的部分用Workflow,需要灵活决策的节点嵌入Agent能力,这样既保住了整体可控,又有局部的灵活性。
| 范式 | 核心思想 | 适用场景 |
|---|---|---|
| ReAct | 思考 → 行动 → 观察 → 再思考 | 通用 Tool Calling Agent |
| Plan-and-Execute | 先制定完整计划,再逐步执行 | 复杂、多步骤任务 |
| Reflection / Self-Reflection | Agent 自我检查、反思并修正 | 代码生成、内容生成 |
| Agentic RAG | Agent 动态决定检索什么、是否继续检索、使用什么检索策略 | 复杂知识库问答 |
Agent 推理模式有哪些?ReAct 是啥?具体是怎么实现的?
Agent的推理模式我用过几种。
最基础的是直接输出答案,没有中间推理;CoT是让LLM先把推理过程写出来再给答案,准确率更高;ReAct是在CoT基础上加了「行动」,让LLM交替输出思考和工具调用,每次行动后再根据结果继续思考,形成一个循环。
我觉得ReAct是目前Agent用得最广的模式,因为它推理过程可见,又能动态利用外部工具,两个优点都有。
ReAct、Plan-and-Execute、Reflection 三种范式有什么核心区别?实际项目中该如何选型?
我理解这三者是Agent开发里最主流的三种设计范式,核心区别在于「决策和执行的关系」。
ReAct是边想边干,走一步看一步,单步迭代实时调整,灵活度最高
Plan-and-Execute是先想全再干,先定完整计划再分步执行,适合长流程复杂任务,不容易跑偏
Reflection不是独立的完整流程,而是给前两者加的「检查修正buff」,用来提升输出质量。
实际选型就看三个维度:任务复杂度、流程确定性、输出质量要求,新手入门首选ReAct,复杂任务用Plan-and-Execute,高要求场景再加 Reflection。
复杂任务怎么做的任务拆分?为什么要拆分?效果如何提升?
我理解任务拆分的原因是LLM一次性处理太复杂的任务很容易出错,把大任务拆成小步骤,每步聚焦一件事,准确率会明显提升。
拆分方式主要有两种:一种是静态拆分,提前把步骤写死;另一种是动态拆分,让LLM自己根据目标规划步骤,更灵活但也更难控制。
拆完之后步骤之间可能有依赖关系,我的经验是把能并行的步骤并发跑,端到端延迟可以降很多,有时能降40%到60%。
请你介绍一下 AI Agent 的记忆机制,并说明在实际开发中应该如何设计记忆模块?
Agent需要记忆才能在多步任务中保持状态、跨任务积累知识。
记忆机制分四层:感知记忆(当前输入的原始内容)、短期记忆(contextwindow里的对话历史)、长期记忆(存在外部数据库、语义检索召回)、实体记忆(结构化提取的关键事实,如用户偏好什么的)。
实际设计时要解决三个核心问题:存什么、怎么存、什么时候取出来用,根据信息类型选合适的存储方式,再搭配主动检索和按需检索两种策略使用。
Agent 的长短期记忆系统怎么做的?记忆是怎么存的?粒度是多少?怎么用的?
我理解记忆系统分两层。
短期记忆就是context window 里的对话历史,存当前任务的中间状态,任务结束就清掉
长期记忆用向量数据库存,把信息总结后写入,用的时候做语义检索拿回来注入提示词中。
粒度上我通常按「一次完整交互」或「一个关键事件」为单位存,太细碎检索噪音大,太粗糙又丢失细节,这个需要根据业务实际调整。
什么是 Multi-Agent?
多智能体系统(Multi-Agent)就是多个Agent 协作完成任务,每个Agent 各有分工,有的负责搜索、有的负责写代码、有的负责做评审。
好处:
- 决策准确率更高、token 消耗更低:每个 Agent 只带必要的最少prompt,没有冗余信息干扰,虽然调用 LLM 次数多了,但更省 token、决策更准、更稳定
- 并行思考和任务处理:主管分派任务,子 Agent 并行处理,整体效率更高
- 多角色互相讨论,纠错能力更强:多 Agent 有不同角色,可以互相监督、互相纠错,比单个 Agent 自己反思更靠谱,复杂任务表现更强
Multi-Agent通过专业分工和并行执行,能处理更复杂、更长流程的任务,这是我在实际项目里选择多智能体方案的核心原因。
说说 Single-Agent 和 Multi-Agent 的设计方案?
Single-Agent适合任务流程清晰、复杂度适中的场景,实现简单、好维护
Multi-Agent适合需要专业分工、任务量大或者需要并行执行的复杂场景。
Multi-Agent 架构上主要有两种拓扑:中心化的Orchestrator 模式,由一个主Agent统一调度各个Worker;去中心化的Peer-to-Peer模式,Agent之间直接通信。
我在工程里用中心化用得更多,因为好控制、好调试,出问题链路清晰。
Agent 记忆压缩通常有哪些方法?
记忆压缩常见有四种方法:摘要压缩、滑动窗口、重要性过滤、结构化抽取。
摘要压缩是把长对话总结成简短摘要
滑动窗口是只保留最近N轮对话
重要性过滤是打分筛选,只留重要内容
结构化抽取是把关键信息抽成结构化数据存起来。
我在实际项目里最常用的是摘要压缩和滑动窗口,而且经常组合用,滑动窗口丢弃前先做一次摘要,尽量不丢重要信息。
在工程实践中,为什么有时候选择「手搓」Agent,而不是直接用成熟框架?
我的感受是框架用起来快,但有几个实际痛点。
第一是抽象层太多,调试的时候不知道哪步出了问题,得一层层往下扒;第二是版本升级经常有破坏性变更,线上稳定性难保证;第三是框架的通用设计往往和具体业务需求有偏差,定制起来反而更费劲。
手搓的代码完全在自己掌控之内,可观测性好、出问题好排查,也更方便做性能优化。
所以我现在的策略是核心逻辑手写,只在边缘功能上用框架的工具。
如何赋予 LLM 规划能力?
给LLM加规划能力主要靠这几种思路。
- CoT是让LLM把推理步骤写出来,线性地一步步推导到答案
- ToT是让它同时探索多条推理路径,选最优的继续深入
- GoT是图结构推理,推理节点可以复用和合并,适合更复杂的任务。
工程上我用CoT最多,因为实现成本最低,就是改个prompt;ToT效果更好但调用次数多,成本大概是3到5倍;GoT目前还比较学术,生产环境我没见过有人真正落地使用
讲讲 Agent 的反思机制?为什么要用反思?具体怎么实现?
反思机制我的理解是:让Agent在完成一个步骤或整个任务后,自我评估输出质量,判断有没有问题,如果有问题就重试或调整策略。
用反思的原因是LLM第一次输出不一定是最优的,加一轮自我检查能显著提升质量,相当于人写完东西自己再看一遍。
代价是至少多一次LLM调用,token消耗和延迟都会增加,所以我在工程里通常只在质量要求高的关键节点启用反思,不是每步都做。
如何设计多 Agent 的协作与动态切换机制?
协作靠两件事:消息传递和共享状态。消息传递是Agent完成自己的工作后把结果发出去,下一个Agent取用;共享状态是所有Agent共同读写一个状态对象,记录任务进展和中间结果。
动态切换靠Orchestrator来做,有两种方式:一种是静态路由,提前写好规则「任务类型A就找AgentX」;另一种是让LLM动态决策,根据当前情况实时判断该把任务交给谁。
我的实践是两种混用,主流程用静态路由保证稳定,边缘情况才交给LLM动态判断。