智能体开发入门:从LLM、提示词到RAG与多智能体协作的10个核心概念

1. 从“脚本”到“智能体”:为什么你需要理解这些概念

如果你是从传统的脚本开发、Web应用开发或者简单的API调用转向Agent开发的,那么你首先需要扭转一个核心观念:你不再仅仅是在编写一段“执行固定逻辑”的代码,而是在“设计”一个具备一定自主性、能够感知、决策和行动的“智能体”。这听起来有点玄乎,但本质上,它意味着你的代码结构、设计模式和思考方式都需要进行一次升级。很多人一上来就扎进LangChain或AutoGPT的代码里,照着教程跑通一个Demo,就觉得自己会做Agent了。但一旦需求稍微变化,或者遇到一个没见过的错误,立刻就懵了。问题往往出在,他们只记住了“怎么做”,却完全没理解“为什么这么做”以及“背后是什么在支撑”。

我见过不少项目,把Agent做成了披着AI外衣的“复杂if-else判断器”,不仅效率低下,而且脆弱不堪。要避免这个坑,你必须先吃透支撑Agent运作的几个核心概念。它们就像是乐高积木的基础模块,不理解这些模块的形状和接口,你永远只能照着别人的图纸拼,而无法自己创造。接下来的内容,我会结合我自己的踩坑经验,把这十个你入门必懂的核心概念掰开揉碎了讲清楚。我们不空谈理论,每个概念都会落到实际的代码设计、框架选择和应用场景上,让你看完就能用上。

2. 基石:LLM、提示词与思维链——Agent的“大脑”与“语言”

2.1 大语言模型:不止是文本生成器

在Agent的语境下,LLM(大语言模型)的角色远不止是聊天或者写文章。它是Agent的“核心推理引擎”。你需要彻底改变对它的认知:LLM是一个在高维语义空间中进行模式匹配和概率推理的系统

这意味着什么?当你给LLM一个提示词(Prompt),它并不是在“查找答案”,而是在根据它从海量数据中学到的模式和关联,生成一段最可能“合理延续”的文本。对于Agent开发,这个特性至关重要。

  • 关键认知1:LLM没有真正的“记忆”和“逻辑”。它每次调用都是独立的。你让它做数学题,它可能凭借模式记忆做对,但稍微变一下形式就可能出错。因此,Agent需要外挂“记忆体”和“工具”来弥补这一点。
  • 关键认知2:LLM的输出具有随机性(通过temperature参数控制)。这对于创意任务是好事,但对于需要稳定执行指令的Agent可能是灾难。在Agent的核心决策环节,通常需要设置较低的temperature(如0.1或0),以增加其行为的可预测性。
  • 关键认知3:上下文长度是硬约束。无论是4K、8K、16K还是128K Token,你的Agent在一次交互中能“记住”的信息是有限的。设计Agent时,如何从海量记忆或知识库中精准地筛选出最相关的信息塞进上下文,是架构设计的核心挑战之一。这直接引出了“检索增强生成”的概念。

实操心得:不要盲目追求最大、最新的模型。对于许多Agent任务,中小型、推理速度快的模型(如DeepSeek、Qwen等)在成本、响应速度和效果上往往是更优解。先用小模型跑通逻辑和架构,再用大模型做效果提升,是更稳妥的策略。

2.2 提示词工程:给“大脑”下达清晰指令的艺术

如果把LLM比作一个能力超强但需要明确指引的员工,那么提示词就是你的管理指令。糟糕的提示词会让最强大的模型表现失常。

在Agent开发中,提示词有几个层级:

  1. 系统提示词:定义Agent的“人设”、核心职责和行为边界。例如:“你是一个专业的数据分析助手,专注于用准确、简洁的语言解释图表趋势。你绝不捏造数据。”
  2. 任务提示词:描述当前需要解决的具体问题。这部分需要清晰、无歧义。
  3. 格式化指令:要求LLM以特定格式(如JSON、XML、特定关键词)输出,以便程序能稳定地解析其输出,并转化为下一个动作。这是Agent自动化链条的关键一环。

一个常见的Agent系统提示词模板可能包含:

  • 角色:你是谁?
  • 目标:你的终极任务是什么?
  • 约束:你必须遵守哪些规则?(例如:不能做什么,必须如何做)
  • 工具:你可以使用哪些工具?格式是什么?
  • 输出格式:你必须以何种格式回复?(例如:“Thought: ... Action: ... Action Input: ... Final Answer: ...”)

2.3 思维链:让LLM“展示思考过程”

思维链是提示词工程中一项革命性的技术。它的核心思想是,在要求LLM给出最终答案前,鼓励它先输出中间的推理步骤。

为什么这对Agent至关重要?因为Agent的决策往往不是一步到位的。它需要“思考”:我现在有什么信息?我的目标是什么?我可以调用哪个工具?调用后的结果会怎样?CoT通过让LLM显式地生成这些“内心独白”,极大地提升了其在复杂、多步推理任务上的准确性。

在Agent框架中,这个“Thought: ...”部分就是思维链的体现。它使得Agent的决策过程变得可观测、可调试。当Agent行为异常时,查看它的“Thought”输出,你就能知道它是在哪一步逻辑跑偏了。

示例对比

  • 无CoT:提问:“如果我有3个苹果,吃了1个,又买了5个,现在有几个?” LLM可能直接输出:“7个”。(对错依赖于模型)
  • 有CoT:提问:“如果我有3个苹果,吃了1个,又买了5个,现在有几个?让我们一步步思考。” LLM可能输出:“首先,最初有3个。吃掉1个,剩下3-1=2个。然后买来5个,总数为2+5=7个。所以,现在有7个苹果。” 这个过程更稳定,也让你能追踪它的逻辑。

在开发中,你会在系统提示词里明确要求Agent按照“Thought -> Action -> Observation -> ... -> Final Answer”的格式进行输出,这就是将CoT机制固化到了Agent的行为模式中。

3. 架构核心:智能体范式、工具使用与规划——Agent的“行为模式”

3.1 智能体范式:ReAct、Plan-and-Execute与AutoGPT

这是Agent的“工作流蓝图”。不同的范式决定了Agent如何组织它的思考、行动和学习。

  • ReAct:这是目前最主流、最经典的Agent范式,由“推理”和“行动”两个环节交替进行。其运行流程是一个循环:

    1. Thought:基于当前目标和观察,推理下一步该做什么。
    2. Action:决定执行哪个工具调用(或直接给出答案)。
    3. Observation:获取工具执行的结果(或环境反馈)。
    4. 重复1-3步,直到达成目标或无法继续。 ReAct结构清晰,易于理解和实现,是大多数Agent框架(如LangChain Agent)的默认基础。它的优势在于能很好地结合CoT和工具使用,但劣势是在处理极其复杂、需要长期规划的任务时,可能陷入局部循环或做出短视决策。
  • Plan-and-Execute:这种范式引入了“规划器”和“执行器”的分离。首先,一个“规划器”Agent(或LLM调用)会制定一个完整的、分步骤的计划大纲。然后,一个或多个“执行器”Agent负责严格按照计划中的每一步去调用工具执行。最后,可能还有一个“校对器”来汇总结果。

    • 优势:对于复杂任务,提前规划可以避免走弯路,整体思路更宏观。执行步骤可以并行化(如果步骤间无依赖)。
    • 劣势:规划可能不准确,且无法在执行中灵活调整。增加了系统复杂性。
  • AutoGPT/BabyAGI风格:这类范式强调高度的自主性和目标驱动。Agent会自主创建任务列表,并持续地优先执行、评估和生成新任务,形成一个自循环。它通常包含一个核心的“任务创建与优先级排序”循环。

    • 优势:非常适合开放式的探索和创作任务,能产生令人意想不到的结果。
    • 劣势:极易“失控”,可能会陷入无意义的任务生成循环,消耗大量token和API成本,且结果不可预测。这是新手最容易踩坑的地方,不建议一开始就尝试。

