返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

Spring AI 提示词(prompts)

[复制链接]
链载Ai 显示全部楼层 发表于 2 小时前 |阅读模式 打印 上一主题 下一主题

ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;display: table;padding: 0px 1em;color: rgb(63, 63, 63);">Spring AI Prompts

ingFang 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 Class

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;">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

Message按照角色划分又分为四种:

  • • 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>中,然后递归请求模型,以此来实现模型的反复工具调用。

ChatOptions

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调用

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=你叫什么名字?

PromptTemplate

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是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