Skip to content

Enjoy 入门示例-擎渲染大模型请求体 ​

在大模型开发过程中,构建复杂的 JSON 请求体是一个常见且关键的步骤。手动构建这些 JSON 对象不仅繁琐,而且容易出错。幸运的是,Enjoy 模版引擎提供了一种高效、简便的方法来自动生成所需的 JSON 请求体,从而大幅提升开发效率和代码的可维护性。

本文将详细介绍如何使用 Enjoy 模版引擎渲染大模型的输入请求体,包括场景描述、开发步骤以及具体的示例代码。

目录 ​

  1. 场景描述
  2. 开发步骤
  3. 示例代码
  4. 运行测试
  5. 发送 JSON 到 ChatGPT
  6. 注意事项
  7. 总结

场景描述 ​

在向大模型(如 ChatGPT)发送 prompt 时,通常需要构建复杂的 JSON 对象。这些 JSON 请求体不仅结构复杂,而且包含动态内容,需要根据不同的输入进行调整。手动构建这些 JSON 对象会导致以下问题:

  • 代码冗长:手动编写大量的 Map 对象或 JSON 字符串,代码量大且难以维护。
  • 易出错:复杂的 JSON 结构容易导致拼写错误或结构错误,增加了调试难度。
  • 缺乏灵活性:随着需求的变化,手动调整 JSON 结构会变得非常困难。

为了解决这些问题,使用 Enjoy 模版引擎可以根据预定义的模板自动生成所需的 JSON 请求体,从而简化开发流程,提高代码质量。


开发步骤 ​

要使用 Enjoy 模版引擎渲染大模型输入请求体,需按照以下步骤进行开发:

  1. 添加依赖:确保项目中已添加 Enjoy 模版引擎的依赖。
  2. 配置 Enjoy 引擎:创建并配置 Enjoy 引擎,以便正确加载模板文件。
  3. 创建模板文件:定义 JSON 结构的模板,并使用占位符和包含指令来实现动态内容。
  4. 渲染模板:通过代码传入变量值,渲染出完整的 JSON 请求体。

接下来,我们将逐步详细介绍每一步的具体操作。


示例代码 ​

1. 添加依赖 ​

首先,在项目的 pom.xml 文件中添加 Enjoy 模版引擎的依赖:

xml
<dependency>
  <groupId>com.jfinal</groupId>
  <artifactId>enjoy</artifactId>
  <version>5.1.3</version>
</dependency>

确保在项目中正确引入该依赖,以便后续使用 Enjoy 模版引擎的功能。

2. 配置 Enjoy 引擎 ​

创建一个配置类 EnjoyEngineConfig,用于设置 Enjoy 引擎的基本参数:

java
package nexus.io.ai.db.assistant.config;

import com.jfinal.template.Engine;

public class EnjoyEngineConfig {

  private final String RESOURCE_BASE_PATH = "/prompt/";

  public void config() {
    Engine engine = Engine.use();
    engine.setBaseTemplatePath(RESOURCE_BASE_PATH);
    engine.setToClassPathSourceFactory();
    // 支持模板热加载,绝大多数生产环境下也建议配置成 true,除非是极端高性能的场景
    engine.setDevMode(true);
    // 配置极速模式,性能提升约 13%
    Engine.setFastMode(true);
    // JFinal 4.9.02 新增配置:支持中文表达式、中文变量名、中文方法名、中文模板函数名
    Engine.setChineseExpression(true);
  }
}

配置说明:

  • RESOURCE_BASE_PATH:指定模板文件的基础路径,此处设为 /prompt/,即模板文件存放在 src/main/resources/prompt/ 目录下。
  • setDevMode(true):开启开发模式,支持模板热加载,适用于生产环境以便动态更新模板。
  • setFastMode(true):启用极速模式,提升模板渲染性能。
  • setChineseExpression(true):允许使用中文表达式和命名,增强中文开发体验。

3. 创建模板文件 ​

在 src/main/resources/prompt/ 目录下创建两个模板文件:init_prompt.txt 和 init_prompt_message.txt。

init_prompt.txt ​

定义 JSON 结构,并使用 #include 指令包含其他模板文件:

txt
{
  "messages": [
    {
      "role": "system",
      "content": "#include(\"init_prompt_message.txt\")"
    }
  ],
  "functions": [
    {
      "name": "find",
      "description": "根据 SQL 查询数据库",
      "parameters": {
        "type": "object",
        "properties": {
          "sql": {
            "description": "需要执行的 SQL 语句",
            "type": "string"
          }
        },
        "required": ["sql"]
      }
    }
  ]
}

init_prompt_message.txt ​

定义动态内容,通过占位符 #(value) 接收外部传入的值:

txt
是一名优秀的 SQL 工程师,可以根据用户的需求执行任何 SQL 命令,连接的数据库是 #(value)

模板说明:

  • #include("init_prompt_message.txt"):将 init_prompt_message.txt 文件的内容嵌入到当前模板中,实现模板的复用和模块化。
  • #(value):占位符,用于接收外部传入的变量值。

4. 渲染模板 ​

创建一个测试类 EnjoyEngineConfigTest,用于验证模板渲染是否正确:

java
package nexus.io.ai.db.assistant.config;

import java.util.HashMap;
import java.util.Map;

