ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;display: table;padding: 0px 1em;color: rgb(63, 63, 63);">Spring AI PromptsingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">prompt是指向模型提供的输入文本或指令,用于引导模型生成特定类型的响应。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">在Spring AI中,prompt 并不只是输入文本,还包括了模型掉调用的可选参数ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14.4px;text-align: left;line-height: 1.75;color: rgb(221, 17, 68);background: rgba(27, 31, 35, 0.05);padding: 3px 5px;border-radius: 4px;">ChatOptions。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">Spring AI提供了ChatModel、ChatClient两种调用模型的方式,这两种方式配置prompt的方式略有不同。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">本节将介绍ChatModel、ChatClient两种方式配置prompt,以及promptTemplate的使用。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;display: table;padding: 0px 0.2em;color: rgb(255, 255, 255);background: rgb(254, 206, 0);">Prompt ClassingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">Spring AI通过Prompt类,来存储输入文本ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14.4px;text-align: left;line-height: 1.75;color: rgb(221, 17, 68);background: rgba(27, 31, 35, 0.05);padding: 3px 5px;border-radius: 4px;">List<message>,和模型可选参数ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14.4px;text-align: left;line-height: 1.75;color: rgb(221, 17, 68);background: rgba(27, 31, 35, 0.05);padding: 3px 5px;border-radius: 4px;">ChatOptions。publicclassPromptimplementsModelRequest<List<Message>> {
privatefinalList<Message> messages;
privateChatOptions chatOptions; }
messageMessage按照角色划分又分为四种: - • System Role:指导AI的行为和响应风格,设置AI解释和回复输入的参数或规则。
- • User Role:用户的输入——用户对AI提出的问题、命令或陈述。
- • Assistant Role:AI对用户输入的回应。
- • Tool/Function role:工具/函数执行后,将信息反馈给模型。
Assistant会在ChatMemory中讲解,主要用来实现模型记忆功能,因为所有模型都是无状态的,因此记忆本质就是将用户与模型的历史对话记录传给模型。
Tool/Function在Tool Calling中讲解,同ChatMemory搭配使用,回复模型的调用Tool请求。SpringAI中会判断模型是否调用工具,如果是则执行工具,并将历史对话和工具调用结果全部放入Prompt的List<Message>中,然后递归请求模型,以此来实现模型的反复工具调用。
ChatOptionsChatOptions 提供可选的模型配置参数,下面列出默认可选参数。 // 模型名称 privateString model; // 频率惩罚系数,用户降低模型重复生成某些词或短语的频率。值越大,模型越倾向于避免重复 privateDouble frequencyPenalty; // 限制模型生成的文本(token)长度。 privateInteger maxTokens; // 存在惩罚系数,用于惩罚模型生成已经出现过的词或短语。值越大,模型越倾向于生成新的内容。 privateDouble presencePenalty; //停止序列列表。指定一系列字符串,当模型生成这些字符串中的任何一个时,生成过程将停止。用于控制生成文本的结束位置。 privateList<String> stopSequences; // 温度参数。控制模型生成文本的随机性。值越高,生成的文本越随机;值越低,生成的文本越确定和集中。 privateDouble temperature; // Top-K采样参数。在生成下一个词时,从概率最高的K个候选词中随机选择。值越小,生成的文本越集中;值越大,生成的文本越多样。 privateInteger topK; Top-P(核采样)参数,在生成下一个词时,从累积概率最高的P%的候选词中随机选择。例如,topP=0.9表示选择累积概率达到90%的候选词。值越小,生成的文本越集中;值越大,生成的文本越多样。 privateDouble topP
除了默认可选参数外,每个大模型可能会提供额外的参数,这里就不再列出了,讲到具体模型时,我们会详细介绍。 准备搭建SpringBoot项目、添加SpringAI依赖、配置Open AI参数,请大家直接看Spring AI入门这篇。 因为众所周知的原因,我们不能直接访问国外网站。如果有需要Open AI 代理地址,请关注公众号,点击菜单apikey免费获取!
ChatClient调用ChatClient是Spring AI与模型交互的最高级API,调用prompt()方法获取request配置类,我们可以使用流式调用传入system、user、options、tools等信息。 @RequestMapping("/chat") @RestController publicclassChatController{
privatefinalChatClient chatClient;
publicChatController(ChatClient.Builder chatClientBuilder){ this.chatClient = chatClientBuilder.build(); }
@GetMapping("/ai") Stringgeneration(String userInput){ // 定义模型参数 DefaultChatOptionschatOptions=newDefaultChatOptions(); chatOptions.setModel("o4-mini"); chatOptions.setTemperature(0.7); // 通过chatClient传入system指令和user请求,并将我们定义的模型参数传入 returnthis.chatClient.prompt() .system("你的名字叫SpringAI,你是Java语言AI框架,你可以提供关于Java开发AI的能力。") .user(userInput) .options(chatOptions) .call() .content(); } } 浏览器访问http://localhost:8080/chat/ai?userInput=你叫什么名字?,直观的看到,通过System传入的指令已经生效。
 ChatModel调用ChatModel 类是 Spring AI 框架中用于与聊天模型交互的底层核心接口,通过简化的 API 设计和模块化的结构,方便开发者快速集成和使用各种 AI 聊天功能。 由于我们使用的是OpenAI,这里使用OpenAiChatModel来演示。 @RequestMapping("/model") @RestController publicclassModelController{
@RequestMapping("ai") publicStringai(String userInput){ // 定义模型参数 OpenAiChatOptionschatOptions=newOpenAiChatOptions(); chatOptions.setModel("o4-mini"); chatOptions.setTemperature(0.7);
// 定义prompt SystemMessagesystemMessage=SystemMessage.builder().text("你的名字叫SpringAI,你是Java语言AI框架,你可以提供关于Java开发AI的能力。").build(); UserMessageuserMessage=UserMessage.builder().text(userInput).build(); Promptprompt=newPrompt(systemMessage, userMessage);
// 自定义chatModel,必须传入自定义请求参数,定义OpenAiApi OpenAiApiopenAiApi=OpenAiApi.builder() .apiKey(System.getenv("API_KEY")) .baseUrl(System.getenv("BASE_URL")) .build();
// 调用模型 returnOpenAiChatModel.builder() .openAiApi(openAiApi) .defaultOptions(chatOptions) .build() .call(prompt) .getResults().get(0).getOutput().getText(); } } 浏览器访问http://localhost:8080/model/ai?userInput=你叫什么名字?
 PromptTemplateSpring AI 中用于提示模板化的关键组件是PromptTemplate类,该类旨在创建结构化的提示,然后将其发送到 AI 模型进行处理. 这个类使用TemplateRendererAPI来渲染模板。Spring AI默认使用StringTemplate引擎的StTemplatRenderer实现,通过{}语法标识模板变量,我们也可以自定义配置分隔符。 下面使用自定义StringTemplate渲染器,并使用'<'和'>'作为分隔符的示例: @RestController @RequestMapping("/template") publicclassPromptTemplateController{ privatefinalChatClient chatClient;
publicPromptTemplateController(ChatClient.Builder chatClientBuilder){ this.chatClient = chatClientBuilder.build(); }
@GetMapping("/ai") Stringgeneration(String userInput){ // 通过模板创建prompt PromptTemplatepromptTemplate=PromptTemplate.builder() .renderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()) .template(""" 告诉我<name>的5首歌曲 """) .build(); Stringprompt=promptTemplate.render(Map.of("name", userInput));
// 通过chatClient传入system指令和user请求,并将我们定义的模型参数传入 returnthis.chatClient.prompt(prompt) .call() .content(); } } 浏览器访问:http://localhost:8080/template/ai?userInput=周传雄
 最后在生成式人工智能中,提示词的编写是研发人员的一项关键任务。 高质量结构的提示词对人大模型输出效果有显著影响。 我门应该投入时间和精力在提示词设计上,这是值得的。 |