Skip to content

PromptEngine ​

本文将详细讲解如何基于 JFinal Template Engine 封装一个专用于大模型提示词的工具类 —— PromptEngine,以及如何使用该工具类来渲染提示词模板。


一、PromptEngine 类的实现 ​

我们首先创建一个名为 PromptEngine 的工具类,该类主要功能是通过 JFinal 的模板引擎加载和渲染提示词模板。代码如下:

java
package nexus.io.template;

import com.jfinal.kit.Kv;
import com.jfinal.template.Engine;
import nexus.io.tio.utils.environment.EnvUtils;

public class PromptEngine {

  // 定义模板资源基础路径
  public static final String RESOURCE_BASE_PATH = "/prompts/";
  public static Engine engine;

  static {
    // 创建一个名称为 "prompt" 的模板引擎实例
    engine = Engine.create("prompt");

    // 设置模板基础路径,所有模板文件将从此路径加载
    engine.setBaseTemplatePath(RESOURCE_BASE_PATH);

    // 使用类路径作为模板资源的来源
    engine.setToClassPathSourceFactory();

    // 根据环境设置开发模式
    if (EnvUtils.isDev()) {
      // 在开发环境中启用模板热加载,建议生产环境同样开启,除非对性能有极端要求
      engine.setDevMode(true);
    }

    // 配置极速模式,性能提升约 13%
    Engine.setFastMode(true);

    // 启用对中文表达式、中文变量名、中文方法名、中文模板函数名的支持(JFinal 4.9.02 新增功能)
    Engine.setChineseExpression(true);
  }

  /**
   * 渲染模板为字符串
   *
   * @param fileName 模板文件名,例如 "WebSearchSelectPrompt.txt"
   * @param kv       模板渲染所需的数据模型
   * @return 渲染后的字符串结果
   */
  public static String renderToString(String fileName, Kv kv) {
    // 获取模板并传入数据模型进行渲染
    return engine.getTemplate(fileName).renderToString(kv);
  }
}

代码详解: ​

  • 模板资源路径设置
    RESOURCE_BASE_PATH 定义了模板文件存放的基础目录。在这个示例中,所有提示词模板文件应存放在 resources/prompts/ 目录下。

  • 模板引擎初始化
    在静态代码块中,通过 Engine.create("prompt") 创建一个新的模板引擎实例,并设置好基础路径和资源加载方式。

  • 开发模式与热加载
    如果当前环境为开发模式(通过 EnvUtils.isDev() 判断),则启用开发模式(setDevMode(true)),支持模板文件的热加载,方便在开发过程中实时看到模板修改的效果。

  • 极速模式与中文支持

    • Engine.setFastMode(true) 开启极速模式,提高模板渲染性能。
    • Engine.setChineseExpression(true) 允许模板中使用中文表达式、变量名、方法名和函数名,使得模板编写更加灵活友好。
  • 渲染方法
    renderToString 方法接收模板文件名和数据模型(Kv 对象),加载对应的模板文件并进行渲染,最终返回渲染后的字符串结果。


二、如何使用 PromptEngine 渲染提示词模板 ​

假设我们有一个提示词模板文件 WebSearchSelectPrompt.txt 存放在 resources/prompts/ 目录下。我们可以通过如下代码来填充数据并渲染该模板:

java
// 构建数据模型,假设 question 是用户查询的问题,results 是搜索结果列表
Kv kv = Kv.by("quesiton", question)
          .set("search_result", JsonUtils.toJson(results));

// 指定模板文件名
String fileName = "WebSearchSelectPrompt.txt";

// 使用 PromptEngine 渲染模板,得到最终的提示词字符串
String prompt = PromptEngine.renderToString(fileName, kv);

使用步骤说明: ​

  1. 准备数据
    使用 Kv 对象构建数据模型,将模板中需要的变量和对应的值放入其中。例如,上述代码中将用户提问 question 和搜索结果 results 转换成 JSON 字符串后绑定到模板变量 quesiton 和 search_result 上。

  2. 指定模板文件
    定义要使用的模板文件名,例如 WebSearchSelectPrompt.txt。该文件应放在之前配置的 RESOURCE_BASE_PATH 目录下。

  3. 渲染模板
    调用 PromptEngine.renderToString(fileName, kv) 方法,将模板文件和数据模型传入,最终得到渲染后的提示词字符串 prompt。

通过上述步骤,即可方便地使用 PromptEngine 对不同的提示词模板进行渲染和动态数据填充。


三、总结 ​

通过封装 PromptEngine 工具类,我们能够统一管理大模型提示词的模板渲染逻辑。借助 JFinal 模板引擎,结合极速模式和中文支持,不仅提高了渲染性能,也使模板设计更为灵活易懂。使用该工具类后,只需准备好模板文件和数据模型,即可快速生成所需的提示词内容,极大地提升开发效率。

MIT Licensed