LangChain4J Tools (Function Calling)

LangChain4J工具(函数调用)详解

LangChain4J Tools (Function Calling)

一些大语言模型(LLM)除了生成文本外,还可以触发某些动作。

注意:所有支持工具的LLM都可以在此处找到(请查看“Tools”列)。

有一个概念叫做“工具”或“函数调用”。它允许 LLM 在必要时调用一个或多个可用的工具,这些工具通常由开发者定义。工具可以是任何东西:一个网络搜索、对外部 API 的调用,或执行特定代码等。LLM 本身不能实际调用工具;相反,它们会在响应中表达调用特定工具的意图(而不是直接以纯文本回应)。我们作为开发者应当执行这个工具,并返回工具执行的结果。

例如,我们知道 LLM 本身在数学方面不太擅长。如果你的使用场景中涉及偶尔的数学计算,你可能希望为 LLM 提供一个“数学工具”。通过在请求中声明一个或多个工具,LLM 可以根据需要决定是否调用其中一个工具。如果给定了一个数学问题和一组数学工具,LLM 可能会决定为了正确回答问题,应该首先调用其中的某个数学工具。

让我们看一下在实践中的应用示例(有工具和没有工具的情况):

没有工具的消息交换示例:

请求:
	消息:
		用户消息:
			文本:475695037565的平方根是多少?
响应:
	AI消息:
		文本:475695037565的平方根大约是689710。

从结果看,接近,但不正确。

使用以下工具的消息交换示例:

@Tool("求两个给定数字的和")
double sum(double a, double b) {
   
   
    return a + b;
}

@Tool("返回给定数字的平方根")
double squareRoot(double x) {
   
   
    return Math.sqrt(x);
}
请求1:
	消息:
		用户消息:
			文本:475695037565的平方根是多少?
工具:
	sum(double a, double b): 求两个给定数字的和
	squareRoot(double x): 返回给定数字的平方根
	
响应1:
	AI消息:
	工具执行请求:
		squareRoot(475695037565)
... 在这里,我们执行了squareRoot方法,传入"475695037565"作为参数,结果为"689706.486532" ...

请求2:
	消息:
		用户消息:
			文本:475695037565的平方根是多少?
	AI消息:
		工具执行请求:
			squareRoot(475695037565)
	工具执行结果消息:
		文本:689706.486532
		
响应2:
	AI消息:
		文本:475695037565的平方根是689706.486532。

正如你所看到的,当 LLM 可以访问工具时,它可以在适当的时候决定调用其中一个工具。

这是一个非常强大的功能。在这个简单的示例中,我们给 LLM 提供了基本的数学工具,但想象一下,如果我们给它提供了例如 googleSearch 和 sendEmail 工具,并提出一个查询:“我的朋友想了解 AI 领域的最新新闻。将简短的总结发送到 friend@email.com”,那么它可以使用 googleSearch 工具查找最新的新闻,接着总结这些新闻并通过 sendEmail 工具将总结通过邮件发送出去。

注意:为了增加 LLM 调用正确工具和正确参数的机会,我们应该提供清晰且不含歧义的:

  • 工具名称
  • 工具的功能描述以及何时使用该工具
  • 每个工具参数的描述

一个好的经验法则是:如果人类可以理解一个工具的用途和如何使用它,LLM 也很可能能理解。
LLM 经过特别微调,以便检测何时调用工具以及如何调用它们。有些模型甚至可以同时调用多个工具,例如 OpenAI。

注意:

  1. 并非所有模型都支持工具。要查看哪些模型支持工具,请参阅此页面的“Tools”列。
  2. 工具/功能调用与JSON模式不同。

两个层次级别

LangChain4j 提供了使用工具的两个层次级别:

低级别:使用 ChatLanguageModel 和 ToolSpecification API
高级别:使用 AI Services(AI 服务)和 @Tool 注解的 Java 方法

低级别工具 API

在低级别,你可以使用 ChatLanguageModel 的 generate(List< ChatMessage>, List< ToolSpecification>) 方法。类似的方法在 StreamingChatLanguageModel 中也有。

ToolSpecification 是一个包含工具所有信息的对象:

  • 工具的名称
  • 工具的描述
  • 工具的参数及其描述

建议尽可能提供关于工具的详细信息:清晰的名称、全面的描述以及每个参数的描述等。

有两种方式创建 ToolSpecification:

手动创建:

ToolSpecification toolSpecification = ToolSpecification.builder()
    .name("getWeather")
    .description("返回给定城市的天气预报")
    .parameters(JsonObjectSchema.builder()
        .addStringProperty("city", "需要返回天气预报的城市")
        .addEnumProperty("temperatureUnit", List.of("CELSIUS", "FAHRENHEIT"))
        .required("city") // 必填的属性需要明确指定
        .build())
    .build();

你可以在这里找到有关 JsonObjectSchema 的更多信息。

使用辅助方法:

ToolSpecifications.toolSpecificationsFrom(Class)
ToolSpecifications.toolSpecificationsFrom(Object)
ToolSpecifications.toolSpecificationFrom(Method)

class WeatherTools {
   
    
  
    @Tool("返回给定城市的天气预报")
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值