1. 大模型Agent开发入门:从零到一构建你的第一个智能体
很多人第一次听到“大模型Agent”这个词,脑子里浮现的可能是科幻电影里那种能自己思考、自己行动的AI。其实没那么玄乎。我做了几个Agent项目之后最大的感受是:Agent本质上就是给大模型装上了手脚和记忆。大模型本身只能“说”,你问它什么它答什么,但Agent能让它“做”——去调用工具、去查数据库、去操作文件、去多步推理完成一个复杂任务。
这篇文章适合谁看?如果你已经用过大模型对话,知道什么是提示词,会一点Python,那就可以直接上手。如果你完全没接触过大模型,也没关系,我会把每个环节的基础知识都补上。目标很明确:读完你就能自己搭一个能跑起来的Agent,知道每一步为什么这么做,踩过的坑我也一并告诉你。
我自己的学习路径是:先跑通一个最简单的Agent,理解它的核心循环,然后再逐步加上工具调用、记忆系统、多Agent协作。这个顺序很重要,反过来先啃框架文档会非常痛苦。下面我就按这个思路,把大模型Agent开发入门的完整路径拆开讲。
2. 先搞明白Agent到底是个什么东西
2.1 大模型和Agent的本质区别
大模型(LLM)是一个无状态的文本生成器。你给它一段输入,它给你一段输出,结束。它不记得你上次说了什么(除非你把历史对话一起塞进去),它也不能主动去做任何事情。就像一个知识渊博但被关在房间里的人,你递纸条进去,他递纸条出来。
Agent则是在大模型外面套了一层控制循环。这个循环做的事情是:让大模型思考当前该做什么,然后执行一个动作,观察执行结果,再决定下一步做什么,直到任务完成。用伪代码表示就是:
while not task_done: thought = llm.think(context) # 大模型思考 action = llm.decide_action(thought) # 决定做什么 result = execute(action) # 执行动作 context.append(result) # 把结果加入上下文这个循环就是Agent的心脏。所有的Agent框架,不管包装得多花哨,底层都是这个逻辑。理解这一点,后面看任何框架都不会迷路。
2.2 Agent的四大核心组件
一个能用的Agent,至少需要四个东西:
- 大脑(LLM):负责推理和决策。选哪个模型直接决定了Agent的智商上限。目前主流选择是GPT-4系列、Claude系列,国内也有不少可选项。入门阶段建议先用API调用,别急着本地部署。
- 工具(Tools):Agent能调用的外部能力。比如搜索、计算器、读写文件、调用API。没有工具的Agent只能聊天,有了工具才能真正“做事”。
- 记忆(Memory):短期记忆就是对话历史,长期记忆通常用向量数据库存储。入门阶段先把短期记忆做好,长期记忆可以后面再加。
- 规划(Planning):把复杂任务拆成子任务的能力。最简单的做法是在提示词里要求大模型先列步骤再执行。
这四个组件缺一不可。我见过很多新手一上来就想搞多Agent协作,结果连单Agent的工具调用都没跑通,最后卡在各种奇怪的报错上。
2.3 为什么现在学Agent开发正当时
三个原因。第一,大模型的能力已经跨过了及格线。两三年前的模型做多步推理经常胡言乱语,现在的主流模型已经能稳定完成大部分日常任务。第二,工具生态成熟了。不管是LangChain、LlamaIndex还是各家自己出的Agent框架,基础设施都比以前好用太多。第三,落地场景清晰了。代码助手、数据分析、客服自动化、科研辅助,这些场景已经有大量成功案例。
说白了,现在学Agent开发,不是在做实验,是在学一门能直接用的手艺。
3. 开发环境搭建与工具选型
3.1 编程语言和基础依赖
Python是绝对的主流选择。Agent开发涉及的库——大模型SDK、向量数据库客户端、Web框架——Python生态最全。版本建议3.10以上,因为很多新库已经不支持3.8了。
核心依赖清单:
pip install openai langchain langchain-community chromadb python-dotenv这里解释一下每个包的作用。openai是调用大模型API的官方SDK,即使你用的不是OpenAI的模型,很多国产模型也兼容这个接口格式。langchain是目前最流行的Agent开发框架,提供了工具、记忆、链式调用的抽象。chromadb是轻量级向量数据库,用来做长期记忆。python-dotenv用来管理API密钥,避免把密钥硬编码在代码里。
注意:不要一上来就装几十个包。先把最小的依赖集跑通,遇到缺什么再装什么。我见过有人环境里装了几百个包,最后连哪个包冲突了都查不出来。
3.2 大模型的选择策略
入门阶段,我建议直接用API,不要本地部署。原因很简单:本地部署一个能用的模型,至少需要一张显存16G以上的显卡,而且部署完之后推理速度、稳定性都是问题。API调用按量付费,几块钱就能跑很多次实验。
选哪个模型?几个考量维度:
| 维度 | 说明 | 入门建议 |
|---|---|---|
| 推理能力 | 决定Agent能不能正确拆解任务 | 选第一梯队的模型 |
| 函数调用 | 是否支持结构化输出和工具调用 | 必须支持 |
| 价格 | 按token计费,Agent循环会消耗大量token | 选性价比高的 |
| 延迟 | 影响Agent响应速度 | 入门阶段不太敏感 |
| 上下文长度 | 决定能塞多少历史信息 | 至少32K |
我自己的做法是:开发调试阶段用一个便宜且支持函数调用的模型,等逻辑跑通了再切换到更强的模型做最终测试。这样能省不少钱。
3.3 开发框架怎么选
目前主流的几个选择:
LangChain:生态最全,文档多,社区活跃。缺点是抽象层太厚,出了问题不好排查。适合快速原型开发。
LlamaIndex:在RAG(检索增强生成)场景下更强,Agent功能也在不断完善。如果你的Agent需要大量知识检索,可以优先考虑。
自己手写:不依赖任何框架,直接用大模型SDK加一个while循环。优点是可控性极强,每一行代码你都知道在干什么。缺点是什么都要自己实现。
我的建议是:第一个Agent手写,第二个再用框架。手写一遍之后你就知道框架帮你做了什么,用框架的时候遇到问题也能定位到根因。
4. 从零构建第一个Agent
4.1 最小可运行Agent的实现
先不依赖任何框架,用最朴素的方式实现一个Agent循环。这个Agent能用的工具只有一个:计算器。
import json from openai import OpenAI client = OpenAI(api_key="your-key", base_url="your-base-url") # 定义工具 tools = [ { "type": "function", "function": { "name": "calculator", "description": "计算数学表达式,输入一个合法的Python数学表达式字符串", "parameters": { "type": "object", "properties": { "expression": { "type": "string", "description": "要计算的数学表达式,例如 '2 + 3 * 4'" } }, "required": ["expression"] } } } ] def calculator(expression: str) -> str: try: result = eval(expression) return str(result) except Exception as e: return f"计算错误: {e}" def run_agent(user_input: str, max_steps: int = 5): messages = [ {"role": "system", "content": "你是一个数学助手,可以使用计算器工具来解答数学问题。"}, {"role": "user", "content": user_input} ] for step in range(max_steps): response = client.chat.completions.create( model="gpt-4o-mini", messages=messages, tools=tools, tool_choice="auto" ) msg = response.choices[0].message # 如果没有工具调用,说明Agent认为任务完成 if not msg.tool_calls: return msg.content # 把Agent的决策加入消息历史 messages.append(msg) # 执行每个工具调用 for tool_call in msg.tool_calls: func_name = tool_call.function.name func_args = json.loads(tool_call.function.arguments) if func_name == "calculator": result = calculator(func_args["expression"]) # 把工具执行结果加入消息历史 messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": result }) return "达到最大步数限制,任务未完成" # 测试 print(run_agent("帮我算一下 (15 + 27) * 3 减去 100 等于多少?"))这段代码虽然短,但包含了Agent的所有核心要素:系统提示词定义了Agent的角色,工具定义告诉大模型有哪些能力可用,循环控制保证了多步执行,消息历史维护了上下文。
4.2 关键参数的计算与选择
max_steps怎么定?这个参数控制Agent最多执行多少轮。设太小,复杂任务做不完;设太大,万一Agent陷入死循环会烧很多token。我的经验值是:简单任务3-5步,中等复杂度10步,复杂任务20步。同时一定要设一个token总消耗的上限作为兜底。
temperature怎么设?Agent场景建议设低一些,0到0.3之间。因为Agent需要稳定地选择正确的工具和参数,太高的随机性会导致它做出莫名其妙的决策。创意写作场景可以调高,但Agent执行任务时稳定压倒一切。
工具描述怎么写?这是最容易被忽视但极其重要的环节。大模型完全依赖工具描述来决定什么时候调用、怎么传参。描述要写清楚:这个工具做什么、什么时候用、参数是什么格式、有什么限制。我踩过的坑是工具描述写得太模糊,导致大模型该调用的时候不调用,不该调用的时候乱调用。
4.3 提示词工程在Agent中的特殊用法
Agent场景的提示词和普通对话不一样。普通对话你只需要告诉模型“你是一个什么角色”,Agent还需要告诉它:
- 工作流程:先做什么,再做什么,什么情况下停止
- 工具使用规则:什么情况用哪个工具,参数怎么填
- 错误处理:工具调用失败后怎么办
- 输出格式:最终结果以什么形式呈现
一个实用的Agent系统提示词模板:
你是一个{角色},你的任务是{任务描述}。 你可以使用以下工具: {工具列表} 工作流程: 1. 首先分析用户的需求 2. 如果需要计算或查询,调用相应的工具 3. 根据工具返回的结果继续推理 4. 当你有足够信息回答用户时,直接给出最终答案 注意事项: - 每次只调用一个工具 - 工具调用失败时,尝试换一种方式或告知用户 - 不要编造工具返回的结果这个模板看起来简单,但每一条都是实践中总结出来的。特别是“不要编造工具返回的结果”这一条,早期版本没有这句话的时候,大模型经常在工具还没返回结果时就自己编一个。
5. 工具调用与记忆系统的实战细节
5.1 工具调用的完整流程与常见坑
工具调用的完整链路是:大模型输出一个结构化的工具调用请求(包含工具名和参数),你的代码解析这个请求并执行对应的函数,然后把执行结果以特定格式返回给大模型。听起来简单,但实际开发中有一堆细节问题。
坑一:参数格式不对。大模型返回的参数是JSON字符串,需要反序列化。但有时候大模型会返回不合法的JSON,比如多了一个逗号或者少了引号。解决办法是在解析时加try-except,解析失败就把错误信息返回给大模型让它重新生成。
坑二:工具执行超时。如果工具是调用外部API,网络延迟可能导致长时间等待。一定要设超时,超时后把“工具执行超时”作为结果返回,让大模型决定下一步。
坑三:并行工具调用。新版的大模型支持一次返回多个工具调用请求。如果你的代码只处理了第一个,后面的就被忽略了。处理方式是遍历所有的tool_calls,逐个执行,然后把所有结果都加入消息历史。
坑四:工具返回值太长。如果工具返回了几千字的文本,会占用大量上下文窗口。解决办法是在工具函数内部做截断或摘要,只返回关键信息。
5.2 短期记忆的管理策略
短期记忆就是对话历史。Agent每执行一步,消息列表就增长一些。问题是上下文窗口是有限的,不可能无限增长。
几种管理策略:
滑动窗口:只保留最近N轮对话。简单粗暴,但可能丢失早期的重要信息。
摘要压缩:当消息数量超过阈值时,用大模型把前面的对话压缩成一段摘要。保留关键信息的同时减少token消耗。
关键信息提取:从对话中提取结构化的关键信息(比如用户的需求、已完成的步骤、待办事项),只保留这些。
我自己的做法是组合使用:日常用滑动窗口,当窗口快满时触发一次摘要压缩。摘要的提示词大概是“请把以下对话压缩成不超过200字的摘要,保留所有关键决策和未完成的任务”。
5.3 长期记忆的入门实现
长期记忆让Agent能记住跨会话的信息。最简单的实现方式是向量数据库加检索。
流程是:把重要信息通过Embedding模型转成向量存进数据库,下次需要时用相似度检索找出相关的记忆。
import chromadb client = chromadb.Client() collection = client.create_collection("agent_memory") # 存入记忆 def save_memory(text: str, metadata: dict = None): collection.add( documents=[text], metadatas=[metadata or {}], ids=[f"mem_{collection.count()}"] ) # 检索记忆 def recall_memory(query: str, n_results: int = 3): results = collection.query( query_texts=[query], n_results=n_results ) return results["documents"][0] if results["documents"] else []入门阶段不需要搞太复杂。先把“存”和“取”跑通,后面再优化检索策略和记忆的重要性排序。
实操心得:长期记忆最大的坑是“存了太多没用的东西”。如果什么都往数据库里塞,检索出来的结果会充满噪音。我的做法是只存三类信息:用户的偏好和习惯、已完成任务的关键结论、明确的待办事项。
6. 常见问题排查与避坑指南
6.1 Agent陷入死循环怎么办
这是最常见的问题。Agent反复调用同一个工具,或者在不同工具之间来回跳转,就是不给最终答案。
排查思路:
- 检查工具描述是否有歧义。如果两个工具的功能描述很接近,大模型会犹豫不决,反复尝试。
- 检查系统提示词是否缺少停止条件。明确告诉Agent“当你获得足够信息时,直接给出答案,不要再调用工具”。
- 设置硬性步数限制。不管Agent是否完成,达到max_steps就强制停止并返回当前状态。
- 加入循环检测。如果连续三次调用了同一个工具且参数相同,强制中断并提示Agent换一种方式。
6.2 工具调用返回错误怎么处理
工具执行失败是常态,关键是怎么让Agent优雅地处理。
我的做法是把错误信息结构化后返回给大模型:
def safe_execute(tool_func, args): try: result = tool_func(**args) return {"status": "success", "data": result} except TimeoutError: return {"status": "error", "error_type": "timeout", "message": "工具执行超时,请尝试简化输入或稍后重试"} except Exception as e: return {"status": "error", "error_type": "execution_error", "message": f"工具执行失败: {str(e)}"}这样大模型能根据错误类型决定是重试、换工具还是告知用户。
6.3 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| Agent不调用工具 | 工具描述不清晰或系统提示词没提工具 | 优化工具描述,在提示词中明确工具用途 |
| Agent反复调用同一工具 | 缺少停止条件或工具返回结果不明确 | 加停止条件,确保工具返回清晰的结果 |
| 工具参数格式错误 | 大模型对参数格式理解有误 | 在参数描述中给出具体示例 |
| 响应速度慢 | 模型推理慢或工具执行慢 | 换更快的模型,给工具加超时 |
| token消耗过大 | 消息历史太长或循环步数太多 | 加摘要压缩,限制max_steps |
| Agent回答与工具结果矛盾 | 大模型没有正确使用工具返回值 | 在提示词中强调“必须基于工具返回结果回答” |
6.4 几个我踩过的坑
坑一:把API密钥硬编码在代码里。这个不用多说了,用环境变量管理,.env文件加到.gitignore里。
坑二:没有做日志记录。Agent的决策过程是黑盒,出了问题没有日志根本没法排查。建议把每一步的输入、输出、工具调用、执行结果都记下来。
坑三:一开始就追求完美。我第一个Agent写了三天,想把所有功能都加上,结果一个都没跑通。后来推倒重来,先做一个只能算加减法的Agent,跑通了再逐步加功能,反而快得多。
坑四:忽视成本控制。Agent循环会消耗大量token,一个复杂任务可能调用几十次大模型。一定要设预算上限,开发阶段用便宜的模型。
7. 从入门到进阶的学习路径
7.1 分阶段的学习计划
第一阶段(1-2周):跑通最小Agent。目标是不依赖框架,手写一个能调用1-2个工具的Agent。重点理解Agent循环、工具调用、消息管理这三个核心概念。
第二阶段(2-3周):加上记忆系统。实现短期记忆的滑动窗口和摘要压缩,再接入向量数据库做长期记忆。重点理解记忆的存取时机和检索策略。
第三阶段(3-4周):引入框架。用LangChain或类似框架重写之前的Agent,对比手写版本理解框架的抽象。重点学习框架的工具定义、链式调用、回调机制。
第四阶段(持续):多Agent协作和复杂任务规划。学习如何让多个Agent分工合作,如何做任务分解和结果汇总。这个阶段需要结合实际项目来练。
7.2 值得深入的方向
Agent安全:如何防止Agent被提示词注入攻击,如何限制Agent的操作权限,如何审计Agent的行为。这是企业落地必须解决的问题。
Agent评估:怎么判断一个Agent好不好用?需要建立评估指标体系,包括任务完成率、步骤效率、工具调用准确率等。
多模态Agent:让Agent能处理图片、音频、视频。比如让Agent看图回答问题,或者根据语音指令操作电脑。
Agent部署与并发:单个Agent跑通不难,难的是同时服务几百个用户。需要考虑并发控制、资源调度、状态隔离等问题。
7.3 推荐的学习资源
吴恩达的Agent系列教程质量很高,适合入门。LangChain的官方文档和示例代码是最实用的参考资料。另外建议多逛GitHub上的Agent项目,看别人怎么组织代码、怎么设计工具、怎么处理错误。
我个人觉得最有效的学习方式是:找一个实际需求,比如“自动整理下载文件夹”或者“每天帮我汇总行业新闻”,然后动手做一个Agent来解决它。有真实需求驱动,学习效率比看教程高十倍。
8. 写在最后
Agent开发这个领域变化很快,新的框架、新的模型、新的最佳实践层出不穷。但核心的东西没变:让大模型在循环中调用工具来完成任务。把这个核心吃透了,上层的东西怎么变都不慌。
我自己的体会是,入门阶段最大的障碍不是技术难度,而是信息过载。网上有太多框架、太多教程、太多“最佳实践”,反而让人不知道从哪里开始。我的建议是:关掉那些花里胡哨的介绍文章,打开编辑器,从上面那段50行的Agent代码开始,一行一行敲进去,跑通它,然后改它。改着改着,你就入门了。
最后分享一个实用小技巧:调试Agent的时候,把每一步的完整消息历史打印出来。你会看到大模型是怎么“思考”的,它看到了什么信息,做了什么决策。这个习惯帮我定位了至少一半的bug。