Prompt 模板与编排
大约 2 分钟
第六章:prompt 工程化:模板、变量、约束与防跑偏
6.1 业务 prompt 的两个误区
- 误区一:把 prompt 当“写作文”
- 误区二:把 prompt 当“业务逻辑”
正确的做法是:prompt 只描述“规则与输出格式”,业务逻辑仍然由你的 Java 代码控制(参数校验、权限、工具白名单、RAG 上下文来源)。
6.2 用模板把 prompt 变成可维护资产
当你需要复用同一套指令、并且在不同场景注入变量时,模板非常必要。最简单的写法就是用 Java 的字符串模板(或格式化)把变量集中注入:
package com.example.langchain4j.prompt;
import java.util.Map;
public final class PromptTemplates {
private PromptTemplates() {
}
public static String customerServiceSystem(Map<String, String> rules) {
return """
你是企业客服助手。
规则:
1) 只回答与业务相关的问题。
2) 不确定就说不确定,不要编造。
3) 输出必须简洁、可执行。
4) 禁止输出敏感信息(手机号、身份证、Key 等)。
业务规则:
- 退款:%s
- 发票:%s
""".formatted(
rules.getOrDefault("refund", "默认退款规则:7 天无理由"),
rules.getOrDefault("invoice", "默认开票规则:订单完成后可申请")
);
}
}这段模板的价值是:所有“业务规则”的变更集中在一处,后面你接入数据库或配置中心时也很好替换。
6.3 把输出约束成“可解析的格式”
生产里常见需求是“让模型输出结构化字段”,比如:
- 订单号、手机号是否存在
- 意图分类(退款/开票/物流/其他)
- 风险等级(低/中/高)
最稳妥的方式是先要求模型输出 JSON,再由你解析并校验:
package com.example.langchain4j.prompt;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;
public class JsonOutput {
private final ObjectMapper mapper = new ObjectMapper();
public Map<String, Object> parse(String json) {
try {
return mapper.readValue(json, Map.class);
} catch (Exception ex) {
throw new IllegalArgumentException("JSON 解析失败", ex);
}
}
}并在 prompt 里明确要求:
只输出 JSON,不要输出多余文本,不要使用 Markdown 代码块。6.4 防跑偏的“最小三件套”
业务落地里,这三条会显著降低“跑偏”和“幻觉”:
- system 里写清楚“允许/不允许做什么”
- RAG 时限制上下文总长度,并带来源标题
- 工具调用只允许白名单工具,并强校验参数
6.5 本章小结
你现在已经把 prompt 从“到处拼字符串”升级成“可维护模板 + 可解析输出”。下一章我们进入 LangChain4j 最推荐的业务写法:AI Services,用接口定义能力,框架生成实现,让你的业务代码像调用普通 Service 一样稳定。
