langchain4j:Tool的使用
在langchain4j中,支持function calling的模型可以使用自定义参数或MCP服务调用函数实现Agent功能描述:存放LLM模型请求中的tools中的函数信息,用于LLM模型理解并根据信息决定是否使用function calling功能以及根据信息构建函数的参数。如上图所示,ToolSpecifications工具类接收含有回调函数的类或直接接收回调函数,并通过反射获取@Tool
在langchain4j中,支持function calling的模型可以使用自定义参数或MCP服务调用函数实现Agent功能
核心类:
ToolSpecification和ToolSpecifications工具类
描述:存放LLM模型请求中的tools中的函数信息,用于LLM模型理解并根据信息决定是否使用function calling功能以及根据信息构建函数的参数。

如上图所示,ToolSpecifications工具类接收含有回调函数的类或直接接收回调函数,并通过反射获取@Tool、@P等注解的信息,并转化为ToolSpecification信息,以便后续传递给LLM
ToolExecutor和ToolExecutionRequest
描述:用于接收LLM构建的请求信息(用ToolExecutionRequest封装)并根据请求信息执行传参和函数回调操作(function calling功能只能让AI构建请求信息,如函数名,参数等,具体执行需要自己监听和进行回调操作)
ToolExecutionRequest类:接收LLM的请求信息
name:调用的函数名称
arguments:LLM构建的参数

默认ToolExecutor实现类:


object:回调函数工具类(有@Tool注解方法的类)的实例(可以是单例,用于反射时查找方法)
originalMethod:回调函数的源方法,即它自身
methodInvoke:需要反射调用的方法,一般与源方法相同,也可自己指定
1、该实现类接收具体的类实例和回调函数,在需要调用时通过反射查找类实例中需要回调的函数并进行调用
2、该实现类执行回调函数并获取响应结果后会自行构建新的包含响应的请求给LLM进行二次输出

完整示例:(使用ToolProvider实现动态注入)
注:这里通过构建ToolProvider实现动态注入tool方法,langchain4j也支持直接使用@Component注解并通过AiServices类自动扫描@Tool注解并构建ToolSpecification和ToolExecutor,这样就只需要定义一个回调函数工具类即可
1、构建回调函数工具类(可以定义多个回调函数)

2、注入回调函数的工具类实例(含@Tool注解方法的类)

3、自定义方法,并使用工具类手动构建ToolSpecification和ToolExecutor

4、构建ToolProvider类
5、添加到Assistant中(@AiService注解暂不支持指定ToolProvider,但允许指定tools,即直接传入函数调用工具类)

6、请求和响应:
首次请求:

成功触发LLM的tool_calls,构建回调函数信息(函数名,参数等):

构建ToolExecutionRequest请求并执行ToolExecutor获取函数返回值:


构建二次请求给LLM获取新的回复:

完整的Ai信息:
AiMessage { text = null toolExecutionRequests = [ToolExecutionRequest { id = "019639f2f8e293774223b34a23c7d96f", name = "getWeatherInfo", arguments = "{"city":"北京"}" }] }, ToolExecutionResultMessage { id = "019639f2f8e293774223b34a23c7d96f" toolName = "getWeatherInfo" text = "{
"weather" : "天气:暴雨",
"temperature" : "气温:8摄氏度",
"message" : "根据人设和结果构建回答"
}" }, AiMessage { text = "北京目前是暴雨天气,气温8摄氏度,出门记得带伞哦!" toolExecutionRequests = null }]
更多推荐




所有评论(0)