选型建议:对于绝大多数业务场景(如数据分析、客服、内部流程自动化),ReAct范式足以应对90%的需求。先从ReAct入手,彻底掌握其调试和优化方法。只有当任务步骤非常固定且复杂时,才考虑Plan-and-Execute。AutoGPT类范式更适合研究或创意探索,生产环境需极其谨慎。

3.2 工具使用:Agent的“手脚”

工具是Agent与外部世界(数据、系统、互联网)交互的唯一途径。一个没有工具的Agent,只是一个被关在上下文窗口里的“百科全书”,能力非常有限。

工具的本质是一个函数,它:

  1. 有一个清晰的名称和描述(供LLM理解何时调用它)。
  2. 定义好输入参数的模式(如JSON Schema)。
  3. 包含实际的执行代码(可以是调用一个API、查询数据库、运行一个计算等)。

设计工具的关键点

  • 描述要精准:LLM根据工具描述来决定是否调用。描述应明确说明工具的功能、适用场景和输入输出格式。例如,“查询天气”工具的描述,应该比“获取数据”好得多。
  • 功能要原子化:一个工具最好只做一件事。不要设计一个“处理用户请求并更新数据库再发送邮件”的巨无霸工具。将其拆分为“查询用户信息”、“更新数据库记录”、“发送邮件”三个独立工具。这样Agent的决策更灵活,也更容易调试。
  • 错误处理要健壮:工具执行可能会失败(网络错误、参数错误等)。工具函数内部必须有完善的异常捕获机制,并返回结构化的错误信息(如{“error”: “Network timeout”, “details”: “...”})供Agent观察。Agent的提示词中需要教会它如何处理这些错误观察(例如:“Observation: Tool X failed with error Y. I should try a different approach or inform the user.”)。

常见的工具类型

  • 搜索工具:调用搜索引擎API。
  • 计算工具:执行数学计算或单位换算。
  • 查询工具:访问数据库或知识库。
  • API调用工具:与外部业务系统(如CRM、ERP)交互。
  • 代码执行工具:在安全沙箱中运行代码(需极度谨慎)。

3.3 规划:不只是“一步一步来”

在ReAct范式中,“规划”是隐含在每一步的“Thought”中的短期规划。但这里指的“规划”更接近一个高层战略。

  • 任务分解:面对一个宏大目标(如“为公司制定下一季度的市场策略”),Agent需要能将其分解为一系列可执行的子任务(“分析上一季度销售数据”、“研究竞争对手动态”、“评估现有营销渠道效果”、“草拟策略文档”等)。这通常需要LLM具备较强的抽象和概括能力。
  • 子任务排序与调度:分解出的任务之间可能存在依赖关系。有些可以并行,有些必须串行。一个成熟的Agent系统可能需要一个简单的任务调度器来管理这些依赖。
  • 动态重规划:计划赶不上变化。当某个工具调用失败,或观察到意料之外的结果时,Agent需要有能力调整原有的计划。这通常通过在提示词中强调“根据最新观察调整你的计划”来实现,对LLM的要求较高。

在实际开发中,对于复杂任务,我通常会采用“混合策略”:先让一个专门的“规划Agent”做一次顶层的任务分解和排序,生成一个初步计划。然后,由一个“执行Agent”(采用ReAct范式)去逐个攻克子任务,并在每个子任务内部允许其进行微观的规划和调整。这样既保证了宏观方向,又不失灵活性。

4. 记忆、检索与评估——Agent的“经验”与“反思”

4.1 记忆:短期、长期与外部记忆

