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