采用 mustache 构造 prompt

本文探讨了在AI应用中,精心设计的prompt对生成内容质量的重要性,强调了格式化prompt如何精确控制输出细节。同时,作者提供了使用Mustache模板引擎进行参数映射的实际示例,展示了如何将文档类型、风格等信息融入到生成过程。
摘要由CSDN通过智能技术生成

        在 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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厉力文武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值