ARTICLE DETAIL

资讯详情

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

AI Agent开发实战:从零搭建具备工具调用与记忆的智能体

AI Agent开发实战:从零搭建具备工具调用与记忆的智能体 这次我们来看一个关于 AI Agent 智能体开发的实战教程。AI Agent 不是一个遥不可及的概念它本质上是一个能理解目标、规划步骤、调用工具并执行任务的智能程序。对于开发者而言核心问题是如何快速、低成本地搭建一个能实际运行的智能体而不是停留在理论层面。本文将聚焦于从零到一的搭建过程重点关注环境准备、核心框架选择、工具集成、记忆系统实现以及如何通过 API 提供服务。无论你是想为个人项目添加自动化能力还是探索智能体在特定业务场景的应用这篇手把手的指南都将提供清晰的路径和可落地的代码。我们将使用目前主流的开发框架这些框架通常对硬件要求友好支持在普通开发机甚至 CPU 环境下进行原型验证。教程的重点在于“能用”和“怎么用”我们会先梳理智能体的核心组件和可选技术栈然后通过一个具体的任务场景例如联网搜索与信息整理来串联所有环节最后部署成可调用的服务。整个过程会涉及 Python 环境、大模型 API 调用、工具函数封装、记忆存储等关键技术点。1. 核心能力速览在深入代码之前我们先快速了解通过本教程你将构建的智能体具备哪些核心能力以及大致的资源门槛。能力项说明与实现目标项目类型AI Agent 智能体开发框架实践核心功能任务规划、工具调用如搜索、计算、记忆管理、多轮对话大模型依赖需接入大语言模型 API如 OpenAI GPT、国产大模型等本地无需部署超大模型硬件门槛极低。开发阶段主要依赖 CPU 和网络推理由云端 API 完成。本地测试无需高端 GPU。内存/显存占用开发框架本身内存占用小通常几百MB主要消耗在运行时代理逻辑和上下文缓存。支持平台Windows / macOS / Linux启动方式通过 Python 脚本启动可封装为 CLI 工具或 Web API 服务是否支持 API是。最终可将智能体封装为 RESTful API 或 FastAPI 服务供其他系统调用。是否支持批量/异步任务是。框架通常支持异步调用可设计任务队列处理批量请求。适合场景个人自动化助手、数据分析智能体、客服问答原型、知识检索工具、业务流程自动化雏形2. 适用场景与使用边界在开始搭建前明确智能体能做什么、不能做什么至关重要这有助于设定合理的预期并设计正确的架构。适合谁用开发者/工程师希望将大模型能力集成到现有系统实现自动化流程。产品经理/业务人员想快速验证一个基于 AI 的自动化想法是否可行。学生/研究者学习智能体架构进行相关实验和原型开发。能解决什么问题信息获取与整合根据用户问题自动搜索网络、查询数据库并汇总报告。自动化流程例如监控特定信息源触发总结并发送邮件。多步骤任务分解将复杂指令如“帮我策划一次旅行”分解为查天气、找景点、订酒店等子任务并执行。个性化交互通过记忆系统记住用户偏好提供连续性服务。不适合什么场景需要极高实时性大模型 API 调用有延迟不适合毫秒级响应的交易系统。完全离线环境本教程基于云端大模型 API若需完全离线需本地部署大模型复杂度陡增。替代确定性业务逻辑智能体擅长处理模糊、开放性问题但对于有严格规则和确定输出的计算如会计记账传统编程更可靠。合规与安全边界API 调用合规使用大模型 API 需遵守其服务条款注意调用频率和内容限制。数据隐私智能体处理的数据尤其是用户输入需考虑隐私政策避免传输敏感个人信息。工具使用授权智能体调用的第三方工具如搜索引擎、数据库需确保有合法使用权。结果审核智能体的输出可能存在“幻觉”或错误关键业务场景必须加入人工审核或复核机制。3. 环境准备与前置条件搭建智能体的开发环境相对简单主要工作是配置 Python 和安装必要的库。1. 操作系统Windows 10/11, macOS 10.15, 或主流 Linux 发行版如 Ubuntu 20.04。2. Python 环境推荐使用 Python 3.9 或 3.10与多数 AI 库兼容性最好。使用conda或venv创建独立的虚拟环境是最佳实践避免包冲突。3. 必备工具代码编辑器VS Code、PyCharm 等。终端/命令行。包管理工具pip。4. 关键依赖库智能体开发通常会选择一个框架来简化流程以下列举几个常见选择及其核心依赖LangChain / LangGraph目前最流行的智能体框架之一提供了丰富的工具链和模块。AutoGen由微软推出支持多智能体协作。Semantic Kernel微软推出的轻量级 SDK易于集成。Dify一个开源的 LLM 应用开发平台提供可视化编排和 API。Transformers如果你需要本地运行一些小模型作为补充。本教程将以LangChain为例进行演示因为它生态丰富、文档齐全适合学习和快速原型开发。5. 大模型 API 密钥这是智能体的“大脑”。你需要准备一个可用的 API Key。OpenAI GPT需在 OpenAI 平台注册并获取 API Key。国产大模型如智谱 AI、百度文心、阿里通义、月之暗面等在其开放平台申请。注意事项保管好 API Key不要上传到公开仓库。建议通过环境变量读取。4. 安装部署与启动方式我们从一个最简化的环境开始搭建一个具备基础能力的智能体。步骤 1创建并激活虚拟环境# 使用 conda (推荐) conda create -n ai-agent python3.10 conda activate ai-agent # 或使用 venv python -m venv ai-agent-env # Windows ai-agent-env\Scripts\activate # macOS/Linux source ai-agent-env/bin/activate步骤 2安装核心依赖我们将安装 LangChain 及其相关工具链。langchain-openai是 LangChain 与 OpenAI 集成的官方包。pip install langchain langchain-openai langchain-community # 安装用于构建Web应用的FastAPI和请求库 pip install fastapi uvicorn requests # 安装用于管理环境变量的库 pip install python-dotenv步骤 3配置环境变量在项目根目录创建.env文件用于安全存储 API Key。# .env 文件内容 OPENAI_API_KEY你的-openai-api-key-here # 如果使用其他模型例如智谱AI ZHIPUAI_API_KEY你的-zhipuai-api-key-here然后在 Python 代码中通过dotenv加载# config.py from dotenv import load_dotenv import os load_dotenv() # 加载 .env 文件中的变量 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在 .env 文件中设置 OPENAI_API_KEY 环境变量)步骤 4编写第一个智能体脚本创建一个simple_agent.py文件实现一个能使用计算器和搜索工具的智能体。这里我们使用 LangChain 的“工具调用”功能。# simple_agent.py from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain.tools import Tool from langchain import hub import math import requests # 1. 定义工具 # 工具1一个简单的计算器 def calculator(query: str) - str: 用于执行数学计算。输入应为一个数学表达式字符串。 try: # 安全警告在生产环境中应对输入进行严格检查和沙箱化避免执行任意代码。 # 这里仅作演示使用 eval 有安全风险。 result eval(query) return f计算结果: {result} except Exception as e: return f计算错误: {e} # 工具2一个模拟的搜索工具实际可接入 SerperAPI、Google Search API 等 def search_web(query: str) - str: 用于搜索网络信息。输入为一个搜索查询字符串。 # 此处为模拟实际应调用真正的搜索API # 例如: response requests.get(fhttps://api.serper.dev/search?q{query}) mock_results { python tutorial: Python 是一种高级编程语言以简洁易读著称。, weather today: 今天天气晴朗气温 25 摄氏度。, AI agent: AI 智能体是能够感知环境、做出决策并执行动作的自治实体。 } return mock_results.get(query.lower(), f未找到关于 {query} 的模拟结果。) # 将函数包装成 LangChain Tool 对象 tools [ Tool( nameCalculator, funccalculator, description当需要回答数学问题时使用此工具。输入应为一个可计算的表达式如 2 2 或 sqrt(16)。 ), Tool( nameWeb_Searcher, funcsearch_web, description当需要获取实时或最新信息时使用此工具。输入为一个搜索关键词或问题。 ), ] # 2. 初始化大模型 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0, api_keyOPENAI_API_KEY) # 3. 获取预设的提示词模板LangChain Hub 提供了很多优秀的模板 prompt hub.pull(hwchase17/openai-tools-agent) # 4. 创建智能体 agent create_tool_calling_agent(llmllm, toolstools, promptprompt) # 5. 创建执行器 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 6. 运行测试 if __name__ __main__: test_queries [ 计算 15 的平方根是多少, 搜索一下 AI agent 的定义。, 先搜索今天的天气然后根据气温判断我该穿什么衣服。 ] for query in test_queries: print(f\n用户: {query}) response agent_executor.invoke({input: query}) print(f智能体: {response[output]})运行这个脚本python simple_agent.py如果一切正常你将看到类似以下的输出智能体会自动判断何时调用哪个工具并整合结果用户: 计算 15 的平方根是多少 进入新的 AgentExecutor 链... 我需要计算 15 的平方根应该使用计算器工具。 调用: Calculator 参数: sqrt(15) 观察: 计算结果: 3.872983346207417 思考: 我已经得到了计算结果。 链结束。 智能体: 15 的平方根大约是 3.873。至此一个最基本的、具备工具调用能力的智能体就运行起来了。5. 功能测试与效果验证现在我们需要系统性地测试智能体的各项核心能力确保其按预期工作。5.1 基础工具调用测试测试目的验证智能体能否正确理解问题并选择合适工具。操作步骤运行simple_agent.py。观察对于不同类型问题的处理流程。预期结果与判断数学问题如“2的8次方是多少”应调用Calculator工具并返回正确数值。事实性问题如“谁发明了Python”应调用Web_Searcher工具并返回模拟信息。失败情况如果智能体错误调用工具或无法解析检查工具的描述description是否清晰以及大模型的temperature参数是否设置过高建议设为0以获得更确定性的输出。5.2 多轮对话与记忆测试测试目的验证智能体能否在对话中记住上下文。操作我们需要升级脚本引入“记忆”组件。修改simple_agent.py# 在原有导入基础上增加 from langchain.memory import ConversationBufferMemory # 在创建执行器之前初始化记忆 memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 修改 prompt使其包含记忆变量。可以使用一个支持记忆的模板。 prompt_with_memory hub.pull(hwchase17/openai-functions-agent) # 注意不同的prompt模板对输入变量的要求不同需要根据模板调整。 # 创建支持记忆的智能体这里使用另一种Agent类型示例 from langchain.agents import initialize_agent, AgentType agent_executor_with_memory initialize_agent( toolstools, llmllm, agentAgentType.CONVERSATIONAL_REACT_DESCRIPTION, # 专为对话设计的Agent类型 verboseTrue, memorymemory, handle_parsing_errorsTrue ) # 测试多轮对话 print(agent_executor_with_memory.run(我叫小明。)) print(agent_executor_with_memory.run(我的名字是什么)) # 应能回答“小明”预期结果第二句提问应能正确回忆起“小明”这个名字。这证明了简单的短期记忆已生效。5.3 复杂任务规划测试测试目的验证智能体能否将复杂任务分解为多个步骤并依次执行。操作使用一个需要组合工具的任务进行测试。# 继续使用 agent_executor_with_memory complex_task “我想知道北京今天的天气然后根据天气决定是否适合跑步如果适合再帮我计算跑步5公里消耗的大概卡路里。” result agent_executor_with_memory.run(complex_task) print(result)预期结果智能体应规划出类似以下的步骤调用Web_Searcher搜索“北京今天天气”。根据天气结果假设为“晴朗20度”判断适合跑步。调用Calculator计算跑步卡路里可能需要一个更专业的公式工具这里用计算器模拟。判断成功输出应连贯地包含天气信息、判断理由和卡路里估算。5.4 错误处理与鲁棒性测试测试目的测试智能体在工具失效或输入不合理时的表现。操作模拟工具失败临时修改search_web函数使其抛出异常。输入模糊或矛盾指令如“计算一下明天的股票价格”。预期结果框架应能捕获工具异常并在日志中显示智能体可能尝试其他方式或直接告知用户失败。对于无法处理的指令智能体应礼貌地回应其能力边界而不是强行给出错误答案。6. 接口 API 与批量任务将智能体封装成 API 服务是将其集成到其他系统的标准做法。我们使用 FastAPI 来快速构建一个 Web 服务。步骤 1创建 API 服务文件agent_api.py# agent_api.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional import asyncio from your_agent_module import get_agent_executor # 假设你将之前的智能体逻辑封装在了这个函数里 app FastAPI(titleAI Agent Service) # 定义请求体模型 class AgentRequest(BaseModel): query: str session_id: Optional[str] None # 用于区分不同对话会话 max_steps: Optional[int] 10 # 定义响应体模型 class AgentResponse(BaseModel): session_id: str answer: str steps: list # 可选返回执行步骤用于调试 # 内存存储简易版生产环境应用数据库或Redis memory_store {} def get_or_create_agent(session_id: str): 根据 session_id 获取或创建一个带记忆的智能体执行器 if session_id not in memory_store: from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 重新初始化一个带记忆的agent_executor agent_executor initialize_agent(...) # 复用之前的初始化代码并传入memory memory_store[session_id] {agent: agent_executor, memory: memory} return memory_store[session_id][agent] app.post(/chat, response_modelAgentResponse) async def chat_with_agent(request: AgentRequest): try: agent get_or_create_agent(request.session_id or default_session) # 注意LangChain的invoke可能是同步的在异步上下文中需使用run_in_executor loop asyncio.get_event_loop() result await loop.run_in_executor(None, agent.invoke, {input: request.query}) return AgentResponse( session_idrequest.session_id or default_session, answerresult[output], stepsresult.get(intermediate_steps, []) ) except Exception as e: raise HTTPException(status_code500, detailf智能体处理失败: {str(e)}) app.get(/health) async def health_check(): return {status: healthy, model: AI Agent Service} if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)步骤 2启动 API 服务uvicorn agent_api:app --reload --host 0.0.0.0 --port 8000访问http://127.0.0.1:8000/docs即可看到自动生成的交互式 API 文档。步骤 3调用 API 测试使用curl或 Pythonrequests库进行测试# curl 示例 curl -X POST http://127.0.0.1:8000/chat \ -H Content-Type: application/json \ -d {query: 计算圆周率小数点后两位, session_id: test_user_1}# Python requests 示例 import requests response requests.post( http://127.0.0.1:8000/chat, json{query: 搜索什么是机器学习, session_id: test_user_1} ) print(response.json())批量任务处理对于批量任务可以设计一个简单的队列系统。设计任务队列使用list或queue.Queue在内存中维护或使用更专业的Celery、RQ。异步处理利用 FastAPI 的后台任务BackgroundTasks或单独的 worker 进程。结果存储将每个任务的结果存入字典、文件或数据库中并通过另一个 API 端点查询结果。from fastapi import BackgroundTasks task_results {} app.post(/submit_batch_task) async def submit_batch_task(queries: list[str], background_tasks: BackgroundTasks): task_id str(uuid.uuid4()) task_results[task_id] {status: processing, results: []} background_tasks.add_task(process_batch, task_id, queries) return {task_id: task_id, status: submitted} def process_batch(task_id: str, queries: list): results [] for q in queries: # 调用智能体处理每个查询 result agent_executor.invoke({input: q}) results.append({query: q, answer: result[output]}) task_results[task_id] {status: completed, results: results} app.get(/get_task_result/{task_id}) async def get_task_result(task_id: str): result task_results.get(task_id) if not result: raise HTTPException(status_code404, detailTask not found) return result7. 资源占用与性能观察由于核心推理在云端大模型 API 完成本地资源占用主要集中在框架运行时和上下文管理上。1. 内存占用观察启动初期加载 LangChain、请求库等内存占用通常在 200-500 MB。运行期间每维护一个对话会话ConversationBufferMemory会根据历史记录长度占用额外内存。存储 100 轮对话的文本可能增加几十 MB。监控方法在任务管理器中查看 Python 进程的内存使用或使用psutil库在代码中监控。import psutil import os process psutil.Process(os.getpid()) print(f内存占用: {process.memory_info().rss / 1024 / 1024:.2f} MB)2. 性能瓶颈分析网络延迟智能体的响应时间主要受大模型 API 网络往返延迟影响。一次工具调用可能涉及 2-3 次 API 请求思考、调用工具、总结。优化建议设置合理的 API 超时时间如 30 秒。对工具调用做缓存避免对相同参数重复调用。使用异步请求asyncio、aiohttp来并发处理多个独立任务。3. 成本控制API 调用成本主要成本来自大模型 API 的 Token 消耗。智能体由于需要多次调用模型思考、行动可能比简单问答消耗更多 Token。监控与优化在代码中记录每次请求的 Token 使用量大多数 API 会在响应中返回。为记忆设置最大长度限制避免上下文无限膨胀。对于简单、重复性问题可以考虑使用更便宜的模型或建立本地缓存答案。8. 常见问题与排查方法在开发过程中你可能会遇到以下典型问题。问题现象可能原因排查方式解决方案启动时提示ModuleNotFoundError依赖库未安装或虚拟环境未激活。检查当前 Python 环境 (python --version,pip list)。激活正确的虚拟环境使用pip install -r requirements.txt安装所有依赖。API 调用返回认证错误API Key 未设置或错误。检查.env文件是否存在变量名是否正确在代码中打印os.getenv(OPENAI_API_KEY)的前几位勿打印完整 Key。确保.env文件在项目根目录变量名与代码中读取的一致并确认 API Key 有效。智能体不调用工具直接回答1. 工具描述不清晰。2. 大模型temperature参数过高。3. Prompt 模板不合适。1. 检查工具description是否准确描述了功能和输入格式。2. 将temperature设为 0。3. 尝试更换不同的 Agent 类型或 Prompt。1. 优化工具描述明确使用场景。2. 使用temperature0。3. 尝试AgentType.OPENAI_FUNCTIONS或AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION。工具调用出错或超时1. 工具函数内部有 bug。2. 网络问题导致外部 API 调用失败。3. 工具执行时间过长。1. 在工具函数内添加详细日志和异常捕获。2. 检查网络连接。3. 查看框架的错误日志。1. 修复工具函数。2. 为外部调用添加重试机制和超时设置。3. 优化工具性能或设置任务超时。多轮对话记忆混乱1.session_id未正确传递或管理。2. 记忆存储未持久化服务重启后丢失。1. 检查每次 API 调用是否使用了相同的session_id。2. 检查记忆后端如ConversationBufferMemory是否被正确初始化并关联到 Agent。1. 确保前端或调用方维护并传递稳定的session_id。2. 使用可持久化的记忆后端如RedisChatMessageHistory。服务 API 响应慢1. 大模型 API 响应慢。2. 智能体思考步骤过多。3. 本地代码有阻塞操作。1. 单独测试大模型 API 的响应时间。2. 设置max_iterations或max_execution_time限制。3. 使用异步框架避免阻塞主线程。1. 考虑更换响应更快的模型或区域端点。2. 在AgentExecutor中设置max_iterations5。3. 将耗时操作如文件 I/O放入线程池。9. 最佳实践与使用建议遵循以下建议可以让你构建的智能体更健壮、更易维护。1. 设计阶段明确边界清晰定义智能体负责的范围避免处理过于开放或危险的任务。工具设计工具函数应职责单一、接口明确、有良好的错误处理和日志。对于复杂工具考虑为其单独编写测试用例。提示工程精心设计系统提示词System Prompt明确智能体的角色、能力和行为规范。这是影响其表现的关键。2. 开发与测试增量开发从一个工具、一个简单任务开始验证通过后再增加复杂度。全面测试为工具函数、智能体决策逻辑编写单元测试和集成测试。模拟各种用户输入和边缘情况。日志与监控在关键节点收到请求、调用模型、调用工具、返回结果添加详细日志便于调试和后期分析。3. 生产部署配置管理将所有配置API Key、模型参数、服务端口外置到环境变量或配置文件中。安全加固API 服务应添加认证如 API Token。对用户输入进行清洗和过滤防止 Prompt 注入攻击。工具调用特别是执行代码或系统命令必须进行严格的权限控制和沙箱化。可观测性记录每次交互的 Token 消耗、响应时间、工具调用链用于成本分析和性能优化。版本管理对智能体的 Prompt、工具集、模型版本进行版本控制便于回滚和对比实验。4. 合规与伦理透明度让用户知道他们正在与 AI 交互并说明其能力限制。数据安全妥善处理用户对话数据遵守相关隐私法规。内容审核对于生成内容特别是面向公众的服务应考虑加入审核机制。10. 总结与下一步通过本教程你已经完成了一个具备基础工具调用、记忆和 API 服务能力的 AI 智能体从零到一的搭建。整个过程的核心在于理解智能体“感知-规划-行动”的循环并利用 LangChain 这样的框架将大模型、工具、记忆等组件高效地连接起来。最值得尝试的扩展方向集成真实工具将模拟的搜索工具替换为真实的 SerperAPI、Google Search API或者集成数据库查询、发送邮件、操作文件等实用功能。增强记忆能力尝试更高级的记忆后端如ConversationSummaryMemory摘要记忆节省 Token、VectorStoreRetrieverMemory向量检索实现长期记忆。尝试多智能体协作使用 AutoGen 或 LangGraph 框架创建多个具有不同角色的智能体如规划者、执行者、审核者让它们协作解决更复杂的问题。加入验证与回滚为智能体的关键决策或工具执行结果加入验证步骤如果结果不符合预期则触发回滚或人工干预流程。探索本地模型对于轻量级或隐私要求高的任务可以尝试在本地部署量化后的小模型如 Qwen2.5-7B-Instruct通过Ollama或vLLM提供服务并与 LangChain 集成。最先应该验证的功能在你自己的业务场景中找到一个最具体、价值最明确的小任务例如“从特定网站抓取数据并总结成表格”用智能体的思路将其拆解并实现对应的工具链。这个端到端的验证能最快体现智能体的价值。最容易踩的坑Prompt 设计不当导致智能体行为偏离预期。多迭代、多测试。工具异常处理不足一个工具失败导致整个流程崩溃。务必为每个工具添加健壮的错误处理。成本失控复杂的任务规划可能导致大量 API 调用。在开发阶段设置预算警报并优化提示词以减少不必要的思考步骤。智能体开发是一个快速迭代和实验的过程。建议从这个小而美的原型出发逐步扩展其能力和应用边界最终打造出真正能提升效率的专属智能助手。
返回列表