序
本文主要研究一下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
@Testvoid 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 {@Overridepublic 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 {@Overridepublic 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
- code-execution-engines/graalvm-polyglot