1. 从零系统学习智能体应用的整体认知框架
1.1 为什么“从零系统学习”比“直接上手搭一个”更重要
我见过太多人学智能体开发的路径是这样的:刷到一篇“10分钟用LangChain搭一个AI Agent”的文章,跟着敲了一遍,跑通了,觉得自己会了。然后换一个需求,比如要做一个能查数据库、能调API、能记住用户偏好的销售智能体,立刻卡住,不知道从哪下手。
问题出在哪?出在跳过了“认知筑基”这一步。智能体开发不是单纯的API调用,它涉及LLM的能力边界理解、任务分解策略、工具调用协议、状态管理、记忆机制、评估方法等一系列相互关联的知识点。你只看到了LangChain那几行链式调用的代码,但没理解它背后为什么要那样设计,换一个框架、换一个场景,你就失去了迁移能力。
“从零系统学习”的核心价值在于:它让你建立一套完整的知识坐标系。当你知道LLM在什么情况下会幻觉、什么情况下需要外部工具兜底、什么情况下应该用多智能体协作而不是单智能体硬扛,你在面对新需求时就能做出合理的技术选型,而不是盲目试错。
这条学习路径适合几类人:有Python基础但没接触过LLM应用开发的程序员;做过传统后端或数据分析、想转型智能体方向的工程师;产品经理或技术管理者,需要理解智能体系统的能力边界和交付标准;以及已经用过Dify等低代码平台、但想深入底层原理的实践者。
1.2 智能体应用开发的知识体系拆解
把“智能体应用开发”当成一个学科来看,它的知识体系大致可以分成四层。
最底层是LLM基础认知层。你需要理解大模型的基本工作原理——不是要你去训练模型,而是要理解token、上下文窗口、温度参数、few-shot prompting、思维链这些概念的实际含义。比如上下文窗口不是“记忆”,它只是单次请求能携带的最大文本量;温度参数不是“创造力”,它是对输出概率分布的平滑程度。这些认知直接决定了你后面设计智能体时的架构选择。
第二层是智能体核心机制层。这一层要搞清楚智能体跟普通LLM调用的本质区别:智能体有目标、有工具、有记忆、有循环。它需要感知环境(用户输入、工具返回结果)、做出决策(下一步调用什么工具、还是直接回复)、执行动作(调用工具或生成回复)、并根据结果调整策略。这个循环的设计质量,直接决定了智能体的实用性。
第三层是工程框架与工具链层。LangChain、LangGraph、Dify、Spring AI这些框架各有定位。LangChain提供了大量的组件抽象,适合快速原型验证;LangGraph专注于有状态的多步骤工作流编排,适合需要精确控制流程的生产级场景;Dify是低代码平台,适合快速搭建和验证业务想法。理解它们的差异和适用场景,比会用一个框架更重要。
第四层是生产级交付层。这一层包括评估体系、可观测性、成本控制、安全防护、部署运维等。一个能在demo里跑通的智能体,和一个能在生产环境稳定服务的智能体,中间隔着的就是这一层。很多开发者卡在“demo能跑、上线就崩”的阶段,就是因为忽略了这一层的建设。
1.3 学习路径的阶段划分与里程碑
我把这条路径分成四个阶段,每个阶段有明确的产出物和验收标准。
第一阶段:认知筑基(1-2周)。目标是建立对LLM和智能体的正确认知。产出物是一份个人笔记,记录你对token、上下文、prompt engineering、function calling等核心概念的理解,以及你用Python直接调用LLM API完成几个基础任务的代码。验收标准是你能不依赖任何框架,用原生API实现一个简单的问答机器人,并解释清楚每一步在做什么。
第二阶段:框架入门与单智能体开发(2-3周)。目标是掌握LangGraph或同类框架的核心用法,能独立开发一个具备工具调用能力的单智能体。产出物是一个可运行的智能体项目,比如一个能查询天气、能计算、能记住对话历史的助手。验收标准是你能画出这个智能体的状态图,解释每个节点的作用和状态流转逻辑。
第三阶段:多智能体与复杂工作流(3-4周)。目标是理解多智能体协作模式,能设计并实现包含多个角色、多个步骤的复杂工作流。产出物是一个多智能体系统,比如一个包含“需求分析员”“代码生成器”“测试员”的自动化开发助手。验收标准是你能说清楚为什么这样拆分角色、每个角色的输入输出是什么、如何处理角色间的冲突和异常。
第四阶段:生产级交付(持续)。目标是掌握评估、监控、成本优化、安全防护等生产级技能。产出物是一套完整的评估方案和监控看板,以及一份成本优化报告。验收标准是你的智能体在真实业务场景下能稳定运行,有量化的质量指标,成本可控,异常可追溯。
2. 认知筑基阶段的核心细节与实操要点
2.1 LLM能力边界的正确理解方式
很多人对LLM的误解集中在两个极端:要么觉得它无所不能,要么觉得它就是个高级复读机。这两种认知都会导致智能体设计上的严重问题。
先说过度乐观的情况。LLM确实能完成很多任务,但它有几个硬性限制你必须刻在脑子里。第一,它没有真正的“记忆”——每次API调用都是独立的,上下文窗口里的内容就是它全部的信息来源。第二,它的输出是概率性的,同样的输入可能得到不同的输出,这在需要确定性的场景下是致命的。第三,它无法主动获取实时信息,训练数据有截止日期,之后发生的事情它不知道。第四,它的推理能力有上限,对于需要多步精确计算或严格逻辑推导的任务,它容易出错。
再说过度悲观的情况。LLM虽然有限制,但通过合理的架构设计,很多限制是可以绕过的。没有记忆?用外部存储加检索来补。输出不确定?用结构化输出约束加验证机制来控。没有实时信息?用工具调用来获取。推理能力有限?用任务分解加多步验证来提升。
理解这些边界之后,你在设计智能体时就会自然地想到:哪些任务交给LLM直接做,哪些任务需要工具辅助,哪些任务需要人工兜底。这个判断力,是认知筑基阶段最重要的收获。
2.2 Python环境配置与LLM API调用的最小实践
在进入框架之前,我强烈建议先用原生Python把LLM API调用的基本流程走一遍。这一步看起来简单,但能帮你建立对“智能体底层在做什么”的直觉。
Python环境配置这块,我推荐用conda或者uv来管理虚拟环境,不要直接在系统Python里装包。原因很简单:智能体项目依赖的包版本冲突很常见,虚拟环境能帮你隔离不同项目的依赖。具体操作上,用conda create -n agent-learn python=3.11创建一个干净的环境,然后激活它。为什么选3.11而不是最新版?因为很多LLM相关的库对Python版本有要求,3.11是目前兼容性最好的版本之一。
装好环境后,先装openai这个包。虽然你可能用的是其他厂商的模型,但大部分厂商都兼容OpenAI的API格式,所以这个包是通用的。然后你需要一个API key,这个从你选用的模型服务商那里获取。
接下来写一个最小的调用脚本。核心逻辑是:构造messages列表,调用chat completions接口,解析返回结果。messages列表里每条消息有role和content两个字段,role可以是system、user、assistant。system消息用来设定模型的行为准则,user消息是用户输入,assistant消息是模型的历史回复。
这个最小实践的关键不在于代码本身,而在于你要亲手体验几个事情:第一,system prompt的改变如何影响输出风格;第二,temperature参数从0调到1,输出的变化规律;第三,当输入超过上下文窗口时会发生什么;第四,如何用few-shot示例来引导输出格式。
我建议你在这个阶段做一个小实验:用同一个问题,分别用temperature=0和temperature=1各调用10次,记录输出的差异。你会发现temperature=0时输出几乎一致,temperature=1时每次都不一样。这个直观感受,比看任何文档都管用。
2.3 Prompt Engineering在智能体场景下的特殊要求
普通的Prompt Engineering关注的是“如何让模型输出更好的答案”,但智能体场景下的Prompt Engineering关注的是“如何让模型做出正确的决策”。这是一个根本性的视角转换。
在智能体里,prompt通常要完成几件事:定义智能体的角色和职责边界、描述可用的工具及其调用方式、规定输出格式(尤其是需要结构化解析的时候)、设定异常处理策略。这比单纯的问答prompt复杂得多。
我踩过的一个坑是:早期设计工具调用prompt时,我只写了“你可以使用以下工具”,但没有明确说明“什么时候应该用工具、什么时候应该直接回答”。结果模型经常在该调用工具的时候直接编造答案,在该直接回答的时候又去调用工具。后来我在prompt里加了一段决策规则:“如果问题涉及实时数据或需要精确计算,必须调用工具;如果问题是常识性或开放性的,直接回答。”这个问题就基本解决了。
另一个关键点是输出格式的约束。智能体需要解析模型的输出来决定下一步动作,所以输出必须是结构化的。我通常用JSON格式,并在prompt里给出明确的schema示例。但要注意,即使你给了schema,模型也可能输出不符合格式的内容。所以解析的时候一定要做容错处理,解析失败时要么重试,要么走降级逻辑。
还有一个容易被忽略的点:prompt的长度管理。智能体的system prompt往往很长,包含角色定义、工具描述、决策规则、格式要求等。如果再加上few-shot示例,很容易就占掉几千个token。这会压缩实际对话的可用上下文空间,也会增加每次调用的成本。我的做法是:核心规则放在system prompt里,few-shot示例根据场景动态加载,不是所有场景都需要全部示例。
3. LangGraph核心机制与单智能体开发实操
3.1 为什么选LangGraph而不是LangChain
LangChain和LangGraph的区别,是很多初学者困惑的地方。简单来说,LangChain提供的是“组件”,LangGraph提供的是“编排”。
LangChain有大量的抽象:LLMChain、SequentialChain、RouterChain等等。这些抽象在快速搭建线性流程时很方便,但当你需要实现带有循环、条件分支、状态持久化的复杂流程时,LangChain的抽象就开始变得别扭。你会发现自己在一层层包装里绕来绕去,很难精确控制执行流程。
LangGraph的思路完全不同。它把智能体的执行过程建模成一张状态图:节点代表执行步骤,边代表状态流转。你可以精确地定义每一步做什么、什么条件下走哪条边、状态如何更新。这种建模方式跟智能体的实际运行逻辑高度吻合,所以代码的可读性和可维护性都好很多。
我举个具体例子。假设你要做一个客服智能体,流程是:先判断用户意图,如果是咨询类问题就直接回答,如果是投诉类问题就转人工,如果是查询类问题就调用查询工具。用LangChain实现,你可能需要写一个RouterChain来做意图分类,然后根据分类结果走不同的Chain。但RouterChain的分类结果如何影响后续流程,在代码里是隐式的,不直观。用LangGraph实现,你定义一个“意图分类”节点,然后从这个节点出发有三条条件边,分别指向“直接回答”“转人工”“调用查询工具”三个节点。整个流程一目了然。
当然,LangGraph的学习曲线比LangChain陡一些。你需要理解StateGraph、Node、Edge、Conditional Edge、Checkpointer这些概念。但一旦理解了,后面开发复杂智能体会顺畅很多。
3.2 LangGraph状态图的核心概念与设计方法
LangGraph的核心是StateGraph。你可以把它想象成一张流程图,但这张流程图是“活”的——它携带状态,状态在节点之间流转,每个节点可以读取和修改状态。
State是整张图共享的数据结构。在Python里通常用TypedDict或Pydantic模型来定义。State里放什么?放智能体运行过程中需要传递的所有信息:对话历史、当前任务、工具调用结果、中间变量等等。设计State的关键原则是:只放需要跨节点共享的数据,节点内部的临时变量不要放进去。
Node是执行单元。每个节点是一个函数,接收当前State,返回State的更新。节点里可以做任何事情:调用LLM、执行工具、做数据转换、甚至调用另一个图。节点的粒度怎么把握?我的经验是:一个节点只做一件事,并且这件事的输入输出是清晰的。比如“调用LLM生成回复”是一个节点,“解析LLM输出”是另一个节点,“执行工具调用”又是一个节点。不要把太多逻辑塞进一个节点,否则调试起来很痛苦。
Edge是节点之间的连接。普通Edge表示“执行完A之后执行B”。Conditional Edge表示“执行完A之后,根据某个条件决定执行B还是C”。条件函数的返回值通常是一个字符串,对应不同的目标节点。
Checkpointer是LangGraph的一个强大特性。它可以在每一步之后保存State的快照,这样如果执行中断,可以从断点恢复。这对于需要人工审核的流程特别有用:智能体执行到某一步,暂停,等人审核通过后再继续。
设计状态图的时候,我习惯先在纸上画出来:有哪些节点、节点之间怎么连、条件分支的判断依据是什么。画清楚了再写代码,比直接写代码然后反复调整要高效得多。
3.3 工具调用的实现细节与常见陷阱
工具调用是智能体区别于普通聊天机器人的核心能力。LangGraph里实现工具调用,通常用ToolNode这个预置节点,配合bind_tools方法把工具绑定到LLM上。
工具的定义用@tool装饰器,函数的docstring就是工具的描述,LLM根据这个描述来决定什么时候调用。所以docstring要写得清晰、具体,说明这个工具做什么、什么时候用、参数是什么含义。
我踩过的一个典型坑是:工具描述写得太模糊,导致LLM在不该调用的时候调用。比如我定义了一个“搜索”工具,描述写的是“搜索信息”。结果用户问“今天天气怎么样”,LLM也去调用搜索工具,而不是用天气工具。后来我把描述改成“搜索互联网上的通用信息,不适用于天气、股价等实时数据查询”,问题就解决了。
另一个坑是工具返回结果的处理。工具返回的可能是很长的文本,直接塞进State里会占用大量上下文。我的做法是在工具节点里对返回结果做摘要或截断,只保留关键信息。如果返回的是结构化数据,就提取需要的字段,而不是把整个JSON都塞进去。
还有一个容易忽略的点:工具调用的错误处理。工具可能因为网络问题、参数错误、权限问题等各种原因失败。如果不在节点里做异常捕获,整个图就会崩溃。我的做法是在工具节点里用try-except包裹,失败时返回一个包含错误信息的标准格式结果,让LLM根据错误信息决定是重试、换工具、还是告知用户。
3.4 单智能体项目的完整实现流程
以一个“个人助理智能体”为例,完整走一遍实现流程。
需求是:用户可以用自然语言让助理帮忙查天气、做计算、记录待办事项、查询待办列表。助理需要记住对话历史,能理解上下文。
第一步,定义State。需要包含:messages(对话历史)、user_id(用户标识,用于区分不同用户的待办)、pending_todo(待确认的待办内容)。用TypedDict定义,messages用Annotated[list, add_messages]来标注,这样新消息会自动追加而不是覆盖。
第二步,定义工具。四个工具:get_weather(查天气)、calculate(做计算)、add_todo(添加待办)、list_todos(查询待办)。每个工具用@tool装饰,写清楚描述和参数。
第三步,定义节点。核心节点有三个:agent节点(调用LLM,决定下一步是回复还是调用工具)、tool节点(执行工具调用)、should_continue条件函数(判断LLM的输出里有没有工具调用请求)。
第四步,构建图。用StateGraph创建图,添加节点,设置入口点为agent,添加条件边从agent出发:如果有工具调用就走tool节点,否则走END。从tool节点添加普通边回到agent,形成循环。
第五步,编译和运行。编译图的时候传入checkpointer(比如MemorySaver),这样对话历史会自动保存。运行时传入初始State和config(包含thread_id),就可以开始对话了。
这个项目虽然简单,但涵盖了智能体开发的所有核心要素:状态管理、工具调用、条件分支、循环、持久化。把这个项目吃透,后面做更复杂的智能体就是在这个基础上扩展。
4. 多智能体协作与生产级交付的关键要点
4.1 多智能体协作的模式选择与适用场景
单智能体搞不定的任务,就需要多智能体协作。但多智能体不是银弹,它带来能力提升的同时也带来了复杂度的指数级增长。所以第一步是判断:这个任务真的需要多智能体吗?
我总结了一个简单的判断标准:如果任务可以清晰地分解成几个子任务,每个子任务需要不同的专业能力或不同的工具集,并且子任务之间有明确的依赖关系,那么多智能体是合适的。反之,如果任务本身是连贯的、不需要多视角的,硬拆成多智能体只会增加协调成本。
多智能体协作有几种常见模式。流水线模式:智能体A的输出是智能体B的输入,B的输出是C的输入,像工厂流水线一样。适合步骤明确、顺序固定的任务,比如“需求分析→代码生成→代码审查”。辩论模式:多个智能体对同一个问题给出不同方案,然后由一个裁判智能体来评估和选择。适合需要多视角决策的场景,比如方案评审。层级模式:一个主管智能体负责分解任务和分配工作,多个 worker 智能体负责执行,主管再汇总结果。适合任务复杂、需要动态分配的场景。
在LangGraph里实现多智能体,本质上就是在一张图里定义多个agent节点,通过边和条件边来协调它们的执行顺序和数据流转。每个agent节点可以有自己的LLM配置、自己的工具集、自己的prompt。状态在它们之间共享,但你可以通过状态字段的设计来控制哪些信息对哪些智能体可见。
4.2 评估体系的搭建与质量度量
智能体“能跑”和“跑得好”之间,差的就是评估体系。没有评估,你就是在盲飞——不知道每次改动是变好了还是变差了,不知道上线后会不会出问题。
评估体系的核心是:定义什么是“好”,然后量化它。对于智能体,我通常从几个维度来评估:任务完成率(用户请求被正确完成的比例)、工具调用准确率(该调工具时调了、不该调时没调的比例)、响应质量(人工评分或LLM评分)、延迟(从用户输入到最终回复的时间)、成本(每次对话的token消耗)。
搭建评估体系的第一步是构建测试集。测试集要覆盖典型场景、边界场景、异常场景。典型场景就是最常见的用户请求;边界场景是那些容易出错的、模棱两可的请求;异常场景是工具失败、输入超长、格式错误等情况。测试集不需要很大,但要有代表性。我通常从真实用户日志里采样,加上人工构造的边界case,组成一个50-100条的测试集。
第二步是自动化评估。对于有明确正确答案的任务,可以用精确匹配或F1值来评估。对于开放式任务,可以用LLM-as-Judge的方式,让一个独立的LLM来给智能体的输出打分。但要注意,LLM评分本身也有偏差,所以最好结合人工抽检。
第三步是持续监控。上线后,要记录每次对话的完整trace,包括输入、LLM输出、工具调用、最终回复、耗时、token消耗。这些数据既可以用来做实时告警(比如错误率突然升高),也可以用来做离线分析(比如发现某类请求的完成率特别低)。
4.3 成本控制与性能优化的实操手段
智能体的成本主要来自LLM调用。一个复杂的多智能体系统,一次用户请求可能触发十几次LLM调用,成本很容易失控。控制成本有几个实操手段。
模型分级:不是所有节点都需要用最贵的模型。意图分类、格式解析这类简单任务,用便宜的小模型就够了。只有核心的推理和生成任务才需要用大模型。在LangGraph里,你可以给不同的agent节点配置不同的LLM。
缓存:很多请求是重复的,或者有大量重叠的上下文。用缓存来避免重复调用。简单的做法是对完全相同的输入做缓存;进阶的做法是用语义缓存,对语义相似的输入返回缓存结果。
上下文压缩:对话历史越来越长,每次调用都带上全部历史,token消耗会线性增长。我的做法是:保留最近N轮完整对话,更早的历史做摘要压缩。摘要可以用小模型来生成,成本很低。
工具结果精简:工具返回的结果往往包含大量冗余信息。在工具节点里做提取和精简,只保留LLM决策需要的关键字段。
并行化:如果多个工具调用之间没有依赖关系,可以并行执行,减少总延迟。LangGraph支持并行节点,但要注意状态更新的冲突问题。
4.4 生产环境部署的注意事项与避坑经验
从开发环境到生产环境,有几个坑是几乎每个人都会踩的。
状态持久化:开发时用MemorySaver,状态存在内存里,重启就没了。生产环境必须用持久化的checkpointer,比如基于数据库的实现。否则用户聊到一半服务重启,对话历史全丢。
并发控制:多个用户同时请求,如果共享同一个State实例,会出问题。LangGraph的checkpointer用thread_id来区分不同会话,每个会话有独立的State。但要注意,如果你的智能体有全局资源(比如共享的数据库连接),需要做好并发控制。
超时和重试:LLM调用可能超时,工具调用可能失败。生产环境必须设置合理的超时时间和重试策略。我的经验是:LLM调用超时设30秒,工具调用超时设10秒,重试最多2次,重试时用指数退避。
降级策略:当核心依赖不可用时,智能体不能直接崩溃。要有降级方案。比如LLM服务不可用时,返回一个预设的兜底回复;工具不可用时,告知用户该功能暂时不可用,并建议替代方案。
日志和可观测性:生产环境必须记录详细的日志,包括每次LLM调用的输入输出、每次工具调用的参数和结果、每个节点的执行时间和状态变化。这些日志是排查问题的唯一依据。我推荐用结构化日志(JSON格式),方便后续做分析和告警。
安全防护:智能体可能被恶意输入攻击,比如prompt injection。防护手段包括:输入过滤(检测并拦截可疑的指令注入)、权限控制(限制智能体可以调用的工具范围)、输出审查(检查智能体的回复是否包含敏感信息)。这些防护要在架构层面设计,不能靠事后补。
5. 常见问题排查与学习路径中的避坑指南
5.1 智能体开发中的典型问题速查
| 问题现象 | 可能原因 | 排查思路 | 解决方案 |
|---|---|---|---|
| 智能体不调用工具,直接编造答案 | 工具描述不清晰;prompt未强调工具优先级 | 检查工具docstring是否明确说明使用场景;检查system prompt是否有决策规则 | 完善工具描述;在prompt中明确“涉及实时数据必须调用工具” |
| 智能体反复调用同一个工具 | 工具返回结果未被正确解析;循环终止条件缺失 | 查看工具返回格式是否与预期一致;检查条件边是否正确判断终止 | 统一工具返回格式;在条件函数中增加最大循环次数限制 |
| 对话历史丢失 | 未配置checkpointer;thread_id未正确传递 | 检查编译图时是否传入checkpointer;检查每次调用是否传了相同的thread_id | 配置持久化checkpointer;确保同一会话使用相同thread_id |
| 输出格式解析失败 | LLM未按指定格式输出;解析逻辑不够健壮 | 打印LLM原始输出,检查是否符合预期格式 | 在prompt中强化格式要求;解析时增加容错和重试逻辑 |
| 响应延迟过高 | LLM调用次数过多;上下文过长;串行执行 | 统计每次请求的LLM调用次数和token消耗;检查是否有可并行的节点 | 减少不必要的LLM调用;压缩上下文;并行化独立节点 |
| 成本超预期 | 使用了过大的模型;上下文未压缩;缓存缺失 | 统计各节点的token消耗占比;检查是否有重复调用 | 分级使用模型;启用缓存;压缩历史对话 |
5.2 学习路径中的常见误区与纠正
误区一:先学框架再学原理。很多人一上来就学LangChain,结果被各种抽象搞晕,不知道底层在做什么。正确的顺序是:先用原生API理解LLM调用和工具调用的基本原理,再学框架。框架只是帮你把原理落地得更高效,原理本身才是核心。
误区二:追求最新最热的框架。智能体领域框架更新很快,今天学LangGraph,明天可能又出了新东西。但底层原理是不变的:状态管理、工具调用、条件分支、循环控制。把原理吃透,换框架只是换语法。
误区三:跳过评估直接上线。没有评估体系的智能体,就像没有测试的代码,上线就是赌博。评估体系不需要一开始就很完善,但必须有。哪怕只是手动跑20个测试用例,也比完全没有强。
误区四:忽视成本控制。开发阶段用最贵的模型,上线后发现成本扛不住。从一开始就要有成本意识:能用小模型的地方不用大模型,能缓存的地方不重复调用,能压缩的上下文不全部携带。
误区五:单智能体硬扛复杂任务。有些任务确实需要多智能体,但有些人为了“炫技”,简单任务也搞多智能体,结果复杂度上去了,效果没提升。记住:多智能体是手段,不是目的。
5.3 从学习到交付的进阶建议
学完基础之后,怎么继续进阶?我的建议是:找一个真实的需求,完整地做一遍从设计到上线的全流程。
真实需求和练手项目最大的区别是:真实需求有模糊性、有边界情况、有性能要求、有成本约束。你在练手项目里不会遇到“用户输入了一段包含特殊字符的文本导致解析失败”这种问题,但在真实需求里一定会遇到。解决这些问题的过程,才是真正长本事的时候。
具体来说,你可以从自己或身边人的实际需求出发。比如做一个自动整理会议纪要的智能体,或者做一个能查询内部文档的问答助手。需求不用大,但要真实。然后按照这条路径走一遍:需求分析→技术选型→架构设计→开发实现→评估测试→部署上线→监控迭代。
每走完一遍,你对智能体开发的理解就会深一层。走三遍之后,你基本上就能独立负责一个智能体项目的交付了。
我个人在实际操作中的体会是:智能体开发最难的不是写代码,而是想清楚“这个任务到底应该怎么拆解、LLM应该负责哪部分、工具应该负责哪部分、异常情况怎么处理”。这些思考决定了系统的上限,而代码只是把这些思考落地。所以每次动手之前,我都会花足够的时间在设计和推演上,把各种可能的情况都想清楚,再开始写代码。这个习惯帮我避免了很多返工。