记忆是Agent实现连续对话和持续学习的基础。根据存储时长和方式,可以分为:

  • 短期记忆/对话记忆:保存当前一次对话轮次中的上下文。这通常就是LLM的上下文窗口本身。管理它的关键是摘要和压缩。当对话历史很长时,不能简单地把所有历史消息都塞进去,需要将过往的对话总结成一段精炼的摘要,作为新的系统提示词的一部分,从而腾出空间给新的交互。
  • 长期记忆/向量记忆:这是Agent的“知识库”或“经验库”。它将历史对话、重要事实、用户偏好等转换成向量(Embedding),存储到向量数据库(如Chroma, Pinecone, Weaviate)中。当需要相关信息时,通过计算相似度进行检索。
    • 工作流程:1. 存储:将文本通过Embedding模型转为向量,存入DB。 2. 检索:将当前问题也转为向量,从DB中找出最相似的K个片段。
    • 关键参数k(返回多少条记忆)、相似度阈值、以及记忆的元数据(如时间戳、重要性标签)用于过滤。
  • 外部记忆:指Agent能够通过工具访问的外部存储系统,如SQL数据库、Notion页面、Confluence文档等。这本质上是将外部数据源作为一种特殊的“工具”来扩展Agent的记忆边界。

记忆管理的核心挑战

  1. 信息冗余与冲突:同样的信息可能被多次存储。需要设计去重和合并机制。
  2. 相关性检索:简单的向量相似度检索不一定总能找到最相关的记忆。需要结合关键词过滤、元数据过滤(如时间范围、记忆类型)以及多轮查询重写等技术来提升召回率。
  3. 记忆的更新与遗忘:不是所有记忆都同等重要。需要设计机制来衰减旧记忆的权重,或主动清理无效记忆。

4.2 检索增强生成:给LLM装上“外部知识库”

RAG是构建专业领域Agent的核心技术。它的核心思想是:在让LLM生成答案之前,先从外部知识库(如你的公司文档、产品手册、代码库)中检索出与问题最相关的文档片段,并将这些片段作为上下文提供给LLM。

为什么需要RAG?

  1. 克服LLM的“幻觉”:LLM可能会对训练数据之外或过时的信息进行胡编乱造。RAG强制它基于你提供的、确凿的参考资料来生成答案,大大提高了事实准确性。
  2. 注入私有/最新知识:LLM的训练数据是静态的。通过RAG,你可以让Agent掌握你公司内部的、最新的、非公开的知识。
  3. 溯源与可信度:RAG生成的答案可以附带引用来源(检索到的文档片段),这让回答更具可信度,也方便用户核实。

一个典型的RAG-Agent工作流

  1. 用户提问。
  2. Agent的“检索工具”被触发(或LLM决定需要检索)。
  3. 将用户问题转换为查询语句,在向量知识库中检索出Top K个相关文档片段。
  4. 将这些片段与原始问题一起,组合成一个新的、增强的提示词,提交给LLM。
  5. LLM基于提供的片段生成最终答案。

避坑指南:RAG的效果严重依赖于检索质量。“垃圾进,垃圾出”。如果检索到的文档不相关,LLM生成的答案也会跑偏。因此,文档的预处理(切分、清洗、添加元数据)和Embedding模型的选择,往往比RAG链条本身更重要。不要指望用一个通用的Embedding模型就能处理好你专业的领域文档。

4.3 智能体评估:如何知道你的Agent“好不好”?

这是Agent开发中最容易被忽视,但也最关键的环节。你不能只靠“感觉”来判断Agent是否工作正常。

评估的维度

  • 功能性:Agent能否正确完成任务?这是最基本的。
  • 可靠性:在多次运行中,结果是否一致?面对边缘案例(如无效输入、工具失败)是否健壮?
  • 效率:完成任务平均需要多少步(工具调用)?消耗多少Token(成本)?
  • 安全性:Agent是否会执行危险操作或生成有害内容?

评估方法

  1. 人工评估:构建一个测试用例集(包括常规用例和边缘用例),人工检查每次运行的最终输出和中间步骤。这是黄金标准,但成本高。
  2. 基于LLM的评估:用另一个LLM(如GPT-4)作为“裁判”,根据预设的评分规则(相关性、正确性、完整性等)对Agent的输出进行打分。这可以自动化,但“裁判”LLM本身也有偏差和成本。
  3. 端到端指标:对于有明确目标的任务(如代码生成后能否通过单元测试、数据分析后得出的关键指标是否准确),可以设计自动化脚本进行验证。
  4. 过程监控:记录每次交互的完整轨迹(Thought, Action, Observation),分析常见错误模式(如工具选择错误、参数解析失败、陷入循环)。这是调试和优化Agent的最宝贵材料。

