智能体开发入门:从零开始搭建能调用工具的AI助手

发布时间:2026/10/22 6:31:23
智能体开发入门:从零开始搭建能调用工具的AI助手
智能体是当前最值得投入精力去学的一个方向。注意我说的是“学”不是“观望”。原因很简单你不需要成为算法工程师不需要会写Transformer甚至不怎么懂数学也能在几分钟内做出一个能调用工具、能自主完成任务的智能体。这听起来像广告语但实际接触过之后你会发现它比想象中更接近现实。为什么小白反而适合从这里切入因为大模型已经把“理解语言”和“生成文本”这件事做完了智能体开发的核心是把模型的能力接到工具、数据和业务逻辑上去本质上是一种“系统集成工作”而系统集成最需要的恰恰是清晰的逻辑和动手能力而不是模型原理。这篇内容我会从零开始把智能体的基础概念、运行原理、具体步骤和实际代码全部拆开讲还会把过程中比较容易踩的坑一并交代清楚适合完全没有接触过相关技术的新手也适合想系统梳理一遍的开发者。1. 为什么说智能体开发是小白最容易上手的AI方向——先建立整体认知1.1 智能体到底是什么从“能聊”到“能干”的质变普通大模型聊天程序本质上是一个“高智商”的文本生成器。你问它一句它回你一段你再问它再回。整个过程是单向的模型本身没有任何“行动能力”所有事情都发生在对话框里。智能体不一样。它的定义可以概括为让大模型在理解任务的基础上自主决定调用哪些外部工具、按照什么顺序处理最终完成一个实际目标。换句话说聊天机器人是“动嘴”智能体是“动手”。我举个具体的例子帮你建立感觉。假设你想知道明天从A地到B地的高铁班次、票价以及到了之后当地的天气情况。普通聊天机器人能告诉你“请去12306查”或者基于训练数据给出笼统建议但它没法实时帮你查。智能体则不同它可以调用车票查询工具拿到真实班次再调用天气API拿到预报最后把两部分信息拼在一起给你一份完整的出行建议。整个过程不需要你手工操作模型会自动安排调用顺序、解析结果、组织回答。这个“自动决定调用什么、怎么调用”的能力就是智能体和大模型聊天程序最本质的区别。模型不再是单纯的语言生成器而是一个“会使用工具的决策者”。1.2 一个智能体的典型运行时路径看似玄乎其实只有五步我看到很多人第一次接触智能体时觉得它像是某种黑魔法模型怎么知道该调哪个函数其实拆开看一次完整的智能体运行流程非常清晰可以归纳为五个步骤。第一步接收用户输入。不管是一句话还是一个文件先把用户意图拿到手。第二步让大模型决定下一步动作。模型根据系统提示词和当前对话上下文输出一个结构化指令。这个指令可能是“直接回答”也可能是“调用某个工具参数是什么”。这里有个技术基础叫函数调用模型在训练中已经学会了当它觉得自己需要外部信息时可以输出一个特殊的函数调用结构而不是普通文本。简单理解模型相当于在说“我需要查一下数据库这就是查询语句请帮我执行”。第三步程序解析并执行工具。你的代码接收到模型输出的调用指令后真正去调用外部API、查询数据库、计算或者操作文件拿到一个结果。第四步把工具返回结果交回给模型。模型看到工具结果后继续决定下一步是再调下一个工具还是已经信息充足可以直接回答。第五步循环直到最终输出。系统会设定一个最大轮数防止模型陷入死循环。一旦达到上限或模型决定不再调用工具就生成最终回复给用户。这套流程也称“循环式智能体”。核心思想是模型是大脑工具是手脚代码是神经系统。理解了这条路径后面的代码实操就是一马平川。1.3 小白入门真正需要的东西其实只有三样如果你想开始学智能体开发不需要补一大堆前置课程。按我的经验真正必要的只有三样。第一Python基础语法。不需要精通但至少能看懂字典、列表、函数定义和if判断。如果你完全零基础花一个周末看看入门教程就够了因为智能体开发里的代码量其实不大核心逻辑特别容易理解。第二大型语言模型API的基本调用方式。知道怎么发一个HTTP请求怎么把消息列表传给模型。这更像是配置操作而非编程。第三一条清晰的主线让你练习。最好的学习方式不是从头看一遍理论而是拿一个真实的小场景直接开做。比如做一个“个人日程管理智能体”让它能帮你添加日程、查询日程、到期提醒这样一个项目做下来你对整个体系的认知会非常立体。神经网络原理、注意力机制、模型微调——这些现阶段都可以先放一放。整个智能体开发的核心矛盾在于“如何高效地让模型用好工具、管好流程”不在于“模型内部是怎么计算的”。你越早摆脱对底层原理的恐惧上手速度反而越快。2. 5分钟跑通第一个智能体环境准备与选型2.1 开发环境与依赖安装在开始动手之前先把环境打理好。开发语言选用Python因为生态最成熟相关库的文档和示例最多。你不需要最新版本3.9以上都行我用Python 3.11做演示。建议先创建一个独立的虚拟环境避免把系统Python环境搞乱。Windows和macOS在命令行里的操作略有不同但流程是一样的创建虚拟环境、激活、安装依赖。# Windows python -m venv agent_env agent_env\Scripts\activate # macOS / Linux python3 -m venv agent_env source agent_env/bin/activate接下来要安装的是大模型平台的官方SDK。目前主流的模型服务商都提供了Python SDK安装方式大同小异本质上就是一条pip命令。我这里用当前中文环境里比较常见的接口做示例pip install openai不要被包名迷惑目前主流的大模型服务商大多兼容这一套接口需要改动的往往只是base_url和api_key两个参数。这个特性也意味着你学会一套调用方式基本能迁移到大部分模型平台上去。安装完成后在项目根目录新建一个.env文件用来存放敏感配置API_KEY你的密钥 BASE_URLhttps://api.example.com/v1 MODEL_NAME你的模型名这里要强调一个习惯永远不要把API密钥直接写在代码里。一方面是因为代码可能被分享、上传到代码托管平台一旦泄露会被人盗刷你的额度另一方面把密钥放在配置文件里也方便切换不同环境。用python-dotenv读取配置文件非常方便pip install python-dotenv2.2 模型接入与第一个对话环境准备好之后写第一段代码验证连通性。这个过程的目标不是完成复杂功能而是确认你的密钥、接口地址和模型名称都没问题。from dotenv import load_dotenv import os from openai import OpenAI # 加载 .env 配置 load_dotenv() # 初始化客户端 client OpenAI( api_keyos.getenv(API_KEY), base_urlos.getenv(BASE_URL) ) # 发送第一轮对话 response client.chat.completions.create( modelos.getenv(MODEL_NAME), messages[ {role: system, content: 你是一个友好的助手请用最简洁的语言回答问题。}, {role: user, content: 你好请用一句话回答大模型编程是什么。} ] ) print(response.choices[0].message.content)看到正常输出后说明整个链路已经打通。不知道有多少人只是卡在这一步花了好多时间在装环境上其实这一套配置在所有项目里都是通用的。顺便说一句首次运行如果提示费用不足、域名解析失败最好逐项检查密钥、域名和网络状态大概率是这三个问题之一。2.3 统一封装一次配置到处复用在真正开发智能体时每次初始化客户端、写死模型名代码会变得很臃肿。我的做法是封装一个模型客户端模块把几乎所有平台相关的配置集中管理。# llm_client.py from dotenv import load_dotenv import os from openai import OpenAI load_dotenv() def get_client(): 返回一个统一的模型客户端实例 return OpenAI( api_keyos.getenv(API_KEY), base_urlos.getenv(BASE_URL) ) def chat(messages, toolsNone, modelNone): 统一对话入口支持工具调用 client get_client() response client.chat.completions.create( modelmodel or os.getenv(MODEL_NAME), messagesmessages, toolstools or [] ) return response.choices[0].message后面的所有示例都会基于这个封装来写。做封装最主要的原因不是追求代码优雅而是为了减少重复和失误。真实项目中你还会往里加日志、加异常处理、加权控但第一版这样已经足够干净了。3. 用Function Calling给智能体装上“手脚”——这是整个体系的核心机制3.1 为什么大模型能够“调用函数”一次通俗的原理拆解很多人第一次接触函数调用时会产生一个疑问模型作为一个神经网络它怎么知道我的代码里有哪些函数答案其实不玄妙。大模型本身不会直接执行任何代码它只负责“决策”。你在请求里通过tools参数把自己准备好的工具清单和描述告诉模型。模型根据用户的问题决定是否需要使用这些工具并且输出一个结构化的JSON内容包括函数名和参数。程序收到这个JSON之后在真实的运行环境里执行对应的代码拿到结果再回传给模型。这个过程的关键在于工具描述写得越清楚模型的选择就越准。举个例子你给模型提供的工具说明是“搜索企业内部知识库”和“根据用户查询字符串在向量数据库中检索相关信息返回最相关的三段文档”后者明显能让模型更准确地决定什么时候调用它。虽然两个描述指向同一个函数但描述质量直接影响了模型的行为。这就是为什么资深智能体开发者都很重视工具描述的写作它本质上是在跟模型“沟通”。3.2 从“电话本”比喻理解工具注册写好说明书才能让模型正确使用为了更容易理解可以把模型调用工具想象成一个人按照电话本打电话。电话本上每个条目都有名字、号码、使用场景描述你想找人办事得先翻电话本看到哪个人最合适再拨号。工具注册也是一样的逻辑。你要给每个函数写一份“电话本条目”让模型知道这个工具的名字叫什么、接受什么参数、什么时候该用。以大模型平台主流的JSON Schema格式为例tools [ { type: function, function: { name: get_weather, description: 根据城市名查询实时天气信息适合在用户询问某地天气时调用。, parameters: { type: object, properties: { city: { type: string, description: 城市名称例如上海、北京、广州 } }, required: [city] } } } ]这里有一个新手经常忽略的点description要写清楚“什么时候用、什么时候不用”。如果你只写“查询天气”模型面对“上海适合穿什么衣服”这类问题时可能就不会想到去查天气因为它不确定这个工具能不能回答隐含的需求。如果你把描述写成“根据城市名查询天气适合用户询问穿衣建议、出行安排、是否带伞等场景”模型就会更主动地调用。这看似是文字游戏实则是函数调用设计中最核心的技巧之一。3.3 循环式核心代码完整跑通一次工具调用理论清楚了直接看代码。下面这段代码是完整的智能体核心循环import json from llm_client import chat def get_weather(city: str): 模拟真实天气查询工具 weather_map { 上海: {weather: 多云, temperature: 18, wind: 东北风3级}, 北京: {weather: 晴, temperature: 15, wind: 西北风2级}, 广州: {weather: 小雨, temperature: 22, wind: 南风2级}, } return weather_map.get(city, {weather: 未知, temperature: 0, wind: 未知}) # 工具列表 tools [ { type: function, function: { name: get_weather, description: 根据城市名称查询实时天气情况, parameters: { type: object, properties: { city: {type: string, description: 城市名如上海} }, required: [city] } } } ] # 保存模型可能用到的工具映射 tool_map {get_weather: get_weather} # 初始对话 messages [ {role: system, content: 你是一个出行助手回答问题时优先借助工具获取准确信息。}, {role: user, content: 上海今天天气怎么样我需要决定要不要带伞。} ] # 智能体主循环 MAX_ROUNDS 5 for _ in range(MAX_ROUNDS): # 调用模型传入工具定义 msg chat(messages, toolstools) # 追加模型回复到对话历史 messages.append({ role: assistant, content: msg.content or , tool_calls: getattr(msg, tool_calls, None) }) # 如果模型没有要求调用工具说明可以直接回答退出循环 if not msg.tool_calls: break # 逐个处理模型的工具调用指令 for tc in msg.tool_calls: func_name tc.function.name func_args json.loads(tc.function.arguments or {}) # 执行真实函数 result tool_map[func_name](**func_args) # 把工具结果传回给模型 messages.append({ role: tool, tool_call_id: tc.id, content: json.dumps(result, ensure_asciiFalse) }) # 打印最终结果 final_answer messages[-1][content] print(final_answer)试着运行一下你会看到模型先调用get_weather拿到返回的JSON后再整理成回答“上海今天多云气温18度东北风3级不需要带伞。”整个过程完全自主完成。第一次跑通这个循环算是真正进入了智能体开发的大门。4. 用“某企业文档智能问答助手”串起完整实战从需求到落地的全过程4.1 为什么选这个场景远程对话场景里的典型应用工具调用搞明白了接下来用一个完整的案例把全流程串起来。我选择做一个“企业文档智能问答助手”的模拟项目原因很简单文档问答是智能体技术距离普通人最近、也最容易被感知的场景。想象一个典型场景某公司的员工在企业微信或内部系统里问“打印机怎么连接”“报销流程是什么”之前需要翻阅文档、问HR现在直接把文档交给智能体它就能在几秒内给出答案。这项能力用到的东西恰好覆盖智能体开发的核心环节文档加载、知识库切分与存储、向量检索、工具封装、模型调用。同时这个项目天然适合入门因为它的数据和代码都不复杂。值得说明的是这里我用本地简易实现而不是引入复杂的向量数据库。在真实生产环境中通常会使用专门的向量数据库来管理海量文档但对于学习项目用内存存储足够直观也能保证代码在每台本地上都能直接运行。4.2 代码结构五个模块各司其职整个模拟项目的结构如下document_agent/ │ ├── llm_client.py # 统一的模型调用模块 ├── knowledge_base.py # 文档加载、切分与向量检索 ├── tools.py # 工具定义与逻辑实现 ├── agent.py # 智能体核心循环 └── main.py # 命令行入口每个文件各司其职这种拆分方式虽然不是唯一答案但对小白来说足够清晰。你要加深的第一个“工程思维”就是别把所有代码堆在一个文件里按职责划分模块出了问题很快就能定位。4.3 知识库模块切分、向量化与检索先把知识库模块写出来。这里不引入外部向量数据库用简单的余弦相似度来完成检索。为了让效果更好我把文档切分成小块每一块单独做向量化。# knowledge_base.py import numpy as np from llm_client import get_client, chat # 模拟的企业文档数据 documents [ 公司报销制度员工因公出差产生的交通费用需在行程结束后一周内提交报销申请。, 报销流程登录OA系统进入财务模块填写报销单上传电子发票提交即可。, 打印机连接方法办公室打印机型号为HP LaserJet Pro连接方式电脑设置-设备-添加打印机-选择对应型号。, 公司网络使用规范禁止擅自修改IP地址禁止私接路由器禁止使用超高带宽应用。, 会议室预约说明需提前一天通过OA预定单次使用不超过两小时会议结束后关闭设备。, 员工请假制度请假需提前在OA提交申请两天以内由直属主管审批超过两天需部门负责人审批。 ] def get_embedding(text): 获取文本向量——这里用模型的Chat接口模拟向量化实际生产建议用专用Embedding模型 response chat( [ { role: system, content: 你是一个文本向量化工具。请输出一段长度为8的数字向量用JSON数组表示不要输出其他任何文字。 }, {role: user, content: text} ] ) try: import json arr json.loads(response.content) return np.array(arr, dtypefloat) except Exception: return np.random.rand(8) def search_documents(query, top_k1): 根据问题检索最相似的文档 query_vec get_embedding(query) best_idx -1 best_score -1 for i, doc in enumerate(documents): doc_vec get_embedding(doc) # 余弦相似度 score np.dot(query_vec, doc_vec) / (np.linalg.norm(query_vec) * np.linalg.norm(doc_vec) 1e-9) if score best_score: best_score score best_idx i return documents[best_idx] if best_idx 0 else None这个简单的实现和真正的向量检索系统在原理上是一致的把文本转换成数字向量通过计算相似度找出最相关的片段。专业系统里会使用Embedding模型来获得语义向量并使用向量数据库支撑海量数据的近似最近邻搜索。你理解了这个雏形再迁移到真实系统会非常快。对代码里的get_embedding方法我需要特别说明用Chat接口直接生成“向量”的做法在工程上是低效的生产环境一定要用真正的Embedding接口。这里这样写的目的是为了保证任何配置都能直接运行减少初学者的环境障碍。你自己在练习时可以替换成平台的Embedding接口效果会更好。4.4 工具层定义让智能体拥有“查资料”的能力知识库准备妥当后定义工具。这个工具的作用是供模型检索企业知识库文档。设计它的关键是让模型知道当用户的问题涉及公司制度、流程、设备操作等内部信息时应该调用这个工具。# tools.py from knowledge_base import search_documents knowledge_tools [ { type: function, function: { name: search_company_documents, description: 检索企业内部知识库适合回答关于公司制度、报销、设备使用、网络管理、请假、会议室等内部事务问题。, parameters: { type: object, properties: { query: { type: string, description: 用户的问题原文或核心关键词例如报销流程是什么 } }, required: [query] } } } ] tool_impl_map { search_company_documents: lambda query: search_documents(query, top_k1) }工具描述里“什么时候用”写得越细致模型就越不容易误判。比如用户问“今天天气怎么样”模型就不会调用检索工具而是直接拒绝或回答因为没有必要在公司文档里找天气信息。4.5 核心循环组装一个可对话、可自主决策的智能体把上面的模块组装进智能体核心循环# agent.py import json from llm_client import chat from tools import knowledge_tools, tool_impl_map def run_agent(user_input, max_rounds3): 运行智能体返回最终回答 messages [ { role: system, content: ( 你是一家公司的智能客服助手。当用户提出关于公司制度、流程、设备、 网络、行政等问题时你必须先调用知识库检索工具获取准确信息再回答。 如果工具结果不足以回答请坦诚说明。 ) }, {role: user, content: user_input} ] for round_idx in range(max_rounds): msg chat(messages, toolsknowledge_tools) messages.append({ role: assistant, content: msg.content or , tool_calls: getattr(msg, tool_calls, None) }) if not msg.tool_calls: break for tc in msg.tool_calls: func_name tc.function.name func_args json.loads(tc.function.arguments or {}) # 执行工具 try: result tool_impl_map[func_name](**func_args) except Exception as e: result f工具执行出错{str(e)} print(f[第{round_idx 1}轮] 调用工具: {func_name}, 参数: {func_args}) print(f[工具返回] {result}\n) messages.append({ role: tool, tool_call_id: tc.id, content: json.dumps(result, ensure_asciiFalse) }) return messages[-1][content] if __name__ __main__: while True: user_input input(\n请输入问题输入exit退出) if user_input.lower() exit: break answer run_agent(user_input) print(f\n助手回答{answer})测试几个问题看看效果。当输入“公司的报销流程是什么”时模型会决定调用检索工具获取知识库中“报销流程”的那段内容再整理成一段清晰的回答当输入“你好”时模型判断不需要工具直接问候并询问需求当输入“打印机连不上怎么办”时模型检索后给出连接步骤并根据工具结果补充“如果还不行联系IT支持”之类的建议。虽然代码很简单但整个行为的“智能感”已经出来了。这个案例的价值在于你以后要做的任何智能体结构上都不会脱离“工具定义 模型决策 循环执行”这个框架。不管是做电商导购、会议纪要、个人助理本质上都在重复这套模式。5. 小白最容易踩的坑与安全边界——这几条是我实际摸出来的经验5.1 Token消耗失控一次对话烧掉一整天的额度智能体开发里最常见的问题就是费用。原理很简单每一次工具调用都要把历史消息全部传给模型重新计算一遍对话轮次越深、历史越长、工具描述越长消耗的Token就越多。我见过一个初学者做演示一次提问消耗了一万多Token就是因为循环没有设置最大轮数模型反复调用工具停不下来。控制Token消耗有几个实操到位的方法都是我试过之后沉淀下来的经验整理成表格方法核心做法适用场景限制循环轮数在for循环里设置max_rounds通常2到5轮足够所有场景都必须有精简对话历史只保留最近几轮消息丢弃早期无关对话长对话场景精简工具描述删除工具描述里的冗余修饰词只保留关键信息工具数量较多时按需传递工具不是所有工具都在每轮都传给模型按用户意图分组工具数量超过10个在这里做个小计算你会更直观体会Token有多“贵”假设你的模型定价为输入1万元Token收10元仅作演示每轮调用涉及系统提示词加工具定义为2000 Token加上历史对话2000 Token那么每轮消耗4000 Token。如果一次任务循环4轮总共16000 Token成本大约16元。如果同时并发100个用户提问一次就是1600元。由此可见控制Token不是小事是项目能不能上线的问题。5.2 工具描述与真实行为不一致模型很聪明但也会被误导我遇到过特别典型的情况工具描述里写“查询订单信息”但函数实际需要两个必填参数——订单号和人名。模型在用户只说了“帮我查一下订单”时因为没有足够参数就会生成一个带有默认值或随机值的参数工具执行后返回一堆奇怪的拼凑信息。模型本身没有错错在工具设计不够严谨。解决这个问题有几个思路。第一种是在工具参数中把必须项写明白比如在订单查询工具的JSON Schema里把两个参数都标记为required并在描述中说明“订单号可以由用户提供也可以从历史消息中提取”。第二种思路是做好错误处理如果参数缺失工具执行代码本身可以抛出明确的异常——不要让异常成为一句“调用失败”就结束而要让模型能看到详细的错误原因。很多情况下模型其实很会“自我纠错”只要把错误信息完整反馈给它它会主动要求用户补充信息或尝试其他方式。5.3 幻觉与安全边界工具把信息拿回来之后模型可能“过度发挥”最后一个也是最重要的坑模型完全可能无视工具返回的真实结果自己脑补一段看起来正确但完全是假的答案。这被称为“幻觉”。一个典型的案例是知识库中明明只写着“一年以内员工每年享有5天年假”但模型在回答时为了让答案更完整自己补了一句“入职满三年可额外享受3天年假”。这句补充是编造的会带来很严重的误导。要减少这类风险有几个非常关键的做法在系统提示词里明确要求“只能依据工具返回的结果回答严禁补充工具结果之外的信息如果信息不足必须明确说明不知道”。如果判断工具结果与用户问题不相关宁愿让模型说“未找到相关内容”也不要让它强行作答。在生成答案后做一轮事实校验把模型回答中的关键数值和工具返回的原文进行比对不一致时要求重新生成。还有一个更实操的细节当工具返回的结果是列表时有些模型会自作聪明地给你“总结”一份“看起来像列表但排序与原结果不同”的输出。所以工具返回内容中尽量用JSON保持可校验结构同时要求模型“原文引用数据不改写数字和排序”。安全边界这块也值得多说一句。智能体能够调用工具就意味着它有权限接触真实系统的资源。在做生产化部署时你需要给工具加上权限校验哪些用户可以用哪些工具、哪些操作必须二次确认、哪些敏感信息脱敏后才进入模型上下文。这些不是“上线之后再说”的问题而应该是设计初期就考虑进去的底线。6. 智能体开发的下一步你学会这些之后能做什么6.1 从“单个工具”到“一套工具库”给智能体加装更多能力当你已经熟练掌握单个智能体的循环结构后首要任务不是追求更复杂的算法而是建立自己的工具库。举个例子你可以给智能体加入SQL查询工具让它直接对接数据库加入HTTP请求工具让它能调用任意内外网API加入文件读写工具让它能生成并保存报告。每个工具本质上是完成一个独立功能的代码模块而智能体则像一位“指挥官”它来决定何时调用哪个模块。实际项目中最有用的一类工具是“读取外部API数据”的工具。无论是实时天气、股票行情还是新闻内容一旦模型能触达实时信息它的回答质量会有一个质的飞跃。你不需要为每个API单独写一套智能体逻辑只需要定义好工具的入参出参塞进工具列表即可。到这一步你已经从一个“写下第一个对话”的初学者变成了一个“能够实际组装业务系统”的智能体开发者。6.2 多模型协作、记忆机制与上下文管理进阶要攻克的三座山如果做好了基础工具库还想继续往前走建议把精力花在三个方向上多模型协同、持久化记忆、上下文工程。多模型协同指的不是一次性调用多个模型而是根据任务类型分配不同模型。比如你的系统里可以有一个“路由模型”负责意图识别一个“决策模型”负责任务拆解一个“生成模型”负责总结回答。这样做的好处是每个模型做自己最擅长的事成本得到有效降低。持久化记忆解决的是“智能体忘记上下文”的问题。现在的模型上下文窗口都在几万Token甚至几十万Token但Token翻倍不意味着无限上下文一定合理。真正工程上会做的是提炼每轮对话的摘要存档到数据库当用户开启新会话时把相关历史摘要注入系统提示词。这一套叫“记忆机制”是目前很热门的方向。上下文工程则是指在设计智能体时就要想清楚哪些信息放在系统提示词里、哪些放在工具调用历史里、哪些没有必要进入模型视野。这些经验需要大量实践来积累每一位做过十余个真实项目的开发者对上下文的理解都会完全不同。6.3 给你的“个人成长路线图”三个阶段的练习建议最后分享一个个人很推荐的学习路径。第一阶段完成本篇文章里所有代码的复现和改造尤其是把模拟知识库换成自己收集的真实数据和真实检索方案。第二阶段做一个“有实用价值”的小工具比如帮自己管理待办事项、做轻量级记账、自动排版周报。这件工具可以用不上但过程一定要完整从需求澄清到工具定义再到部署运行你走通一次全流程后以后面对任何新场景心里都不虚。第三阶段尝试给自己的智能体加入一条以上外部API调用、一个以上的判断条件和一份简单的持久化存储。我在实际使用中发现大多数人学不下去的原因都很相似总想把理论看完再动手。其实智能体开发天然适合“边做边学”你只需要一个小模型服务账号和一点写Python的兴趣就能一晚上做出一个真正会调用工具的程序来。踩过几次坑之后你会发现所谓“大模型编程”其实就是一套非常优雅的“决策-执行-反馈”循环没有背不完的记忆负担也没有深不见底的算法前提。不管是为了应付工作需要还是单纯想跟上这一波技术变化用一晚上敲一遍本文的代码绝对物有所值。