langchain4j动态函数调用

langchain4j动态函数调用

起男 19 2025-05-01

langchain4j动态函数调用

在传统functionCalling的基础上,可以让大模型返回可运行的脚本语言代码,langchain4j收到后调用CodeExecutionEngine执行,再将结果返回给大模型

LangChain4j目前支持两种主要的代码执行引擎:

  1. GraalVM
    • Polyglot: 允许在同一应用中无缝使用多种编程语言
    • Truffle: 用于构建语言引擎的框架,支持轻松添加新语言
  2. 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()