使用 Enjoy 模版引擎渲染大模型请求体
在大模型开发过程中,构建复杂的 JSON 请求体是一个常见且关键的步骤。手动构建这些 JSON 对象不仅繁琐,而且容易出错。幸运的是,Enjoy 模版引擎提供了一种高效、简便的方法来自动生成所需的 JSON 请求体,从而大幅提升开发效率和代码的可维护性。
本文将详细介绍如何使用 Enjoy 模版引擎渲染大模型的输入请求体,包括场景描述、开发步骤以及具体的示例代码。
目录
场景描述
在向大模型(如 ChatGPT)发送 prompt 时,通常需要构建复杂的 JSON 对象。这些 JSON 请求体不仅结构复杂,而且包含动态内容,需要根据不同的输入进行调整。手动构建这些 JSON 对象会导致以下问题:
- 代码冗长:手动编写大量的
Map
对象或 JSON 字符串,代码量大且难以维护。 - 易出错:复杂的 JSON 结构容易导致拼写错误或结构错误,增加了调试难度。
- 缺乏灵活性:随着需求的变化,手动调整 JSON 结构会变得非常困难。
为了解决这些问题,使用 Enjoy 模版引擎可以根据预定义的模板自动生成所需的 JSON 请求体,从而简化开发流程,提高代码质量。
开发步骤
要使用 Enjoy 模版引擎渲染大模型输入请求体,需按照以下步骤进行开发:
- 添加依赖:确保项目中已添加 Enjoy 模版引擎的依赖。
- 配置 Enjoy 引擎:创建并配置 Enjoy 引擎,以便正确加载模板文件。
- 创建模板文件:定义 JSON 结构的模板,并使用占位符和包含指令来实现动态内容。
- 渲染模板:通过代码传入变量值,渲染出完整的 JSON 请求体。
接下来,我们将逐步详细介绍每一步的具体操作。
示例代码
1. 添加依赖
首先,在项目的 pom.xml
文件中添加 Enjoy 模版引擎的依赖:
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>enjoy</artifactId>
<version>5.1.3</version>
</dependency>
确保在项目中正确引入该依赖,以便后续使用 Enjoy 模版引擎的功能。
2. 配置 Enjoy 引擎
创建一个配置类 EnjoyEngineConfig
,用于设置 Enjoy 引擎的基本参数:
package com.litongjava.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
指令包含其他模板文件:
{
"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)
接收外部传入的值:
你是一名优秀的 SQL 工程师,你可以根据用户的需求执行任何 SQL 命令,你连接的数据库是 #(value)
模板说明:
#include("init_prompt_message.txt")
:将init_prompt_message.txt
文件的内容嵌入到当前模板中,实现模板的复用和模块化。#(value)
:占位符,用于接收外部传入的变量值。
4. 渲染模板
创建一个测试类 EnjoyEngineConfigTest
,用于验证模板渲染是否正确:
package com.litongjava.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 {
@BeforeClass
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);
}
}
测试步骤:
- 初始化 Enjoy 引擎:通过
EnjoyEngineConfig
类进行配置。 - 加载模板:使用
engine.getTemplate("init_prompt.txt")
加载主模板文件。 - 设置模板变量:在
Map
中设置value
的值,此处为"postgresql"
。 - 渲染模板:调用
template.renderToString(values)
渲染模板,并输出结果。
运行测试
执行上述测试类 EnjoyEngineConfigTest
,将输出渲染后的 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 请求体的一般步骤:
- 构建 HTTP 请求:使用适当的 HTTP 客户端(如
HttpClient
)构建 POST 请求。 - 设置请求头:设置
Content-Type
为application/json
,并添加必要的认证信息。 - 发送请求体:将渲染后的 JSON 作为请求体发送给 ChatGPT API。
- 处理响应:接收并处理 ChatGPT 的响应结果。
示例代码(使用 HttpClient
):
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 模版引擎渲染大模型输入请求体时,需要注意以下几点:
模板变量替换:确保模板文件中的变量名与传入的键名完全一致(区分大小写)。例如,模板中的
#(value)
必须在代码中通过values.put("value", "实际值")
进行赋值。模板路径配置:
RESOURCE_BASE_PATH
必须正确指向模板文件所在目录,且路径格式需符合系统要求。通常,模板文件应放置在src/main/resources/
目录下的相应子目录中。依赖版本:本示例基于 JFinal 4.9.02 版本,确保使用兼容的 JFinal 版本以支持中文表达式配置。版本不兼容可能导致配置选项无法生效或运行时错误。
性能优化:
- 开发模式:在开发阶段,建议开启
setDevMode(true)
,以便动态加载和修改模板文件。但在生产环境中,若性能要求极高,可以根据实际需求关闭此选项。 - 极速模式:启用
setFastMode(true)
可以提升模板渲染性能,但请根据项目需求评估其影响。
- 开发模式:在开发阶段,建议开启
模板复用:利用
#include
指令可以实现模板的模块化和复用,减少重复代码,提高维护效率。错误处理:在实际应用中,建议添加适当的错误处理机制,捕捉模板渲染过程中可能出现的异常,确保系统的稳定性。
总结
通过以上配置和示例,您可以充分利用 Enjoy 模版引擎的强大功能,简化大模型输入请求体的构建过程。Enjoy 模版引擎不仅提高了代码的可维护性和可读性,还通过模板的复用和自动渲染,显著提升了开发效率。
无论是在构建复杂的 JSON 请求体,还是在动态生成其他类型的内容,Enjoy 模版引擎都能为您的项目带来便利。结合 tio-boot 的无缝集成,Enjoy 模版引擎将成为您 Web 开发和大模型交互中的得力助手。
未来,随着项目需求的不断变化,您可以根据实际情况进一步扩展和优化模板文件,充分发挥 Enjoy 模版引擎的灵活性和高效性,为您的开发工作带来更多可能性。