建立一个评估流水线:在项目初期,就应该规划如何评估Agent。可以设置一个简单的CI/CD流程:每次代码更新后,自动运行一批测试用例,收集成功率、平均步数等指标,并与基线进行比较。这能有效防止代码变更引入的回归问题。

5. 多智能体协作与安全边界——从“个体”到“团队”

5.1 多智能体系统:分工与协作

当单个Agent无法处理复杂任务时,就需要引入多智能体系统。这就像组建一个项目团队,每个Agent有明确的角色和专长。

常见的协作模式

  • 主从模式:一个“主管”Agent负责接收用户指令,进行任务分解和规划,然后将子任务分配给不同的“专家”Agent(如数据分析专家、文档撰写专家、代码审查专家)去执行,并汇总结果。
  • 辩论模式:多个Agent对同一个问题提出自己的解决方案或观点,并进行多轮辩论,最终由一个“裁判”Agent或投票机制得出综合结论。这有助于从多角度审视问题,减少偏见。
  • 竞争模式:多个Agent尝试解决同一问题,最终选择最优结果。类似于集成学习。

设计多智能体系统的关键考量

  1. 角色定义:每个Agent的系统提示词必须清晰定义其角色、能力和责任边界,避免冲突和重复劳动。
  2. 通信协议:Agent之间如何交换信息?是通过共享一个黑板(blackboard)系统,还是通过消息传递(message passing)?消息的格式需要标准化(例如,使用JSON包含发送者、接收者、消息类型和内容)。
  3. 协调机制:谁来决定任务分配和冲突解决?是有一个中心化的协调者,还是完全去中心化的协商机制?
  4. 成本与效率:多个Agent意味着多次LLM调用,成本会显著增加。需要权衡任务复杂度与成本效益。

一个实用的入门示例是创建一个“代码开发团队”:一个“产品经理”Agent将用户需求转化为功能规格;一个“架构师”Agent设计代码结构;一个“程序员”Agent编写具体代码;一个“测试员”Agent编写单元测试并运行。它们通过共享一个项目文件夹(作为黑板)来协作。

5.2 安全、伦理与可控性:给“超人”套上缰绳

这是Agent走向实际应用必须跨越的鸿沟。一个不受控制的Agent可能带来财务损失、数据泄露甚至法律风险。

核心风险点与应对策略

风险类别具体表现应对策略
指令注入用户通过精心设计的输入,诱使Agent绕过系统提示词中的限制,执行恶意操作。1.输入过滤与净化:对用户输入进行敏感词检测和转义。
2.系统提示词强化:在提示词中多次、多角度强调安全边界,使用“无论如何都不能...”等强硬措辞。
3.沙箱环境:让Agent在严格受限的沙箱中运行工具(尤其是代码执行、文件操作类工具)。
越权操作Agent错误地使用了本不该使用的工具,或使用了正确的工具但参数越界。1.最小权限原则:为每个Agent分配完成任务所必需的最小工具集。
2.工具级权限校验:在工具函数内部,根据调用者的身份或会话上下文,进行二次权限验证。
3.操作确认:对于高风险操作(如删除数据、支付),设计人工确认或二次授权环节。
数据泄露Agent在思考过程或最终输出中,无意间泄露了从工具或记忆中获取的敏感信息。1.输出过滤:对Agent的最终输出进行扫描,过滤掉身份证号、手机号、密钥等模式化敏感信息。
2.记忆隔离:不同用户的对话记忆和长期记忆必须严格隔离。
3.隐私计算:在可能的情况下,使用隐私保护技术处理敏感数据。
资源滥用Agent陷入死循环,不断调用工具或生成大量文本,导致API费用暴涨或系统负载过高。1.设置硬性限制:限制单次会话的最大交互轮次、最大Token消耗、最大工具调用次数。
2.成本监控与熔断:实时监控消耗,达到阈值时自动终止会话并告警。
3.看门狗机制:设计一个外部监控进程,检测Agent是否长时间无进展或陷入循环。
价值对齐Agent的行为或输出违背人类伦理、社会公序良俗或公司价值观。1.价值观植入:在系统提示词中明确植入伦理准则。
2.内容安全过滤:使用内容安全API对输入和输出进行双重审核。
3.人工审核流程:对于高风险领域的应用,建立输出结果的人工抽检或全检流程。