import org.junit.BeforeClass;
import org.junit.Test;

import com.jfinal.template.Engine;
import com.jfinal.template.Template;

public class EnjoyEngineConfigTest {

  @AopBeforeClass
  public static void beforeClass() {
    new EnjoyEngineConfig().config();
  }

  @Test
  public void testTemplateRendering() {
    Engine engine = Engine.use();
    Template template = engine.getTemplate("init_prompt.txt");
    Map<String, Object> values = new HashMap<>();
    values.put("value", "postgresql");
    String renderToString = template.renderToString(values);
    System.out.println(renderToString);
  }
}

测试步骤:

  1. 初始化 Enjoy 引擎:通过 EnjoyEngineConfig 类进行配置。
  2. 加载模板:使用 engine.getTemplate("init_prompt.txt") 加载主模板文件。
  3. 设置模板变量:在 Map 中设置 value 的值,此处为 "postgresql"。
  4. 渲染模板:调用 template.renderToString(values) 渲染模板,并输出结果。

运行测试 ​

执行上述测试类 EnjoyEngineConfigTest,将输出渲染后的 JSON 内容:

json
{
  "messages": [
    {
      "role": "system",
      "content": "是一名优秀的SQL工程师,可以根据用户的需求执行任何SQL命令,连接的数据库是 postgresql"
    }
  ],
  "functions": [
    {
      "name": "find",
      "description": "根据 SQL 查询数据库",
      "parameters": {
        "type": "object",
        "properties": {
          "sql": {
            "description": "需要执行的 SQL 语句",
            "type": "string"
          }
        },
        "required": ["sql"]
      }
    }
  ]
}

输出说明:

  • 动态内容替换:模板中的 #(value) 被替换为 "postgresql",生成完整的 JSON 请求体。
  • 结构完整:JSON 结构保持完整,符合大模型的输入要求。

发送 JSON 到 ChatGPT ​

生成的 JSON 请求体可以直接发送给 ChatGPT 进行推理处理。以下是发送 JSON 请求体的一般步骤:

  1. 构建 HTTP 请求:使用适当的 HTTP 客户端(如 HttpClient)构建 POST 请求。
  2. 设置请求头:设置 Content-Type 为 application/json,并添加必要的认证信息。
  3. 发送请求体:将渲染后的 JSON 作为请求体发送给 ChatGPT API。
  4. 处理响应:接收并处理 ChatGPT 的响应结果。

示例代码(使用 HttpClient):

java
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ChatGPTClient {
  private static final String API_URL = "https://api.openai.com/v1/chat/completions";
  private static final String API_KEY = "your_api_key_here";

  public static void main(String[] args) throws IOException, InterruptedException {
    String jsonRequest = "{...}"; // 渲染后的 JSON 请求体

    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(API_URL))
        .header("Content-Type", "application/json")
        .header("Authorization", "Bearer " + API_KEY)
        .POST(HttpRequest.BodyPublishers.ofString(jsonRequest))
        .build();

    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

    System.out.println("Response Status Code: " + response.statusCode());
    System.out.println("Response Body: " + response.body());
  }
}

注意:请确保将 your_api_key_here 替换为您的实际 API 密钥。


注意事项 ​

在使用 Enjoy 模版引擎渲染大模型输入请求体时,需要注意以下几点:

  1. 模板变量替换:确保模板文件中的变量名与传入的键名完全一致(区分大小写)。例如,模板中的 #(value) 必须在代码中通过 values.put("value", "实际值") 进行赋值。

  2. 模板路径配置:RESOURCE_BASE_PATH 必须正确指向模板文件所在目录,且路径格式需符合系统要求。通常,模板文件应放置在 src/main/resources/ 目录下的相应子目录中。

  3. 依赖版本:本示例基于 JFinal 4.9.02 版本,确保使用兼容的 JFinal 版本以支持中文表达式配置。版本不兼容可能导致配置选项无法生效或运行时错误。

  4. 性能优化:

    • 开发模式:在开发阶段,建议开启 setDevMode(true),以便动态加载和修改模板文件。但在生产环境中,若性能要求极高,可以根据实际需求关闭此选项。
    • 极速模式:启用 setFastMode(true) 可以提升模板渲染性能,但请根据项目需求评估其影响。
  5. 模板复用:利用 #include 指令可以实现模板的模块化和复用,减少重复代码,提高维护效率。

  6. 错误处理:在实际应用中,建议添加适当的错误处理机制,捕捉模板渲染过程中可能出现的异常,确保系统的稳定性。


总结 ​

通过以上配置和示例,您可以充分利用 Enjoy 模版引擎的强大功能,简化大模型输入请求体的构建过程。Enjoy 模版引擎不仅提高了代码的可维护性和可读性,还通过模板的复用和自动渲染,显著提升了开发效率。

无论是在构建复杂的 JSON 请求体,还是在动态生成其他类型的内容,Enjoy 模版引擎都能为您的项目带来便利。结合 tio-boot 的无缝集成,Enjoy 模版引擎将成为您 Web 开发和大模型交互中的得力助手。

未来,随着项目需求的不断变化,您可以根据实际情况进一步扩展和优化模板文件,充分发挥 Enjoy 模版引擎的灵活性和高效性,为您的开发工作带来更多可能性。

MIT Licensed