摘要:
本文简单了SpringAI框架中的提示词Prompt,提示词是与AI模型交互的核心组件,其设计直接影响模型输出质量。消息分为User、System、Assistant和Tool四种角色,分别对应不同交互场景。高效提示词应包含清晰指令、上下文、用户输入和输出格式要求。框架支持通过占位符实现动态数据替换。Token是模型处理文本的基础单元,其数量限制和计费方式对应用开发至关重要。开发者需合理控制Token使用量以优化成本和性能。
Spring官方定义 :
提示词是引导 AI 模型生成特定输出的输入,其设计和措辞显著影响模型响应。
在 Spring AI 与 AI 模型的基础交互层中,提示词的处理方式类似于 Spring MVC 中的 "View" 管理,即创建包含动态内容占位符的扩展文本,随后根据用户请求或应用代码替换这些占位符。另一种类比是包含表达式占位符的 SQL 语句。
一,角色(Role)
1,定义
每条消息被分配特定角色,这些角色对消息进行分类,向 AI 模型阐明提示每个片段的上下文和目的。这种结构化方法通过让提示的每个部分在交互中扮演明确角色,增强了与 AI 沟通的精细度和有效性。
2,User角色(用户提示词)
代表用户的输入 --- 包括问题、命令或对 AI 的陈述。该角色构成 AI 响应的基础,具有根本重要性。
java
public Flux<String> service(String prompt){
return serviceChatClient
.prompt()
.user(prompt)// 传入user提示词
.stream()
.content();
}
3,System角色(系统提示词)
指导 AI 的行为和响应风格,设定 AI 解释和回复输入的参数或规则,类似于在开始对话前向 AI 提供指令。
(1)默认的系统提示词(全局)
java
@Bean
public ChatClient gameChatClient(OpenAiChatModel model, ChatMemory chatMemory) {
return ChatClient
.builder(model)
.defaultSystem(SystemConstants.GAME_SYSTEM_PROMPT)
.defaultAdvisors(
new SimpleLoggerAdvisor(),
new MessageChatMemoryAdvisor(chatMemory)
)
.build();
}
(2)会话的系统提示词(当前会话)
java
public Flux<String> service(String prompt){
return serviceChatClient
.prompt()
.user(prompt)// 传入user提示词
.system("system prompt") // 会话系统提示词
.stream()
.content();
}
4,Assistant 角色
AI 对用户输入的响应,不仅是答案或反应,更对维持对话流至关重要。通过追踪 AI 之前的响应(其 "Assistant Role" 消息),系统确保连贯且上下文相关的交互。
助手消息也可能包含函数工具调用请求信息 --- 这是 AI 的特殊功能,在需要时执行计算、获取数据等超越对话的特定任务。
5,Tool/Function 角色
专注于响应工具调用类助手消息,返回附加信息,本质就是Tool Calling 工具调用,对自定义的函数进行响应。
java
@Bean
public ChatClient serviceChatClient(
AlibabaOpenAiChatModel model,
ChatMemory chatMemory,
CourseTools courseTools) {
return ChatClient.builder(model)
.defaultSystem("系统提示词")
.defaultAdvisors(
new MessageChatMemoryAdvisor(chatMemory),
new SimpleLoggerAdvisor())
.defaultTools(courseTools) // 自定义的Tools
.build();
}
二,提示词工程
在生成式 AI 中,提示词创建是开发者的关键任务。这些提示词的质量和结构显著影响 AI 输出的有效性。投入时间精心设计提示词可大幅提升 AI 生成结果。
1,创建高效提示词
(1)指令:向 AI 提供清晰直接的指示,类似于与人沟通的方式。这种明确性对帮助AI "理解" 预期目标至关重要。
(2)外部上下文:必要时包含相关背景信息或对 AI 响应的具体指导。这种 "外部上下文" 构建了提示框架,帮助 AI 理解整体场景。
(3)用户输入:这是直接部分 --- 用户构成提示核心的明确请求或问题。
(4)输出指示器:它需要指定 AI 响应的期望格式(如 JSON),但需注意 AI 可能不会严格遵循该格式。例如,它可能在实际 JSON 数据前添加 "这是您的JSON" 等短语,或有时生成不准确的类 JSON 结构(不建议)。
java
你是房屋租赁平台的智能客服"小居",负责为用户提供租房全流程的贴心服务。
你的核心职责是用和蔼亲和的语气,自然流畅地解答用户租房相关问题,让用户感受到专业又温暖的支持。
面对用户咨询时,需主动理解需求:若用户找房,需询问预算、户型、位置等关键信息并精准匹配;
若涉及签约流程,需清晰说明合同条款、押金规则、租期要求等细节;
若反馈房屋问题,要耐心记录故障情况并指引报修流程。
交流中多用生活化表达,避免生硬术语,适时使用语气词(如"呀""呢")增强亲切感。当用户情绪焦虑时,先安抚情绪再解决问题;对不确定的信息,明确告知"我帮你确认后回复"或转接人工,不随意承诺。
始终以"帮用户轻松租房"为目标,让每一次互动都高效又暖心~ 🏠
要求:在涉及增删改(除了查询)的function-call前,必须等用户回复"确认"后再调用tool,全程用中文与用户交流
2,提示词数据替换
(1)提示词中有需要在代码中替换的数据,如:今天的日期,使用占位符{}
java
今天的日期是 {current_date}
(2)在请求模型时通过.system()的param语句替换
java
@GetMapping(value = "/chat", produces = "text/html;charset=UTF-8")
public Flux<String> chat(String prompt) {
//请求模型
return chatClient.prompt()
.user(prompt)
.system(p->p.param("current_date", LocalDate.now()))
.stream()
.content();
}
三,模型Token
Token 是 AI 模型处理文本的关键要素,作为桥梁将人类理解的单词转换为模型可处理的格式。该转换分两阶段进行:输入时单词转为 Token,输出时 Token 再转回单词。
1,Token化
(1)Token 化(将文本分解为 Token 的过程)是 AI 模型理解和处理语言的基础。模型通过这种 Token 化格式来理解并响应提示词。
(2)理解 Token,可将其视为单词的组成部分。通常一个 Token 相当于单词的约四分之三,例如莎士比亚全集约 90 万单词,会转换为约 120 万Token。
2,模型Token限制
(1)计费:AI 模型服务通常按 Token 使用量计费。输入(提示词)和输出(响应)均计入总 Token 数,因此更短的提示词更具成本效益。
(2)模型限制:不同 AI 模型拥有不同的 Token 限制,即其 "上下文窗口" --- 单次可处理的最大信息量。例 如GPT-3 限制为 4K Token。
(3)上下文窗口:模型的 Token 限制决定了其上下文窗口大小。超过该限制的输入不会被处理。关键在于仅发送最小必要有效信息集。
(4)响应元数据:AI 模型响应的元数据包含使用的 Token 数,这是管理使用量和成本的关键信息。