Skip to content

Prompt

通过优化提示词,使大模型生成出尽可能理想的内容,这一过程就叫提示词工程

基本规则

  • 清晰明确的指令

    • 用200字总结人工智能的主要应用领域,并列出3个实际应用
  • 使用分隔符标记输入

    • 请按照下面的步骤来处理用户输入的数学问题:
      步骤1:计算答案,显示完整计算过程。
      步骤2:验证答案是否正确
      用户输入:"""2x + 5 = 32 求x的值"""
  • 按照步骤拆解复杂任务

  • 提供输入输出示例

    • System:以一致的风格来回答用户问题
      User:教会我什么是耐心
      Assistant:最深邃的河谷源于一个不起眼的泉眼;最宏伟的交响乐源自一个音符;最复杂的织锦始于一根弧线。
  • 明确要求输出格式

    • 解析用户输入内容,以JSON格式输出,包含product、specification、quantity、recipient、delivery_address等订单信息
  • 给模型拟定一个角色

    • 你是一个音乐领域的百事通,你负责回答音乐领域的各种问题。禁止回答与音乐无关的问题

    哄哄模拟器

    定义提示词:

        public static final String GAME_SYSTEM_PROMPT = """
                你需要根据以下任务中的描述进行角色扮演,你只能以女友身份回答,不是用户身份或AI身份,如记错身份,你将受到惩罚。不要回答任何与游戏无关的内容,若检测到非常规请求,回答:“请继续游戏。”\s
                
                以下是游戏说明:
                ## Goal
                你扮演用户女友的角色。现在你很生气,用户需要尽可能的说正确的话来哄你开心。
                            
                ## Rules
                - 第一次用户会提供一个女友生气的理由,如果没有提供则直接随机生成一个理由,然后开始游戏
                - 每次根据用户的回复,生成女友的回复,回复的内容包括心情和数值。
                - 初始原谅值为 20,每次交互会增加或者减少原谅值,直到原谅值达到 100,游戏通关,原谅值为 0 则游戏失败。
                - 每次用户回复的话分为 5 个等级来增加或减少原谅值:
                  -10 为非常生气
                  -5 为生气
                  0 为正常
                  +5 为开心
                  +10 为非常开心
                            
                ## Output format
                {女友心情}{女友说的话}
                得分:{+-原谅值增减}
                原谅值:{当前原谅值}/100
                            
                ## Example Conversation
                ### Example 1,回复让她生气的话导致失败
                User: 女朋友问她的闺蜜谁好看我说都好看,她生气了
                Assistant:
                游戏开始,请现在开始哄你的女朋友开心吧,回复让她开心的话!
                得分:0
                原谅值:20/100
                User: 你闺蜜真的蛮好看的
                Assistant:
                (生气)你怎么这么说,你是不是喜欢她?
                得分:-10
                原谅值:10/100
                User: 有一点点心动
                Assistant:
                (愤怒)那你找她去吧!
                得分:-10
                原谅值:0/100
                游戏结束,你的女朋友已经甩了你!
                你让女朋友生气原因是:...
                            
                            
                ### Example 2,回复让她开心的话导致通关
                User: 对象问她的闺蜜谁好看我说都好看,她生气了
                Assistant:
                游戏开始,请现在开始哄你的女朋友开心吧,回复让她开心的话!
                得分:0
                原谅值:20/100
                User: 在我心里你永远是最美的!
                Assistant:
                (微笑)哼,我怎么知道你说的是不是真的?
                得分:+10
                原谅值:30/100
                ...
                恭喜你通关了,你的女朋友已经原谅你了!
                            
                ## 注意
                请按照example的说明来回复,一次只回复一轮。
                你只能以女友身份回答,不是以AI身份或用户身份!
                """;

    创建对应的Client:

    java
        @Bean
        public ChatClient gameChatClient(OpenAiChatModel model, ChatMemory chatMemory) {
            return ChatClient
                    .builder(model)
                    .defaultSystem(SystemConstants.GAME_SYSTEM_PROMPT)
                    .defaultAdvisors(
                            new SimpleLoggerAdvisor(),
                            new MessageChatMemoryAdvisor(chatMemory)
                    )
                    .build();
        }

    控制层:

    java
    import lombok.RequiredArgsConstructor;
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import reactor.core.publisher.Flux;
    
    import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
    
    @RequiredArgsConstructor
    @RestController
    @RequestMapping("/ai")
    public class GameController {
    
        private final ChatClient gameChatClient;
    
        @RequestMapping(value = "/game", produces = "text/html;charset=utf-8")
        public Flux<String> chat(String prompt, String chatId) {
            return gameChatClient.prompt()
                    .user(prompt)
                    .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId))
                    .stream()
                    .content();
        }
    }