当前位置: 首页 > news >正文

聊聊langchain4j的Code Execution Engine

本文主要研究一下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

  • code-execution-engines/graalvm-polyglot

相关文章:

  • 基于Java的科研成果统计系统的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!
  • CANopen基本理论
  • 2025年- G27-Lc101-542. 01 黑客帝国--java版
  • 2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序
  • 欧拉角与法向量之间的相互转换(附代码)
  • Cursor+Claude-3.5生成Android app
  • HuggingFace Transformers
  • 【算法笔记】图论基础(二):最短路、判环、二分图
  • Python-金融相关代码讲解
  • 详解Redis 核心特性与基础
  • 【C】高效的 GPIO 读取编码方式
  • 深入理解智能家居领域中RS485、Modbus、KNX 和 Zigbee协议概念
  • AI编程工具
  • 从切图仔到鸿蒙开发01-文本样式
  • 如何查看Unity打包生成的ab文件
  • 2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序
  • c++ (8) string类
  • 灵茶山艾府基础算法精讲
  • 享元模式(Flyweight Pattern)
  • Federated learning client selection algorithm based on gradient similarity阅读
  • 韩国代总统、国务总理韩德洙宣布辞职
  • 宿州市委副书记任东已任市政府党组书记
  • 李公明︱一周书记:数字文化的乌托邦精神与……算法时代的生存指南
  • 49:49白热化,美参议院对新关税政策产生巨大分歧
  • 家政阿姨如何炼成全国劳模?做饭、收纳、养老、外语样样都会
  • 美乌矿产协议签署被曝“临门一脚”时生变,美方提附加条件