4步搞定Agent多工具调用实战落地

张开发
2026/4/10 2:09:22 15 分钟阅读

分享文章

4步搞定Agent多工具调用实战落地
4步搞定Agent多工具调用实战落地大语言模型LLM的出现让自然语言交互能力实现了质的突破但单一LLM存在知识时效性弱、计算能力不足、无法执行外部操作等固有缺陷。通过为LLM赋予工具调用能力构建智能Agent系统能够让模型突破自身局限完成复杂的实际任务比如数据分析、API交互、代码执行等。本文将从原理拆解到实战落地用4步完成Agent多工具调用的完整实现。一、背景与问题在实际业务场景中单纯的LLM输出往往无法满足需求当用户询问2024年国内新能源汽车销量Top3企业时依赖训练数据的LLM只能提供截止到训练时间的信息当用户需要计算10000元按照年化4.2%的利率存3年的复利收益时LLM可能出现计算错误当用户要求将本地Excel文件中的销售数据生成可视化图表时LLM本身无法直接操作本地文件。这些场景的核心痛点在于LLM的能力边界受限于训练数据和模型架构无法实时获取外部信息、执行精确计算或与外部系统交互。而Agent多工具调用正是解决这类问题的关键方案——让LLM根据任务需求自主选择并调用合适的工具将自然语言指令转化为可执行的操作最终完成复杂任务。二、原理分析Agent多工具调用的核心逻辑1. 什么是Agent多工具调用Agent多工具调用是指基于大语言模型构建的智能代理系统能够理解用户的自然语言需求分析任务类型自主选择并调用外部工具如API、计算器、文件操作工具、数据库查询工具等获取工具执行结果后再将结果整理为自然语言反馈给用户的完整流程。2. 为什么需要Agent多工具调用突破知识时效性限制通过调用实时API如新闻接口、股票行情接口获取最新数据弥补LLM训练数据滞后的问题提升计算与操作准确性将复杂计算、文件操作、数据库查询等任务交给专业工具执行避免LLM的计算误差和能力盲区扩展任务边界让LLM具备执行实际操作的能力从信息输出者转变为任务执行者覆盖数据分析、自动化办公、系统运维等更多场景。3. 怎么工作的Agent多工具调用的核心流程分为4个关键阶段任务理解与意图识别LLM接收用户指令分析任务需求判断是否需要调用工具以及需要调用哪种类型的工具工具选择与参数生成根据任务类型从工具库中选择合适的工具并生成符合工具要求的调用参数如API请求参数、函数入参工具执行与结果获取调用目标工具并获取执行结果若执行失败则进行重试或选择其他工具结果整理与反馈LLM将工具返回的结构化结果转换为自然语言向用户输出最终答案。为了实现这一流程通常需要引入**工具描述Tool Description和函数调用Function Call**机制工具描述用结构化的方式定义工具的名称、功能、参数类型、参数说明等信息让LLM能够理解工具的用途和调用方式函数调用LLM根据工具描述生成符合格式要求的调用指令系统解析该指令后调用对应的工具再将结果返回给LLM。4. 优缺点分析维度优点缺点能力边界突破LLM固有局限覆盖实时数据、精确计算、外部操作等场景依赖工具的可用性和稳定性工具故障会直接影响任务执行准确性专业工具执行特定任务结果准确性远高于LLM直接输出若LLM对任务理解错误或参数生成错误会导致工具调用失败复杂度无需修改LLM模型通过工具扩展即可实现能力升级需要维护工具库处理工具调用的异常情况系统复杂度提升成本工具调用的计算成本通常低于大模型的复杂推理多工具调用会增加API调用次数和网络开销提升使用成本三、实现步骤4步完成Agent多工具调用落地本文将基于Python语言结合OpenAI的GPT-3.5-turbo模型实现一个支持计算器、实时天气查询、文件读取三种工具调用的Agent系统。步骤1环境准备与工具定义首先需要安装依赖库并定义工具的描述信息和执行逻辑。# 安装依赖# pip install openai python-dotenv requestsimportosimportrequestsfromdotenvimportload_dotenvfromopenaiimportOpenAI# 加载环境变量从.env文件中读取OpenAI API密钥load_dotenv()clientOpenAI(api_keyos.getenv(OPENAI_API_KEY))# ---------------------- 工具定义 ----------------------# 1. 计算器工具defcalculator(num1:float,num2:float,operator:str)-str: 执行基本算术运算的工具 :param num1: 第一个操作数 :param num2: 第二个操作数 :param operator: 运算类型支持、-、*、/ :return: 运算结果的字符串形式 try:ifoperator:resultnum1num2elifoperator-:resultnum1-num2elifoperator*:resultnum1*num2elifoperator/:ifnum20:return错误除数不能为0resultnum1/num2else:return错误不支持的运算类型仅支持、-、*、/returnf运算结果{result}exceptExceptionase:returnf计算失败{str(e)}# 2. 实时天气查询工具使用和风天气API需在.env中设置WEATHER_API_KEYdefget_weather(city:str)-str: 查询指定城市的实时天气信息 :param city: 城市名称如北京、上海 :return: 天气信息的字符串形式 try:api_keyos.getenv(WEATHER_API_KEY)base_urlhttps://devapi.qweather.com/v7/weather/nowparams{location:city,key:api_key}responserequests.get(base_url,paramsparams)response.raise_for_status()# 检查请求是否成功dataresponse.json()ifdata[code]!200:returnf天气查询失败{data.get(msg,未知错误)}nowdata[now]return(f{city}实时天气\nf温度{now[temp]}℃\nf体感温度{now[feelsLike]}℃\nf天气状况{now[text]}\nf风速{now[windSpeed]}km/h\nf湿度{now[humidity]}%)exceptExceptionase:returnf天气查询异常{str(e)}# 3. 文件读取工具defread_file(file_path:str)-str: 读取指定文本文件的内容 :param file_path: 文件路径如./data.txt :return: 文件内容的字符串形式 try:withopen(file_path,r,encodingutf-8)asf:contentf.read()returnf文件内容\n{content}exceptFileNotFoundError:returnf错误文件不存在 -{file_path}exceptPermissionError:returnf错误无权限读取文件 -{file_path}exceptExceptionase:returnf文件读取失败{str(e)}# 工具描述列表遵循OpenAI函数调用的格式要求tools[{type:function,function:{name:calculator,description:执行基本算术运算如加法、减法、乘法、除法,parameters:{type:object,properties:{num1:{type:number,description:第一个操作数},num2:{type:number,description:第二个操作数},operator:{type:string,description:运算类型支持、-、*、/}},required:[num1,num2,operator]}}},{type:function,function:{name:get_weather,description:查询指定城市的实时天气信息,parameters:{type:object,properties:{city:{type:string,description:城市名称如北京、上海}},required:[city]}}},{type:function,function:{name:read_file,description:读取指定文本文件的内容,parameters:{type:object,properties:{file_path:{type:string,description:文件路径如./data.txt}},required:[file_path]}}}]# 工具映射字典用于根据工具名称调用对应的函数tool_map{calculator:calculator,get_weather:get_weather,read_file:read_file}常见坑点工具描述的参数定义必须严格符合JSON Schema格式否则LLM无法正确生成调用参数工具函数的异常处理必须完善避免单个工具调用失败导致整个Agent系统崩溃第三方API需确保密钥安全避免硬编码在代码中应使用环境变量管理。步骤2构建Agent核心逻辑实现Agent的核心流程接收用户指令调用LLM判断是否需要调用工具解析工具调用指令并执行最后整理结果反馈给用户。defagent_run(user_query:str)-str: Agent核心执行函数 :param user_query: 用户的自然语言查询 :return: Agent的最终反馈结果 # 第一步调用LLM分析用户需求判断是否需要调用工具messages[{role:system,content:你是一个具备工具调用能力的智能助手根据用户的需求选择合适的工具执行任务。},{role:user,content:user_query}]responseclient.chat.completions.create(modelgpt-3.5-turbo-1106,# 支持函数调用的模型版本messagesmessages,toolstools,tool_choiceauto# 让LLM自动判断是否需要调用工具)response_messageresponse.choices.message tool_callsresponse_message.tool_calls# 如果LLM决定调用工具iftool_calls:# 第二步解析工具调用指令执行工具并获取结果messages.append(response_message)# 将LLM的工具调用指令添加到对话历史fortool_callintool_calls:tool_nametool_call.function.name tool_functool_map.get(tool_name)ifnottool_func:returnf错误不支持的工具 -{tool_name}# 解析工具参数try:tool_argseval(tool_call.function.arguments)# 将JSON字符串转换为字典except:returnf错误工具参数解析失败 -{tool_call.function.arguments}# 执行工具调用tool_resulttool_func(**tool_args)# 将工具执行结果添加到对话历史messages.append({tool_call_id:tool_call.id,role:tool,name:tool_name,content:tool_result})# 第三步调用LLM整理工具结果生成自然语言反馈second_responseclient.chat.completions.create(modelgpt-3.5-turbo-1106,messagesmessages)returnsecond_response.choices.message.contentelse:# 如果不需要调用工具直接返回LLM的回答returnresponse_message.content关键说明使用gpt-3.5-turbo-1106及以上版本的模型这些版本原生支持函数调用功能通过tool_choiceauto让LLM自主判断是否需要调用工具也可以指定tool_choice{type: function, function: {name: calculator}}强制调用某个工具工具执行结果需要以特定格式添加到对话历史中让LLM能够理解工具返回的信息。步骤3测试Agent多工具调用能力编写测试用例验证Agent在不同场景下的工具调用能力。if__name____main__:# 测试用例1计算器工具print(测试1计算器工具)query1计算125.6乘以3.14的结果result1agent_run(query1)print(f用户提问{query1})print(fAgent回答{result1}\n)# 测试用例2实时天气查询print(测试2实时天气查询)query2帮我查一下广州今天的实时天气result2agent_run(query2)print(f用户提问{query2})print(fAgent回答{result2}\n)# 测试用例3文件读取工具print(测试3文件读取工具)# 先创建一个测试文件withopen(test_file.txt,w,encodingutf-8)asf:f.write(这是一个测试文件\n包含两行内容\n用于验证Agent的文件读取能力)query3帮我读取当前目录下的test_file.txt文件内容result3agent_run(query3)print(f用户提问{query3})print(fAgent回答{result3}\n)# 测试用例4无需调用工具的场景print(测试4无需调用工具的场景)query4请解释一下什么是人工智能result4agent_run(query4)print(f用户提问{query4})print(fAgent回答{result4})预期输出示例测试1计算器工具 用户提问计算125.6乘以3.14的结果 Agent回答125.6乘以3.14的结果是394.384。 测试2实时天气查询 用户提问帮我查一下广州今天的实时天气 Agent回答广州实时天气 温度28℃ 体感温度32℃ 天气状况多云 风速12km/h 湿度75% 测试3文件读取工具 用户提问帮我读取当前目录下的test_file.txt文件内容 Agent回答文件内容 这是一个测试文件 包含两行内容 用于验证Agent的文件读取能力 测试4无需调用工具的场景 用户提问请解释一下什么是人工智能 Agent回答人工智能Artificial Intelligence简称AI是一门旨在使计算机系统能够模拟、延伸和扩展人类智能的技术科学。它涵盖了机器学习、自然语言处理、计算机视觉、专家系统等多个领域目标是让机器具备感知、理解、学习、推理和决策等能力从而完成通常需要人类智能才能实现的任务。步骤4异常处理与优化为提升Agent的稳定性和鲁棒性需要针对常见异常场景进行优化工具调用失败重试当工具调用因网络问题或参数错误失败时可增加重试机制多工具协作支持同时调用多个工具比如先读取文件中的城市列表再批量查询天气用户意图澄清当LLM无法明确用户需求时主动询问用户补充信息比如用户说查天气时询问具体城市。以下是优化后的Agent核心函数增加了意图澄清和重试机制defagent_run_optimized(user_query:str,max_retries:int2)-str:messages[{role:system,content:你是一个具备工具调用能力的智能助手根据用户的需求选择合适的工具执行任务。如果用户的需求不明确请主动询问用户补充必要的信息。},{role:user,content:user_query}]responseclient.chat.completions.create(modelgpt-3.5-turbo-1106,messagesmessages,toolstools,tool_choiceauto)response_messageresponse.choices.message tool_callsresponse_message.tool_callsiftool_calls:

更多文章