> ## Documentation Index
> Fetch the complete documentation index at: https://javaai.pig4cloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 动态函数调用

#### 引言

在现代软件开发中，代码执行引擎的应用场景日益广泛。LangChain4j框架通过集成多种代码执行引擎，为开发者提供了强大的工具支持。本文将详细介绍LangChain4j如何接入GraalVM，实现动态函数调用，并探讨其在实际业务场景中的应用。

#### 代码执行引擎的使用场景

<img src="https://minio.pigx.top/oss/202410/1728392891.png" alt="1728392891" />

在大模型执行function calling的流程中：

1. 大模型首先返回可直接运行的脚本语言代码
2. LangChain4j接收到这段可运行代码后，调用`CodeExecutionEngine`执行
3. 执行结果返回给大模型

#### LangChain4j支持的执行引擎

LangChain4j目前支持两种主要的代码执行引擎：

1. **GraalVM**
   * **Polyglot**: 允许在同一应用中无缝使用多种编程语言
   * **Truffle**: 用于构建语言引擎的框架，支持轻松添加新语言

2. **Judge0**
   * 开源代码执行引擎，支持多种编程语言（C, C++, Java, Python, Ruby等）
   * 被誉为"世界上最先进的开源在线代码执行系统"

#### 执行引擎测试

##### 1. 添加依赖

```xml theme={"system"}
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-code-execution-engine-graalvm-polyglot</artifactId>
</dependency>
```

##### 2. 调用 js 版本斐波那契数列

```java theme={"system"}
CodeExecutionEngine engine = new GraalVmJavaScriptExecutionEngine();

String code = """
        function fibonacci(n) {
            if (n <= 1) return n;
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
                        
        fibonacci(10)
        """;

String result = engine.execute(code);
```

#### 动态函数示例

##### 1. 配置类

```java theme={"system"}
ChatAssistant assistant = AiServices.builder(ChatAssistant.class)
        .chatModel(chatModel)
        .tools(new GraalVmJavaScriptExecutionTool())
        .build();
```

##### 2. AI Service 定义

```java theme={"system"}
public interface Assistant {
    String chat(String message);
}
```

##### 3. 测试

```java theme={"system"}
String chat = chatAssistant.chat("What is the square root of 485906798473894056 in scientific notation?");
System.out.println(chat);
```

#### 实现原理

LangChain4j通过GraalVmJavaScriptExecutionTool类实现了JavaScript代码的动态执行。以下是该类的核心实现：

```java theme={"system"}
public class GraalVmJavaScriptExecutionTool {

    // 初始化一个GraalVM JavaScript执行引擎
    private final CodeExecutionEngine engine = new GraalVmJavaScriptExecutionEngine();

    /**
     * 执行JavaScript代码的方法
     * 
     * @Tool 注解标记这个方法为一个工具，可以被AI助手调用
     * 描述指定了这个工具必须用于精确计算，如数学运算、排序、过滤、聚合、字符串处理等
     */
    @Tool("MUST be used for accurate calculations: math, sorting, filtering, aggregating, string processing, etc")
    public String executeJavaScriptCode(
        // @P 注解用于描述参数
        // 这里说明输入的JavaScript代码必须返回一个结果
        @P("JavaScript code to execute, result MUST be returned by the code") String code
    ) {
        // 调用GraalVM执行引擎来执行传入的JavaScript代码
        return engine.execute(code);
    }
}
```

这个类的主要功能包括：

1. 封装GraalVM JavaScript执行引擎
2. 提供一个被 `@Tool` 注解标记的方法，可以被AI助手调用
3. 接受JavaScript代码作为输入，执行代码并返回结果

通过这种方式，LangChain4j能够在运行时动态执行JavaScript代码，为AI助手提供强大的计算和数据处理能力。

#### 优势与局限性

优势：

1. 灵活性：允许AI助手执行动态生成的代码，大大增强了系统的适应性
2. 性能：GraalVM提供了高效的代码执行能力
3. 多语言支持：GraalVM的Polyglot特性使得未来可以轻松扩展到其他编程语言

局限性：

1. 安全性考虑：动态执行代码可能带来安全风险，需要严格的代码审查和沙箱机制
2. 复杂性：集成GraalVM可能增加系统的复杂性
3. 资源消耗：动态编译和执行可能增加系统资源消耗

#### 结论

LangChain4j通过接入GraalVM实现的动态函数调用功能，为AI系统提供了强大的计算能力和灵活性。这种方法使得AI助手能够执行复杂的操作，大大扩展了其应用范围。然而，在实际应用中，开发者需要权衡其优势和潜在的风险，确保系统的安全性和稳定性。

未来，随着技术的不断发展，我们可以期待看到更多创新的代码执行方案，进一步推动AI系统的进步。

<Card title="PIG AI应用开发平台 | 适合中大型企业构建自主可控的AI中台" icon="link" href="https://ai.pig4cloud.com">
  **为Java开发者提供全栈式AI工程化解决方案**，强类型/高可维护性架构，内置30+主流大模型支持。

  * **🔍 知识引擎体系**：RAG 知识引擎全自动化多模态解决方案
  * **📝 AI-OCR 中枢**：复杂非标场景高精度识别
  * **⚙️ 业务智能融合**：函数编排 + Chat2SQL，无缝对接现有业务系统
  * **🛡️ N维风控体系**：敏感词/IP/Token/User 规则控制引擎
</Card>

<Card title="文档有误？请协助编辑" icon="pencil" href="https://github.com/javaai-pig4cloud-com/javaai-docs/edit/main/docs/14动态函数调用.mdx">
  发现文档问题？点击此处直接在 GitHub 上编辑并提交 PR，帮助我们改进文档！
</Card>

<Card title="文档有误？请协助编辑" icon="pencil" href="https://github.com/javaai-pig4cloud-com/javaai-docs/edit/main/docs/14-dynamic-function-calling.mdx">
  发现文档问题？点击此处直接在 GitHub 上编辑并提交 PR，帮助我们改进文档！
</Card>
