}

Tool Reduction 策略实现笔记

📌 概述

通过 Embedding 技术实现智能工具筛选,减少 AI 模型需要处理的工具数量,提高响应效率。

🛠️ 核心实现步骤

1. 批量工具注册

csharp

IList<AITool> batchRegisteredTools =
    typeof(AICallFunction)
        .GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
        .Select(method => AIFunctionFactory.Create(
            method,
            travelTools,
            name: method.Name.ToLowerInvariant(),
            description: method.GetCustomAttribute<DescriptionAttribute>()?.Description))
        .Cast<AITool>()
        .ToList();
  • 反射机制:自动扫描 AICallFunction 类中的所有公共实例方法

  • 命名规范:方法名转换为小写作为工具名称

  • 描述提取:从 DescriptionAttribute 获取工具描述信息

2. Embedding Tool Reduction 策略配置

csharp

var strategy = new EmbeddingToolReductionStrategy(
    embeddingClient,    // Embedding 生成器
    toolLimit: 5        // 最多保留 5 个相关工具
);
  • 核心参数

    • embeddingClient:负责将文本转换为向量表示

    • toolLimit:限制返回的工具数量,避免信息过载

3. 启用 Tool Reduction 的客户端构建

csharp

var reducingClient = chatClient.AsBuilder()
    .UseToolReduction(strategy)      // 应用工具筛选策略
    .UseFunctionInvocation()          // 启用函数调用功能
    .Build();

4. 聊天选项配置

csharp

var chatOptions = new ChatOptions
{
    Tools = batchRegisteredTools,    // 注册所有可用工具
    ToolMode = ChatToolMode.Auto     // 自动模式:AI 决定何时调用工具
};

🔄 工作流程

完整请求处理

csharp

var response = await reducingClient.GetResponseAsync(
    "北京今天天气怎么样?",    // 用户查询
    chatOptions                 // 包含工具列表的配置
);

手动工具筛选测试

csharp

var selectedTools = await strategy.SelectToolsForRequestAsync(
    [new ChatMessage(ChatRole.User, "北京今天天气怎么样?")],  // 用户消息
    chatOptions,                                                // 聊天配置
    CancellationToken.None                                     // 取消令牌
);

📊 效果验证

text

✅ 已注册 X 个工具
✅ 已创建启用 Tool Reduction 的 ChatClient
响应内容: [AI 返回的天气信息]

📊 原始工具数量: X
🎯 筛选后工具数量: 5
🔧 筛选后的工具列表:
- [相关工具1]
- [相关工具2]
- [相关工具3]
- [相关工具4]
- [相关工具5]

💡 技术亮点

  1. 智能筛选:基于语义相似度选择最相关的工具

  2. 性能优化:从大量工具中精准筛选,减少模型负担

  3. 配置灵活:可调整工具数量限制,平衡精度与性能

  4. 易于集成:通过 Builder 模式简单启用

🎯 应用场景

  • 多工具系统:当注册工具数量较多时(如20+)

  • 复杂查询:需要从多个工具中选择最合适的执行器

  • 性能敏感:需要减少 AI 模型 token 消耗的场景


不会做游戏