1. 背景
提示词模板(PromptTemplate)主要解决的问题:
-
动态凭借输入变量和提示词。
-
支持不同格式(纯文本、JSON、系统指令、多端对话)。
-
在调用LLM时统一管理提示内容,避免硬编码。
2. 基础使用
import lombok.AllArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.ollama.OllamaChatModel;
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;
import java.util.Map;
@AllArgsConstructor
@RestController
public class PromptTemplateController {
private final OllamaChatModel ollamaChatModel;
@RequestMapping(value = "/promptTemplate", produces = "text/stream;charset=UTF-8")
public Flux<String> promptTemplate(@RequestParam(name = "userInput") String userInput) {
PromptTemplate promptTemplate = new PromptTemplate("""
你是一个专业的翻译助手,
请将以下内容翻译成 {language}
"{text}"
""");
Prompt prompt = promptTemplate.create(Map.of("language", "英文", "text", userInput));
ChatClient chatClient = ChatClient.builder(ollamaChatModel)
//.defaultSystem(prompt)
.build();
return chatClient.prompt(prompt)
.stream()
.content();
}
}
3. 自定义提示词模版
除了{} 还可以定义成任意格式。
@RequestMapping(value = "/promptTemplateCustomFormat", produces = "text/stream;charset=UTF-8")
public Flux<String> promptTemplateCustomFormat(@RequestParam(name = "userInput") String userInput) {
PromptTemplate promptTemplate = PromptTemplate.builder()
.renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build())
.template("""
你是一个专业的翻译助手,
请将以下内容翻译成 <language> :
"<text>"
""")
.build();
Prompt prompt = promptTemplate.create(Map.of("language", "英文", "text", userInput));
ChatClient chatClient = ChatClient.builder(ollamaChatModel)
//.defaultSystem(prompt)
.build();
return chatClient.prompt(prompt)
.stream()
.content();
}
4. 提示词模版文件
提升提示词的可维护性
模版文件
classpath:/template/prompt1.tpl
你是一个专业的翻译助手,
请将用户提问的内容翻译成 {language} :
@RequestMapping(value = "/promptTemplateFile", produces = "text/stream;charset=UTF-8")
public Flux<String> promptTemplateFile(
@Value("classpath:/template/prompt1.tpl") Resource resource,
@RequestParam(name = "userInput") String userInput) {
ChatClient chatClient = ChatClient.builder(ollamaChatModel)
.defaultSystem(resource)
.build();
return chatClient.prompt()
.system(p -> p.param("language", "法语"))
.user(userInput)
.stream()
.content();
}