AI 工具调用

工具调用 是一项 AI 模型功能,可用于向 AI 模型描述可用的工具,以便模型可以请求应用程序调用它们。 工具可以是 .NET 方法、对外部 API 的调用、与 模型上下文协议(MCP) 服务器的交互或任何其他可执行作。 模型不直接执行这些工具,而是返回一个结构化输出,描述要调用的工具以及使用哪些参数。 您的应用程序调用这些工具,并将结果返回到模型,从而能够生成更准确和扎实的响应。

Microsoft.Extensions.AI (MEAI) 为跨 AI 服务(包括 Azure OpenAI、OpenAI、Ollama 等)的工具调用提供与提供程序无关的抽象。 编写工具调用逻辑一次,无论使用何种基础模型或提供程序,它都会正常工作。

为何使用工具调用

工具调用简化了将外部工具连接到 AI 模型的方式。 在对话中,将每个工具描述给模型听。 然后,模型根据用户的问题确定要调用的工具。 应用程序调用请求的工具并返回结果后,模型使用这些结果构造更完整和准确的响应。

工具调用的常见用例包括:

  • 通过调用外部 API 回答问题。 例如,检查天气预报或发送电子邮件。
  • 从内部数据存储检索信息。 例如,聚合销售数据以回答“我最畅销的产品是什么?”
  • 从非结构化文本生成结构化数据。 例如,从聊天历史记录创建用户资料。

在 MEAI 中调用 AI 函数

用于调用 AI 函数的 IChatClient 总体流程为:

  1. 将 .NET 方法定义为函数,并在实例上 ChatOptions 配置它们。

  2. 将用户的消息发送到模型。 模型决定调用哪些函数(如果有)。 它返回一个结构化响应,其中列出了函数调用及其参数。

    注释

    模型可能会使函数定义中未描述的参数幻觉。

  3. 分析模型的响应,并使用指定的参数调用请求的函数。

  4. 发送另一个请求,其中包含函数结果作为对话历史记录中的新消息。

  5. 模型使用更多函数调用请求或用户问题的最终答案进行响应。 继续调用请求的函数,直到模型提供最终响应。

MEAI FunctionInvokingChatClient 会自动处理步骤 3 到 5,因此无需自行管理调用循环。

键类型

MEAI 提供以下类型来支持函数调用:

  • AIFunction:表示可描述为 AI 模型并调用的函数。 这是 MEAI 中函数的核心抽象。
  • AIFunctionFactory:提供从.NET方法创建 AIFunction 实例的工厂方法。 用于 AIFunctionFactory 将现有方法包装为函数,而无需编写样本说明或参数分析代码。
  • FunctionInvokingChatClient:包裹任何 IChatClient 并添加自动函数调用功能。 当模型请求函数调用时, FunctionInvokingChatClient 调用相应的 AIFunction函数、收集结果并继续对话(全部透明)。

并行函数调用

某些模型支持 并行函数调用,其中模型在单个响应中请求多个函数调用。 应用程序调用每个函数,并在一条后续消息中一起返回所有结果。 并行函数调用可减少到模型的往返次数,从而降低延迟和 API 使用率。 FunctionInvokingChatClient 支持自动调用并行函数。

跨供应商支持

将 MEAI 用于函数调用的主要优点之一是供应商独立性。 AIFunctionAIFunctionFactoryFunctionInvokingChatClient类型适用于任何IChatClient实现,包括:

  • Azure OpenAI
  • OpenAI
  • Ollama
  • 任何其他实现 IChatClient 的提供程序

由于函数调用支持因模型和提供程序而异,因此请检查提供程序的文档以确认特定模型是否支持函数调用或并行函数调用。

令牌注意事项

发送给模型的请求中包含工具描述,并计入模型的令牌数限制。 这意味着工具定义有助于令牌消耗和请求成本。

如果请求接近模型的令牌计数限制,请考虑以下调整:

  • 减少为聊天注册的工具数。
  • 缩短用于生成工具定义的方法名称和说明。
  • 将工具注册限制为仅与给定聊天上下文相关的工具。