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。
注意:
两个层次级别
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("返回给定城市的天气预报")
LangChain4J工具(函数调用)详解

最低0.47元/天 解锁文章
975

被折叠的 条评论
为什么被折叠?



