ARTICLE DETAIL

资讯详情

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

AI Agent开发实战:从核心架构到天气查询助手构建

AI Agent开发实战:从核心架构到天气查询助手构建 在实际 AI 应用开发中我们经常遇到一个核心矛盾大模型本身知识渊博但让它直接处理复杂、多步骤的任务时往往表现得不尽如人意。比如你无法直接要求一个基础大模型“帮我分析上个月的销售数据生成一份PPT并发送给市场部经理”。它可能会生成一段描述这个过程的文字但无法真正执行。这就是Agent智能体技术要解决的核心问题。Agent 不是一个新的模型而是一个赋予大模型“行动能力”的框架或系统它让大模型能够理解任务、规划步骤、调用工具如代码执行器、API、数据库并最终完成目标。对于开发者而言从“调用大模型 API 生成文本”到“构建一个能自主完成任务的智能体”中间存在巨大的认知和实践鸿沟。这涉及到对智能体架构、记忆、规划、工具使用等核心概念的理解以及如何选择框架、编写技能Skill、处理异常等工程实践。本文旨在为你梳理一条清晰的 Agent 开发学习路径从核心概念到环境搭建再到一个可运行的最小案例并深入探讨开发中的关键决策与常见陷阱。无论你是希望将 AI 能力集成到现有业务系统还是探索下一代 AI 原生应用掌握 Agent 开发都是不可或缺的一环。1. 理解 Agent 的核心架构从“思考”到“行动”在深入代码之前必须建立对 Agent 系统的基本认知。一个典型的 Agent 系统不是单一模块而是一个由多个组件协同工作的架构。1.1 Agent 是什么超越聊天机器人的“执行者”你可以将 Agent 理解为一个具备感知、规划、行动和反思能力的智能程序。其核心工作流通常遵循ReAct (Reasoning Acting)范式感知Perception接收用户指令或环境信息。思考Reasoning大模型LLM分析当前状态、历史记忆和可用工具决定下一步该“想什么”或“做什么”。行动Acting根据思考结果执行具体操作如调用一个工具函数、查询知识库或输出最终答案。观察Observation获取行动的结果并将其作为新的输入反馈给思考环节。 这个循环会持续进行直到任务被判定为完成。与传统的规则引擎或脚本相比Agent 的“思考”环节由大模型驱动使其能够处理开放域、非结构化的复杂任务。与仅用于对话的聊天机器人相比Agent 的核心特征是拥有并能够调用外部工具Tools来影响现实世界或数字世界。1.2 Agent 系统的关键组件构建一个功能完整的 Agent通常需要设计和集成以下组件大脑Brain - 大语言模型LLM负责所有的推理、规划和决策。它是 Agent 的“思考”中心。你可以使用云端 API如 OpenAI GPT-4, Claude, DeepSeek或本地部署的模型如 Ollama 管理的 Llama、Qwen 等。技能Skills / 工具Tools这是 Agent 的“手”和“脚”。每个技能都是一个可执行的函数封装了特定的能力。例如search_web(query): 执行网络搜索。execute_python_code(code): 在安全沙箱中运行 Python 代码。query_database(sql): 执行 SQL 查询。send_email(to, subject, body): 发送邮件。 Agent 通过大模型决定在何时调用哪个工具并生成符合工具输入要求的参数。记忆Memory让 Agent 拥有上下文感知能力。分为短期记忆当前对话上下文和长期记忆向量数据库存储的历史交互、知识。记忆使 Agent 能在多轮交互中保持一致性并基于历史经验进行优化。规划器Planner对于复杂任务Agent 需要将其分解为子任务。规划器负责制定或调整执行计划。有时这个功能直接由大模型承担有时则由专门的模块处理。执行器Executor负责调度规划器产生的任务序列调用相应的工具并管理整个执行流程的状态。1.3 主流 Agent 开发框架简介为了高效开发我们通常会借助现有的框架。以下是一些主流选择各有侧重框架名称主要特点适用场景LangChain / LangGraph生态最成熟组件丰富Models, Tools, Chains, Agents社区活跃。LangGraph 特别适合构建有状态的、多步骤的 Agent 工作流。快速原型验证构建复杂的、有状态的工作流需要大量现成工具集成。LlamaIndex最初专注于 RAG检索增强生成现在也提供了强大的 Agent 功能尤其在数据查询和知识推理方面有优势。任务与私有数据查询、分析强相关需要深度结合 RAG 的 Agent。AutoGen (by Microsoft)专注于多智能体Multi-Agent协作可以轻松定义多个不同角色的 Agent 让他们对话合作解决问题。需要模拟团队协作、辩论、评审等涉及多个 Agent 交互的场景。Semantic Kernel (by Microsoft)强调将传统编程技能与 AI 语义技能Semantic Skills相结合方便 .NET 开发者集成。.NET 技术栈项目希望将 AI 能力以插件形式融入现有应用。Dify, FastGPT 等提供可视化编排的 AI 应用开发平台可以低代码方式构建包含 Agent 功能的应用。追求开发效率业务逻辑可通过界面配置对代码灵活性要求不高。对于初学者和大多数应用场景从LangChain入手是一个不错的选择因为它提供了最全面的抽象和丰富的示例。2. 环境准备与开发栈选择在开始编写第一个 Agent 之前需要搭建好开发环境并做出关键的技术选型。2.1 基础环境配置你需要准备以下基础环境Python 环境推荐使用 Python 3.9 或以上版本。使用conda或venv创建独立的虚拟环境是绝对必要的以避免包依赖冲突。# 使用 conda 创建环境 conda create -n ai-agent python3.10 conda activate ai-agent # 或使用 venv python -m venv ai-agent # Windows ai-agent\Scripts\activate # Linux/Mac source ai-agent/bin/activate代码编辑器VS Code 或 PyCharm 均可确保安装好 Python 插件。API 密钥如果你计划使用 OpenAI、Anthropic 等云端模型需要提前注册并获取相应的 API Key。请妥善保管不要直接提交到代码仓库。2.2 核心依赖安装我们以 LangChain 为例安装核心包。这里假设你使用 OpenAI 的模型。pip install langchain langchain-openai langchain-communitylangchain: 核心框架。langchain-openai: OpenAI 模型的官方集成。langchain-community: 包含大量第三方工具和集成。如果你需要与本地模型交互例如通过 Ollama则还需要安装pip install langchain-ollama2.3 模型选择云端 API 还是本地模型这是第一个关键决策点取决于你的需求、预算和数据敏感性。维度云端 API (如 GPT-4, Claude)本地模型 (如 Llama3, Qwen via Ollama)性能与能力强。通常是最先进的模型推理、编程、规划能力强。中等至强。顶尖开源模型能力接近 GPT-3.5但复杂任务规划仍可能落后于 GPT-4。成本按 token 收费持续调用成本高。一次性硬件投入。推理无需持续付费但需要较强的 GPU。速度网络延迟速度取决于 API 响应。无网络延迟速度取决于本地硬件。数据隐私数据需发送至第三方服务器。数据完全本地隐私和安全可控。可控性受提供商服务条款和可用性限制。完全自主可控可定制化微调。开发便捷性非常方便一个 API Key 即可开始。需要自行部署和管理模型有一定运维成本。建议在学习和原型开发阶段优先使用云端 API如 GPT-3.5-turbo成本低且稳定。当进入涉及敏感数据的生产环境概念验证PoC时再评估是否迁移到本地或私有化部署的模型。3. 构建你的第一个 Agent一个天气查询助手让我们通过一个经典的“天气查询助手”案例将理论付诸实践。这个 Agent 将能够理解用户关于天气的询问并调用一个模拟的天气工具来获取信息。3.1 项目结构与初始化创建一个新的项目目录结构如下weather_agent/ ├── tools/ │ └── weather_tool.py # 自定义天气工具 ├── agents/ │ └── weather_agent.py # Agent 定义与执行逻辑 ├── main.py # 程序入口 └── requirements.txt # 依赖列表在requirements.txt中写入langchain langchain-openai python-dotenv3.2 创建自定义工具Skill工具是 Agent 能力的扩展。在tools/weather_tool.py中我们定义一个简单的天气查询工具。在生产环境中这里应该调用真实的天气 API如 OpenWeatherMap。# tools/weather_tool.py from langchain.tools import tool from typing import Optional tool def get_weather(city: str, date: Optional[str] None) - str: 根据城市名称和可选日期查询天气信息。 Args: city: 城市名称例如“北京”、“Shanghai”。 date: 查询日期格式为‘YYYY-MM-DD’。如果为None则默认为今天。 Returns: 返回该城市的天气情况描述字符串。 # 这是一个模拟函数。真实场景应调用天气API。 # 例如response requests.get(fhttps://api.weatherapi.com/...?q{city}dt{date}) print(f[工具调用] 正在查询{city}在{date if date else 今天}的天气...) # 模拟一些逻辑 weather_conditions [晴, 多云, 阴, 小雨, 中雨, 大雪] import random temperature random.randint(-5, 35) condition random.choice(weather_conditions) result f{city}在{date if date else 今天}的天气是{condition}气温大约{temperature}摄氏度。 return result关键点解释tool装饰器这是 LangChain 提供的装饰器它能自动将函数转化为 LangChain Agent 可以识别和调用的工具。类型提示str,Optional[str]这非常重要LangChain 会将函数的参数类型和文档字符串提供给大模型帮助它理解如何调用这个工具。清晰的文档字符串描述工具的功能、参数和返回值。这是大模型决定是否以及如何调用该工具的主要依据。3.3 构建并运行 Agent在agents/weather_agent.py中我们创建 Agent 的核心逻辑。# agents/weather_agent.py import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from tools.weather_tool import get_weather # 1. 加载环境变量从 .env 文件读取 API Key load_dotenv() openai_api_key os.getenv(OPENAI_API_KEY) if not openai_api_key: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY) # 2. 初始化大模型 # 使用 GPT-3.5-turbo性价比高适合演示 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, openai_api_keyopenai_api_key) # temperature0 使输出更确定适合工具调用 # 3. 定义工具列表 tools [get_weather] # 4. 构建提示词模板 # 这是指导 Agent 行为的关键。SystemMessage 设定角色和规则。 prompt ChatPromptTemplate.from_messages([ (system, 你是一个专业的天气查询助手。请根据用户的问题使用合适的工具获取天气信息。如果你没有合适的工具来回答问题请如实告知用户。请用中文回复。), MessagesPlaceholder(variable_namechat_history), # 预留位置给对话历史记忆 (human, {input}), # 用户输入 MessagesPlaceholder(variable_nameagent_scratchpad), # 预留位置给 Agent 的思考过程 ]) # 5. 创建 Agent agent create_openai_tools_agent(llmllm, toolstools, promptprompt) # 6. 创建 Agent 执行器 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # verboseTrue 会打印出 Agent 的思考过程便于调试 # handle_parsing_errorsTrue 当模型输出无法解析为工具调用时进行友好处理 def run_agent(query: str) - str: 执行 Agent处理用户查询 try: result agent_executor.invoke({input: query, chat_history: []}) return result[output] except Exception as e: return fAgent 执行出错: {e} if __name__ __main__: # 简单测试 test_queries [ 北京今天天气怎么样, 帮我看看上海明天会不会下雨, 旧金山下周一的天气呢 ] for query in test_queries: print(f\n用户: {query}) response run_agent(query) print(f助手: {response})在项目根目录创建.env文件填入你的 OpenAI API KeyOPENAI_API_KEYsk-你的真实key3.4 运行与验证在项目根目录下运行python agents/weather_agent.py你应该能看到类似以下的输出其中verboseTrue会展示 Agent 内部的思考链Chain of Thought用户: 北京今天天气怎么样 进入新的 AgentExecutor 链... 我需要查询北京今天的天气我有一个工具可以查询天气。 动作get_weather 动作输入{city: 北京} [工具调用] 正在查询北京在今天的天气... 观察北京在今天天气是晴气温大约22摄氏度。 思考我已经获得了北京的天气信息。 最终答案北京今天天气晴朗气温大约22摄氏度。 链结束。 助手: 北京今天天气晴朗气温大约22摄氏度。这个输出清晰地展示了 ReAct 范式的过程思考需要查询天气 -行动调用get_weather工具 -观察工具返回结果 -最终回答。4. 深入 Agent 开发的关键议题与排错完成第一个 Agent 后你会遇到更复杂的需求和问题。以下是几个核心议题的深入探讨。4.1 工具调用失败与参数解析错误这是 Agent 开发中最常见的问题之一。现象是 Agent 决定调用工具但调用时出错。常见原因与排查工具描述不清模型的“思考”依赖于你为工具编写的文档字符串Docstring。确保描述准确、参数意义明确。参数类型不匹配模型生成的参数格式可能不符合工具函数的要求。例如工具期望date是字符串2023-10-01但模型可能生成明天。解决方案在工具函数内部增加参数清洗和验证逻辑。或者使用 LangChain 的StructuredTool来定义更严格的参数模式Pydantic Model。模型“幻觉”调用不存在的工具如果提示词中未清晰界定工具边界模型可能会编造工具名。解决方案在系统提示词中明确列出可用工具及其用途。使用create_openai_tools_agent这类 Agent 类型它要求模型必须从提供的工具列表中选择。改进的工具定义示例使用 Pydantic 强化结构from langchain.tools import StructuredTool from pydantic import BaseModel, Field class WeatherInput(BaseModel): city: str Field(description城市的中文或英文名称) date: str Field(defaulttoday, description查询日期格式为 YYYY-MM-DD 或 ‘today‘, ‘tomorrow‘) def get_weather_structured(city: str, date: str today) - str: # ... 实现逻辑同上 ... return result weather_tool_structured StructuredTool.from_function( funcget_weather_structured, nameget_weather, description查询指定城市在指定日期的天气, args_schemaWeatherInput, # 关键绑定严格的输入模式 return_directFalse, )4.2 记忆Memory的实现无状态的 Agent 无法进行多轮对话。我们需要为其添加记忆。LangChain 提供了多种记忆后端。为天气助手添加对话记忆# agents/weather_agent_with_memory.py from langchain.memory import ConversationBufferMemory # 初始化记忆 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 在创建 AgentExecutor 时传入 memory agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, memorymemory, # 关键绑定记忆 handle_parsing_errorsTrue ) # 调用时不再需要手动传入空的 chat_history result agent_executor.invoke({input: query}) # memory 会自动管理 chat_history 的存储和注入现在当你连续问“北京天气如何”和“那上海呢”Agent 能理解“那上海呢”指的是天气查询。4.3 处理复杂任务与规划对于“帮我对比北京和上海未来三天的天气”这类任务简单的单步工具调用不够。你需要更强大的规划能力。方案一使用 LangChain 的 Plan-and-Execute 模式。这需要一个“规划者”LLM 先制定计划再由“执行者”LLM 按计划调用工具。方案二使用 LangGraph。它允许你以图Graph的形式定义工作流明确节点工具/LLM调用和边执行路径非常适合复杂、有状态的流程。简单示例使用 LangGraph 编排多城市查询# 注这是一个概念性简化示例实际 LangGraph 代码更详细 from langgraph.graph import StateGraph, END from typing import TypedDict, List import operator class AgentState(TypedDict): cities: List[str] weather_results: List[str] final_answer: str def plan_step(state: AgentState): 规划节点解析用户输入提取要查询的城市列表 # 这里可以调用一个 LLM 来解析用户意图 # 假设我们简单地从输入中提取 state[cities] [北京, 上海] # 模拟解析结果 return state def query_weather_node(state: AgentState): 执行节点并发或顺序查询每个城市的天气 for city in state[cities]: weather get_weather(city) # 调用工具 state[weather_results].append(weather) return state def synthesize_step(state: AgentState): 合成节点汇总所有结果生成最终答案 all_results \n.join(state[weather_results]) state[final_answer] f对比结果如下\n{all_results} return state # 构建图 workflow StateGraph(AgentState) workflow.add_node(planner, plan_step) workflow.add_node(querier, query_weather_node) workflow.add_node(synthesizer, synthesize_step) workflow.set_entry_point(planner) workflow.add_edge(planner, querier) workflow.add_edge(querier, synthesizer) workflow.add_edge(synthesizer, END) app workflow.compile() # 运行这个图 result app.invoke({cities: [], weather_results: [], final_answer: })4.4 生产环境考量当 Agent 从演示走向生产必须考虑以下问题稳定性与容错工具调用超时与重试网络请求可能失败。为工具调用添加重试机制和超时设置。LLM 调用限流与降级监控 API 调用频率准备备用模型如从 GPT-4 降级到 GPT-3.5。输入输出过滤对用户输入和模型输出进行安全检查防止提示词注入或生成有害内容。可观测性全链路日志记录每一次 LLM 调用输入/输出、工具调用参数/结果、Agent 的中间步骤。这对于调试和优化至关重要。链路追踪Tracing使用 LangSmith 或 OpenTelemetry 等工具可视化 Agent 的执行轨迹分析耗时和成本。成本控制缓存对相同的 LLM 请求或工具查询结果进行缓存减少重复调用。Token 计数估算每次交互的 token 消耗设置预算和警报。安全工具权限控制不是所有工具都应对所有用户开放。根据用户身份或上下文动态提供工具列表。沙箱环境对于执行代码如execute_python_code这类高危工具必须在严格的沙箱环境中运行。5. 最佳实践与进阶学习路线5.1 Agent 开发清单在将一个 Agent 投入生产前请对照此清单进行检查[ ]工具设计每个工具是否有清晰、单一的责任文档字符串是否准确描述了功能、参数和返回值[ ]提示词工程系统提示词是否明确设定了 Agent 的角色、规则和可用工具是否限制了其行为范围[ ]错误处理是否处理了 LLM 输出解析失败、工具调用异常、网络超时等情况[ ]记忆管理是否选择了合适的记忆类型缓冲、窗口、摘要记忆长度是否合理避免上下文过长[ ]可观测性是否记录了关键步骤的日志是否有办法追踪一次用户请求的完整执行链[ ]性能是否对耗时长的工具调用做了异步处理是否有缓存策略[ ]安全用户输入是否经过清洗工具调用是否有权限校验执行代码是否在沙箱中5.2 常见陷阱坑过度依赖 Agent 处理一切并非所有任务都需要 Agent。简单的分类、提取任务用传统的函数或 RAG 可能更高效、更稳定。Agent 适用于需要多步骤推理和外部交互的复杂任务。提示词过于冗长或模糊提示词质量直接决定 Agent 表现。避免写小说要清晰、简洁、结构化。明确给出“如果做不到 X就做 Y”的兜底指令。忽视工具调用的可靠性工具是 Agent 与真实世界交互的桥梁。工具本身的稳定性、错误处理和接口设计比 Agent 框架的选择更重要。无限循环或昂贵调用Agent 可能在规划中陷入死循环或反复调用高成本工具如网络搜索。需要在系统层面设置最大迭代次数和成本监控。5.3 进阶学习方向掌握了单 Agent 开发后你可以探索更前沿的领域多智能体Multi-Agent系统让多个具有不同角色分析师、执行者、评审员的 Agent 协作解决问题。研究AutoGen和CrewAI框架。智能体与 RAG 深度结合让 Agent 不仅能调用工具还能从庞大的私有知识库中精准检索信息。深入研究LlamaIndex的 Agent 能力。智能体模拟与评估如何定量评估一个 Agent 的性能如何构建测试场景Simulation来批量测试其可靠性和有效性长上下文与记忆优化当对话或任务历史很长时如何高效地利用记忆研究记忆压缩、总结和向量检索等技术。强化学习与智能体优化让 Agent 能从与环境的交互中学习优化其决策策略。学习 Agent 开发是一个从“知其然”到“知其所以然”的过程。从使用高级框架封装好的 Agent 开始快速体验其能力然后深入理解其组成模块模型、提示词、工具、记忆并学会自定义最后挑战复杂的工作流编排和多智能体协作。始终以解决实际问题为导向先构建一个最小可行产品MVP再根据反馈和需求迭代优化这是掌握这项技术最有效的路径。
返回列表