}
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]💡 技术亮点
智能筛选:基于语义相似度选择最相关的工具
性能优化:从大量工具中精准筛选,减少模型负担
配置灵活:可调整工具数量限制,平衡精度与性能
易于集成:通过 Builder 模式简单启用
🎯 应用场景
多工具系统:当注册工具数量较多时(如20+)
复杂查询:需要从多个工具中选择最合适的执行器
性能敏感:需要减少 AI 模型 token 消耗的场景