这篇适合谁,读完能做到什么
这篇适合已经会调用大模型、想让它查数据库、调接口或执行代码的开发者。读完你应该能说清工具调用(Tool Use)设计模式是什么,列出它需要的组成部分,照着示例走完一次函数调用的完整流程,并知道让模型接触数据库时该设置哪些安全限制[1]。
工具调用是什么
工具调用设计模式让大模型能与外部工具交互,以达成具体目标。工具就是智能体可以执行的代码,用来完成某个动作。它可以是一个简单的函数,比如计算器,也可以是调用第三方服务的 API,比如查询股价或天气预报[1]。在智能体中,工具是响应模型生成的函数调用(function call)而执行的[1]。
哪些场景适合用工具
工具让智能体能完成复杂任务、获取信息并做出决定。当智能体需要和外部系统动态交互时,这种模式最常见,比如数据库、Web 服务和代码解释器。典型用途包括[1]:
- 动态获取信息:查询外部 API 或数据库拿到最新数据,例如查询 SQLite 数据库做数据分析,或获取股价和天气[1]。
- 执行代码:运行代码或脚本,解数学题、生成报告或做模拟[1]。
- 工作流自动化:接入任务调度器、邮件服务或数据管道,处理重复性或多步骤的工作[1]。
- 客户支持:与 CRM 系统、工单平台和知识库交互,解决用户的问题[1]。
- 内容生成与编辑:借助语法检查、文本摘要或内容安全评估工具辅助写作[1]。
需要哪些组成部分
要实现这种模式,需要六类组件[1]。
- 函数或工具的 schema:描述每个工具的名称、用途、必填参数和预期输出,让模型知道有哪些工具,以及怎样构造合法的请求[1]。
- 函数执行逻辑:根据用户意图和对话上下文,决定什么时候、怎样调用工具,可以包括规划模块、路由机制或条件分支[1]。
- 消息处理:管理用户输入、模型回复、工具调用和工具输出之间的对话流[1]。
- 工具集成框架:把智能体连接到各种工具,无论是简单函数还是复杂的外部服务[1]。
- 错误处理与校验:应对工具执行失败、校验参数,并处理意外的返回结果[1]。
- 状态管理:跟踪对话上下文和之前的工具交互,让多轮对话保持一致[1]。
一次函数调用的完整流程
函数调用(function calling)是大模型使用工具的主要方式。「函数」和「工具」两个词常被混用,因为函数(可复用的代码块)正是智能体用来完成任务的工具[1]。模型要调用某个函数时,会把用户请求和所有函数的描述做对比,返回它认为最合适的函数名和参数。应用随后执行该函数,把结果送回模型,由模型写出最终回答[1]。
要做到这一点,需要三样东西:支持函数调用的大模型、描述函数的 schema,以及每个函数的代码[1]。并不是所有模型都支持函数调用。Azure OpenAI 支持,示例使用 Responses API 的稳定 /openai/v1/ 端点,不需要 api_version[1]。
下面以「查询旧金山当前时间」为例,分三步走。
第一步,初始化客户端。代码如下[1]:
# Initialize the OpenAI client for Azure OpenAI (Responses API, v1 endpoint)
client = OpenAI(
base_url=f"{os.environ['AZURE_OPENAI_ENDPOINT'].rstrip('/')}/openai/v1/",
api_key=os.environ["AZURE_OPENAI_API_KEY"],
)
deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT"]第二步,定义函数 schema。它包含函数名、功能说明,以及每个参数的名称和说明[1]:
# Function description for the model to read (Responses API flat tool format)
tools = [
{
"type": "function",
"name": "get_current_time",
"description": "Get the current time in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. San Francisco",
},
},
"required": ["location"],
},
}
]第三步,处理返回结果。模型第一次的回复是一个工具调用,而不是最终答案,里面写明了函数名和参数。你的代码要执行这个函数,把输出作为函数调用结果回传,再发一次请求,拿到最终回答[1]。
简单说,模型负责选择和描述调用,代码负责真正执行并返回结果[1]。
用 Microsoft Agent Framework 写工具
Microsoft Agent Framework 用 @tool 装饰器,把一个 Python 函数变成工具。框架负责模型和代码之间的来回通信,并根据函数和参数自动生成 schema[1]。它还能通过 FoundryChatClient 提供 File Search、Code Interpreter 等预置工具[1]。下面的示例把前面的时间函数改写成工具[1]:
import os
from agent_framework import tool
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
@tool(approval_mode="never_require")
def get_current_time(location: str) -> str:
"""Get the current time for a given location"""
...
# Create the client
provider = FoundryChatClient(
project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
credential=AzureCliCredential(),
)
# Create an agent and run with the tool
agent = provider.as_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")示例中函数体里的 ... 代表你自己要写的查询逻辑,示例中省略了。
Foundry Agent Service 多做了什么
Microsoft Foundry Agent Service 是一项完全托管的服务。开发者可以构建、部署和扩展智能体,无需管理底层的计算和存储资源,并且提供企业级安全[1]。与直接调用模型 API 相比,它有三点实际好处[1]:
- 自动工具调用:解析工具调用、执行工具、处理返回结果,全部在服务端完成。
- 托管对话数据:线程(thread)保存对话所需的信息,开发者不必自己管理对话状态。
- 现成的工具:例如 Bing、Azure AI Search 和 Azure Functions,用来接入数据源[1]。
服务里的工具分两类[1]。知识类工具包括 Grounding with Bing Search、File Search 和 Azure AI Search;动作类工具包括 Function Calling、Code Interpreter、由 OpenAPI 定义的工具,以及 Azure Functions[1]。服务可以把这些工具组合成一个 toolset,线程则记录每次对话的消息历史[1]。
在 Contoso 销售数据的例子里,大模型会根据用户的问题,在开发者自己写的函数 fetch_sales_data_using_sqlite_query 与预置的 Code Interpreter 之间做选择[1]。
让模型生成的 SQL 只读
大模型动态生成的 SQL,最大的担心是安全问题:SQL 注入,或者删除、篡改数据库。这些风险可以通过正确设置数据库访问权限大幅降低,对大多数数据库来说,做法就是把数据库设为只读[1]。如果用的是 PostgreSQL 或 Azure SQL 这类数据库服务,应当给应用分配只读(SELECT)角色[1]。
在安全的环境里运行应用,又能再加一层保护[1]。企业场景中,数据通常会从业务系统抽取、转换到只读的数据库或数据仓库,结构清晰易懂,应用只拥有受限的只读权限[1]。
下一步
示例代码在仓库的 code_samples 目录下,有一个面向 Agent Framework 的 Python notebook,还有一个 .NET 文件[1]。如果你用 Python,先运行 notebook 即可。
本文改编自 Microsoft 开源课程《AI Agents for Beginners》第 4 课[1],原文以 MIT 许可证发布。
来源
- 1Tool Use Design PatternMicrosoft ai-agents-for-beginners (MIT)
引用本页: 智能体工具调用怎么做:函数调用流程与安全要点. TellWorld, https://www.tellworld.net/zh/practice/practice-agent-tool-use. 更新于 2026-11-14