十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

大模型工具调用实战:从概念到智能体构建,实现AI从聊天到执行

大模型工具调用实战:从概念到智能体构建,实现AI从聊天到执行 1. 从“聊天”到“做事”大模型工具调用的核心价值很多开发者初次接触大模型时往往将其视为一个“超级聊天机器人”擅长生成文本、回答问题但在实际业务集成中却感到束手无策。例如当你想让大模型帮你查询最新的天气、发送一封邮件、或者从数据库中提取特定数据时你会发现它只能“纸上谈兵”无法真正执行操作。这种“能说不能做”的困境正是工具调用Tool Calling技术要解决的核心问题。工具调用本质上是一种让大模型与外部世界交互的“桥梁”机制。它允许大模型在理解用户意图后不是直接生成最终答案而是生成一个结构化的“动作请求”比如调用一个特定的API、执行一段代码、或操作一个软件工具。然后由外部系统执行这个动作并将结果返回给大模型大模型再整合信息生成最终回复给用户。这个过程让大模型从一个被动的“知识库”或“文本生成器”转变为一个可以主动“做事”的智能体Agent。本文将深入拆解大模型工具调用的完整技术栈与实现逻辑。我们将从核心概念入手逐步构建一个能够调用真实API的智能体并探讨其与RAG检索增强生成技术的结合最后分析工程落地中的关键考量。无论你是想为现有应用添加AI能力还是构建全新的AI原生应用掌握工具调用都是实现“智能自动化”的关键一步。2. 核心概念工具调用、智能体与RAG的三角关系在深入代码之前我们需要厘清几个关键概念及其相互关系这有助于我们构建正确的技术心智模型。工具调用Tool Calling这是最基础的能力单元。它指的是大模型根据输入决定是否需要以及如何调用一个外部工具。一个“工具”通常对应一个函数或API具有明确的输入参数和输出格式。大模型需要将自然语言指令转化为符合该工具定义的参数格式的结构化数据如JSON。智能体Agent智能体是一个更高层次的概念它代表了一个具备自主决策和行动能力的系统。一个典型的智能体架构包含几个核心组件一个“大脑”通常是大模型、一套可用的“工具”Tool Kit、一个记忆模块用于存储对话历史或任务上下文以及一个决策循环。工具调用是智能体实现其“行动”能力的具体手段。智能体通过大模型分析当前状态和目标规划步骤并选择最合适的工具进行调用。RAG检索增强生成RAG解决的是大模型知识“静态”和“幻觉”的问题。它通过从外部知识库如向量数据库中检索相关文档片段并将其作为上下文提供给大模型从而生成更准确、更具事实依据的回答。RAG让大模型“知道得更多、更准”。三者关系工具调用 vs. 智能体工具调用是“动作”智能体是执行这个动作的“角色”。你可以有一个只调用单一工具的简单智能体也可以有一个能协调多个复杂工具的超级智能体。工具调用/RAG vs. 大模型两者都是扩展大模型能力的“手脚”。RAG是扩展其“知识”和“记忆”主要解决“是什么”的问题工具调用是扩展其“行动”和“影响”主要解决“做什么”和“怎么做”的问题。协同工作在实际应用中一个强大的智能体往往会同时结合RAG和工具调用。例如一个客服智能体可以先通过RAG从产品手册中检索信息再通过工具调用创建一个售后工单。RAG负责信息获取工具调用负责业务操作。理解这个三角关系后我们就可以聚焦于“工具调用”这一具体技术看看如何让大模型从聊天走向行动。3. 环境准备与核心工具链我们将使用Python生态中最流行的框架LangChain和OpenAI的GPT模型来构建示例。LangChain提供了高度抽象且功能完整的智能体和工具调用支持非常适合快速理解和原型开发。环境要求操作系统Windows 10/11, macOS, 或 Linux (Ubuntu 20.04)Python版本 3.8核心库langchain智能体框架。langchain-openaiLangChain的OpenAI集成包。openaiOpenAI官方SDK某些场景下也需要。requests用于演示自定义API工具。大模型API你需要一个OpenAI API Key或者使用其他兼容OpenAI接口的模型服务如Azure OpenAI, 通义千问等。安装依赖在项目目录下创建并激活虚拟环境后使用pip安装# 创建虚拟环境 (可选但推荐) python -m venv venv # Windows venv\Scripts\activate # macOS/Linux source venv/bin/activate # 安装核心依赖 pip install langchain langchain-openai openai requests项目结构一个简单的项目结构如下所示我们将逐步填充文件tool_calling_demo/ ├── tools/ # 存放自定义工具定义 │ ├── __init__.py │ └── weather_tool.py ├── agents/ # 存放智能体定义 │ ├── __init__.py │ └── simple_agent.py ├── config.py # 配置文件存放API Key等 ├── main.py # 主程序入口 └── requirements.txt # 依赖列表配置文件 (config.py) 将敏感信息如API Key放在配置文件中不要硬编码在代码里。# config.py import os from dotenv import load_dotenv # 从 .env 文件加载环境变量 load_dotenv() # 获取API Key优先从环境变量读取 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) # 如果没有设置环境变量可以在这里直接写不推荐用于生产 # OPENAI_API_KEY your-api-key-here # 其他配置比如天气API的Key WEATHER_API_KEY os.getenv(WEATHER_API_KEY)同时在项目根目录创建一个.env文件记得加入.gitignore# .env OPENAI_API_KEYsk-your-openai-api-key WEATHER_API_KEYyour-weather-api-key4. 工具调用的核心机制拆解工具调用并非魔法其背后是一套标准化的协议和流程。理解这个流程是进行自定义开发和问题排查的基础。4.1 大模型如何“思考”工具调用当大模型如GPT-4被要求处理一个可能涉及工具调用的请求时其内部流程可以简化为以下几步意图识别模型解析用户的自然语言指令判断其意图是否超出了纯文本生成的范围是否需要与外部系统交互。例如“今天北京天气怎么样”需要调用天气API“帮我查一下用户ID为123的订单”可能需要调用数据库查询接口。工具选择如果判断需要调用工具模型会从其已知的“工具列表”中选择一个最匹配的工具。这个工具列表是在调用模型时由开发者通过系统提示词System Prompt或特定参数如OpenAI的tools参数提供的。参数提取模型从用户指令中提取出调用所选工具所必需的参数并将其格式化为工具定义所要求的JSON结构。例如对于天气查询工具需要提取location城市名参数。生成结构化请求模型不会直接输出“我要调用天气API”而是输出一个严格遵循特定格式的JSON对象。在OpenAI的体系中这表现为在聊天补全的响应中返回一个或多个tool_calls对象。4.2 关键协议OpenAI的tool_calls与Function CallingOpenAI的Chat Completions API是工具调用事实上的标准之一。其核心是tools参数和响应中的tool_calls。定义工具 (tools参数) 在调用chat.completions.create时你可以传入一个tools列表其中每个元素都是一个工具定义对象。这个定义告诉模型“你可以使用这些工具这是它们的名字、描述和参数格式。”# 这是一个工具定义的示例结构 weather_tool_definition { “type”: “function”, “function”: { “name”: “get_current_weather”, “description”: “获取指定城市的当前天气情况” “parameters”: { “type”: “object”, “properties”: { “location”: { “type”: “string”, “description”: “城市名称例如北京上海” }, “unit”: { “type”: “string”, “enum”: [“celsius”, “fahrenheit”], “description”: “温度单位” } }, “required”: [“location”], }, }, }模型的响应 (tool_calls) 当模型决定调用工具时它会在响应消息的tool_calls字段中返回一个数组。{ “id”: “chatcmpl-xxx”, “object”: “chat.completion”, “choices”: [{ “index”: 0, “message”: { “role”: “assistant”, “content”: null, “tool_calls”: [{ “id”: “call_abc123”, “type”: “function”, “function”: { “name”: “get_current_weather” “arguments”: “{\”location\“: \”北京\“ \”unit\“: \”celsius\“}” } }] }, “finish_reason”: “tool_calls” // 注意这里的完成原因 }] }关键点content为null当模型决定调用工具时它通常不会同时生成文本内容。finish_reason为tool_calls这明确告诉开发者模型停止生成是因为它想调用工具。arguments是字符串虽然内容是JSON格式但它是一个字符串需要解析。4.3 执行与回调流程完整的工具调用是一个多轮对话用户请求用户发送消息。模型请求工具调用模型返回带有tool_calls的响应。开发者执行工具你的代码解析tool_calls找到对应的本地函数如get_current_weather使用解析出的参数执行它并获取结果。返回工具结果你将工具执行的结果作为一条新的消息以role“tool”的身份附带上tool_call_id发送回给模型。模型生成最终回答模型接收到工具执行结果后结合对话历史生成面向用户的最终文本回答。这个“模型请求 - 执行工具 - 返回结果 - 模型总结”的循环是智能体工作的基本单元。LangChain等框架将这个循环封装得非常完善开发者只需关注工具和智能体的定义。5. 实战构建一个能查询天气的智能体现在我们将动手实现一个完整的、能调用真实天气API的智能体。我们将使用LangChain来简化流程。5.1 第一步创建自定义天气工具首先我们实现一个具体的工具。这里我们使用一个免费的天气API例如 openweathermap.org需要注册获取API Key作为示例。# tools/weather_tool.py import requests import json from typing import Type, Any from pydantic import BaseModel, Field from langchain.tools import BaseTool, ToolException # 定义工具的输入参数模型 class WeatherToolInput(BaseModel): location: str Field(description“城市名称例如Beijing, London, Tokyo”) unit: str Field(default“metric”, description“温度单位: ‘metric’ 为摄氏度 ‘imperial’ 为华氏度”) class WeatherTool(BaseTool): name: str “get_current_weather” description: str “获取指定城市的当前天气情况包括温度、湿度和天气状况。” args_schema: Type[BaseModel] WeatherToolInput return_direct: bool False # 是否直接返回工具结果不交给模型总结。通常设为False。 # 这是工具的核心执行逻辑 def _run(self, location: str, unit: str “metric”) - str: “”“调用天气API获取数据。”“” # 在实际项目中API Key应从安全配置中读取 api_key “YOUR_WEATHER_API_KEY” # 请替换为你的API Key或从config导入 base_url “http://api.openweathermap.org/data/2.5/weather” params { “q”: location, “appid”: api_key, “units”: unit } try: response requests.get(base_url, paramsparams, timeout10) response.raise_for_status() # 如果状态码不是200抛出HTTPError data response.json() except requests.exceptions.RequestException as e: raise ToolException(f“调用天气API失败: {e}”) except json.JSONDecodeError as e: raise ToolException(f“解析天气API响应失败: {e}”) # 解析API返回的JSON数据 weather_main data.get(“weather”, [{}])[0].get(“main”, “N/A”) weather_desc data.get(“weather”, [{}])[0].get(“description”, “N/A”) temp data.get(“main”, {}).get(“temp”, “N/A”) humidity data.get(“main”, {}).get(“humidity”, “N/A”) city data.get(“name”, “N/A”) result_str ( f“城市{city}\n” f“天气状况{weather_main} ({weather_desc})\n” f“温度{temp}°{‘C’ if unit ‘metric’ else ‘F’}\n” f“湿度{humidity}%” ) return result_str # 异步版本可选用于异步框架 async def _arun(self, location: str, unit: str “metric”) - str: “”“异步调用天气API。本例中我们暂不实现。”“” raise NotImplementedError(“此工具不支持异步调用。”)关键点解析继承BaseTool这是LangChain定义工具的标准方式。args_schema使用Pydantic模型来严格定义工具的输入参数这有助于大模型更准确地生成参数。description字段至关重要它是模型理解参数含义的主要依据。_run方法包含实际的业务逻辑。这里我们调用外部API处理响应和异常并将结果格式化为字符串。异常处理使用ToolException抛出工具执行错误这样智能体可以捕获并可能进行错误恢复或向用户报告。return_direct如果设为True工具执行的结果会直接作为智能体的最终输出返回给用户不再经过大模型总结。适用于结果非常清晰、无需解释的场景。5.2 第二步创建并运行智能体接下来我们使用LangChain的create_openai_tools_agent来创建一个智能体并让其运行。# agents/simple_agent.py 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 WeatherTool import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from config import OPENAI_API_KEY def run_weather_agent(): # 1. 初始化大模型 # 使用gpt-3.5-turbo-1106或gpt-4-turbo-preview等支持工具调用的模型 llm ChatOpenAI( model“gpt-3.5-turbo-1106” # 确保模型支持工具调用 temperature0, # 对于工具调用低温度确定性高通常更好 openai_api_keyOPENAI_API_KEY ) # 2. 定义工具列表 tools [WeatherTool()] # 3. 构建提示词模板 # 系统提示词指导智能体的行为 prompt ChatPromptTemplate.from_messages([ (“system”, “你是一个有用的助手可以查询天气信息。请根据用户的问题使用合适的工具来获取信息然后用友好、清晰的语言回答用户。如果你无法回答请如实告知。”), MessagesPlaceholder(variable_name“chat_history”), # 预留位置存放对话历史 (“user”, “{input}”), MessagesPlaceholder(variable_name“agent_scratchpad”), # 预留位置存放智能体思考过程工具调用和结果 ]) # 4. 创建智能体 agent create_openai_tools_agent(llm, tools, prompt) # 5. 创建智能体执行器 # AgentExecutor封装了循环调用模型、执行工具、管理历史等复杂逻辑 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue, # 设为True可以看到详细的思考过程调试时非常有用 handle_parsing_errorsTrue, # 处理模型输出解析错误 max_iterations5, # 防止智能体陷入无限循环 early_stopping_method“generate” # 停止条件 ) # 6. 运行智能体 print(“天气查询智能体已启动。输入‘退出’或‘quit’结束。”) while True: user_input input(“\n您想问什么天气: “).strip() if user_input.lower() in [“退出” “quit”, “exit”]: print(“再见”) break if not user_input: continue try: # 调用执行器 result agent_executor.invoke({“input”: user_input, “chat_history”: []}) print(f“\n助手{result[‘output’]}”) except Exception as e: print(f“\n抱歉处理您的请求时出错了{e}”) if __name__ “__main__”: run_weather_agent()5.3 第三步运行与验证确保你的OPENAI_API_KEY和WEATHER_API_KEY已正确配置在.env文件中。在终端运行python agents/simple_agent.py。观察输出。当verboseTrue时你会看到类似以下的详细日志清晰地展示了智能体的“思考”过程 进入新的AgentExecutor链... 思考用户想知道北京的天气。我需要使用get_current_weather工具。 行动 { “action”: “get_current_weather” “action_input”: {“location”: “北京” “unit”: “metric”} } 观察城市Beijing 天气状况Clear (clear sky) 温度22.5°C 湿度45% 思考我已经获取到了北京的天气信息现在可以回答用户了。 最终答案北京目前天气晴朗温度大约22.5摄氏度湿度45%。 链结束。结果说明思考模型分析用户意图决定调用工具。行动模型输出了结构化的工具调用请求在LangChain中已格式化。观察工具执行后返回的结果。最终答案模型根据工具返回的结果生成的面向用户的自然语言回答。至此你已经成功构建了一个能够真正“做事”查询天气的大模型应用而不仅仅是聊天。6. 进阶结合RAG与多工具调用的复杂智能体单一的天气查询工具只是一个开始。真正的生产力来自于将多种能力组合起来。下面我们设计一个更复杂的场景一个“旅行助手”智能体它能结合RAG从本地知识库查询旅行指南和工具调用查询天气、查询航班来回答问题。6.1 设计架构RAG模块使用Chroma或FAISS作为向量数据库存储本地的城市旅行指南PDF/TXT文档。工具集get_current_weather查询天气。search_flight查询航班信息模拟或调用真实API。search_travel_guide这是一个RAG工具它接收用户问题从向量库中检索相关旅行指南片段。智能体具备访问以上所有工具的能力并能根据复杂问题如“我下周去北京旅行天气怎么样有什么推荐景点顺便看看机票。”进行规划按顺序或并行调用多个工具综合信息给出建议。6.2 实现RAG工具首先我们需要构建一个RAG检索工具。这里简化处理假设我们已经有一个构建好的向量库。# tools/rag_tool.py from langchain.tools import BaseTool, ToolException from langchain_community.vectorstores import Chroma # 示例使用Chroma from langchain_openai import OpenAIEmbeddings from pydantic import BaseModel, Field from typing import Type class RagToolInput(BaseModel): query: str Field(description“用户关于旅行指南的具体问题”) class TravelGuideRAGTool(BaseTool): name: str “search_travel_guide” description: str “从内部知识库中搜索关于目的地城市旅行指南的信息如景点、美食、文化、注意事项等。” args_schema: Type[BaseModel] RagToolInput def _run(self, query: str) - str: “”“基于向量数据库进行相似性搜索。”“” # 初始化嵌入模型和向量库实际项目中应复用已加载的实例 embeddings OpenAIEmbeddings(openai_api_keyOPENAI_API_KEY) # 假设向量库已持久化在 ./chroma_db 目录 vectorstore Chroma(persist_directory“./chroma_db” embedding_functionembeddings) # 执行相似性搜索 docs vectorstore.similarity_search(query, k3) # 返回最相关的3个片段 if not docs: return “在旅行指南知识库中没有找到相关信息。” # 将检索到的文档内容拼接起来 retrieved_content “\n\n”.join([doc.page_content for doc in docs]) # 可以在这里添加一个总结性提示词让模型提炼但作为工具我们先返回原始内容 return f“根据旅行指南找到以下相关信息\n{retrieved_content}”6.3 创建多工具智能体# agents/travel_agent.py 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 WeatherTool from tools.rag_tool import TravelGuideRAGTool # 假设我们还有一个模拟的航班查询工具 from tools.flight_tool import MockFlightSearchTool from config import OPENAI_API_KEY def create_travel_agent_executor(): llm ChatOpenAI(model“gpt-4-turbo-preview” temperature0, openai_api_keyOPENAI_API_KEY) # 组装所有工具 tools [WeatherTool(), TravelGuideRAGTool(), MockFlightSearchTool()] # 更复杂的系统提示词指导智能体进行规划和协作 prompt ChatPromptTemplate.from_messages([ (“system”, “”” 你是一个专业的旅行助手。你的目标是综合运用所有可用工具为用户提供一站式旅行规划建议。 你可以使用的工具包括 1. search_travel_guide: 查询目的地城市的旅行指南、景点、美食等信息。 2. get_current_weather: 查询目的地城市的当前天气。 3. search_flight: 查询模拟的航班信息。 请遵循以下原则 - 首先理解用户的完整需求。 - 如果问题涉及多个方面如既问天气又问景点请规划步骤依次或并行调用相关工具。 - 将不同工具获取的信息整合起来形成连贯、有帮助的回答。 - 如果信息不足可以主动询问用户更多细节如具体出行日期、预算等。 “””), MessagesPlaceholder(variable_name“chat_history”), (“user”, “{input}”), MessagesPlaceholder(variable_name“agent_scratchpad”), ]) agent create_openai_tools_agent(llm, tools, prompt) executor AgentExecutor(agentagent, toolstools, verboseTrue, max_iterations8) return executor if __name__ “__main__”: agent_executor create_travel_agent_executor() complex_question “我计划下个月去巴黎旅行能告诉我那里的天气大概怎样吗另外巴黎有哪些必去的博物馆” result agent_executor.invoke({“input”: complex_question, “chat_history”: []}) print(f“\n旅行助手{result[‘output’]}”)运行这个智能体你会看到它可能先调用search_travel_guide查询博物馆信息再调用get_current_weather查询天气注意下个月的天气需要预报API当前工具是查询实时天气这里只是示例流程最后将两部分信息融合成一个完整的回答。这充分展示了智能体如何通过工具调用和RAG完成复杂的、需要多步骤和信息整合的任务。7. 常见问题与排查思路在开发工具调用应用时你可能会遇到以下典型问题问题现象可能原因排查思路与解决方案模型不调用工具直接生成文本回答。1. 工具描述 (description) 不清晰或与用户问题不匹配。2. 模型能力不足如使用了不支持工具调用的旧模型。3. 系统提示词未明确指示使用工具。1.优化工具描述确保description和参数description准确、具体。例如“获取天气”不如“获取指定城市的当前温度、湿度和天气状况”清晰。2.检查模型确认使用gpt-3.5-turbo-1106、gpt-4-turbo-preview或更新版本。3.强化系统提示在系统提示词中明确要求“请使用可用工具来获取信息”。模型调用了错误的工具或参数解析错误。1. 工具名称或参数名容易混淆。2. 用户指令模糊模型无法准确提取参数。1.工具差异化给工具起独特、描述性强的名字。参数名也要清晰。2.提供示例在系统提示词中提供少量工具调用示例Few-shot Prompting。3.参数约束在Pydantic模型中使用Field的description详细描述参数使用enum限制可选值。工具执行失败如API超时、返回错误。1. 网络问题或外部服务不可用。2. 参数格式错误导致API调用失败。3. 权限问题API Key无效。1.完善异常处理在工具的_run方法中捕获所有可能的异常并用ToolException抛出清晰的错误信息方便智能体处理。2.添加重试机制对于网络请求可以使用tenacity库添加指数退避重试。3.验证输入在执行外部调用前对输入参数进行验证和清洗。智能体陷入循环不断调用同一个工具。1. 工具返回的结果无法让模型得出最终结论。2.max_iterations设置过高。3. 智能体逻辑出现死循环。1.检查工具输出确保工具返回的信息是明确、格式化的。混乱的输出会导致模型困惑。2.限制迭代次数合理设置AgentExecutor的max_iterations如5-10次。3.优化提示词在系统提示中要求智能体“在获得足够信息后给出最终答案”。处理速度慢。1. 串行调用多个工具每个都等待网络I/O。2. 模型响应慢。1.并行化对于独立的工具调用可以探索使用AgentExecutor的异步接口或并行处理逻辑。2.缓存对频繁查询且结果变化不快的工具如某些静态知识查询实施缓存。3.模型选择在精度和速度间权衡gpt-3.5-turbo比gpt-4系列更快。8. 工程最佳实践与进阶考量将工具调用应用到生产环境需要考虑更多工程化问题。1. 工具设计与描述工程单一职责每个工具应只做一件事并做好。这使模型更容易理解和调用。描述即契约工具和参数的description是模型理解的唯一来源。要用自然语言清晰、无歧义地描述其功能、输入和输出。可以把它当作写给模型的API文档。结构化输出尽可能让工具返回结构化的数据如JSON字符串而不是纯自然语言段落。这为后续处理如直接展示在前端提供便利。2. 智能体流程控制设置超时与迭代限制必须防止智能体无休止运行。AgentExecutor的max_execution_time和max_iterations是关键安全阀。处理解析错误handle_parsing_errorsTrue可以捕获模型输出不符合工具格式的错误并尝试让模型重试或给出友好错误。记忆管理对于长对话需要管理chat_history。简单的做法是使用ConversationBufferWindowMemory只保留最近N轮对话避免上下文过长导致性能下降和成本增加。3. 安全与权限工具权限隔离不是所有用户都能调用所有工具。需要在应用层实现权限检查根据用户身份动态过滤可用的工具列表。输入验证与净化在工具执行前务必验证所有输入参数防止注入攻击特别是调用数据库或系统命令的工具。沙箱环境对于执行代码或访问敏感系统的工具应考虑在沙箱或受限环境中运行。4. 可观测性与调试开启verbose模式在开发阶段这是理解智能体决策过程的最重要手段。结构化日志记录完整的交互流水包括用户输入、模型请求、工具调用详情、工具结果、模型最终输出。这对于问题复现和效果分析至关重要。评估与监控建立评估体系监控工具调用的成功率、延迟、成本并根据数据持续优化提示词和工具设计。5. 与RAG的深度结合工具即检索器如上文所示可以将RAG系统本身封装成一个工具让智能体在需要知识时主动查询。结果增强也可以将工具调用的结果作为额外的上下文输入给RAG的检索或重排Re-ranking阶段使最终答案更精准。通过遵循这些最佳实践你可以构建出不仅功能强大而且稳定、安全、可维护的大模型智能体应用真正让大模型成为你业务中能够可靠“做事”的智能伙伴。从简单的API调用到复杂的多步骤任务编排工具调用技术为我们打开了通往AI原生应用的大门。
返回列表