尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI Agent开发实战:从零构建能自主调用工具的智能体

AI Agent开发实战:从零构建能自主调用工具的智能体 1. 先搞清楚AI Agent到底是什么以及它到底能帮你解决什么问题如果你最近在关注AI尤其是大模型应用一定绕不开“AI Agent”这个词。它听起来很酷但很多人第一反应是这和我直接用ChatGPT对话有什么区别我为什么要学这个简单来说AI Agent智能体不是一个简单的聊天机器人而是一个能自主规划、使用工具、执行任务并达成目标的“智能程序”。你可以把它想象成一个配备了“大脑”大模型、“双手”各种API和工具和“记忆”上下文或知识库的虚拟员工。它和普通对话AI的核心区别在于“自主性”和“工具使用”。举个例子你问ChatGPT“帮我查一下北京明天的天气然后根据天气推荐一个室内活动。”ChatGPT可能会给你一段描述性的文字告诉你“可以查天气网站然后根据结果推荐”。而一个AI Agent会自己去调用天气API获取数据自己分析数据自己从活动数据库中筛选出符合条件的室内活动最后把结果结构化地呈现给你。所以学习AI Agent开发本质上是在学习如何让大模型从“健谈的顾问”变成“能干的执行者”。这解决的是“AI落地”最后一公里的问题如何让AI真正帮你干活而不是只跟你聊天。这篇文章适合谁看开发者想将大模型能力集成到自己的应用或业务流程中实现自动化。产品/运营人员想理解AI Agent的能力边界知道它能做什么、不能做什么以便设计更好的AI产品功能。技术爱好者/学习者希望系统性地了解当前AI应用开发的前沿技术栈而不仅仅是调用API。最值得你关注的点不是某个框架或工具而是一整套思维模式和工作流如何定义任务、拆解步骤、为模型配备工具、处理执行中的不确定性。掌握了这个你才能灵活应对各种场景而不是被某个平台绑定。2. 动手之前理清开发环境与核心组件在急着写代码之前先把“战场”打扫干净。AI Agent开发对环境的依赖比普通Web开发更复杂因为它涉及到大模型、工具调用、可能的环境变量等多个层面。2.1 核心开发环境准备你不需要顶配的机器但需要一个清晰、可复现的环境。Python环境这是目前AI Agent生态最活跃的语言。强烈建议使用Python 3.10。使用conda或venv创建独立的虚拟环境是必须的避免包冲突。# 使用 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大模型API密钥这是Agent的“大脑”。你可以从多家服务商获取OpenAI最主流生态最完善但需要海外支付方式。国内大厂百度文心、阿里通义、智谱GLM、月之暗面Kimi等获取相对方便但功能和生态可能略有差异。本地部署使用 Ollama 等工具在本地运行 Llama、Qwen 等开源模型。适合对数据隐私要求极高或想深度定制的场景但对硬件尤其是GPU显存有要求。我建议新手先从一家云服务商的API开始比如智谱GLM或阿里通义申请流程简单有免费额度足够完成入门学习和简单原型开发。拿到API Key后把它设置为环境变量不要在代码里硬编码。# 在终端中设置临时 export ZHIPUAI_API_KEYyour-api-key-here # Windows (cmd) set ZHIPUAI_API_KEYyour-api-key-here # Windows (PowerShell) $env:ZHIPUAI_API_KEYyour-api-key-here2.2 理解AI Agent的四大核心组件一个典型的AI Agent由以下几部分构成理解它们是你进行开发的基础规划模块PlanningAgent的“思考”部分。负责理解用户目标并将其拆解成一系列可执行的子任务或步骤。例如目标“帮我做一份市场分析报告”可能被拆解为1) 搜索近期行业动态2) 收集竞品数据3) 分析用户趋势4) 生成报告大纲5) 撰写报告内容。记忆模块MemoryAgent的“经验”。分为短期记忆即对话上下文Context让Agent记得当前会话中说过的话。长期记忆通过向量数据库如Chroma, Pinecone, Weaviate存储和检索历史信息让Agent拥有“知识库”能记住跨会话的信息或事实。工具使用模块Tool UseAgent的“双手”。这是Agent能力的扩展器。工具可以是搜索调用Serper、Google Search API。计算调用Pythonmath库或WolframAlpha。代码执行安全的沙箱环境。API调用获取天气、股票、发送邮件、操作数据库等任何网络服务。自定义函数你自己写的任何功能函数。行动模块Action根据规划调用相应的工具并执行获取结果。目前主流的开发框架如LangChain、LlamaIndex、Semantic Kernel都在以不同的方式封装和简化这些组件的构建过程。不要一上来就试图自己从头实现所有组件先用成熟的框架跑通一个最小闭环。3. 从零构建你的第一个AI Agent一个天气查询助手理论讲再多不如动手做一遍。我们用一个最经典的例子——天气查询助手来串联整个开发流程。这个Agent的目标是用户用自然语言询问天气Agent能自动调用天气API并返回结构化的回答。3.1 项目初始化与框架选择我们选择LangChain作为入门框架因为它生态最成熟文档和社区资源最丰富适合学习核心概念。首先安装核心包pip install langchain langchain-community langchain-core根据你选择的大模型安装对应的集成包。例如如果你用智谱GLMpip install langchain-zhipu如果你用OpenAIpip install openai langchain-openai3.2 第一步让大模型“学会”调用工具工具是Agent的灵魂。我们先定义一个最简单的工具——获取城市天气的函数。# weather_agent.py import os import requests from typing import Optional from langchain.agents import Tool, AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate from langchain_zhipu import ChatZhipuAI # 以智谱为例 # 1. 设置API Key (从环境变量读取) os.environ[ZHIPUAI_API_KEY] your_zhipu_api_key # 2. 定义一个真实的天气查询工具函数 def get_current_weather(city: str) - str: 根据城市名称查询实时天气。 这里使用一个免费的天气API示例实际使用时请注册并替换为你的Key。 # 示例API实际项目请使用更稳定的服务如和风天气、OpenWeatherMap等 api_url fhttps://wttr.in/{city}?format%C%t try: response requests.get(api_url, timeout10) response.raise_for_status() # 检查HTTP错误 return f{city}的天气是{response.text.strip()} except requests.exceptions.RequestException as e: return f查询{city}天气时出错{str(e)} # 3. 将函数包装成LangChain可识别的Tool对象 weather_tool Tool( nameGetCurrentWeather, funcget_current_weather, description当需要查询某个城市的当前天气时使用此工具。输入应为城市名称例如北京。 ) # 4. 初始化大模型 llm ChatZhipuAI(modelglm-4, temperature0.1) # temperature调低让输出更确定 # 5. 定义工具列表 tools [weather_tool] # 6. 使用ReAct框架创建Agent提示词 prompt PromptTemplate.from_template( 你是一个有帮助的天气助手。你可以使用工具来获取实时天气信息。 请严格遵循以下步骤思考 1. 理解用户的问题确定是否需要查询天气。 2. 如果需要调用合适的工具并确保输入正确的城市名。 3. 根据工具返回的结果用友好、清晰的语言回答用户。 工具列表 {tools} 用户问题{input} 开始你的思考 ) # 7. 创建Agent和Executor agent create_react_agent(llmllm, toolstools, promptprompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 8. 运行测试 if __name__ __main__: # 测试查询 result agent_executor.invoke({input: 上海今天天气怎么样}) print(\n--- Agent 回答 ---) print(result[output]) # 测试无关问题应直接回答不调用工具 result2 agent_executor.invoke({input: 你好请介绍一下你自己。}) print(\n--- Agent 回答 ---) print(result2[output])关键点解释Tool对象这是连接你的函数和大模型的桥梁。description字段至关重要大模型根据它来决定是否以及如何调用工具。描述要清晰、具体。create_react_agent这是LangChain提供的一种Agent类型基于“Reasoning Acting”范式会让模型先“思考”Reason再“行动”Act适合需要多步推理的任务。AgentExecutor负责运行Agent的循环接收用户输入 - Agent思考 - 调用工具 - 获取结果 - 继续思考或输出最终答案。verboseTrue强烈建议在开发调试时开启它会在控制台打印Agent的完整思考过程让你看清它是如何做决策的这是排查问题的关键。运行这个脚本你会看到类似以下的输出verbose模式 Entering new AgentExecutor chain... 我需要查询上海的天气应该使用GetCurrentWeather工具。 Action: GetCurrentWeather Action Input: 上海 Observation: 上海的天气是Clear 16°C 我现在知道了上海的天气情况可以回答用户了。 Thought: 用户问上海今天天气怎么样工具返回天气是晴朗16摄氏度。 Final Answer: 上海今天的天气晴朗气温大约16摄氏度。 Finished chain. --- Agent 回答 --- 上海今天的天气晴朗气温大约16摄氏度。看到这个你的第一个能自主调用外部API的AI Agent就成功了它不再是空谈而是真正完成了一次任务。3.3 第二步处理复杂问题与多工具协作单个工具太简单。现实任务往往需要多个工具协作。我们增加一个“城市编码查询”工具模拟更复杂的场景用户可能只说“帝都”我们需要先将其转换为“北京”再查询天气。# 在之前的代码基础上增加一个新工具和修改提示词 def get_city_code(place_name: str) - str: 将常见的地点别名或模糊名称转换为标准的城市名称。 这里用一个简单的字典模拟实际可使用更智能的地名服务。 city_mapping { 帝都: 北京, 魔都: 上海, 羊城: 广州, 鹏城: 深圳, 山城: 重庆, } standard_name city_mapping.get(place_name, place_name) # 如果映射中找不到则原样返回 return f标准城市名称是{standard_name} city_tool Tool( nameGetStandardCityName, funcget_city_code, description当用户使用城市的别名、简称或模糊称呼时使用此工具将其转换为标准的城市名称。输入为地点名称。 ) # 更新工具列表 tools [weather_tool, city_tool] # 更新提示词指导Agent学会使用多个工具 prompt PromptTemplate.from_template( 你是一个智能天气助手。请遵循以下步骤 1. 分析用户问题判断是否与天气相关。 2. 如果相关先检查城市名称是否标准如‘帝都’。如果不标准先调用GetStandardCityName工具进行转换。 3. 获得标准城市名后调用GetCurrentWeather工具查询天气。 4. 结合两次工具调用的结果组织最终答案。 可用工具 {tools} 用户问题{input} 开始思考 ) # 重新创建Agent和Executor agent create_react_agent(llmllm, toolstools, promptprompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 测试复杂查询 result agent_executor.invoke({input: 魔都的天气如何}) print(result[output])这次verbose日志会显示Agent先调用了GetStandardCityName得到“上海”再调用GetCurrentWeather。这演示了Agent的多步规划和工具链能力。4. 进阶实战为Agent注入记忆与知识一个只有“短期记忆”单次对话上下文的Agent是健忘的。要让Agent更智能需要赋予它“长期记忆”和“专业知识”。4.1 实现短期记忆对话历史LangChain的AgentExecutor默认会将对话历史chat_history传入上下文。但我们需要在调用时显式地维护这个历史列表。from langchain_core.messages import HumanMessage, AIMessage chat_history [] # 用于存储对话历史 def chat_with_agent(user_input: str): global chat_history # 将用户输入和历史一起传入 result agent_executor.invoke({ input: user_input, chat_history: chat_history }) # 更新历史添加用户消息和AI消息 chat_history.append(HumanMessage(contentuser_input)) chat_history.append(AIMessage(contentresult[output])) return result[output] # 模拟连续对话 print(chat_with_agent(北京天气怎么样)) print(chat_with_agent(那我应该穿什么衣服)) # Agent能基于上一句的“北京”和“天气”来理解上下文现在你的Agent能记住当前对话中发生的事情了。4.2 构建长期记忆与知识库RAG这是让Agent“专业化”的关键。例如你想做一个公司内部知识问答Agent它能回答员工手册、产品文档里的问题。这需要用到RAG检索增强生成技术。核心步骤知识入库将你的文档PDF、Word、TXT等切分成片段转换成向量Embedding存入向量数据库。检索当用户提问时将问题也转换成向量在数据库中查找最相关的文本片段。增强生成将找到的相关片段作为上下文连同问题一起送给大模型让它生成答案。我们使用Chroma轻量级向量数据库和OpenAI Embeddings文本转向量来演示。pip install chromadb langchain-chroma langchain-openai tiktoken# knowledge_agent.py import os from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import TextLoader from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser # 假设你有一个 knowledge.txt 文件 loader TextLoader(knowledge.txt, encodingutf-8) documents loader.load() # 1. 分割文档 text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) docs text_splitter.split_documents(documents) # 2. 创建向量存储 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) # 或使用其他Embedding模型 vectorstore Chroma.from_documents(documentsdocs, embeddingembeddings, persist_directory./chroma_db) # 之后可以加载已存在的数据库vectorstore Chroma(persist_directory./chroma_db, embedding_functionembeddings) # 3. 创建检索器 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 检索最相关的3个片段 # 4. 构建RAG链 template 请根据以下上下文回答问题。如果你不知道答案就说不知道不要编造。 上下文{context} 问题{question} 请给出有帮助的答案 prompt ChatPromptTemplate.from_template(template) llm ChatOpenAI(modelgpt-3.5-turbo) # 或使用其他LLM rag_chain ( {context: retriever, question: RunnablePassthrough()} | prompt | llm | StrOutputParser() ) # 5. 提问 question 我们公司的年假政策是怎样的 answer rag_chain.invoke(question) print(f问题{question}) print(f答案{answer})现在你可以将这个RAG链作为一个强大的“知识查询工具”集成到你的Agent中让它不仅能调用API还能从专属知识库中寻找答案。5. 生产环境考量避坑指南与优化策略当你跑通Demo准备将AI Agent投入实际使用时会遇到一系列新挑战。下面是我从实际项目中总结的几个关键点和避坑经验。5.1 稳定性与错误处理大模型和外部API调用天生具有不确定性。网络超时与重试为所有外部调用LLM API、工具API添加重试逻辑和合理的超时设置。使用tenacity或backoff库实现指数退避重试。from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def call_llm_with_retry(prompt): # 调用LLM的代码 pass解析错误Agent输出的工具调用参数可能格式不对。AgentExecutor的handle_parsing_errorsTrue能兜底但更好的做法是在提示词中明确要求输出JSON等格式并在工具函数内部做好参数验证和类型转换。设置思考上限防止Agent陷入无限循环。在AgentExecutor中设置max_iterations和max_execution_time。agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, max_iterations5, # 最多思考/行动5轮 early_stopping_methodgenerate, # 提前停止策略 handle_parsing_errorsTrue )5.2 成本与性能优化上下文长度管理对话历史或检索到的上下文太长会显著增加API调用成本和延迟。需要定期总结或修剪历史只保留关键信息。缓存对频繁且结果不变的查询如某些知识库问答、固定的计算进行缓存可以大幅降低成本和提升响应速度。LangChain提供了LLMCache组件。选择性价比模型不必所有任务都用最强大的模型。可以将任务分类需要复杂推理的用GPT-4或GLM-4简单的分类、提取用GPT-3.5-Turbo或更小的模型Embedding也有更轻量的选择。异步处理如果Agent需要顺序调用多个独立工具考虑使用异步asyncio来并行执行减少总体耗时。5.3 评估与监控如何知道你的Agent工作得好不好定义评估指标不仅仅是“能不能跑通”。关注任务完成率用户意图被正确理解并执行的比例。工具调用准确率在需要调用工具时是否调用了正确的工具并传入了正确的参数。人工评分定期抽样让人工评估回答的准确性、有用性和流畅度。记录与日志详细记录每个会话的输入、Agent的思考过程Chain of Thought、工具调用详情、输出以及最终结果。这对于调试和优化至关重要。考虑使用LangSmithLangChain官方平台或自建日志系统。防范“幻觉”与滥用设置内容过滤器对Agent的输入和输出进行检查。对于关键业务场景可以引入“人工审核环节”或“高置信度才执行”的规则。5.4 关于平台与框架的选择输入材料提到了Dify、Workbuddy等平台。它们和LangChain这类框架定位不同LangChain/LlamaIndex等开发框架提供底层构建块灵活性极高适合深度定制、复杂逻辑或需要集成到现有系统的开发者。Dify、Workbuddy等AI应用平台提供了可视化编排、知识库管理、API部署等开箱即用的功能上手极快适合快速构建原型或对编码要求不高的团队。我的建议是如果你是开发者或想深入理解原理从LangChain开始。如果你业务方只想快速验证一个AI应用想法Dify这类平台是更好的起点。理解了底层原理你再使用任何平台都会更加得心应手。AI Agent开发不是一个“学完即就业”的魔法而是一个结合了软件工程、提示词工程和大模型理解的综合领域。真正的价值不在于你用了多酷的框架而在于你能否清晰地定义问题稳健地拆解任务并设计出可靠、可控的自动化流程。从今天这个能查天气的小助手开始逐步为它添加更多工具、更复杂的记忆和更严谨的流程控制你就能打造出真正解决实际问题的“智能体”。
返回列表