LangChain4j 接入OpenAI+Judge0 实现动态函数调用

941 阅读4分钟

本篇文章介绍LangChain4j集成的代码执行引擎,详细介绍代码执行引擎的使用场景,并能够运用到实际的业务场景中去!!

代码执行引擎使用场景

  • 在线编程竞赛:用于自动评测参赛者的代码。
  • 代码评审:在代码提交过程中自动检查代码的正确性和性能。
  • 教育平台:用于在线课程中的编程作业自动评分。
  • ...

LangChain4j框架支持执行引擎有哪些?

目前支持两种,一种为GraalVm系列的,另一种为Judge0。

  • GraalVm
    • Polyglot:是 GraalVM 提供的一个用于构建多语言应用程序的 API。它允许开发者在同一个应用程序中无缝地使用多种编程语言。
    • Truffle:是 GraalVM 中用于构建语言引擎的框架。它提供了一套工具和 API,使得开发者可以轻松地为 GraalVM 添加新的语言支持。
  • Judge0:是一个开源的代码执行引擎。包括但不限于 C、C++、Java、Python、Ruby 等。

    The most advanced open-source online code execution system in the world.

类结构

classDiagram
CodeExecutionEngine <|-- GraalVmJavaScriptExecutionEngine
CodeExecutionEngine <|-- GraalVmPythonExecutionEngine
CodeExecutionEngine <|-- Judge0JavaScriptEngine

CodeExecutionEngine: +String execute(String code)
class GraalVmJavaScriptExecutionEngine{
+String execute(String code)
}
class GraalVmPythonExecutionEngine{
+String execute(String code)
}
class Judge0JavaScriptEngine{
-String apiKey; // 访问需要的key
-int languageId; // 编程语言的ID
-OkHttpClient client; // OkHttp访问Judge0服务
}
class GraalVmJavaScriptExecutionTool{
- craalVmJavaScriptExecutionEngine engine
+ String executeJavaScriptCode(String code)
}
class GraalVmPythonExecutionTool{
- GraalVmPythonExecutionEngine engine
+ String executePythonCode(String code)
}
class Judge0JavaScriptExecutionTool{
- Judge0JavaScriptEngine engine
+ String executeJavaScriptCode(String code)
}
GraalVmJavaScriptExecutionEngine  <.. GraalVmJavaScriptExecutionTool
GraalVmPythonExecutionEngine <.. GraalVmPythonExecutionTool
Judge0JavaScriptEngine <.. Judge0JavaScriptExecutionTool

在此基础上,LangChain4j 封装了代码执行工具类,在函数调用(function calling)中可以直接使用。

  • GraalVmJavaScriptExecutionTool :JavaScript语言
  • GraalVmPythonExecutionTool: Python语言
  • Judge0JavaScriptExecutionTool: JavaScript语言

对于GraalVm工具我们可以扩展,支持其它语言,比如支持Java、Go等。

使用代码示例

提供了对GraalVm、Judge0 的代码使用示例,由于篇幅原因,在文章中只展示了Judge0的使用,因为其使用起来稍微复杂一些。对于GraalVm的代码示例可以参考我的Github上关于GraalVm Tool的使用示例。

Judge0 版本

两个版本唯一不同之处在于支持的语言范围,对于Judge0 CE版本的支持的语言要比Judge0 Extra CE版本多。

使用模式

  • 本地部署方式,在实际生成中我们建议自行部署,服务质量由自己保障。
  • Shared Cloud(Shared SaaS)方式,对于有免费(每天50次调用)和收费,提供的能力相同。
  • Dedicated Cloud(Dedicated SaaS) 方式,全部收费,保证SLA。 image.png

实现动态Tools调用

第一步:申请key

第二步:代码实现

dependencies
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-code-execution-engine-judge0</artifactId>
</dependency>

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
yml
langchain4j:
  open-ai:
    chat-model:
      base-url: xxx
      api-key: xxx
Config
@Configuration
public class Judge0Config {
    @Bean
    public Judge0JavaScriptExecutionTool judge0JavaScriptExecutionTool() {
        return new Judge0JavaScriptExecutionTool(
                "d71e45f899mshfc8bffd2eeaf2f1p1f7adajsnee2401c1b95a"
        );
    }
}
Assistant
public interface Assistant {
    String chat(String message);
}
Service
@Service
@RequiredArgsConstructor
public class Judge0ToolService {
    private final OpenAiChatModel model;
    private final Judge0JavaScriptExecutionTool judge0;

    public String execute(String message) {
        Assistant assistant = AiServices.builder(Assistant.class)
                .chatLanguageModel(model)
                .tools(judge0)
                .build();
        return assistant.chat(message);
    }
}
Controller
@RestController
@RequiredArgsConstructor
public class Judge0Controller {
    private final Judge0ToolService judge0ToolService;

    @GetMapping("/judge0/js")
    public String tool(@RequestParam(value = "message",
            defaultValue = "What is the square root of 485906798473894056 in scientific notation?") String message) {
        return judge0ToolService.execute(message);
    }
}

测试效果

  • GET localhost:8080/judge0/js?message=Capitalize every third letter: abcabc? image.png

  • GET localhost:8080/judge0/js?message=The Length of the string "Hello, World!"? image.png

文末总结

文本详细介绍了LangChain4j框架对代码执行引擎的支持,并对Judge0的使用过程进行介绍,使用Judge0实现一个动态Tools的调用示例。

代码示例:code-execute-engine