主题
15 · 模板(Templates)
Embabel 支持用 Jinja 模板生成提示词,通过 PromptRunner.rendering(String) 方法实现。
该方法接收一个指向 Jinja 模板的 Spring 资源路径。默认位置在 classpath:/prompts/ 下, 并且会自动补上 .jinja 扩展名。你也可以按 Spring 资源约定指定完整的资源路径。
指定模板之后,就可以用一个 model map 来创建对象。示例:
java
DistinctFactualAssertions distinctFactualAssertions = context.ai()
.withLlm(properties.deduplicationLlm())
// 来自 classpath 的 Jinjava 模板:prompts/factchecker/consolidate_assertions.jinja
.rendering("factchecker/consolidate_assertions")
.createObject(
DistinctFactualAssertions.class,
Map.of(
"assertions", allAssertions,
"reasoningWordCount", properties.reasoningWordCount()
)
);自定义模板渲染器(Custom Template Renderer)
默认情况下,rendering() 使用平台的 TemplateRenderer(一个基于 Jinja、从 classpath 加载模板的渲染器)。 你可以用 withTemplateRenderer() 按每次渲染覆盖它,提供自定义的 TemplateRenderer 实现。
当你需要从其它来源加载模板时,这就很有用 —— 例如从文件系统中某个用户专属目录、或从数据库拉取模板, 从而实现按租户或按用户的提示词定制。
java
TemplateRenderer perUserRenderer = createRendererForUser(userId);
String result = context.ai()
.rendering("user-greeting")
.withTemplateRenderer(perUserRenderer)
.generateText(
Map.of("userName", userName)
);别急着把提示词外部化。
在拥有多行字符串的现代语言里,把提示词留在代码库中往往更简单。 外部化会牺牲类型安全,并带来复杂度与维护上的挑战。