AI Agent开发实战:从零构建智能任务规划与执行系统

📅 2026/7/6 7:29:13
AI Agent开发实战:从零构建智能任务规划与执行系统
30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度在实际的大模型应用开发中单纯调用API生成文本已经无法满足复杂业务需求。AI Agent智能体通过将大模型作为核心的“大脑”结合规划、记忆、工具使用等能力能够自主或半自主地完成一系列任务例如信息检索、数据分析、流程自动化等这正成为构建下一代智能应用的关键技术。然而从零开始构建一个稳定、可用的Agent系统开发者常常会面临概念模糊、框架选择困难、工程落地复杂等诸多挑战。本文旨在为有一定大模型基础例如了解过ChatGPT API或类似服务的开发者提供一条清晰的AI Agent从入门到实践的路径。我们将避开空洞的理论直接从一个可运行的“任务规划与执行”Agent案例入手逐步拆解其核心组件、常用框架、开发流程以及生产环境中的注意事项。通过本文你将能够理解Agent的核心工作机制掌握使用主流框架如LangChain、LlamaIndex搭建智能体的基本方法并了解如何规避开发中的常见陷阱。1. 理解AI Agent的核心架构与工作流在深入代码之前必须厘清AI Agent究竟是什么以及它是如何工作的。这有助于我们在后续选择框架和设计系统时做出正确决策。1.1 AI Agent的定义与核心组件AI Agent不是一个单一的模型而是一个系统。它以大语言模型LLM为核心决策器并围绕其构建了感知、规划、行动和记忆的完整闭环。一个典型的Agent包含以下核心组件大脑LLM Core负责理解用户指令、进行逻辑推理、制定计划和做出决策。这是Agent的“智能”来源。规划模块Planner将复杂任务分解为一系列可执行的子任务或步骤。例如用户问“分析上季度销售数据并生成报告”规划模块可能将其分解为1. 获取销售数据2. 计算关键指标3. 生成图表4. 撰写分析文本。工具集ToolsAgent与外部世界交互的手段。每个工具对应一个具体功能如搜索网络、查询数据库、执行代码、调用API等。LLM负责在适当时机选择并调用正确的工具。记忆系统Memory分为短期记忆会话上下文和长期记忆向量数据库等。记忆使Agent能够参考之前的交互历史实现多轮对话和持续学习。执行器Executor协调以上组件按照规划调用工具处理工具返回的结果并将结果反馈给LLM进行下一步决策直至任务完成。1.2 Agent的典型工作流程一个标准的任务执行型Agent的工作流程可以概括为以下循环用户输入 - LLM理解与规划 - 选择工具 - 执行工具 - 观察结果 - 更新记忆与状态 - 判断是否完成 - [若未完成] 进入下一轮决策 - [若完成] 输出最终结果。这个循环被称为ReActReason Act模式即推理与行动相结合。LLM在每一步都会生成一个“思考”过程Reason然后决定一个“行动”Act。1.3 与简单提示工程和传统自动化的区别理解Agent的独特性需要将其与相关概念对比特性简单提示工程Prompt Engineering传统脚本自动化RPA/脚本AI Agent灵活性低输出完全依赖于单次输入的提示词。中流程固定难以处理未预见的异常。高能根据中间结果动态调整计划。可处理任务复杂度低至中适合内容生成、分类等单步任务。中适合规则明确、结构化的重复流程。高适合需要多步骤推理和决策的开放任务。对外部系统的交互无仅限于文本输入输出。有但需要预先硬编码所有交互逻辑。有且能动态决定何时、如何与何种工具交互。核心挑战设计有效的提示词管理上下文长度。流程维护成本高环境变化易导致失效。规划可靠性、工具调用准确性、成本与延迟控制。Agent的本质是赋予大模型使用工具的能力从而突破其纯文本生成的局限真正作用于数字世界。2. 环境准备与核心工具选型开始构建Agent之前需要搭建开发环境并选择合适的技术栈。以下配置是一个兼顾学习与开发的通用起点。2.1 基础开发环境配置首先确保你的本地或开发服务器具备以下基础环境Python环境推荐使用Python 3.9或3.10更高版本需注意某些库的兼容性。使用conda或venv创建独立的虚拟环境是必须的。# 创建并激活虚拟环境以conda为例 conda create -n ai-agent python3.10 conda activate ai-agent代码编辑器VS Code或PyCharm均可确保安装好Python插件。大模型API访问你需要一个可用的LLM API服务。对于学习和原型开发可以选择OpenAI GPT系列稳定生态好但需要海外支付方式。国内大模型平台如智谱AIChatGLM、百度文心一言、阿里通义千问、月之暗面Kimi等它们提供了与OpenAI兼容的API接口。注意选择国内平台时务必仔细阅读其API文档关注速率限制、计费方式和模型上下文长度等关键参数。2.2 核心框架选择LangChain vs LlamaIndex目前最流行的两个Agent开发框架是LangChain和LlamaIndex。它们各有侧重选择取决于你的主要场景。框架核心优势典型应用场景学习曲线LangChain工具链与Agent编排能力极强提供了大量现成的工具Tools、链Chains和代理Agents模板生态丰富。构建复杂的工作流、多步骤任务自动化、需要与多种外部工具搜索引擎、API、数据库集成的应用。中等偏上概念较多Chain, Agent, Memory, Tool。LlamaIndex数据连接与检索增强生成RAG能力专精擅长将私有数据文档、数据库与大模型结合构建问答系统。基于企业知识库的智能问答、文档分析、数据查询代理。其Agent功能也围绕数据检索展开。中等如果你专注于RAG上手更快。对于通用型任务Agent开发LangChain通常是更全面的起点。本文后续示例将主要使用LangChain。2.3 安装核心依赖在你的虚拟环境中安装必要的Python包。这里以LangChain和OpenAI SDK为例。# 安装LangChain核心包和OpenAI集成包 pip install langchain langchain-openai # 安装常用的社区工具包例如用于网页搜索需要自行申请API Key # pip install langchain-community # 安装用于结构化输出的Pydantic推荐 pip install pydantic # 安装用于演示的本地向量数据库可选用于记忆模块 pip install chromadb如果你计划使用国内大模型例如智谱AI则需要安装对应的LangChain集成包。# 例如使用智谱AI的ChatGLM pip install zhipuai # LangChain对智谱的官方支持可能通过langchain-community需查看最新文档3. 构建你的第一个任务规划型Agent我们将从一个简单的“研究助手”Agent开始。它的任务是根据一个主题自动规划步骤搜索网络信息并整理成一份摘要报告。这个例子涵盖了Agent的核心要素规划、工具使用和记忆。3.1 项目结构与初始化创建一个新的项目目录结构如下first_agent/ ├── config.py # 存放API密钥等配置 ├── tools.py # 自定义工具定义 ├── agent_builder.py # Agent组装逻辑 └── main.py # 主运行入口首先在config.py中安全地管理你的API密钥。切勿将密钥硬编码在代码中或上传至GitHub。# config.py import os from dotenv import load_dotenv # 从.env文件加载环境变量 load_dotenv() # 配置OpenAI (或其他模型服务商) OPENAI_API_KEY os.getenv(OPENAI_API_KEY) OPENAI_BASE_URL os.getenv(OPENAI_BASE_URL, https://api.openai.com/v1) # 若使用国内代理需修改此处 MODEL_NAME gpt-3.5-turbo # 或 gpt-4, claude-3-haiku等 # 配置其他工具API如Serper谷歌搜索API SERPER_API_KEY os.getenv(SERPER_API_KEY)在同级目录下创建.env文件OPENAI_API_KEYyour_openai_api_key_here # OPENAI_BASE_URLhttps://your.proxy.com/v1 # 如果需要 SERPER_API_KEYyour_serper_api_key_here3.2 定义工具Tools工具是Agent的手臂。我们定义一个搜索工具。这里使用Serper作为示例它是一个提供搜索结果的API。你也可以使用DuckDuckGo等免费但稳定性稍差的库。# tools.py import requests import json from langchain.tools import tool from config import SERPER_API_KEY tool def search_web(query: str) - str: 使用Serper API进行网络搜索并返回相关摘要。 参数: query: 搜索查询字符串。 返回: 搜索结果的摘要文本。 if not SERPER_API_KEY: return 错误未配置SERPER_API_KEY。请检查config.py和.env文件。 url https://google.serper.dev/search payload json.dumps({q: query}) headers { X-API-KEY: SERPER_API_KEY, Content-Type: application/json } try: response requests.request(POST, url, headersheaders, datapayload) response.raise_for_status() data response.json() # 简单提取前几条结果的标题和摘要 results data.get(organic, []) summaries [] for i, result in enumerate(results[:3]): # 取前3条 title result.get(title, ) snippet result.get(snippet, ) summaries.append(f{i1}. {title}: {snippet}) return \n\n.join(summaries) if summaries else 未找到相关结果。 except requests.exceptions.RequestException as e: return f搜索请求失败: {e}这个tool装饰器将函数转换为LangChain能识别的工具对象。工具的描述Docstring非常重要LLM会据此判断何时使用该工具。3.3 组装Agent在agent_builder.py中我们将大模型、工具和记忆组装成一个可用的Agent。# agent_builder.py from langchain_openai import ChatOpenAI from langchain.agents import create_react_agent, AgentExecutor from langchain import hub from langchain.memory import ConversationBufferMemory from config import OPENAI_API_KEY, OPENAI_BASE_URL, MODEL_NAME from tools import search_web def build_research_agent(): 构建一个具备搜索能力的ReAct模式Agent。 # 1. 初始化LLM llm ChatOpenAI( modelMODEL_NAME, openai_api_keyOPENAI_API_KEY, openai_api_baseOPENAI_BASE_URL, temperature0, # 降低随机性使Agent行为更确定 streamingFalse, ) # 2. 准备工具列表 tools [search_web] # 3. 从LangChain Hub拉取一个ReAct风格的提示词模板 # 这是一个经过优化的提示词指导LLM按照“思考-行动-观察”的循环工作。 prompt hub.pull(hwchase17/react) # 4. 创建记忆使Agent能记住对话历史 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 5. 使用create_react_agent创建Agent agent create_react_agent(llm, tools, prompt) # 6. 将Agent包装进执行器它负责管理循环、调用工具和处理错误 agent_executor AgentExecutor( agentagent, toolstools, memorymemory, verboseTrue, # 设为True可以看到Agent的思考过程调试时非常有用 handle_parsing_errorsTrue, # 处理LLM输出解析错误 max_iterations5, # 限制最大迭代次数防止无限循环 early_stopping_methodgenerate, # 当Agent认为任务完成时停止 ) return agent_executor关键参数解释temperature0对于任务执行型Agent通常设置为0或较低值以减少输出的随机性使行为更可预测。verboseTrue强烈建议在开发阶段开启。这会在控制台打印出Agent的“思考”Thought、“行动”Action和“观察”Observation是理解和调试Agent决策过程的关键。max_iterations5必须设置。防止Agent陷入死循环或因为规划错误而不断重复操作。handle_parsing_errorsTrue当LLM的输出不符合工具调用的格式时执行器会尝试修复或提示错误而不是直接崩溃。3.4 运行与验证创建主程序入口main.py来测试我们的Agent。# main.py from agent_builder import build_research_agent def main(): print(初始化研究助手Agent...) agent build_research_agent() # 测试查询 queries [ 2024年巴黎奥运会新增了哪些比赛项目, # 你可以尝试更复杂的多轮任务例如 # “先查一下特斯拉最新的车型然后看看它的电池技术有什么创新。” ] for query in queries: print(f\n{*50}) print(f用户提问: {query}) print(f{*50}) try: response agent.invoke({input: query}) print(f\nAgent最终回答:\n{response[output]}) except Exception as e: print(f执行过程中出现错误: {e}) if __name__ __main__: main()运行程序python main.py3.5 解析输出与Agent的思考过程当verboseTrue时你将在控制台看到类似以下的输出这揭示了Agent的“内心活动”初始化研究助手Agent... 用户提问: 2024年巴黎奥运会新增了哪些比赛项目 进入新的Agent执行链... Thought: 用户想知道2024年巴黎奥运会新增的比赛项目。我需要查找最新的相关信息。我应该使用搜索工具。 Action: search_web Action Input: 2024年巴黎奥运会 新增比赛项目 Observation: 1. 2024年巴黎奥运会新增项目霹雳舞、滑板、攀岩、冲浪成为正式比赛项目... 2. 巴黎奥运会新增四大项霹雳舞、滑板、攀岩、冲浪其中霹雳舞是首次入奥... 3. 此外举重和拳击项目有所调整... Thought: 我已经找到了相关信息。现在需要整理这些信息清晰地回答用户。 Action: Final Answer Final Answer: 2024年巴黎奥运会新增了霹雳舞Breaking、滑板Skateboarding、运动攀岩Sport Climbing和冲浪Surfing四个大项作为正式比赛项目。其中霹雳舞是首次成为奥运会比赛项目。此外一些传统项目如举重和拳击在具体小项上有所调整。 Agent最终回答: 2024年巴黎奥运会新增了霹雳舞Breaking、滑板Skateboarding、运动攀岩Sport Climbing和冲浪Surfing四个大项作为正式比赛项目。其中霹雳舞是首次成为奥运会比赛项目。此外一些传统项目如举重和拳击在具体小项上有所调整。这个流程完美展示了ReAct模式思考Thought-行动Action调用search_web-观察Observation获取搜索结果-最终思考并给出答案。4. 深入Agent核心规划、工具与记忆的进阶配置一个基础的搜索Agent已经能工作但要构建更强大的Agent需要深入理解每个组件的配置细节。4.1 设计更复杂的规划策略create_react_agent使用的是基础的ReAct策略。对于更复杂的任务你可能需要更强大的规划器。Plan-and-Execute规划与执行让一个“规划者”LLM先制定详细计划再由一个“执行者”LLM或Agent按步骤调用工具。这适合步骤繁多、逻辑清晰的任务。BabyAGI / AutoGPT风格基于目标驱动动态创建任务列表并优先执行。这需要更复杂的任务管理和记忆系统。在LangChain中你可以通过自定义AgentType或使用initialize_agent函数并指定agent_type来尝试不同的内置策略例如AgentType.ZERO_SHOT_REACT_DESCRIPTION零样本ReAct、AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION带聊天记忆的ReAct等。# 示例使用不同的内置Agent类型 from langchain.agents import initialize_agent, AgentType agent initialize_agent( tools, llm, agentAgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, # 专为对话设计的ReAct Agent memorymemory, verboseTrue, max_iterations5, handle_parsing_errorsTrue, )4.2 创建与集成自定义工具除了搜索Agent可以集成任何你能用代码定义的函数作为工具。关键是为工具提供清晰、准确的描述。# tools.py 新增工具 from datetime import datetime import pytz tool def get_current_time(timezone: str Asia/Shanghai) - str: 获取指定时区的当前日期和时间。 参数: timezone: 时区字符串例如 Asia/Shanghai, America/New_York。默认为 Asia/Shanghai。 返回: 格式化后的当前时间字符串。 try: tz pytz.timezone(timezone) current_time datetime.now(tz) return current_time.strftime(%Y-%m-%d %H:%M:%S %Z%z) except pytz.exceptions.UnknownTimeZoneError: return f错误未知时区 {timezone}。请提供有效的时区名称如 UTC, Asia/Shanghai。 tool def calculate(expression: str) - str: 执行一个简单的数学表达式计算。支持加减乘除(-*/)和括号。 参数: expression: 数学表达式字符串例如 (3 4) * 2。 返回: 计算结果字符串或错误信息。 # 警告使用eval存在安全风险仅用于演示。生产环境应使用安全库如ast.literal_eval或自定义解析器。 try: # 极其简单的安全过滤生产环境需要更严格的检查 allowed_chars set(0123456789-*/(). ) if not all(c in allowed_chars for c in expression): return 错误表达式包含非法字符。 result eval(expression) return str(result) except Exception as e: return f计算错误: {e}将这些新工具加入到工具列表中Agent就具备了查询时间和进行基础计算的能力。LLM会根据你的问题自动判断是否需要使用这些工具。4.3 配置有效的记忆系统ConversationBufferMemory会将整个对话历史存储在内存中。对于长对话这可能导致上下文过长超出LLM限制和成本增加。更高级的记忆方案包括ConversationSummaryMemory自动总结之前的对话历史只将摘要放入上下文节省token。from langchain.memory import ConversationSummaryMemory memory ConversationSummaryMemory(llmllm, memory_keychat_history, return_messagesTrue)向量存储记忆将历史对话片段转换为向量存入数据库如Chroma在需要时进行语义检索只召回最相关的历史信息。这适合超长对话和知识库型应用。自定义记忆你可以根据业务逻辑将记忆持久化到数据库如Redis、PostgreSQL中实现跨会话的记忆。4.4 处理结构化输出与工具调用有时我们希望Agent返回结构化的数据如JSON而不仅仅是文本。这可以通过让LLM遵循特定的输出格式如Pydantic模型来实现。LangChain提供了create_structured_chat_agent等方案来支持。# 示例使用Pydantic定义结构化输出简化示意 from pydantic import BaseModel, Field from langchain.agents import create_structured_chat_agent class ResearchReport(BaseModel): topic: str Field(description研究主题) key_findings: list[str] Field(description关键发现列表) summary: str Field(description总体摘要) # 然后可以创建一个输出解析器并集成到Agent提示词中引导LLM生成符合格式的答案。5. 生产环境部署与关键问题排查将原型Agent转化为生产可用的服务需要解决稳定性、成本、监控和安全等问题。5.1 部署架构考量一个典型的Agent服务后端架构如下客户端 (Web/App) - API网关 - Agent服务 (FastAPI/Flask) - LangChain Agent - LLM API 工具服务 | 记忆存储 (Redis/DB) | 向量数据库 (Chroma/Weaviate)API层使用FastAPI或Flask提供RESTful或WebSocket接口处理并发请求。服务层Agent实例应设计为无状态或轻状态将记忆等状态外置到Redis或数据库中以便水平扩展。LLM调用必须实现重试、退避、熔断和限流机制以应对API不稳定或限速。异步处理对于长耗时任务应考虑异步队列如Celery Redis处理避免HTTP请求超时。5.2 常见问题与排查路径开发和使用Agent过程中你一定会遇到以下典型问题。这里提供系统的排查思路。问题现象可能原因检查与解决步骤Agent陷入死循环或达到max_iterations1. 任务规划不清晰LLM无法找到终结路径。2. 工具返回的结果无法满足LLM生成Final Answer的条件。3. 提示词Prompt未明确指示任务完成的标志。1.开启verboseTrue观察Agent的“Thought”和“Action”看它是否在重复无意义的操作。2. 检查工具返回的内容是否清晰、相关。优化工具的输出格式。3. 在系统提示词中强化“当你认为已经获得足够信息回答用户问题时请使用Final Answer”的指令。4. 适当增加max_iterations但需谨慎。LLM无法正确选择工具1. 工具描述Docstring不够清晰。2. 工具太多LLM混淆。3. LLM的temperature设置过高导致选择随机。1. 为每个工具编写精确、无歧义的描述说明输入参数和输出。2. 精简工具集或对工具进行分类。3. 将temperature设为0或接近0的值。4. 使用AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION等更擅长处理工具的Agent类型。工具调用参数格式错误LLM生成的Action Input不符合工具函数定义的参数格式如应为JSON字符串却生成了纯文本。1. 在工具描述中明确参数类型和示例。2. 在Agent执行器中启用handle_parsing_errorsTrue。3. 使用create_structured_chat_agent它通过Pydantic模型更好地约束输出格式。API调用超时或失败1. 网络问题。2. LLM API服务不稳定或达到速率限制。3. 工具调用的外部API失败。1. 为所有网络请求LLM调用、工具API调用添加重试机制和合理的超时设置。2. 监控API调用状态码和错误信息。3. 实现降级策略例如工具失败时返回友好错误信息让Agent尝试其他路径。上下文长度超限1. 对话历史记忆过长。2. 工具返回的内容过于冗长。1. 使用ConversationSummaryMemory或向量存储记忆来压缩历史。2. 限制工具返回内容的长度或让LLM先进行摘要再存入记忆。3. 选择上下文窗口更大的模型如GPT-4 Turbo。回答存在“幻觉”或事实错误1. 依赖的LLM本身存在幻觉。2. 搜索工具返回了过时或不准确的信息。3. Agent错误地综合了多个来源的信息。1.为关键事实提供引用源。要求工具返回信息时附带来源如URL并在最终答案中注明。2. 使用更可靠的工具和数据源。3. 在最终输出前增加一个“验证”步骤让LLM自我检查答案的一致性。5.3 成本与性能优化Agent的每次“思考-行动”循环都会消耗LLM的token成本可能迅速增长。优化提示词精简系统提示词和工具描述移除冗余信息。限制迭代次数严格设置max_iterations避免简单问题复杂化。使用更小/更便宜的模型对于工具选择、规划等步骤可以尝试使用更小、更快的模型如gpt-3.5-turbo仅在需要复杂推理或生成最终答案时使用大模型。缓存对常见、结果不变的查询如“今天的日期”进行缓存。异步与流式对于前端应用考虑使用流式响应Streaming来提升用户体验让用户逐步看到思考过程和结果。5.4 安全与合规建议工具调用安全像上面calculate工具中的eval是极度危险的。生产环境中任何执行代码、访问数据库、调用系统命令的工具都必须进行严格的输入验证、权限控制和沙箱隔离。数据隐私确保通过Agent处理的数据符合隐私法规。避免将敏感信息如个人身份信息、密钥直接传递给LLM或不可信的工具。内容审核在Agent的最终输出返回给用户前可以增加一层内容安全过滤防止生成有害或不适当的内容。可控性为Agent设置明确的边界。例如禁止其执行金融交易、发送邮件等高风险操作除非经过额外的人工确认或授权流程。6. 扩展方向与学习路径掌握了基础Agent构建后你可以向以下几个方向深入探索构建更专业和强大的智能体系统。6.1 多智能体Multi-Agent系统让多个具备不同专长的Agent协作完成复杂任务。例如辩论式多个Agent从不同角度分析问题最终合成结论。分层式一个“管理者”Agent负责分解任务并分配给“工作者”Agent执行。竞争式用于模拟或游戏场景。框架如CrewAI、AutoGen专门为此设计。6.2 与RAG深度集成将Agent与检索增强生成RAG结合打造基于私有知识的专家系统。使用LlamaIndex或LangChain的RAG模块将企业文档、知识库向量化。创建一个“检索”工具Agent在需要专业知识时调用该工具查询向量数据库。将检索到的片段作为上下文提供给LLM生成精准、有据可依的答案。6.3 强化学习与长期记忆让Agent能够从与环境的交互中学习在线学习或利用长期记忆优化未来的决策。这涉及更复杂的状态、奖励函数设计和模型微调。6.4 领域专用Agent针对特定领域如金融分析、代码生成、客服定制工具集、提示词和验证流程。例如代码生成Agent可以集成代码解释器、单元测试工具、代码风格检查工具等。6.5 学习资源与下一步官方文档精读LangChain和LlamaIndex的官方文档特别是Agents和Tools章节。开源项目在GitHub上搜索“AI Agent”、“langchain agent example”等关键词学习真实项目的架构和代码。论文与博客关注ReAct、Toolformer、HuggingGPT等经典论文理解其设计思想。动手实践从改造本文的示例开始尝试接入不同的工具如数据库、邮件、JIRA、不同的记忆方式并解决实际遇到的所有错误。构建可靠的AI Agent是一个系统工程它考验的不仅是对大模型的理解更是对软件架构、异常处理和业务逻辑的把握。从一个小而可用的原型出发逐步迭代和加固是通往“Agent大神”最踏实的路径。 30款热门AI模型一站整合DeepSeek/GLM/Qwen 随心用限时 5 折。 点击领海量免费额度