安全开发流程建议:将安全设计融入Agent开发的每一个阶段。在设计阶段就进行威胁建模;在实现阶段为每个工具加上“安全带”;在测试阶段进行专门的安全测试(如模糊测试、对抗性提示测试);在部署阶段设置层层监控和熔断机制。

6. 主流框架与开发实战:LangChain和LangGraph

理解了概念,最终要落到代码上。目前最流行的Agent开发框架是LangChain(及其扩展LangGraph),它们提供了构建Agent所需的大部分组件。

6.1 LangChain Agent:快速上手的标准范式

LangChain将Agent抽象为AgentExecutor,它封装了ReAct循环。你的主要工作是:

  1. 定义LLM:选择模型提供商(OpenAI, Anthropic, 本地模型等)并初始化。
  2. 定义工具:创建Tool对象列表,每个工具绑定一个函数和描述。
  3. 定义提示词模板:通常使用LangChain内置的ChatPromptTemplate,包含system_message,human_message等部分,并预留toolstool_names等变量。
  4. 创建Agent:使用create_react_agent或类似函数,将LLM、工具和提示词模板组合起来。
  5. 运行Agent:通过AgentExecutor来运行,传入用户输入和对话历史。

一个极简的代码骨架

from langchain_openai import ChatOpenAI from langchain.agents import create_react_agent, AgentExecutor from langchain.tools import Tool from langchain import hub # 1. 定义工具 def search_api(query: str) -> str: # 调用某个搜索API return f"Results for {query}: ..." search_tool = Tool( name="WebSearch", func=search_api, description="Useful for searching the web for current information." ) # 2. 定义LLM llm = ChatOpenAI(model="gpt-4", temperature=0) # 3. 获取提示词模板(从LangChain Hub拉取一个标准的ReAct模板) prompt = hub.pull("hwchase17/react") # 4. 创建Agent agent = create_react_agent(llm, tools=[search_tool], prompt=prompt) # 5. 创建执行器并运行 agent_executor = AgentExecutor(agent=agent, tools=[search_tool], verbose=True, handle_parsing_errors=True) result = agent_executor.invoke({"input": "What's the latest news about AI?"}) print(result["output"])

LangChain的优势:生态丰富,组件齐全,文档和社区资源多,适合快速原型验证。LangChain的劣势:抽象层级高,有时感觉“黑盒”,调试复杂流程时不够直观;性能开销相对较大。

6.2 LangGraph:为复杂工作流而生

当你的Agent逻辑超出简单的ReAct循环,需要分支、循环、多Agent协作时,LangChain的基础Agent就显得力不从心了。这时就需要LangGraph

LangGraph允许你以的形式来定义Agent的工作流。节点代表步骤(可以是LLM调用、工具调用、条件判断),边代表步骤之间的流转路径。

核心概念

  • State:一个共享的字典,在整个工作流执行过程中传递和修改数据。它定义了Agent的“记忆”。
  • Node:一个函数,接收当前的State,执行一些操作(如调用LLM),并返回更新后的State。
  • Edge:决定下一个执行哪个Node。可以是条件边(根据State中的某个值决定),也可以是固定边。

用LangGraph实现一个带条件判断的Agent: 假设我们有一个Agent,它先尝试用简单方法解决问题,如果不行,再改用复杂方法。

