ARTICLE DETAIL

资讯详情

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

AI Agent技术拆解与最小实现:从任务执行到商业化落地

AI Agent技术拆解与最小实现:从任务执行到商业化落地 最近围绕 Manus 的讨论很多既有对通用 AI Agent 的热捧也有关于“被退货”“收入数据”的各种猜测。作为一个开发者我更关心的其实不是传闻本身而是这类产品背后到底用了哪些技术、踩过哪些坑、如何一步步做成可交付的形态。这篇文章不讨论具体数字是否属实只从技术视角拆解 AI Agent 类产品从原型到可运行、再到商业化落地需要关注的核心环节并给出一套可以本地运行的最小实现方案。如果你正在学习大模型应用开发或者想把一个“会聊天”的机器人改造成“能办事”的智能助手这篇文章应该能给你一条相对完整的参考路线。我们会先理清 Agent 的核心概念再写一个简化版任务执行引擎最后聊一聊产品化过程中的成本、安全和工程化问题。1. 背景与核心概念1.1 什么是 Manus 这类 AI AgentManus 本质上是一个以自然语言为入口的通用任务执行助手。用户只需要描述目标比如“帮我整理这 20 篇文章并生成一份周报”它就会自己拆解步骤、调用工具、访问网页、处理文件最终交付一个结果。这和传统聊天机器人最大的区别在于它不再停留在“生成文字”层面而是真正去操作计算机上的资源。大模型本身只能生成文本不能直接点击按钮、查询数据库、写入文件。Agent 的价值就是充当“调度中枢”通过规划、工具调用、结果反馈这三步循环让大模型具备操作外部环境的能力。这类产品在 2025 年之后集中爆发原因是三个条件同时成熟大模型的指令理解能力足够强能够生成可执行的步骤计划。Function Calling / Tools API 成为标准能力模型可以输出结构化工具调用参数。浏览器自动化、文件解析、代码执行等工具链变得稳定。换句话说Manus 这类产品并不是某一家独享的技术魔法而是把已有的模型能力、工具链和产品交互做了深度整合。1.2 Agent 与 Chatbot 的区别很多初学者会把 AI Agent 和 Chatbot 混为一谈。简单区分对比项ChatbotAgent回答方式根据上下文生成文字规划并执行任务最终产出结果工具使用通常不支持支持调用 API、浏览器、文件系统状态管理对话上下文任务状态、中间产物、记忆用户参与度单轮或多轮对话可独立执行关键节点人工确认失败处理重新生成回答重试、回退、改用其他工具以“查天气并安排出行”为例。Chatbot 会告诉你今天的天气然后建议你带伞Agent 则会自动打开天气网站、查询目的地的实时天气、结合地图 API 估算通勤时间、生成一份出行建议文档并发送到你的邮箱。所以 Agent 更接近“数字员工”它能对结果负责而不仅仅是“回答问题”。1.3 为什么“被退货”的话题会与技术相关当一款 AI 产品受到热议随之而来的往往是“退货”“退款”“期望落差”等声音。站在技术角度看这背后其实反映了 Agent 产品常见的一类问题演示环境表现很好真实用户场景表现不稳定。可能的技术原因包括任务拆分不合理复杂任务中途断裂。工具调用失败后没有自动恢复机制。上下文窗口有限长任务执行到一半丢失关键信息。对用户输入的边界情况处理不足导致结果不可用。成本控制不到位个别任务消耗大量 Token。这些问题不是靠堆参数能解决的而是要靠工程架构来兜底。我们后面会围绕这些问题给出具体方案。2. 核心技术模块拆解在写代码之前先建立整体架构认知。一个可以商用的 Agent 系统通常包含六个模块。2.1 大模型推理模块这是 Agent 的“大脑”。它负责理解用户意图、生成计划、判断工具调用结果。实际项目里常用两类方式直接使用模型自带的 Function Calling 能力例如 OpenAI 的 tools 参数。使用 LangChain、LlamaIndex 等框架封装模型调用统一管理 Prompt、重试和输出解析。实践建议不要只绑定一家模型。可以通过 OpenAI 兼容接口接入不同模型像 DeepSeek、Qwen 等都提供类似接口方便在成本和效果之间做取舍。2.2 任务规划模块复杂任务必须被拆解成多个子任务。常见思路有两种一种是让模型一次性输出完整计划然后逐条执行另一种是执行一步、观察结果、再决定下一步类似 ReAct 模式。对于落地项目推荐“动态规划”而不是“一次性规划”。因为真实环境充满不确定性页面加载失败、接口返回异常、权限不足都会打乱原计划。Agent 应该在每一步执行后重新评估剩余步骤。2.3 工具调用与集成模块工具是 Agent 的手脚。常见工具类型包括网页访问与抓取Playwright、Selenium、httpx。文件处理读写 CSV、PDF、Word。代码执行本地 Python 或沙箱环境。数据库操作MySQL、PostgreSQL、Redis。第三方 API邮件、支付、办公套件。工具注册时建议使用统一的输入输出格式这样模型更容易学会何时调用哪个工具。2.4 记忆与上下文管理模块Agent 在长时间任务中需要记住三类信息用户偏好比如“报告要中文”“数据要保留两位小数”。历史操作已经访问过哪些页面执行过哪些步骤。中间结果上一步生成的临时文件路径、查询结果。实现方式很灵活短期记忆可以直接放在会话对象里长期记忆可以用向量数据库保存例如 Chroma、Milvus 或云厂商的向量检索服务。2.5 执行反馈与重试模块真实任务一定会失败。如果 Agent 碰到一次错误就退出用户会非常不满。好的做法包括工具调用失败后把错误信息回传给大模型让它自己决定是重试还是换方案。设置最大重试次数避免无限循环消耗成本。对问题进行分类可重试错误、不可恢复错误、需要用户确认的错误。反馈模块做得越细Agent 的真实可用性就越高。2.6 人机协同模块不是所有任务都适合全自动。涉及支付、删除、发送邮件等高风险操作时应该插入人工确认节点。这也是商业产品最常见的“保命”设计。3. 环境准备与依赖说明3.1 运行环境本文示例使用 Python 编写。实测建议使用 Python 3.10 或更高版本其他版本在语法兼容性上需要适当调整。操作系统方面Windows、macOS、Linux 都可以运行。浏览器自动化部分需要安装对应系统下的浏览器内核。3.2 依赖安装创建一个虚拟环境然后安装以下依赖python -m venv venv source venv/bin/activate # Windows 下执行 venv\Scripts\activatepip install fastapi uvicorn openai pydantic playwright httpx依赖说明库名用途fastapi提供 HTTP 接口服务uvicornASGI 服务器运行 FastAPIopenai调用支持 Function Calling 的大模型接口pydantic定义数据结构与参数校验playwright浏览器自动化操作httpx异步 HTTP 请求安装完成后如果要用浏览器自动化还要执行playwright install chromium这一步会下载 Chromium 内核用于后续操作网页。3.3 模型接口准备本文示例使用 OpenAI 兼容接口具体模型名称通过环境变量配置。你可以使用 OpenAI 官方服务也可以使用国内大模型平台提供的兼容接口。在项目根目录创建.env文件或直接设置环境变量export OPENAI_API_KEYyour-api-key export OPENAI_BASE_URLhttps://api.openai.com/v1 export OPENAI_MODELgpt-4o-mini版本差异提醒不同 API 平台的模型名称和请求格式可能存在差异。本文代码以 OpenAI 兼容接口为标准写法如果你接入其他平台请按平台文档调整base_url和model字段。4. 完整实战从零实现一个最小任务执行 Agent接下来我们实现一个简化版 Agent。它接收用户任务通过大模型规划是否需要调用工具然后执行工具并继续推理最终返回结果。4.1 项目结构mini-agent/ ├── main.py # FastAPI 入口 ├── agent.py # Agent 核心循环 ├── tools.py # 工具注册与执行 └── requirements.txt # 依赖清单4.2 定义工具先创建一个tools.py注册两个简单工具一个用于加法计算一个用于模拟获取今日热榜数据。# 文件路径tools.py from typing import Any, Dict def add_numbers(a: float, b: float) - float: 计算两个数字的和。 return a b def get_hot_topics(limit: int 5) - list[str]: 模拟获取今日技术热榜实际项目中可替换为真实抓取逻辑。 hot_list [ AI Agent 应用落地, 大模型 Function Calling, 检索增强生成 RAG, 多模态模型实战, 向量数据库选型, ] return hot_list[:limit] TOOL_MAP { add_numbers: { name: add_numbers, description: 计算两个数字的和, parameters: { type: object, properties: { a: {type: number, description: 第一个数字}, b: {type: number, description: 第二个数字}, }, required: [a, b], }, function: add_numbers, }, get_hot_topics: { name: get_hot_topics, description: 获取今日技术热榜列表, parameters: { type: object, properties: { limit: {type: integer, description: 返回数量默认 5}, }, required: [], }, function: get_hot_topics, }, } def execute_tool(name: str, arguments: Dict[str, Any]) - Any: 根据模型返回的工具名称和参数执行对应工具。 tool_config TOOL_MAP.get(name) if not tool_config: raise ValueError(f未知工具: {name}) func tool_config[function] return func(**arguments)这段代码最重要的部分是把工具描述信息按模型可识别的 JSON Schema 格式组织。大模型会根据这些描述决定“什么时候该调用哪个工具、参数填什么”。4.3 实现 Agent 核心循环agent.py是整个项目的核心。它实现一个标准的工具调用循环把用户消息发给模型。模型返回普通文本或工具调用请求。如果是工具调用则执行工具然后把结果追加到消息历史里再次请求模型。重复以上过程直到模型不再要求调用工具。# 文件路径agent.py import json import os from openai import OpenAI from tools import execute_tool, TOOL_MAP client OpenAI( api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL, https://api.openai.com/v1), ) MODEL_NAME os.getenv(OPENAI_MODEL, gpt-4o-mini) def build_tools_schema(): 把 TOOL_MAP 转换成 OpenAI tools 参数需要的格式。 schemas [] for tool_config in TOOL_MAP.values(): schemas.append( { type: function, function: { name: tool_config[name], description: tool_config[description], parameters: tool_config[parameters], }, } ) return schemas def run_agent(user_query: str, max_iterations: int 5) - str: 执行 Agent 主循环。 参数说明 - user_query: 用户输入的任务描述 - max_iterations: 最大工具调用轮数防止死循环 messages [ {role: system, content: 你是一个智能任务代理善于拆解问题并使用工具完成任务。}, {role: user, content: user_query}, ] tools build_tools_schema() for _ in range(max_iterations): response client.chat.completions.create( modelMODEL_NAME, messagesmessages, toolstools, tool_choiceauto, ) message response.choices[0].message # 如果没有工具调用请求说明任务已经完成 if not message.tool_calls: return message.content or 任务已完成。 # 把模型返回的消息追加到会话记录 messages.append( { role: assistant, content: message.content, tool_calls: [ { id: tc.id, type: function, function: { name: tc.function.name, arguments: tc.function.arguments, }, } for tc in message.tool_calls ], } ) # 逐个执行工具调用 for tool_call in message.tool_calls: func_name tool_call.function.name func_args json.loads(tool_call.function.arguments or {}) try: result execute_tool(func_name, func_args) result_text json.dumps(result, ensure_asciiFalse) except Exception as exc: result_text f工具执行失败: {exc} messages.append( { role: tool, tool_call_id: tool_call.id, content: result_text, } ) return 已达到最大迭代次数任务结束。请尝试拆分成更小的步骤。 if __name__ __main__: # 直接运行 python agent.py 可进行命令行测试 query 请获取今日技术热榜然后帮我计算返回数量的两倍是多少。 print(run_agent(query))代码中加入了最大迭代次数限制避免模型在复杂任务里无限调用工具。实际项目中这个值可以根据任务复杂程度动态调整但建议不要设得过大因为每次工具调用都会新增 Token 消耗。需要说明的是max_iterations限制的是工具调用轮数不是重试次数。如果你希望失败后自动重试可以在异常分支里追加一条系统提示再重新请求模型。4.4 编写 HTTP 服务入口为了让 Agent 能被外部调用我们使用 FastAPI 把它包装成一个 HTTP 接口。# 文件路径main.py from fastapi import FastAPI from pydantic import BaseModel from agent import run_agent app FastAPI(titleMini Agent Service) class TaskRequest(BaseModel): query: str max_iterations: int 5 class TaskResponse(BaseModel): result: str app.post(/agent/run, response_modelTaskResponse) async def run_task(request: TaskRequest): result run_agent(request.query, request.max_iterations) return TaskResponse(resultresult)启动服务uvicorn main:app --host 0.0.0.0 --port 80004.5 运行与验证打开一个新终端通过 curl 发起请求curl -X POST http://127.0.0.1:8000/agent/run \ -H Content-Type: application/json \ -d {query: 请获取今日技术热榜然后计算热榜数量的两倍}预期输出类似{ result: 今日技术热榜返回了 5 个主题数量的两倍是 10。 }这个流程完整演示了 Agent 的基本工作方式模型先决定调用get_hot_topics拿到结果后再根据上下文生成最终回答并且在合适的时候调用add_numbers工具完成计算。4.6 扩展接入浏览器自动化的思路真实产品里很多任务需要访问网页。这里给出一个基于 Playwright 的扩展片段作为思路参考。# 文件路径browser_tools.py示例片段 import asyncio from playwright.async_api import async_playwright async def open_page_and_get_text(url: str) - str: 打开网页并提取页面纯文本内容。 async with async_playwright() as p: browser await p.chromium.launch(headlessTrue) page await browser.new_page() await page.goto(url, timeout30000) content await page.inner_text(body) await browser.close() return content[:2000]注意浏览器自动化成本很高不仅有额外网络请求还可能出现元素定位失败、登录态失效等问题。生产实现里建议使用无头模式降低资源占用。设置页面加载超时。对常见网站做规则缓存避免重复抓取。5. 产品化与商业化思考5.1 从“收货”到“退货”的产品问题回到开头的争议。如果一款 Agent 产品收到大量“退货”反馈技术部门首先要排查的是“承诺是否过度”。演示时用精心设计的 Prompt 和固定模板任务用户却用它处理各种开放式问题效果自然会波动。更稳妥的做法是分阶段开放能力第一阶段只开放少数高成功率的任务类型例如信息查询、报告生成。第二阶段开放需要多工具协作的任务但保留人工确认环节。第三阶段再尝试全自动复杂任务。每开放一个能力都要配套对应的成功率监控、失败归因和成本统计。5.2 收入增长背后的技术支撑如果一款 Agent 产品真的实现了收入大幅增长通常不是因为某个单一功能而是整个系统达到了一定的稳定性和用户粘性。从技术角度可以拆成几个关键指标任务成功率用户发起任务后最终拿到可用结果的比例。平均运行时长任务执行越快用户满意度越高。Token 成本控制单次任务成本才能支撑低价订阅模式。用户留存只有任务真正解决问题用户才会持续付费。所以商业收入本质上是一个技术指标的外化表现。5.3 付费模式设计建议Agent 产品成本结构与传统 SaaS 不太一样因为它包含可变的大模型推理成本。建议根据任务类型设计不同的计费策略任务类型成本特征计费建议轻量问答Token 少无外部调用计入订阅包月中度任务多轮工具调用按次数或积分扣除重度任务浏览器操作 长上下文单独计费或限制次数企业定制私有化、高并发商务合同制同时一定要做配额限制避免用户一次任务消耗过多资源。比较常见的做法是给每个用户设置每日任务上限和单任务 Token 上限。5.4 安全与合规边界Agent 能操作浏览器和文件系统意味着风险也被放大了。最小实现示例中工具是手动注册的生产环境里必须考虑工具白名单机制只允许调用预置工具。路径校验禁止写入系统目录、其他用户目录。URL 校验默认识别并拦截内网地址防止 SSRF 攻击。敏感操作二次确认删除、付款、发送消息必须经用户确认。审计日志记录每一步操作出现问题可回溯。我强烈建议不要在生产环境直接使用“模型自由选择任意代码执行”这种设计。即使模型能力再强也要在工具层做严格限制。6. 常见问题与排查思路6.1 常见报错对照表问题现象常见原因解决思路API 返回 401API Key 无效或没有权限检查 Key 是否正确确认账户是否有模型访问权限请求报错 404模型名不存在或 base_url 配置错误按平台文档核对模型名和接口地址模型一直重复调用同一工具工具结果没有正确追加到上下文检查 messages 是否完整包含了 tool 角色消息工具参数解析失败模型返回的 JSON 参数非法使用json.loads增加 try-except失败后请求模型重新生成任务执行到一半停止超过 max_iterations增大迭代次数或把任务拆分成子任务浏览器无法启动系统缺少 Chromium 依赖执行playwright install chromium并检查系统依赖Token 消耗过高上下文持续累积定期做历史摘要裁剪不重要的中间步骤6.2 排查通用流程当 Agent 运行结果不符合预期时建议按以下顺序排查打开调试日志记录每次模型请求和工具返回。确认模型当时看到了哪些上下文。检查工具返回结果是否为模型可解析的合法格式。缩小任务范围用最少步骤复现问题。更换模型对比效果排除模型能力差异。很多看似“模型不聪明”的问题最后都出在上下文组装或者工具返回格式上。先把日志做好问题就解决了一半。6.3 避免“上下文爆炸”Agent 在长任务中会把每一轮工具调用结果追加到 messages 里很容易超过模型上下文限制。解决办法是给中间步骤做摘要# 思路示例把早期工具执行历史压缩成摘要 if len(messages) 20: summary 前面已完成获取热榜、计算数量。剩余任务生成报告。 messages messages[:2] [{role: system, content: summary}]这里只是演示思路实际项目中要结合 Token 计数工具动态判断什么时候该压缩。7. 工程化与最佳实践7.1 任务拆分通用策略把一个大任务拆成“子任务-子结果-决策”的结构。每个子任务只做一件事并且具备可验证的输出。例如“写一份市场分析报告”不要直接丢给模型让它一次生成而是拆成收集行业数据。整理竞品信息。生成分析框架。结合数据填充内容。校验格式并导出。不要让模型一次性完成所有环节因为只要中间一步出错后续内容就会全线崩坏。7.2 日志与可观测性生产环境必须记录用户 ID、任务 ID。每次模型请求的 token 数。工具调用的名称、参数、耗时。错误类型与重试次数。最终任务结果。有了这些数据你才能回答“用户为什么退货”“这个任务为什么失败”“成本为什么超标”。7.3 成本控制建议Agent 项目的成本有两个大头模型 Token 和浏览器资源。常用控制手段包括优先使用小模型处理简单任务只有复杂任务才上强模型。对工具调用结果做截断保留关键信息而不是全部塞进上下文。浏览器操作前先判断页面是否需要 JS 渲染能直接抓接口就不开浏览器。设置单日、单用户、单任务的配额。7.4 模型选型与多模型切换不要把所有逻辑写死在 OpenAI SDK 调用上。建议封装一个LLMClient把“模型名称”“base_url”“api_key”全部做成配置项。这样后续可以按业务场景切换模型日常问答用低成本小模型。复杂推理用旗舰模型。对外展示用离线部署模型保障数据安全。8. 总结与学习路线这篇文章从 Manus 引发的讨论出发梳理了 AI Agent 类产品的核心架构并提供了一个最小可运行的 Agent 服务示例。你需要重点掌握的知识点包括Function Calling 的工作原理、Agent 主循环的实现方式、工具注册与执行的设计模式、上下文管理和成本控制的工程技巧。如果你希望继续深入下面这条学习路线可以参考掌握 Prompt Engineering理解 System Prompt 对 Agent 行为的影响。学习 LangGraph 或 AutoGen理解多智能体协作和图状态管理。研究 MCP 协议了解 Agent 如何标准化接入外部工具生态。学习 RAG 技术让 Agent 能访问私有知识库。练习 Playwright 自动化积累网页操作的任务成功率。最后把一个研究型 Demo 改造成有用户体系、配额控制、审计日志的生产系统。再回到文章开头的那个问题一款 Agent 产品能不能留住用户、能不能产生收入核心还是技术稳定性和用户体验。与其追逐热点传闻不如亲手把一套 Agent 流程跑通理解它哪里强、哪里弱、哪里需要人工兜底。至少在今天Agent 仍然是一个需要工程师不断调试和打磨的工程系统而不是一句提示词就能解决所有问题的魔法。希望这篇文章对你有帮助。如果后续你想看某个模块的深入实战比如浏览器自动化、多 Agent 协作或者成本优化可以留言告诉我我们继续在下篇展开。
返回列表