十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AIAgent智能体开发实战:从零搭建到项目封装全指南

AIAgent智能体开发实战:从零搭建到项目封装全指南 在过去的开发与学习过程中我一直觉得“AI 应用开发”这件事被很多资料讲复杂了。尤其是 Agent智能体这个概念网上有大量资料但真正能让人从零开始、不靠碎片化拼凑就能完整跑通一套项目的教程并不算多。本文基于一套完整的 AIAgent 智能体学习路径整理成一篇系统性的实战教程。内容覆盖核心概念、架构拆解、环境准备、从零搭建一个可用智能体、封装成项目、常见报错与最佳实践。无论你是刚接触 AI 开发的新手还是有一定后端基础想切入智能体方向的开发者都可以把本文作为第一份“少走弯路清单”。1. AIAgent 是什么先搞懂概念再谈开发1.1 从“大模型”到“智能体”我们先从最基础的场景说起。你大概率已经用过类似 ChatGPT 这类对话产品你输入一段文字它给你一段回答。这是“大语言模型”的基础用法单轮或多轮对话模型根据上下文生成文本。但“智能体”和普通的“对话机器人”有一个本质区别智能体不只是“会说话”而是“会做事”。什么叫“会做事”举个例子你让普通聊天机器人“帮我查一下明天北京到上海的机票”它可能会告诉你一个通用的查询方法甚至直接说“我无法实时获取信息”。但一个真正的智能体会主动调用机票查询接口、读取返回数据、筛选合适航班然后给你一句话结论。整个过程里智能体需要自己决定“要调用哪个工具”而不是每次都由人来指定。所以在 AIAgent 开发里核心关键词是感知接收用户意图。决策判断接下来该做什么。调用选择并执行某个工具或 API。反馈把执行结果整理成自然语言返回给用户。这也是为什么智能体会被拆成多个模块而不是一个大模型直接输出。模型的职责是“思考”工具调用的职责是“行动”两者结合才是一个完整 Agent。1.2 AIAgent 的常见应用场景从实际工程角度看AIAgent 并不是只存在于实验室它已经被广泛用在多个领域自动化客服根据用户问题查询订单、退换货规则、物流信息。数据分析助手连接数据库用户用自然语言提问Agent 帮你写 SQL、执行查询、把结果转成图表描述。个人助理管理日历、发送邮件、抓取网页内容。代码辅助根据 Issue 描述自动读取仓库代码、定位文件、提出修改方案。企业内部知识库问答对接公司内部文档和权限系统。这些场景有一个共同点如果你只用对话模型事情做不完加上工具调用、任务拆解、流程控制之后才能真正落地。1.3 你需要掌握哪些前置知识在开始 AIAgent 开发之前并不要求你已经是算法工程师但最好具备以下基础Python 基础语法能写函数、类会处理 dict、list 这类数据结构。HTTP 与 API 基础知道 GET、POST 是什么看得懂 JSON 数据。基本的命令行操作能在终端里安装依赖、运行脚本。如果你的基础还不牢固也可以边学边补。因为实际项目中AIAgent 开发更侧重于“把现有模型能力、工具能力和代码逻辑串起来”难度反而在工程整合上而不是模型训练。2. AIAgent 的核心架构与工作流程2.1 一个 Agent 由哪些模块组成一个典型的智能体系统通常包含以下部分用户界面层UI / 交互入口Agent 调度核心决定下一步做什么大语言模型LLM负责理解和生成工具层Tools / APIAgent 可以调用的外部能力记忆与上下文管理短期记忆、长期记忆外部数据存储数据库、向量数据库、文件系统可以把 Agent 想象成一个“实习生”大模型是他的大脑负责思考。工具是他能使用的软件系统比如 Excel、网页、公司内部后台。记忆是他笔记本记录用户偏好和之前的操作。调度核心就是他的工作流决定先做什么、再做什么。2.2 Agent 的典型工作流程一次完整的 Agent 调用流程大致可以拆成这样用户输入问题 ↓ Agent 接收输入整理上下文 ↓ LLM 思考判断需要调用哪个工具或不调用 ↓ 生成结构化指令例如 JSON 格式的 tool_call ↓ Agent 执行工具调用拿到返回结果 ↓ 把工具结果交给 LLM生成最终回复 ↓ 返回给用户这里最关键的一步是“LLM 判断需要调用哪个工具”。它并不是靠预写死的 if-else 决定的而是模型根据你描述的工具名称、参数说明、当前用户意图进行判断。所以在 AIAgent 开发中工具描述Function Description写得清不清楚直接影响 Agent 表现。2.3 单 Agent 与多 Agent 的区别2026 年前后Agent 开发逐渐分成了两条路线单 Agent 模式一个 Agent 同时负责对话理解、工具调用、回复生成。适合任务链路清晰的小项目。多 Agent 模式多个 Agent 分别负责不同角色比如一个负责理解用户一个负责操作数据库一个负责生成报告。它们之间通过消息队列或特定协议协作。对于刚接触 AIAgent 的开发者建议先掌握单 Agent 的开发体系跑通一个完整项目后再向多 Agent 协作方向深入。3. AIAgent 开发环境准备3.1 语言与框架选型目前 AIAgent 开发的生态相对集中在 Python 语言上主要原因有两个主流 AI 框架如 Pydantic AI、LangChain、LlamaIndex 等对 Python 支持最完善。AI/机器学习相关工具链天然偏向 Python。如果你的项目里有 Web 前端部分现在也很流行前后端分离式开发后端用 Python 起一个 Agent 服务前端用 Vue 或 React 构建交互界面。这也就是大家常说的“aiagent react”组合方案。3.2 推荐环境版本因为 AI 工具链更新非常快实际开发时一定要锁定自己项目的版本组合。下面给出一套比较常用的示例组合操作系统Windows 10/11、macOS、LinuxUbuntu 22.04均可Python3.10 或 3.11建议至少 3.10 以上包管理工具pip 或 poetry大模型接入方式通过各大模型厂商的开放 API 调用可选框架可以用 Pydantic AI 这类轻量框架入门也可以直接用原生代码实现工具调用逻辑版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。3.3 大模型 API 的获取与配置AI Agent 开发中模型 API 是最核心的“大脑”。你需要准备一个可调用的大模型服务。无论是国内还是国外的服务商基本流程都是注册并登录开放平台。创建 API Key。账户充值或领取免费额度。查看对应模型的 API 调用地址和模型名称。获取到 API Key 之后建议不要直接硬编码在代码里而是通过环境变量或配置文件管理。后面的项目示例中我统一采用环境变量方式加载方便在不同环境里隔离密钥信息。export LLM_API_KEY你的API密钥窗口关闭后环境变量会失效。如果想长期生效可以写入 shell 配置文件如~/.bashrc或~/.zshrc或者使用 .env 文件管理。注意API Key 是你的身份凭证牵扯到费用和调用权限。不要提交到公开代码仓库不要把 Key 明文写在前后端代码里。更好的方式是用密钥管理服务或后端环境注入。3.4 项目结构规划为了后面实战环节不混乱建议先建立一个清晰的项目结构。我们可以用一个名为ai_agent_project的目录来放整个项目ai_agent_project/ ├── .env # 存放 API Key 等敏感配置 ├── requirements.txt # 项目依赖 ├── agent/ │ ├── __init__.py │ ├── core.py # Agent 核心调度逻辑 │ ├── tools.py # 工具定义 │ └── memory.py # 记忆与上下文管理 ├── app.py # 入口文件 └── test_agent.py # 简单测试脚本这里面agent/core.py是重点文件负责组织整个 Agent 的调度流程。4. 从零搭建一个可运行的 AIAgent 示例4.1 明确示例需求为了把核心原理讲透我们做一个非常实用的示例用户输入城市名称Agent 自动判断用户意图调用天气查询工具返回该城市当前天气情况。这个例子虽然小但覆盖了 Agent 开发的核心链路用户输入自然语言。模型判断意图。模型输出结构化工具调用指令。程序执行真实的工具函数。模型结合工具输出生成回复。4.2 安装依赖在项目目录下创建虚拟环境并安装依赖python -m venv venv source venv/bin/activate # Windows 下执行 venv\Scripts\activate pip install openai pydantic python-dotenv httpx说明一下这些库的用途openai用于调用支持 OpenAI 协议的大模型 API。pydantic用于定义结构化输出实现工具参数校验。python-dotenv用于加载 .env 文件。httpx用于发起外部 HTTP 请求。4.3 编写工具函数在agent/tools.py中我们定义一个天气查询工具。为了避免依赖第三方收费 API这里做成一个模拟工具传入城市名返回一份固定格式的天气数据。真实项目中你只需要把函数内部换成真实 API 调用即可。# 文件路径agent/tools.py 工具层这里定义 Agent 可以调用的所有外部能力。 每个工具函数都是普通 Python 函数。 def get_weather(city: str) - str: 查询指定城市当前的天气情况。 在实际项目中这个函数内部可以调用真实天气 API。 这里为了演示使用模拟数据返回。 Args: city: 城市名称例如 北京。 Returns: 城市天气信息的 JSON 字符串。 weather_data { 北京: {temperature: 25, condition: 晴, wind: 东南风 2 级}, 上海: {temperature: 28, condition: 多云, wind: 东风 3 级}, 广州: {temperature: 30, condition: 雷阵雨, wind: 南风 2 级}, } data weather_data.get(city) if data is None: return f未找到 {city} 的天气数据 return f{city}{data[temperature]}℃{data[condition]}{data[wind]}这个函数虽然简单但它代表了 Agent 开发中“工具Tool”的最基本形态一段具体的业务逻辑代码接收参数返回结果。为了让大模型知道这个工具的作用和参数要求我们还需要给它一份“工具描述”。这里用 JSON 格式描述{ type: function, function: { name: get_weather, description: 查询指定城市当前的天气情况, parameters: { type: object, properties: { city: { type: string, description: 城市名称例如 北京 } }, required: [city] } } }在真实的 API 调用中这份 JSON 会直接传给大模型模型根据描述决定是否调用、以及如何填写参数。4.4 编写 Agent 核心调度逻辑接下来是项目核心文件agent/core.py。这个文件负责加载环境变量。构建消息上下文。把工具描述传给模型。接收模型返回的工具调用指令。执行工具并回传结果。让模型生成最终回答。由于不同大模型 API 的 SDK 可能在细节上有差异下面的示例以常见的 OpenAI 兼容协议为例。实际使用时请根据你选择的模型服务商调整base_url和模型名。# 文件路径agent/core.py import json import os from dotenv import load_dotenv from openai import OpenAI from agent.tools import get_weather # 加载 .env 文件中的环境变量 load_dotenv() # 初始化模型客户端 client OpenAI( api_keyos.getenv(LLM_API_KEY), base_urlos.getenv(LLM_BASE_URL, https://api.openai.com/v1), ) MODEL_NAME os.getenv(LLM_MODEL_NAME, gpt-4o-mini) # 工具描述列表传给模型 TOOLS [ { type: function, function: { name: get_weather, description: 查询指定城市当前的天气情况, parameters: { type: object, properties: { city: { type: string, description: 城市名称例如 北京 } }, required: [city] } } } ] def run_agent(user_input: str) - str: 运行 Agent 主流程。 Args: user_input: 用户输入的自然语言内容。 Returns: Agent 的最终回复内容。 # 1. 构建初始消息 messages [ { role: system, content: 你是一个智能助手可以根据用户需求调用工具来回答问题。 }, { role: user, content: user_input } ] # 2. 第一次调用模型传入工具描述 response client.chat.completions.create( modelMODEL_NAME, messagesmessages, toolsTOOLS, ) # 3. 判断模型是否要求调用工具 message response.choices[0].message # 如果没有工具调用直接返回内容 if not message.tool_calls: return message.content # 4. 有工具调用先把 assistant 消息加入上下文 messages.append(message) # 5. 逐个执行工具调用 for tool_call in message.tool_calls: tool_name tool_call.function.name tool_args json.loads(tool_call.function.arguments) # 根据工具名分发执行 if tool_name get_weather: tool_result get_weather(**tool_args) else: tool_result f未知工具{tool_name} # 6. 把工具执行结果以 tool 角色消息加入上下文 messages.append( { role: tool, tool_call_id: tool_call.id, content: str(tool_result), } ) # 7. 再次调用模型让它结合工具结果生成最终回复 second_response client.chat.completions.create( modelMODEL_NAME, messagesmessages, toolsTOOLS, ) return second_response.choices[0].message.content这个run_agent函数是整个智能体的核心调度代码。简单总结就是先让模型思考一次看它要不要工具要的话执行工具把结果回传模型再让模型生成答案。4.5 编写入口文件入口文件app.py负责接收命令行输入并把结果打印给用户。# 文件路径app.py from agent.core import run_agent def main(): print(AI Agent 示例已启动输入内容后回车即可。退出请按 q) while True: user_input input(你) if user_input.lower() q: break reply run_agent(user_input) print(Agent, reply) if __name__ __main__: main()4.6 配置环境变量在项目根目录创建.env文件LLM_API_KEY你的API密钥 LLM_BASE_URLhttps://api.openai.com/v1 LLM_MODEL_NAMEgpt-4o-mini根据你实际使用的模型服务商修改LLM_BASE_URL和LLM_MODEL_NAME。4.7 运行与验证在项目目录下执行python app.py然后输入你北京今天天气怎么样如果一切正常Agent 会输出类似结果Agent北京今天 25℃晴东南风 2 级。这个过程看起来很简单但是里面已经发生了两次模型调用和一次真实的工具调用。这正是 AIAgent 工作流程的精髓模型负责决策“调什么”代码负责执行“怎么调”。5. 用 FastAPI 把 Agent 封装成服务命令行脚本能帮我们验证逻辑但在实际项目中Agent 往往需要作为一个后端服务运行对外提供 HTTP 接口供网页端或移动端调用。5.1 安装 FastAPI 与 uvicornpip install fastapi uvicorn5.2 创建 Web 服务文件在项目根目录创建server.py# 文件路径server.py from fastapi import FastAPI from pydantic import BaseModel from agent.core import run_agent app FastAPI(titleAIAgent Demo Service) class ChatRequest(BaseModel): message: str class ChatResponse(BaseModel): reply: str app.post(/api/chat, response_modelChatResponse) async def chat(req: ChatRequest): 对话接口接收用户消息返回 Agent 回复。 reply run_agent(req.message) return ChatResponse(replyreply) app.get(/health) async def health(): return {status: ok}5.3 启动服务uvicorn server:app --host 0.0.0.0 --port 8000启动后打开浏览器访问http://localhost:8000/docs可以看到 FastAPI 自动生成的接口文档页面。在 Swagger UI 页面里你可以直接点击/api/chat接口用 JSON 格式传入测试数据{ message: 上海今天天气怎么样 }返回结果{ reply: 上海今天 28℃多云东风 3 级。 }到此一个最简单的 Agent 后端服务就跑通了。6. 前端接入React 项目如何对接 Agent 接口很多 AIAgent 项目最终都要有一个可视化对话界面。如果采用前后端分离架构前端常用 ReactVite 构建后端就是我们上面写的 FastAPI 服务。6.1 创建 React 工程如果你本机有 Node.js 环境可以使用 Vite 快速创建项目npm create vitelatest agent-web -- --template react-ts cd agent-web npm install如果你不熟悉 React也可以用最基础的 HTML 页面先做测试原理是一样的。6.2 前端调用接口在 React 组件中调用后端接口的核心代码非常简单// 文件路径src/App.tsx核心片段 import { useState } from react; function App() { const [message, setMessage] useState(); const [reply, setReply] useState(); const sendMessage async () { const res await fetch(http://localhost:8000/api/chat, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify({ message }), }); const data await res.json(); setReply(data.reply); }; return ( div style{{ padding: 24 }} h1AI Agent 对话测试/h1 input value{message} onChange{(e) setMessage(e.target.value)} placeholder请输入问题 style{{ width: 300, padding: 8 }} / button onClick{sendMessage} style{{ marginLeft: 8 }} 发送 /button p回复{reply}/p /div ); } export default App;启动 React 项目npm run dev浏览器访问http://localhost:5173输入问题即可看到 Agent 回复。6.3 注意跨域问题前端地址是localhost:5173后端地址是localhost:8000直接访问会遇到跨域问题。解决方式通常有两种在后端 FastAPI 中配置跨域中间件。在前端 Vite 配置代理。推荐在后端配置跨域代码片段如下# server.py 中新增 from fastapi.middleware.cors import CORSMiddleware app.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, allow_methods[*], allow_headers[*], )这样改动简单方便本地调试。如果上线生产环境建议把allow_origins换成具体的域名而不是使用通配符。7. AIAgent 开发的常见问题与排查思路在实际开发智能体的过程中你会遇到各种奇怪的问题。下面整理几种高频场景和排查思路。7.1 模型返回空内容或返回“拒绝回答问题”问题现象常见原因解决思路模型回答为空系统提示词不当模型认为无需回答检查 system prompt明确告知模型可以调用工具完成用户需求模型一直不调用工具工具描述不够清晰优化工具名称和参数描述必要时在描述中加入使用示例模型调用工具后说“无法获取信息”工具执行结果没有成功回传检查 messages 中是否以 tool 角色追加了结果以及 tool_call_id 是否正确7.2 工具参数格式错误模型返回的工具调用参数是 JSON 字符串格式代码里用json.loads解析。如果模型返回的内容不符合 JSON 格式就会抛出异常。解决方法给模型更严格的工具参数描述把每个字段类型说明白。在解析时增加异常捕获解析失败时通知模型重新生成。try: tool_args json.loads(tool_call.function.arguments) except json.JSONDecodeError: tool_args {}7.3 上下文越来越长导致费用变高、响应变慢Agent 每执行一次工具调用都会向 messages 中添加新的消息。如果任务链路长上下文就会很大。解决思路对历史消息做截断或摘要。工具执行结果只保留关键信息。把长期记忆放到外部存储比如向量数据库而不是全部塞进上下文。7.4 API 报错 401 或 429401API Key 无效或权限不足。429请求频率超限或余额不足。排查顺序先确认环境变量是否加载成功再确认 Key 所属账号是否有权限调用当前模型。7.5 Agent 明明调用了工具但返回值不理想这种情况很常见。原因往往是工具返回的数据结构复杂模型没有理解关键字段。你没有告诉模型“最终回复时要提炼哪些信息”。优化方式是在工具返回结果前先做一次格式化处理把关键信息压缩成简洁文本再回传给模型。8. AIAgent 开发的最佳实践与工程建议8.1 工具设计要“小而专”不要把一个大功能全塞进一个工具函数里。例如不要写一个process_all函数里面又查天气又订机票又发邮件。更好的做法是拆成get_weather、search_flight、send_email多个独立工具。这样模型更容易判断该调用谁参数校验也更简单。8.2 工具描述要写“人话”写工具描述时可以想象你在向一个新同事解释这个功能的用途。例如错误的描述这是一个天气函数。正确的描述查询指定城市当前实时天气情况返回内容包括温度、天气状况和风力。当用户询问天气时使用此工具。模型对描述的理解直接决定它能否准确选对工具。8.3 密钥管理必须严格开发阶段可以借助 .env 文件管理密钥但一定不要把 .env 文件提交到 Git 仓库。建议在.gitignore中加上.env。生产环境建议使用密钥管理服务或环境变量注入。8.4 可观测性与日志智能体项目比普通 Web 项目更难调试因为你不清楚模型内部为什么这样决策。所以一定要记录用户原始输入。模型每一次返回的完整消息。工具调用的名称、参数、结果。模型最终输出。有了完整日志才能快速定位是模型问题还是工具问题。8.5 不要让 Agent 无限循环调用在某些场景下Agent 可能出现“不断调用工具”的死循环。必须在代码中加入调用次数限制。MAX_TOOL_CALLS 5 tool_call_count 0 while tool_call_count MAX_TOOL_CALLS: # 调用模型判断是否还需要工具 ... if not message.tool_calls: break tool_call_count 1一旦次数超限就强制返回当前结果并提示用户稍后再试。8.6 保存会话状态用户有可能连续提出多个问题比如先问“北京天气”再问“那上海呢”。如果希望 Agent 记住上下文需要把对话历史持久化到数据库或缓存中。每次请求都带着完整的会话历史。会话设计上通常是给每个会话分配一个conversation_id服务端用这个 ID 存取 messages 列表。8.7 模型版本不稳定怎么办不同时期模型服务商可能会升级模型名称或者下线旧版模型。建议把模型名称配置化不要硬编码在代码里。这样当模型版本调整时只需要修改配置文件不需要重新上线代码。8.8 从单 Agent 到多 Agent 的演进建议当你已经能稳定开发单 Agent 后遇到下面的场景再考虑引入多 Agent 协作单个 Agent 的 prompt 太长互相冲突。不同任务需要不同的模型策略。业务流程中不同环节需要隔离的权限或错误处理。多 Agent 架构会显著增加开发成本不是一个需要一上来就用重的方案。9. 总结与下一步学习路线本文从 AIAgent 的核心概念出发讲清楚了 Agent 与大模型对话机器人的本质区别拆解了一个完整智能体的工作流程然后带着大家从零写了一个最小的天气查询 Agent并把它封装成了 FastAPI 服务还实现了 React 前端对接。把这篇内容完整跟下来你应该掌握了以下核心能力理解 Agent 的工作原理知道模型、工具、上下文三者如何配合。会定义工具函数和工具描述。能写一个支持工具调用的 Agent 调度核心。能通过 HTTP 接口对外提供服务。会排查工具调用和 API 接入中的常见问题。具备继续深入多 Agent 开发的工程基础。下一步如果你想继续往深走可以围绕这几个方向展开学习记忆机制把对话历史接入 Redis 或 PostgreSQL。引入向量数据库让 Agent 能检索知识库内容。学习主流 Agent 框架的高级用法理解它们的内部封装原理。研究多 Agent 协作与工作流编排实现更复杂的自动化任务。把 Agent 嵌入到实际业务系统中结合权限控制、审计日志和定时触发机制。如果未来有机会我会再写一篇关于多 Agent 协作和知识库检索的进阶实战笔记。你可以把本文收藏起来作为自己 AIAgent 开发路上的第一份落地参考。
返回列表