from langgraph.graph import StateGraph, END from typing import TypedDict, Annotated from langchain_openai import ChatOpenAI import operator # 1. 定义State的结构 class AgentState(TypedDict): question: str simple_answer: Annotated[str, operator.add] # 表示这个字段会被累加 complex_answer: Annotated[str, operator.add] use_complex_method: bool # 2. 定义各个节点(函数) def simple_solver(state: AgentState): llm = ChatOpenAI(model="gpt-3.5-turbo") # 尝试用简单方法回答 response = llm.invoke(f"Answer this question simply: {state['question']}") return {"simple_answer": response.content} def check_answer(state: AgentState): # 这里可以是一个规则或另一个LLM调用,来判断简单答案是否足够好 # 假设我们简单判断:如果简单答案很短,就认为不够好 if len(state.get("simple_answer", "")) < 50: return {"use_complex_method": True} else: return {"use_complex_method": False} def complex_solver(state: AgentState): if not state.get("use_complex_method"): return {} # 如果不需要复杂方法,直接跳过 llm = ChatOpenAI(model="gpt-4") # 用复杂方法回答 response = llm.invoke(f"Analyze this question in depth and provide a comprehensive answer: {state['question']}") return {"complex_answer": response.content} # 3. 构建图 workflow = StateGraph(AgentState) workflow.add_node("simple_solver", simple_solver) workflow.add_node("check_answer", check_answer) workflow.add_node("complex_solver", complex_solver) # 4. 添加边 workflow.set_entry_point("simple_solver") # 从简单求解开始 workflow.add_edge("simple_solver", "check_answer") # 求解后去检查 # 条件边:根据检查结果决定下一步 workflow.add_conditional_edges( "check_answer", lambda x: "complex_solver" if x["use_complex_method"] else END, {"complex_solver": "complex_solver", END: END} ) workflow.add_edge("complex_solver", END) # 复杂求解后结束 # 5. 编译并运行图 app = workflow.compile() initial_state = {"question": "Explain the theory of relativity."} result = app.invoke(initial_state) print(result)

LangGraph的优势:可视化、调试复杂流程极其方便;能清晰表达带有分支、循环、并发的Agent逻辑;状态管理更灵活。LangGraph的劣势:学习曲线比基础LangChain陡峭;对于简单任务显得过于重型。

6.3 开发流程与调试心得

无论用哪个框架,一个稳健的Agent开发流程应该是:

  1. 明确需求与边界:用文字精确描述Agent要做什么,不能做什么。这是编写系统提示词的基石。
  2. 工具先行:先独立开发和测试好所有需要的工具函数,确保它们功能正确、错误处理完善。
  3. 构建最小可行Agent:用最简单的ReAct循环,只挂载1-2个核心工具,跑通端到端流程。
  4. 迭代提示词:这是最耗时的部分。通过观察Agent的失败案例(特别是“Thought”部分),不断微调系统提示词和工具描述。常用技巧包括:在提示词中提供更具体的例子(Few-shot Learning),使用更强烈的限制性语言,调整工具描述的措辞。
  5. 引入记忆与RAG:在基础Agent工作良好后,再根据需要加入对话记忆管理和知识库检索功能。
  6. 全面测试与评估:构建涵盖常规和边缘案例的测试集,运行并评估Agent的表现。重点关注工具调用准确率、任务完成率和异常处理。
  7. 安全加固与部署:加入前文提到的各项安全限制和监控,然后才能部署到准生产或生产环境。

调试技巧

  • 开启verbose=True:这是最重要的调试手段,它能打印出Agent完整的思考链(Thought, Action, Observation)。
  • 模拟工具:在开发初期,可以为工具创建“模拟版本”,返回固定的成功或失败数据,以便快速测试Agent的逻辑分支。
  • 记录轨迹:将每次运行的完整状态(包括所有中间步骤)保存下来,便于事后分析和复现问题。
  • 单元测试提示词:可以将提示词模板和固定的输入输出作为单元测试,确保提示词的修改不会破坏核心逻辑。

掌握这十个核心概念,并能在LangChain/LangGraph这样的框架中灵活运用,你就已经跨过了Agent开发的门槛。真正的精通来自于在具体项目中不断解决那些文档里没写的、千奇百怪的问题。记住,设计Agent更像是在培养一个数字员工,清晰的指令、合适的工具、可控的环境和持续的调教,缺一不可。