Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plan for building a tool repository #98

Open
chickenlj opened this issue Nov 7, 2024 · 1 comment
Open

Plan for building a tool repository #98

chickenlj opened this issue Nov 7, 2024 · 1 comment

Comments

@chickenlj
Copy link
Collaborator

image

Spring AI Function

先来看 Spring AI Function Calling 是怎么定义的。

image

设计方案

方案一

不做额外的抽象,用户使用标准的 Spring AI 使用方式定义 Function,以 spring-starter 或类似的方式来透出插件定义。

比如我们可能会有:

  • baidu-search-plugin-starter
  • bing-search-plugin-starter
  • xxx-plugin-starter

baidu-search-plugin-starter

一个示例插件定义如下

@Configuration
static class BaiduSearchPluginConfiguration {

	@Bean
	@Description("Use baidu search engine to query for the latest news.") // function description
	public Function<BaiduSearchRequest, BaiduSearchResponse> search() {
		return new BaiduSearchService();
	}

}


class BaiduSearchService implements Function {
    // implementation
}

用户使用方式

  1. 加入 baidu-search-plugin-starter 依赖
  2. chatclient.functions("baidu_search").call() 启用

缺点是插件管理和扩展略微重一点

方案二

定义额外的 SPI 接口,开发者遵循SPI接口扩展即可,扩展者无需做Spring等相关配置。

先看看用户怎么使用插件

  1. 用户或者社区开发者如何自定义新的插件?
class BaiduSearchTool implements ToolProvider {
    public FunctionCallbackWrapper<I, O> getFunctionCallback() {
        return FunctionCallbackWrapper.builder(new BaiduSearchService())
            .withName("CurrentWeather") // (1) function name
            .withDescription("Get the weather in location") // (2) function description
            .build();
    }
}

class BaiduSearchService implements Function<BaiduSearchRequest, BaiduSearchResponse> {
    public BaiduSearchResponse apply(BaiduSearchRequest request) {
        return xxx;
    }
}

配置以上实现到标准的 java SPI services

com.alibaba.cloud.ai.community.tools.BaiduSearchTool
  1. 业务用户如何使用生态中已有的插件?
//其中 baidu_search 为用户定义的插件 id
chatbuilder.defaultFunctions("baidu_search").build();
chatClient.functions("baidu_search").call();

插件机制具体设计方案(框架内核实现)

SPI 定义

interface ToolProvider<I, O> {
    FunctionCallbackWrapper<I, O> getFunctionCallback();
}

SPI 实现加载与注册

class ToolProviderLoader {
    // load all ToolProvider impls
    List<ToolProvider> tools = load(ToolProvider.class)
    // register impl into Spring AI function context
    functionCallbackContext.register();
}

image

部分插件实现可做内部抽象

  • 简单的插件可直接扩展后自行实现。
  • 复杂一点的插件可考虑再做一些抽象
    • 搜索
    • 通用API调用
    • xxx

方案其他待考虑事项

  • 考虑插件自身配置的问题,有些插件参数配置初。比如支持在 application.properties 中配置
  • 考虑插件执行前后的一些行为嵌入,如执行前校验、日志记录、执行后评估等

常见插件分类

从开发者角度来讲,插件和工具主要包括以下几类:

  • 搜索插件: 包括baidu search、quark search等搜索工具。
  • 办公插件: 包括邮件发送、企业微信机器人、钉钉群机器人、飞书群机器人等办公工具。
  • 日常生活插件: 包括天气查询,腾讯新闻,携程,飞猪酒店等插件。
  • 数据库工具: 包括sql、nosql检索等插件。
  • 文档解析: 包括word、excel、pdf、html等文档解析插件。
  • API调用工具: 基于restful api或者rest client的api调用工具等。
@chickenlj chickenlj changed the title Tool Plan for building a tool repository Nov 7, 2024
@hzdavid
Copy link

hzdavid commented Nov 13, 2024

666

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants