本文主要研究一下langchain4j的Code Execution Engine

步骤

pom.xml

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-code-execution-engine-graalvm-polyglot</artifactId>
    <version>1.0.0-beta2</version>
</dependency>

example

    @Test
    void should_execute_tool() {
        GraalVmJavaScriptExecutionTool tool = new GraalVmJavaScriptExecutionTool();
        Assistant assistant = AiServices.builder(Assistant.class)
                .chatLanguageModel(model)
                .tools(tool)
                .chatMemory(MessageWindowChatMemory.withMaxMessages(10))
                .build();
        String answer = assistant.chat("What is the square root of 485906798473894056 in scientific notation?");
        assertThat(answer).contains("6.97");
    }
这里给assistant设置GraalVmJavaScriptExecutionTool,输出示例:
2025-03-24T20:26:30.533+08:00 DEBUG 67097 --- [           main] d.l.service.tool.DefaultToolExecutor     : About to execute ToolExecutionRequest { id = null, name = "executeJavaScriptCode", arguments = "{
  "arg0" : "Math.sqrt(485906798473894056).toExponential()"
}" } for memoryId default
2025-03-24T20:26:31.686+08:00 DEBUG 67097 --- [           main] d.l.service.tool.DefaultToolExecutor     : Tool execution result: 6.97070153193991e+8

源码

CodeExecutionEngine

dev/langchain4j/code/CodeExecutionEngine.java

public interface CodeExecutionEngine {

    /**
     * Execute the given code.
     *
     * @param code The code to execute.
     * @return The result of the execution.
     */
    String execute(String code);
}
langchain4j定义了CodeExecutionEngine接口,该接口定义了execute方法用于执行指定的代码,langchain4j-code-execution-engine-graalvm-polyglot模块提供了两个实现,分别是GraalVmPythonExecutionEngine、GraalVmJavaScriptExecutionEngine

GraalVmPythonExecutionEngine

dev/langchain4j/code/graalvm/GraalVmPythonExecutionEngine.java

public class GraalVmPythonExecutionEngine implements CodeExecutionEngine {

    @Override
    public String execute(String code) {
        OutputStream outputStream = new ByteArrayOutputStream();
        try (Context context = Context.newBuilder("python")
            .sandbox(TRUSTED)
            .allowHostAccess(UNTRUSTED)
            .out(outputStream)
            .err(outputStream)
            .build()) {
            Object result = context.eval("python", code).as(Object.class);
            return String.valueOf(result);
        }
    }
}
GraalVmPythonExecutionEngine的execute方法使用GraalVM Polyglot/ Truffle来执行python代码

GraalVmJavaScriptExecutionEngine

dev/langchain4j/code/graalvm/GraalVmJavaScriptExecutionEngine.java

public class GraalVmJavaScriptExecutionEngine implements CodeExecutionEngine {

    @Override
    public String execute(String code) {
        OutputStream outputStream = new ByteArrayOutputStream();
        try (Context context = Context.newBuilder("js")
            .sandbox(CONSTRAINED)
            .allowHostAccess(UNTRUSTED)
            .out(outputStream)
            .err(outputStream)
            .build()) {
            Object result = context.eval("js", code).as(Object.class);
            return String.valueOf(result);
        }
    }
}
GraalVmJavaScriptExecutionEngine的execute方法使用GraalVM Polyglot/ Truffle来执行JavaScript代码

GraalVmPythonExecutionTool

dev/langchain4j/agent/tool/graalvm/GraalVmPythonExecutionTool.java

public class GraalVmPythonExecutionTool {

    private final CodeExecutionEngine engine = new GraalVmPythonExecutionEngine();

    @Tool("MUST be used for accurate calculations: math, sorting, filtering, aggregating, string processing, etc")
    public String executePythonCode(@P("Python code to execute, result MUST be returned by the code") String code) {
        return engine.execute(code);
    }
}
GraalVmPythonExecutionTool实例化了GraalVmPythonExecutionEngine,其executePythonCode方法标注了@Tool注解表示该tool用于精确的计算,比如数学计算、排序、过滤、聚合、字符串处理等

GraalVmJavaScriptExecutionTool

dev/langchain4j/agent/tool/graalvm/GraalVmJavaScriptExecutionTool.java

public class GraalVmJavaScriptExecutionTool {

    private final CodeExecutionEngine engine = new GraalVmJavaScriptExecutionEngine();

    @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 engine.execute(code);
    }
}
GraalVmJavaScriptExecutionTool实例化了GraalVmJavaScriptExecutionEngine,其executeJavaScriptCode方法标注了@Tool注解表示该tool用于精确的计算,比如数学计算、排序、过滤、聚合、字符串处理等

小结

langchain4j定义了CodeExecutionEngine接口,该接口定义了execute方法用于执行指定的代码;langchain4j-code-execution-engine-graalvm-polyglot模块提供了两个实现,分别是GraalVmPythonExecutionEngine、GraalVmJavaScriptExecutionEngine,该模块提供了GraalVmPythonExecutionTool、GraalVmJavaScriptExecutionTool,通过@Tool注解来表示该tool用于精确的计算,比如数学计算、排序、过滤、聚合、字符串处理等。

doc


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...