langchain4j动态函数调用
在传统functionCalling的基础上,可以让大模型返回可运行的脚本语言代码,langchain4j收到后调用CodeExecutionEngine执行,再将结果返回给大模型
LangChain4j目前支持两种主要的代码执行引擎:
- GraalVM
- Polyglot: 允许在同一应用中无缝使用多种编程语言
- Truffle: 用于构建语言引擎的框架,支持轻松添加新语言
- Judge0
- 开源代码执行引擎,支持多种编程语言(C, C++, Java, Python, Ruby等)
- 被誉为”世界上最先进的开源在线代码执行系统”
依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-code-execution-engine-graalvm-polyglot</artifactId>
</dependency>
functionCalling
langchain4j提供了一个tool
public class GraalVmJavaScriptExecutionTool {
private final CodeExecutionEngine engine = new GraalVmJavaScriptExecutionEngine();
public GraalVmJavaScriptExecutionTool() {
}
@Tool({"MUST be used for accurate calculations: math, sorting, filtering, aggregating, string processing, etc"})
public String executeJavaScriptCode(@P("JavaScript code to execute, result MUST be returned by the code") String code) {
return this.engine.execute(code);
}
}
配置bean
@Bean
public GraalVmJavaScriptExecutionTool graalVmJavaScriptExecutionTool(){
return new GraalVmJavaScriptExecutionTool();
}
AiService
@AiService(
wiringMode = AiServiceWiringMode.EXPLICIT,
chatModel = "qwenChatModel",
tools = "graalVmJavaScriptExecutionTool"
)
public interface GraalAssistant {
String chat(String message);
}
测试
@Autowired
private GraalAssistant graalAssistant;
@Test
void test(){
String chat = graalAssistant.chat("科学记数法中485906798473894056的平方根是多少?");
System.out.println(chat);
}
tool会收到参数:const num = 485906798473894056; const sqrtNum = Math.sqrt(num); sqrtNum.toExponential()