Agent
Agent
定义、循环、规划、记忆、工具、协议和框架。
001 · 易 · 你如何定义一个基于 LLM 的智能体(Agent)?它通常由哪些核心组件构成?
来源:Hello-Agents Extra01
一个基于 LLM 的智能体(Agent)是一个能够自主理解环境、进行规划决策、并执行行动以达成特定目标的计算系统。其核心特征是利用一个大型语言模型(LLM)作为其“大脑”或“中央处理器”,来进行复杂的推理和决策。
与传统的调用LLM进行问答或文本生成不同,Agent具有自主性和循环执行的特点,它能主动地、持续地与环境或工具交互,直到完成任务。
一个典型的LLM Agent通常由以下四个核心组件构成:
- 大脑/核心引擎 (Brain/Core Engine):
- 组件: 一个强大的大型语言模型(LLM),如GPT系列、Gemini、Llama等。
- 作用: 这是Agent的认知核心。它负责理解用户目标、感知环境信息、进行常识推理、制定计划、并决定下一步的行动。所有其他组件的输出最终都会汇集到LLM进行处理。
- 规划模块 (Planning Module):
- 组件: 可以是LLM的内置能力(如通过CoT、ReAct等提示策略激发),也可以是独立的算法模块。
- 作用: 负责将一个复杂、长期的目标分解成一系列更小、更具体的、可执行的子任务。它还负责根据行动的反馈动态地调整和修正计划。规划能力是Agent处理复杂任务的关键。
- 记忆模块 (Memory Module):
- 组件: 通常是外部数据库或数据结构的组合,如向量数据库、键值存储等。
- 作用: 弥补LLM有限的上下文窗口。它分为:
- 短期记忆: 记录当前的对话历史、中间步骤的“思考过程”(scratchpad),用于维持任务的连贯性。
- 长期记忆: 存储过去的经验、知识、用户偏好等,通过检索(通常是RAG)来为当前决策提供信息。
- 工具使用模块 (Tool Use Module):
- 组件: 一系列外部API、函数库或硬件接口。
- 作用: 扩展Agent的能力边界。LLM本身无法获取实时信息、执行数学计算或与物理世界交互。工具使用模块允许Agent调用外部工具来完成这些任务,例如:
- 信息获取: 调用搜索引擎、数据库查询API。
- 代码执行: 运行Python解释器、访问终端。
- 物理操作: 控制机器人手臂、调用智能家居API。
002 · 中 · 请详细解释 ReAct 框架。它是如何将思维链和行动结合起来,以完成复杂任务的?
来源:Hello-Agents Extra01
ReAct (Reason and Act) 是一个强大且基础的Agent行为框架,它通过一种巧妙的提示(Prompting)策略,让LLM能够协同地生成推理轨迹(reasoning traces)和任务相关的行动(actions)。
核心思想:
ReAct的核心思想是,人类在解决复杂问题时,并不仅仅是“思考”或“行动”,而是将两者紧密地交织在一起。我们会先思考一下,然后采取一个行动,观察结果,再根据结果进行思考,决定下一步行动。ReAct就是模仿人类这种“思考 -> 行动 -> 观察 -> 思考...”的循环模式。
工作流程:
ReAct通过一个精心设计的Prompt来引导LLM生成特定格式的文本。这个循环的每一步如下:
- 思考 (Thought):
- LLM首先分析当前的任务目标和已有的信息(观察)。
- 然后,它会生成一段内心独白,即“思考”部分。这部分内容是LLM对当前情况的分析、策略的制定或对下一步行动的规划。例如:“我需要查找一下今天新加坡的天气。我应该使用搜索工具。”
- 思考过程让Agent的行为变得可解释,并且有助于LLM自己进行复杂的规划和错误修正。
- 行动 (Action):
- 在“思考”之后,LLM会决定并生成一个具体的、可执行的“行动”。
- 这个行动通常被格式化为
Action: [Tool_Name, Tool_Input]的形式。例如:Action: [Search, "weather in Singapore today"]。 Tool_Name是要调用的工具名称,Tool_Input是传递给该工具的参数。
- 观察 (Observation):
- Agent的外部执行器(harness)会解析LLM生成的“行动”,并实际调用对应的工具。
- 工具执行后返回的结果,被格式化为“观察”信息,并反馈给LLM。例如:
Observation: "Today in Singapore, the weather is sunny with a high of 32°C."
循环与结合:
这个“观察”结果会作为新的上下文,与原始目标一起,输入到LLM中,开始下一轮的“思考 -> 行动 -> 观察”循环。
如何结合思维链(CoT)和行动?
- 思维链 (Chain of Thought, CoT) 是一种让LLM通过生成中间推理步骤来解决复杂问题的方法。
- ReAct中的思考 (Thought)部分,本质上就是一种动态的、交互式的思维链。
- 传统的CoT是一次性生成所有思考步骤,然后得出答案。而ReAct的“思考”是每一步行动前都会进行的、基于最新观察结果的思维链。
- 这种结合使得Agent能够:
- 处理动态环境: 可以根据工具返回的最新信息实时调整策略。
- 进行错误修正: 如果一个行动失败或返回了无用的信息,Agent可以在下一步的“思考”中分析失败原因,并尝试不同的行动。
- 完成复杂任务: 通过将大任务分解成一系列“思考-行动”的子步骤,ReAct能够完成需要多步推理和工具交互的复杂任务。
003 · 中 · 在 Agent 的设计中,“规划能力”至关重要。请谈谈目前有哪些主流方法可以赋予 LLM 规划能力?(例如 CoT, ToT, GoT等)
来源:Hello-Agents Extra01
规划能力是衡量Agent智能水平的核心指标,它决定了Agent能否有效地将复杂目标分解为可执行步骤。目前,赋予LLM规划能力的主流方法,从简单到复杂,大致可以分为以下几个层次:
- 基于提示的隐式规划 (Prompt-based Implicit Planning):
- Chain of Thought (CoT): 这是最基础的规划方法。通过在提示中加入“Let's think step by step”,引导LLM生成一个线性的、一步接一步的思考过程。这个思考过程本身就是一种简单的计划。
- 优点: 实现简单,无需修改模型。
- 缺点: 规划是线性的,无法进行探索和回溯。一旦某一步出错,整个计划很可能失败。
- ReAct 框架: ReAct将CoT与行动结合,使得规划成为一个动态过程。每一步的“思考”都是基于前一步“观察”的重新规划,比CoT更具鲁棒性。
- 基于搜索的显式规划 (Search-based Explicit Planning):
这类方法将规划问题形式化为一个搜索问题,通过探索不同的“思考”路径来寻找最优解。
Tree of Thoughts (ToT):
- 核心思想: ToT将规划过程构建为一棵“思维树”。从一个初始问题开始,LLM会生成多个不同的、并行的思考路径(树的分支)。
- 工作流程: 它采用标准的树搜索算法(如广度优先或深度优先搜索),在每一步都对当前的所有“思维节点”(叶子节点)进行评估(通常也由LLM自己打分),然后选择最有希望的节点进行下一步的扩展。
- 优点: 允许模型进行探索、评估和回溯,能解决需要深思熟虑或多路径探索的复杂问题。
- 缺点: 计算开销大,因为需要维护和评估一整棵树。
Graph of Thoughts (GoT):
- 核心思想: GoT是对ToT的进一步泛化。它认为思维过程不一定是树状的,而更可能是图状的。
- 工作流程: GoT允许不同的思维路径(分支)进行合并(Merge),将多个子问题的解汇集起来形成一个更复杂的解。它还允许循环(Cycle),使得思维过程可以迭代地优化和精炼。
- 优点: 提供了比树更灵活的思维结构,能够解决需要整合不同信息流或迭代改进的、更复杂的规划问题。
- 缺点: 结构和实现比ToT更复杂。
- 基于任务分解的规划 (Task Decomposition Planning):
- 方法: 训练或提示LLM充当一个“规划器”,将主任务显式地分解成一个依赖图或一个步骤列表。然后,另一个“执行器”LLM(或同一个LLM扮演不同角色)再去逐一完成这些子任务。
- 优点: 结构清晰,易于管理和监控任务进度。
- 缺点: 对LLM的分解能力要求很高,且预先分解的计划可能缺乏对动态变化的适应性。
004 · 中 · Memory是 Agent 的一个关键模块。请问如何为 Agent 设计短期记忆和长期记忆系统?可以借助哪些外部工具或技术?
来源:Hello-Agents Extra01
记忆模块是Agent打破LLM上下文窗口限制、实现持续学习和个性化的关键。设计Agent的记忆系统通常会模仿人类的记忆机制,分为短期记忆和长期记忆。
1. 短期记忆 (Short-Term Memory):
- 作用: 存储当前任务的上下文信息,包括即时对话历史、中间的思考步骤(如ReAct的Scratchpad)、工具的调用结果等。它是Agent进行连贯思考和行动的基础。
- 实现方式:
- LLM的上下文窗口 (Context Window): 这是最直接的短期记忆载体。所有最近的交互都会被放入Prompt中。
- 缓冲区 (Buffers): 在Agent框架(如LangChain)中,通常会使用不同类型的缓冲区来管理对话历史,例如:
- ConversationBufferMemory: 存储完整的对话历史。
- ConversationBufferWindowMemory: 只保留最近的K轮对话。
- ConversationSummaryBufferMemory: 在历史对话过长时,动态地用LLM进行总结,以节省Token。
- 暂存器 (Scratchpad): 用于记录ReAct框架中的“Thought-Action-Observation”轨迹,是Agent进行逐步推理的关键。
2. 长期记忆 (Long-Term Memory):
- 作用: 存储跨越任务和时间维度的信息,如用户的个人偏好、过去的成功/失败经验、领域知识等。它使得Agent能够“学习”和“成长”。
- 实现方式与外部工具: 长期记忆的核心是“存储”和“检索”,这通常需要借助外部技术,最主流的是RAG (Retrieval-Augmented Generation) 范式。
- 核心技术:向量数据库 (Vector Database)
- 工具: Pinecone, ChromaDB, FAISS, Weaviate等。
- 工作流程:
- 存储(Storing/Writing): 当Agent获得一个有价值的信息(如用户明确给出的偏好、一个成功解决问题的完整流程)时,它会使用一个嵌入模型(Embedding Model)将这段文本信息转换成一个高维向量。然后,将这个向量及其原始文本存入向量数据库。
- 检索(Retrieving/Reading): 在Agent进行规划或决策时,它会把当前的任务或问题也转换成一个查询向量。然后,用这个查询向量去向量数据库中进行相似度搜索,找出与当前情况最相关的历史记忆。
- 使用(Using): 检索到的记忆(原始文本)会被插入到LLM的Prompt中,作为额外的上下文,来指导LLM做出更明智的决策。
- 其他技术:
- 传统数据库/知识图谱: 对于结构化或关系型数据,使用SQL数据库或图数据库(如Neo4j)进行存储和精确查询也是一种有效的长期记忆形式。
005 · 中 · Tool Use是扩展 Agent 能力的有效途径。请解释 LLM 是如何学会调用外部 API 或工具的?(可以从 Function Calling 的角度解释)
来源:Hello-Agents Extra01
LLM学会调用外部API或工具,是其从一个纯粹的“语言模型”转变为一个“行动执行者”的关键一步。这一能力的核心是让LLM能够理解何时需要使用工具,以及如何以结构化的方式表达使用哪个工具和传递什么参数。目前,主流的实现方式是Function Calling。
Function Calling的工作原理如下:
- 工具定义与注册 (Tool Definition & Registration):
- 我们首先需要以一种机器可读的方式,向LLM“描述”我们有哪些可用的工具。这个描述通常是一个结构化的模式(Schema),比如JSON Schema。
- 对于每一个工具,我们需要定义:
- 函数名称 (Function Name): 例如,
get_current_weather。 - 函数描述 (Function Description): 用自然语言清晰地描述这个函数的功能。例如,“获取指定城市的实时天气信息”。这个描述至关重要,因为LLM会根据它来判断何时使用该工具。
- 参数列表 (Parameters): 定义函数需要哪些输入参数,每个参数的名称、类型、和描述。例如,参数
location(string, "城市名") 和unit(enum, "温度单位,可以是celsius或fahrenheit")。
- 函数名称 (Function Name): 例如,
- LLM的决策与意图识别 (LLM's Decision & Intent Recognition):
- 在与用户交互时,我们将用户的提问连同所有已注册的工具描述一起发送给LLM。
- LLM(如GPT-4, Gemini等)经过了特殊的指令微调,使其能够理解这种“工具描述”的格式。
- LLM会分析用户的意图。如果它认为只靠自身知识无法回答,且用户的意图与某个工具的功能相匹配,它就会决定调用该工具。
- 生成结构化的调用指令 (Generating Structured Calling Instructions):
- 当LLM决定调用工具时,它的输出不再是自然语言文本,而是一个特殊格式的、结构化的JSON对象(或其他格式)。
- 这个JSON对象会精确地包含:
- 要调用的函数名称。
- 一个包含所有参数名和值的对象。
- 例如,对于用户提问“今天新加坡天气怎么样?”,LLM可能输出:
{
"tool_call": {
"name": "get_current_weather",
"arguments": {
"location": "Singapore",
"unit": "celsius"
}
}
}- 外部执行与结果返回 (External Execution & Result Return):
- Agent的控制代码(Orchestrator)会捕获这个特殊的JSON输出。
- 它会解析JSON,找到函数名和参数,然后在外部环境中实际执行这个函数(例如,调用一个真实的天气API)。
- 函数执行完毕后,会返回一个结果(例如,
{"temperature": 32, "condition": "sunny"})。
- 整合结果并生成最终回复 (Integrating Result & Generating Final Response):
- 控制代码将工具的返回结果再次格式化,并将其作为新的上下文信息,连同之前的对话历史一起,再次发送给LLM。
- 这一次,LLM已经获得了它需要的信息。它会基于这个结果,生成一个最终的、流畅的自然语言回答给用户,例如:“今天新加坡的天气是晴天,温度为32摄氏度。”
006 · 中 · 请比较一下两个流行的 Agent 开发框架,如 LangChain 和 LlamaIndex。它们的核心应用场景有何不同?
来源:Hello-Agents Extra01
LangChain和LlamaIndex是构建LLM应用最流行的两个开源框架,它们都极大地简化了开发流程,但它们的核心哲学和设计重点有所不同,导致了它们在应用场景上的差异。
核心定位的差异:
LangChain:一个通用的LLM应用“编排”框架 (General-purpose Orchestration Framework)
哲学: LangChain的目标是提供一个全面的工具集,用于将LLM与各种组件(工具、记忆、数据源)“链接”在一起,构建复杂的应用程序,其中Agent是其核心应用之一。它更关注于 “工作流”的构建。
核心抽象: Chains (调用链), Agents (智能体), Memory (记忆模块), Callbacks (回调系统)。
LlamaIndex:一个专注于外部数据的“数据”框架 (Data Framework for External Data)
哲学: LlamaIndex的出发点是解决LLM与私有或外部数据连接的核心问题,即RAG (Retrieval-Augmented Generation)。它专注于如何高效地摄入(ingest)、索引(index)、和查询(query)外部数据。它更关注于“数据流”的管理。
核心抽象: Data Connectors (数据连接器), Indexes (索引结构), Retrievers (检索器), Query Engines (查询引擎)。
核心应用场景的不同:
| 特性 | LangChain | LlamaIndex |
|---|---|---|
| 最擅长的场景 | 构建复杂的、多步骤的Agent:当你的应用需要调用多个不同的工具、维护复杂的对话状态、并遵循一个精心设计的执行逻辑时,LangChain的Agent Executor和Chains提供了极大的灵活性。 | 构建高性能的RAG系统:当你的核心需求是搭建一个强大的知识库问答系统(Q&A over your data),需要处理复杂的非结构化数据(PDF, PPT)、构建高级索引(如树索引、关键词表索引)、并优化检索质量时,LlamaIndex是首选。 |
| 应用举例 | 1. 一个能上网搜索、执行代码、并调用计算器的通用研究助手。 2. 一个能连接公司内部API来查询订单、更新客户信息的自动化客服Agent。 3. 一个能执行一系列复杂操作的自动化流程(RPA)。 | 1. 一个能够回答关于公司内部海量技术文档问题的开发者助手。 2. 一个能够结合多份PDF财报进行深度分析和回答的金融分析工具。 3. 一个私人的、基于个人笔记库(Notion, Obsidian)的知识管理和问答系统。 |
| 功能交叉 | LangChain也内置了RAG功能(Document Loaders, Vector Stores, Retrievers),但相对LlamaIndex来说,其高级功能和可定制性较少。 | LlamaIndex也引入了Agent的概念(Data Agent),允许LLM智能地选择不同的数据源和查询策略,但其Agent的通用性和复杂工具编排能力不如LangChain。 |
总结:
- 如果你的项目以Agent为核心,需要复杂的逻辑编排和多工具协作,首选LangChain。
- 如果你的项目以数据为核心,需要构建强大的知识库和问答能力,首选LlamaIndex。
- 在实际开发中,两者也常常被结合使用:例如,使用LlamaIndex构建一个强大的知识库检索工具,然后将这个工具接入到LangChain构建的Agent中,让Agent能够利用这个知识库来完成更复杂的任务。
007 · 难 · 在构建一个复杂的 Agent 时,你认为最主要的挑战是什么?
来源:Hello-Agents Extra01
构建一个复杂的Agent(例如,需要多步规划、多工具交互、长期记忆的Agent)时,会遇到一系列从理论到工程的挑战。我认为最主要的挑战可以归结为以下几点:
- 规划与推理的鲁棒性 (Robustness of Planning and Reasoning):
- 挑战描述: 复杂的任务往往需要长期、多步的规划。当前的LLM虽然强大,但其推理链条仍然很脆弱。Agent很容易在执行过程中“迷失”——忘记最初的目标、陷入无效的循环、或者因为某一步的错误(如工具返回非预期结果)而导致整个任务失败。如何让Agent具备强大的纠错能力和动态重规划能力,是最大的挑战之一。
- 具体表现: Agent卡在重复的“思考-行动”循环中;对工具的失败没有备用方案;过早地认为任务已完成。
- 可靠且可复现的评估 (Reliable and Reproducible Evaluation):
- 挑战描述: 如何科学地评估一个Agent的性能极其困难。对于一个复杂的、开放式的任务(如“帮我规划一次为期一周的新加坡旅游”),没有唯一的正确答案。
- 具体表现:
- 评估指标难以定义: 仅看最终结果是否“好”是主观的。需要评估过程的效率(调用了多少次工具)、成本(花费了多少token)、鲁棒性(在不同干扰下的表现)等。
- 环境不可复现: 如果Agent使用了搜索引擎等动态工具,两次执行的结果可能完全不同,导致评估无法复现。
- 评估成本高: 目前最可靠的评估方式仍然是人工评估,但成本高昂且难以规模化。
- 成本、延迟与可扩展性 (Cost, Latency, and Scalability):
- 挑战描述: 一个复杂的任务可能需要Agent进行数十次甚至上百次的LLM调用(每次思考、每次总结、每次决策都需要一次调用)。
- 具体表现:
- 高昂的API费用: 使用GPT-4等强大模型作为Agent大脑,一次复杂任务的成本可能高达数美元。
- 不可接受的延迟: 用户需要等待很长时间才能得到最终结果,因为整个过程是串行的。
- 服务扩展性差: 高成本和高延迟使得将这类复杂Agent大规模部署给海量用户变得不切实际。
- 安全与可控性 (Safety and Controllability):
- 挑战描述: 赋予Agent调用工具的能力,本质上是赋予了它在数字世界甚至物理世界中“行动”的能力。
- 具体表现:
- 权限管理困难: 如何精确控制Agent的权限,防止它执行危险操作(如删除文件、发送恶意邮件)?
- 提示注入攻击(Prompt Injection): 恶意用户或被Agent处理的外部数据(如网页内容)可能包含恶意指令,劫持Agent去执行非预期的任务。
- 不可预测性: Agent的自主性使其行为难以被完全预测,可能会产生意料之外的负面后果。
008 · 中 · 什么是多智能体系统?让多个 LLM Agent 协同工作相比于单个 Agent 有什么优势?又会引入哪些新的复杂性?
来源:Hello-Agents Extra01
多智能体系统 (Multi-Agent System, MAS) 是一个由多个自主的、交互的智能体组成的系统。这些智能体在同一个环境中运作,它们可以相互通信、协作、竞争或协商,以解决单个智能体难以解决的复杂问题。在LLM的背景下,就是让多个LLM Agent协同工作。
相比于单个Agent的优势:
- 分工与专业化 (Division of Labor & Specialization):
- 我们可以为每个Agent设定不同的角色和专长。例如,在一个软件开发团队中,可以有一个“产品经理Agent”负责需求分析,一个“程序员Agent”负责编写代码,一个“测试工程师Agent”负责编写测试用例。每个Agent都可以基于专门的知识和工具进行微调,从而在各自领域达到更高的专业水平。
- 并行处理与效率 (Parallelism & Efficiency):
- 复杂任务可以被分解成多个子任务,并分配给不同的Agent同时处理,这大大缩短了解决问题的总时间。这就像一个团队并行工作,而不是一个人按顺序做所有事。
- 鲁棒性与冗余 (Robustness & Redundancy):
- 系统不依赖于任何单个Agent。如果一个Agent出现故障或陷入困境,其他Agent可以接替它的工作,或者通过集体决策找到解决方案,从而提高了整个系统的容错能力。
- 视角多样性与创新 (Diversity of Perspectives & Innovation):
- 不同的Agent可以被赋予不同的“性格”、目标或推理方法。通过辩论、协商等方式,它们可以从多个角度审视问题,避免单一Agent的思维局限,并可能激发出更具创造性的解决方案。这在模拟社会动态、进行头脑风暴等场景中尤为有效。
引入的新的复杂性:
- 通信协议与语言 (Communication Protocol & Language):
- Agent之间如何有效沟通?需要设计一套标准化的通信协议和消息格式,确保它们能够相互理解意图、状态和知识。这本身就是一个巨大的挑战。
- 协调与协作机制 (Coordination & Collaboration Mechanisms):
- 如何分配任务?谁来领导?如何解决冲突和资源争抢?这需要复杂的协调机制,例如集中的“指挥官”Agent,或者分布式的协商协议(如合同网、拍卖)。
- 社会行为与动态 (Social Behaviors & Dynamics):
- 当多个Agent交互时,会出现复杂的社会现象,如信任、欺骗、联盟、背叛等。如何引导系统走向良性的协作,而不是恶性的竞争或混乱,是一个核心的对齐问题。
- 系统状态维护与一致性 (System State Maintenance & Consistency):
- 在一个共享的环境中,每个Agent的行为都可能改变环境状态。如何确保所有Agent对当前环境有一个一致的、最新的认知,避免信息不同步导致决策冲突?
- 信用分配的加剧 (Aggravated Credit Assignment):
- 当一个团队任务成功或失败时,如何评估每个Agent在其中的贡献或责任?这比单个Agent的信用分配问题要复杂得多。
009 · 中 · 当一个 Agent 需要在真实或模拟环境中(如机器人、游戏)执行任务时,它与纯粹基于软件工具的 Agent 有什么本质区别?
来源:Hello-Agents Extra01
当Agent从纯粹的软件环境(调用API、读写文件)进入到真实或模拟的物理环境(如机器人、游戏)时,我们称之为具身智能体(Embodied Agent)。这种转变引入了几个本质的区别,极大地增加了任务的复杂性。
本质区别主要体现在以下几个方面:
- 感知与世界接地 (Perception & World Grounding):
- 软件Agent: 感知的是结构化的、符号化的信息(如API返回的JSON,数据库的表格)。
- 具身Agent: 感知的是非结构化的、高维的、充满噪声的传感器数据(如摄像头的像素流、激光雷达的点云)。它必须解决“符号接地”(Symbol Grounding)问题,即将语言中的概念(如“苹果”)与现实世界的物理实体(像素集合)对应起来。
- 状态的可观测性 (State Observability):
- 软件Agent: 环境状态通常是完全可观测的(Full Observability)。通过API可以获取到所有需要的信息。
- 具身Agent: 环境状态是部分可观测的(Partial Observability)。机器人只能看到它面前的景象,无法知道房间另一边发生了什么。Agent必须基于不完整的观测历史来推断世界的状态。
- 行动空间与不确定性 (Action Space & Uncertainty):
- 软件Agent: 行动空间是离散的、确定的。调用一个API要么成功要么失败,结果是可预测的。
- 具身Agent: 行动空间通常是连续的、随机的。控制机器人手臂移动一个精确的距离,会因为电机误差、摩擦力等因素而存在不确定性。每个行动的结果都需要通过传感器反馈来确认。
- 实时性与反馈循环 (Real-time & Feedback Loop):
- 软件Agent: 交互是回合制的、异步的。Agent可以花很长时间思考,然后调用工具,等待结果。
- 具身Agent: 必须在实时(real-time)中运行。它需要持续地感知、决策和行动,以应对动态变化的环境。反馈循环是即时的、连续的。
- 安全与不可逆性 (Safety & Irreversibility):
- 软件Agent: 错误行动的后果通常是可逆的、有限的。一个失败的API调用可以重试,最坏的情况可能是数据错误。
- 具身Agent: 错误行动的后果可能是物理性的、不可逆的、甚至是危险的。一个机器人错误的动作可能会打碎一个杯子、损坏自身或对人类造成伤害。因此,安全是具身Agent的首要考虑。
010 · 难 · 如何确保一个 Agent 的行为是安全、可控且符合人类意图的?在 Agent 的设计中,有哪些保障对齐方法?
来源:Hello-Agents Extra01
确保Agent的安全、可控和对齐是Agent技术能够被信任和应用的前提,这是一个系统性工程,需要在多个层面进行设计。
主要的保障对齐方法包括:
- 核心模型的对齐(Core Model Alignment):
- 基础: Agent的大脑是一个LLM,因此,这个LLM本身必须是高度对齐的。
- 方法: 使用如RLHF(从人类反馈中强化学习)、DPO(直接偏好优化)、Constitutional AI(宪法AI)等技术,对基础LLM进行微调,使其遵循“有用、诚实、无害”的原则,这是所有安全措施的基石。
- 工具和权限的严格管理(Tool and Permission Scrutiny):
- 原则: 最小权限原则(Principle of Least Privilege)。只给Agent完成其任务所必需的最少的工具和权限。
- 方法:
- 工具白名单: 明确列出Agent可以调用的安全工具,而不是让它任意调用。
- 权限控制: 对文件系统、数据库、API的访问进行严格的读/写/执行权限控制。
- 资源限制: 限制Agent的计算资源、API调用次数和执行时间,防止其失控或造成资源滥用。
- 人类在环(Human-in-the-Loop, HITL):
- 原则: 对于高风险或不可逆的操作,必须有人类监督和确认。
- 方法:
- 操作确认: 在执行如“删除文件”、“发送邮件”、“执行金融交易”等敏感操作前,Agent必须生成一个执行计划,并暂停等待人类用户的明确批准。
- 监督与干预: 人类可以实时监控Agent的行为轨迹,并随时暂停、修改或终止其任务。
- 执行环境沙箱化(Sandboxed Execution Environment):
- 原则: 将Agent的执行环境与宿主系统隔离。
- 方法: 让Agent生成的代码或命令在一个受控的沙箱(如Docker容器、虚拟机)中执行。这样即使Agent被劫持或产生恶意代码,其破坏范围也被限制在沙箱内部,不会影响到外部系统。
- 明确的规则与护栏(Explicit Rules and Guardrails):
- 方法: 除了LLM内在的对齐,可以在Agent的控制逻辑中加入硬编码的规则或“护栏”。例如,可以设置一个正则表达式过滤器,禁止Agent生成或执行包含特定危险命令(如
rm -rf /)的指令。
- 持续的红队测试与审计(Continuous Red Teaming and Auditing):
- 方法:
- 红队测试: 组织专门的团队,像黑客一样,从各种角度(如提示注入、越狱、滥用工具)来攻击Agent,主动发现其安全漏洞和对齐缺陷。
- 行为审计: 详细记录Agent所有的思考链、工具调用和最终输出,进行事后审计,分析失败案例和非预期行为,并据此迭代改进安全设计。
011 · 中 · 了解A2A框架吗?它和普通Agent框架的区别在哪,挑一个最关键的不同点说明。
来源:Hello-Agents Extra01
是的,我了解A2A(Agent-to-Agent)框架或协议的概念。它代表了多智能体系统研究中的一个重要方向。
和普通Agent框架的区别:
一个普通的Agent框架,如LangChain或Auto-GPT,其核心关注点是单个Agent的内部工作循环和能力。它定义了一个Agent如何感知环境、进行规划(思考)、调用工具(行动)、并处理反馈(观察)。它的设计蓝图是围绕着一个独立的、自主的个体。
而A2A框架的核心关注点则完全不同,它关注的是多个异构Agent之间的通信和协作。它试图定义一套通用的标准、协议和语言,使得由不同开发者、使用不同技术栈、为了不同目标而构建的Agent们,能够相互发现、理解和交互。
最关键的不同点:
普通Agent框架关注的是“个体的实现”(Implementation of an individual),而A2A框架关注的是“群体的交互标准”(Interaction standard for a collective)。
- 举例来说:
- LangChain告诉你如何用Python代码构建一个能使用Google搜索和计算器的Agent。它关心的是这个Agent内部的逻辑流(
AgentExecutor,Chains,Tools)。 - 一个A2A框架则试图回答这样的问题:“我的LangChain Agent如何向一个完全不认识的、由别人用Java写的Agent有效地传达一个任务:‘帮我用你的专业金融数据库分析一下这只股票,并把结果以JSON格式返回给我?’”
- 它需要定义消息的格式、能力的描述方式(如何声明自己会用什么工具)、任务的分解和委托协议、以及信任和验证机制。
所以,最关键的不同点在于抽象层次。普通Agent框架在“应用层”,致力于构建能干活的个体;而A2A框架在“协议层”,致力于构建一个能让所有个体互相交流的“社会规则”或“互联网协议”。A2A是实现真正复杂的、去中心化的多智能体协作的必要基础。
012 · 中 · 你用过哪些Agent框架?选型是如何选的?你最终场景的评价指标是什么?
来源:Hello-Agents Extra01
原文给的是一套选型范例。常用 LangChain 和 LlamaIndex,多智能体实验再用更轻的 AutoGen。
选型是如何选的?
我的选型过程主要基于项目的核心需求,我通常会从“逻辑编排驱动”还是“数据驱动”这两个角度来考虑:
- 当项目是“逻辑编排驱动”时,我首选LangChain。
- 场景: 这类项目的核心是构建一个复杂的、需要执行一系列步骤、并与多种外部工具(APIs, 数据库, 文件系统)交互的Agent。例如,一个自动化的研究助手,需要先上网搜索,然后对结果进行总结,再用代码执行器进行数据分析。
- 选择理由: LangChain提供了非常强大和灵活的Agent Executor和Chains(特别是LCEL表达式语言),能够很好地编排和控制复杂的执行流。它的工具集成生态也是最丰富的。
- 当项目是“数据驱动”时,我首选LlamaIndex。
- 场景: 这类项目的核心是构建一个围绕特定知识库的问答或分析系统,即高级RAG(Retrieval-Augmented Generation)。例如,一个能回答公司内部上千份PDF技术文档的客服机器人。
- 选择理由: LlamaIndex在数据的摄入、索引、和检索方面做得比LangChain更深入、更专业。它提供了更多样化和高级的索引结构(如树索引、知识图谱索引)和检索策略(如混合检索、重排序),对于优化RAG的质量至关重要。
最终场景的评价指标是什么?
评价指标是高度依赖于具体场景的,但我通常会从以下三个维度来综合评估一个Agent的性能:
- 任务成功率 (Task Success Rate):
- 定义: 这是最重要的结果导向指标。它衡量Agent在多大比例上成功地、完整地完成了最终任务。
- 举例: 对于一个代码生成Agent,能否生成无语法错误且能通过所有单元测试的代码。对于一个问答Agent,答案的准确率和完整性。
- 过程效率 (Process Efficiency):
- 定义: 衡量Agent在完成任务过程中的资源消耗。
- 举例:
- 成本 (Cost): 完成一次任务的总Token消耗量或API调用费用。
- 延迟 (Latency): 从用户发出指令到Agent给出最终结果的总耗时。
- 步骤数 (Number of Steps): Agent执行的“思考-行动”循环次数。次数越少通常意味着规划能力越强。
- 鲁棒性与可预测性 (Robustness & Predictability):
- 定义: 衡量Agent在面对非理想情况(如工具报错、模糊指令、环境变化)时的表现。
- 举例:
- 错误处理能力: 当一个API调用失败时,Agent能否识别错误并尝试备用方案。
- 一致性: 对于相似的输入,Agent能否产生相似的、可预测的输出。
- 安全评估: 在红队测试中,Agent抵抗提示注入等攻击的能力。
013 · 中 · 有微调过Agent能力吗?数据集如何收集?
来源:Hello-Agents Extra01
微调的是思考和用工具的过程,不是最终答案。只靠提示的 zero-shot Agent 在复杂或特定领域上不稳,微调是在做行为克隆(Behavioral Cloning)。
数据不是(输入,输出)对,而是决策轨迹。原文展开了的收集方式只有教师模型合成:
- 定好任务和工具集。
- 写一批任务样本。
- 让教师模型(原文举例 GPT-4o)在 ReAct 或其他 Agent 框架里跑这些任务。
- 记下每一步的 Thought 和 Action。一条数据是(任务, 思考, 行动)。
- 丢掉执行失败或质量差的轨迹。
原文还列了两种做法,但没有展开:人工编写或修正轨迹;从真实用户交互里收集。
014 · 中 · 为什么选择 ReAct 而不是 Plan-and-Execute?
来源:ai-agent-interview-guide
ReAct 是思考、行动、观察的循环:每一步都看当前观察再决定下一步。Plan-and-Execute 先把步骤定死再执行,适合结构清楚、步骤可预见的任务。
客服里意图会中途变,比如从查订单改成退款。计划在中途失败就要整段重做。ReAct 能改策略,Prompt 用 few-shot 就能调行为,也和 Function Calling、流式输出合拍。死循环靠 max_iterations(常见是 10)和超时截住。
落地通常是混合:单步查询走一轮 ReAct;多步任务先出粗粒度计划,每一步内部再跑 ReAct。源笔记的对照是平均响应从纯计划执行的 8 秒降到 3.2 秒,完成率从 78% 到 91%。
015 · 中 · Agent 编排器是怎么设计的?为什么这样设计?
来源:ai-agent-interview-guide
主路径是状态机加事件,不是把一切交给一条 LLM 链。
状态:INIT → INTENT_PARSED → PLANNED → EXECUTING → TOOL_CALLED → SYNTHESIZING → COMPLETED。合法转换写在表里,异常和调试都有落点。
四个组件各管一件事:编排器拿上下文,规划器把任务拆成 DAG,分发器按 Function Calling 调工具,上下文管理器留对话和工具结果。
状态机是为了可枚举。事件驱动是为了解耦和并行。DAG 而不是队列,是因为查库和调 API 可以同时跑。新工具实现 BaseTool 注册进 ToolRegistry;新流程改配置,不改核心循环。源笔记里并行把复杂任务时间缩短约 40%,新工具从两天收到两小时。
016 · 中 · 多 Agent 协作和单 Agent 有什么区别?你怎么选择?
来源:ai-agent-interview-guide
单 Agent 把角色、工具、规则塞进一份 Prompt。源笔记给的拐点:系统 Prompt 超过约 4000 token 后指令遵循变差;工具超过约 15 个,选择准确率从 95% 掉到 78%。改一处容易碰到别处。
多 Agent 按职责拆:主管只做意图和路由,检索、工具、摘要各做自己的事。之间传 JSON Schema 消息,不传一段容易丢字段的自然语言。主管可以串行,也可以把互不依赖的子任务并行,最后自己汇总。
选择按规模,不按时髦:工具不超过约 8 个、逻辑简单,用单 Agent。工具更多、要跨知识库和外部 API,用多 Agent。拆开之后每个 Prompt 压到约 2000 token 以内,工具选择准确率回到约 96%。代价是通信、超时和结果汇总,这些要单独设计。
017 · 中 · 意图识别模块是怎么实现的?
来源:ai-agent-interview-guide
两阶段,把便宜的判断挡在 LLM 前面。
第一阶段用规则加小模型。订单号这类用正则,例如 [A-Z]{2}-\d{8}-\d{3}。FastText 做粗分类,延迟小于 5 毫秒,盖住大约 80% 的常见查询。
第二阶段只处理不确定的句子。LLM 输出结构化意图,一条里可以有多个意图和实体,例如「订单怎么还没到,我要退款」同时是查询和操作。意图做成三级:咨询/操作/投诉/闲聊,再往下到具体业务和产品线。
置信度决定要不要问人:≥ 0.85 直接执行,0.6 到 0.85 让用户确认,低于 0.6 追问。源笔记在 5000 条标注上准确率约 94%,多意图 F1 约 0.89,LLM 调用量因此少了大约 80%。
018 · 中 · 怎么看待 MCP?系统里怎么用?
来源:ai-agent-interview-guide
MCP 把工具、资源、提示收成开放协议,传输是 JSON-RPC 2.0,本地用 stdio,远程用 SSE,服务端可以推送。
Function Calling 是厂商请求格式,每家字段不同,适合少量内置工具。MCP 把工具做成独立 Server,跨模型和项目复用,适合要建工具生态的时候。两者不是互斥:简单查询和文本处理留在 Function Calling,数据库、外部 API、文件操作做成 MCP Server,编排器下面统一抽象。
早期成本是很多 Server 得自己包,每个 Server 的权限要单独审。协议本身大约多 5 毫秒序列化,通常可以接受。源笔记把新工具从约 2 天收到约 4 小时,靠的是接口标准化,不是协议魔法。
019 · 中 · 如何设计 Agent 的错误恢复和重试机制?
来源:ai-agent-interview-guide
错误先分类,再决定能不能试。
| 类 | 例子 | 做法 |
|---|---|---|
| 可重试 | 超时、限流 | 指数退避,最多 3 次 |
| 可降级 | 主模型不可用 | 换备用模型 |
| 致命 | 权限、参数非法 | 把原因告诉用户 |
退避:delay = base * 2^attempt + jitter,base 1 秒,上限 30 秒。工具失败要作为 Observation 交回模型,让它改参数、换工具,或者承认做不到。盲目重试会放大故障。
长任务的中间状态放 Redis,崩溃后从检查点继续,避免整段重跑。源笔记里用户可见的超时错误从 5% 降到 0.3%,降级把可用性维持在约 99.5%,续跑大约省 15% token。
020 · 中 · 你怎么看 Agent 架构的未来发展?
来源:ai-agent-interview-guide
按时间说判断,并说这个判断怎么影响选型。
2024–2025:ReAct 和 Plan-and-Execute 的单 Agent 已经能上线,多 Agent 能用但协作还不稳,MCP 和 Function Calling 在补工具生态。
2025–2026:关键路径用确定性工作流,其余留给模型。长期记忆从「一个向量库」走向可检索的结构化记忆。输入输出不再只有文本。
2026–2028:Agent 之间的协议会标准化;执行历史会反过来改策略;开发、评估、部署、监控收成一条平台。
核心矛盾不变:确定性相对灵活,企业要的是可观测和可停,不是更长的自主循环。Agent 的价值是信息和工具之间的桥。
021 · 中 · ReAct 的 Prompt 是怎么设计的?
来源:ai-agent-interview-guide
Prompt 要让解析器有锚点,而不是让模型自由发挥。骨架是:Thought、Action、Action Input(JSON)、Observation,可以重复,最后 Thought 加 Final Answer。工具列表写清「何时用」和参数格式。规则写死:一次一个工具,不需要工具就直接 Final Answer,最多 5 轮。
System Prompt 里放 2 到 3 个例子,覆盖单步和多步。模板进 Git,改动有 changelog,用评估指标做 A/B,不凭感觉替换。
解析要防两种常见跑偏:跳过 Thought 时补一个默认 Thought;格式不标准时先正则,再让轻量模型重排成标准格式。源笔记把遵循率从 78% 收到 96%,工具选择准确率约 95%,稳定模板大约迭代了 5 版。
022 · 中 · 短期记忆和长期记忆怎么配合?
来源:ai-agent-interview-guide
短期是这一次对话的工作记忆:进程内加 Redis,内容是历史、中间推理和工具结果。保留最近约 10 轮原文,更早的压成摘要,会话结束约 30 分钟清理。
长期分两处:PostgreSQL 放用户画像、偏好、常用术语;Milvus 放历史摘要和高频问答,供语义召回。
会话结束时抽出新偏好、已解决的问题和还没解决的问题,写入长期记忆。新会话按用户加载画像,再按当前话题检索相关历史,注入本轮 context。不要把全部历史灌进去。
源笔记的跨会话一致性从约 30% 到 78%,偏好记忆在约 200 个 case 上约 85%,每用户长期记忆控制在约 50MB。
023 · 中 · Function Calling 和 MCP 有什么区别?怎么选?
来源:ai-agent-interview-guide
| Function Calling | MCP | |
|---|---|---|
| 标准 | 各厂商私有字段 | 开放协议 |
| 复用 | 换模型要适配 | 一个 Server 多个 Client |
| 部署 | 嵌在应用里 | 独立进程或服务 |
| 能力 | 主要是工具调用 | tools、resources、prompts,可推送 |
| 适合 | 少量、简单 | 要跨项目的工具生态 |
项目里是混合:大约 70% 的库内查询和文本处理走 Function Calling;大约 30% 要独立运行的外部服务走 MCP Server。编排器只看见统一的工具接口。选错的代价是要么为每个模型重写一遍工具,要么为了三个函数多维护一套协议。
024 · 中 · Agent 死循环怎么检测和防止?
来源:ai-agent-interview-guide
ReAct 会在「检索不满意就再检索」或「同一工具、同一参数」上转圈。先放硬上限,再做检测。
硬上限:最多大约 10 轮,最长大约 60 秒,单次请求 token 大约不超过 30000。到了就停,用已有信息作答,并标明可能不完整。
检测三种重复:连续两次相同工具且参数相同或极近;每 3 轮看有没有新信息或状态变化;状态机回到旧状态。发现后先往下一轮 Thought 里注入「换方法或直接回答」。再转就强制进入 Final Answer。
日志要留根因。常见是工具描述不清、Prompt 自相矛盾、检索质量差。只加次数上限能止血,改不了为什么转。源笔记发生率从约 3% 到 0.2%,约 99.8% 的请求在 5 轮内结束。
025 · 中 · 工具调用失败怎么处理?
来源:ai-agent-interview-guide
| 类型 | 例子 | 策略 |
|---|---|---|
| 临时 | 超时、限流 | 最多再试 2 次 |
| 参数 | SQL 写错 | 把错误交回 Agent 改参数 |
| 权限 | 无权访问 | 告诉用户,不要让模型硬试 |
| 不存在 | 没有这个订单 | 让用户核对 |
| 系统 | 服务挂了 | 降级 |
错误要结构化:类型、人能读的说明、是否可重试、建议下一步。Agent 看到 Observation 里的错误,才能改参数或换工具。连续失败大约 3 次就放弃该工具,用已经拿到的信息回答。全部工具不可用时退回纯 RAG。
源笔记端到端工具成功率从约 92% 到 98%,模型自己改对参数大约 78%。把异常吞掉换成空字符串,模型会当成「没有结果」继续编。
026 · 中 · 多 Agent 之间通信失败怎么处理?
来源:ai-agent-interview-guide
一个子 Agent 挂了,不能把整条任务链挂死。
每次调用有超时,默认大约 30 秒,复杂任务大约 60 秒。超时由主管决定重试还是跳过。每 10 秒做一次健康检查,连续 3 次失败就不再派新任务。失败任务交给同角色的备份;没有备份,主管降级自己做,并说明能力下降。
消息走 Redis Stream,消费者重启后未处理的消息还在。源笔记重新分配小于约 5 秒,整体可用性大约 99.5%。通信失败如果只打日志不改派,用户看到的是一直转圈。
027 · 中 · AI Agent 在企业里的价值是什么?
来源:ai-agent-interview-guide
按时间说,避免把长期故事当成当期 ROI。
短期是降本:重复的客服、查询、报告。粗算是 AI 处理量乘单次人工成本。源笔记的典型回收大约 6 个月。
中期是把企业知识交到每个员工手上,给决策提供可引用的材料,并把服务质量拉齐。
长期是工作流里的智能节点、按用户画像的服务,以及从反馈里改策略。后两项依赖评估闭环,不是上线就有。
做成的条件:有真实痛点;简单重复交给系统,判断和例外留给人;评估和知识库要持续花钱。为了用 Agent 而改已有稳定流程,价值算不过来。
028 · 易 · 什么是 Agent 的工具学习?
来源:ai-agent-interview-guide
工具学习是模型学会三件事:现在要不要用工具、用哪一个、参数怎么填。
三条路:
- Prompt 里写名称、用途和参数。灵活,不用训练,工具一多就挤占上下文,也更容易选错。
- 用调用轨迹微调,例如 Gorilla、ToolLLM 那类工作。更稳,要标注,换工具集往往要再训。
- 厂商的 Function Calling。模型专门为这个格式训过,最可靠,格式绑在那一家 API 上。
失败集中在选错工具、参数类型不对、多个工具的先后依赖,以及失败后不会改。实践上描述写「何时用」、给少量例子、单次候选控制在大约 8 个以内,调用前校验参数,失败要作为观察返回去。只加工具不减描述,准确率会先掉。