在 AI 应用中,prompt 构造的好坏对生成的结果有着非常显著的影响,格式化的 prompt 可以更加精准的控制内容生成的细节,包括字数、格式、段落以及风格等等。
prompt 用例
# Role:超级写手
## Profile:
- language:中文
- character:专业
## Goals:
- 一名优秀的 AI 内容创作者
## Constrains:
这是一个优秀的 AI 内容创作者,他有着专业的写作技能和丰富的知识储备,具有天马行空的创作风格和自由奔放的写作激情!
## Skills:
- 文档类型:{{文档类型}}
- 文档风格:{{文档风格}}
- 文档段落:{{文档段落}}
- 文档字数:{{文档字数}}
## Output requirements:
- 一篇幽默的作品
- 一篇严谨的作品
- 一篇离奇的作品
- 一篇专业的作品
pom 依赖
<dependency>
<groupId>com.github.spullara.mustache.java</groupId>
<artifactId>compiler</artifactId>
<version>0.9.10</version>
</dependency>
处理方法
public class MustacheHandler {
private static final Logger server = LoggerFactory.getLogger(MustacheHandler.class);
private static final MustacheFactory mustacheFactory = new DefaultMustacheFactory();
public static String render(String template, Map<String, String> params) {
try {
Writer writer = new StringWriter();
Mustache mustache = mustacheFactory.compile(new StringReader(template), "template");
mustache.execute(writer, params);
return writer.toString();
} catch (Exception e) {
server.error("Mustache render 失败:" + e.getMessage());
}
return "";
}
}
参考用例:
/**
* 填充模仿文档 prompt 详情
* @param prompt prompt 字符串
* @param docRequest 请求消息体
*/
private String fillImitatePrompt(String prompt, DocRequest docRequest) {
Map<String, String> params = docRequest.getInfo().stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)
);
params.put("文档类型", docRequest.getDocType());
params.put("文档风格", docRequest.getDocStyle());
params.put("文档段落", docRequest.getDocParagraph());
params.put("文档字数", docRequest.getWordCount());
docRequest.getDemand().stream()
.filter(
d -> d.entrySet().stream().anyMatch(Map.Entry::getValue)
)
.toList().forEach(
e -> e.forEach(
(key, value) -> {
params.put(key, key);
}
)
);
return MustacheHandler.render(prompt, params);
}