序
本文主要研究一下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用于精确的计算,比如数学计算、排序、过滤、聚合、字符串处理等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。