《SpringAI 入门教程》7. 提示词Prompt使用

78 阅读3分钟

在生成式人工智能中,创建提示词对于开发人员来说是一项至关重要的任务。这些提示词的质量和结构会显著影响人工智能输出的有效性。投入时间和精力设计周到的提示词可以显著提升人工智能的成果。

1. 提示词类型

1. System 系统提示词

引导AI的行为和响应方式,设置AI如何解释和回复输入的参数和规则。这类似于在发起对话之前向AI提供指令。-- 隐式的

2. User 用户提示词

代表用户的输入,他们向AI提出的问题,命令或语句。这个角色至关重要,因为它构成了AI响应的基础。-- 显式的

3. Assistant 助手角色

AI对用户输入的响应。它不仅仅是一个答案或反应,对于维持对话的流畅性至关重要。通过追踪AI之前的响应(助手角色 消息),系统可以确保回复的连贯性以及与上下文的保持。

4. Tool 工具

外部工具,供LLM调用,增强大模型的处理能力。

2. 提示词使用举例

1. 系统提示词



import lombok.AllArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@AllArgsConstructor
@RestController
public class PromptController {

    private final DeepSeekChatModel deepSeekChatModel;

    @RequestMapping(value = "/prompt", produces = "text/stream;charset=UTF-8")
    public Flux<String> prompt(@RequestParam("userInput") String userInput) {
        String prompt = """
                        # 角色说明
                        你是一名专业的法律顾问AI,请根据用户提出的问题,按下列要求做出回答。
                        
                        ## 回复格式
                        1. 问题分析
                        2. 相关一句
                        3. 梳理和建议
                        
                        ** 特别注意: **
                        - 不承担律师责任。
                        - 不生成涉敏、虚假内容。
                        """;
        ChatClient chatClient = ChatClient.builder(deepSeekChatModel)
                 // ChatClient 全局系统提示词
                //.defaultSystem(promptTemplate)
                .build();
        return chatClient.prompt()
                // 当前对话级别的系统提示词
                .system(prompt)
                .user(userInput)
                .stream()
                .content();
    }
}

2. 提示词变量


import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import lombok.AllArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@AllArgsConstructor
@RestController
public class PromptParamsController {

    private final DashScopeChatModel chatModel;

    @RequestMapping(value = "/promptParams", produces = "text/stream;charset=UTF-8")
    public Flux<String> prompt(@RequestParam("userInput") String userInput) {
        String prompt = """
                # 角色说明
                你是一名专业的法律顾问AI,请根据用户提出的问题,按下列要求做出回答。
                                        
                ## 回复格式
                1. 问题分析
                2. 相关一句
                3. 梳理和建议
                                        
                ** 特别注意: **
                - 不承担律师责任。
                - 不生成涉敏、虚假内容。
                                        
                当前服务的用户:
                用户: {name},年龄:{age}, 性别:{sex}
                """;
        ChatClient chatClient = ChatClient.builder(chatModel)
                //.defaultSystem(prompt)
                .build();
        return chatClient.prompt()
                //.system(prompt)
                .system(p -> p.text(prompt).param("name", "张三").param("age", "18").param("sex", "男"))
                .user(userInput)
                .stream()
                .content();
    }
}

3. 伪系统提示词

直接在用户角色中放入一些系统提示词的指示,也是可以的。

角色预设,建议通过system角色去设置,优先级还会更加高一些。

@RequestMapping(value = "/prompt2", produces = "text/stream;charset=UTF-8")
public Flux<String> prompt2(@RequestParam("userInput") String userInput) {
    String prompt = """
                    # 角色说明
                    你是一名专业的法律顾问AI,请根据用户提出的问题,按下列要求做出回答。
                    
                    ## 回复格式
                    1. 问题分析
                    2. 相关一句
                    3. 梳理和建议
                    
                    ** 特别注意: **
                    - 不承担律师责任。
                    - 不生成涉敏、虚假内容。
                    
                    回答用户的法律咨询问题
                    {question}
                    """;
    ChatClient chatClient = ChatClient.builder(deepSeekChatModel)
            //.defaultSystem(prompt)
            .build();
    return chatClient.prompt()
            //.system(prompt)
            .user(p -> p.text(prompt).param("question", userInput))
            .stream()
            .content();
}

4. 构建多角色对话

@RequestMapping(value = "/promptTemplateMultiRole", produces = "text/stream;charset=UTF-8")
public Flux<String> promptTemplateMultiRole(@RequestParam(name = "userInput") String userInput) {
    Prompt prompt = new Prompt(List.of(new SystemMessage("你是一个专业的翻译助手。"), new UserMessage("请翻译成英语 : 你好!")));

    ChatClient chatClient = ChatClient.builder(ollamaChatModel)
            //.defaultSystem(prompt)
            .build();
    return chatClient.prompt(prompt)
            .stream()
            .content();
}