本篇文章介绍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。
实现动态Tools调用
第一步:申请key
- 首先注册账号「通常手机号即可」rapidapi.com/
- rapidapi.com/judge0-offi…
- rapidapi.com/judge0-offi…
第二步:代码实现
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?
-
GET localhost:8080/judge0/js?message=The Length of the string "Hello, World!"?
文末总结
文本详细介绍了LangChain4j框架对代码执行引擎的支持,并对Judge0的使用过程进行介绍,使用Judge0实现一个动态Tools的调用示例。
代码示例:code-execute-engine