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;
}Message按照角色划分又分为四种:
Assistant会在ChatMemory中讲解,主要用来实现模型记忆功能,因为所有模型都是无状态的,因此记忆本质就是将用户与模型的历史对话记录传给模型。
Tool/Function在Tool Calling中讲解,同ChatMemory搭配使用,回复模型的调用Tool请求。SpringAI中会判断模型是否调用工具,如果是则执行工具,并将历史对话和工具调用结果全部放入Prompt的
List<Message>中,然后递归请求模型,以此来实现模型的反复工具调用。
ChatOptions 提供可选的模型配置参数,下面列出默认可选参数。
// 模型名称
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是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 类是 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=你叫什么名字?Spring 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=周传雄在生成式人工智能中,提示词的编写是研发人员的一项关键任务。 高质量结构的提示词对人大模型输出效果有显著影响。 我门应该投入时间和精力在提示词设计上,这是值得的。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |