尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Spring AI 2.0:Prompt

Spring AI 2.0:Prompt 一、简介Prompt 提示词分为系统提示词和用户提示词提示词决定这回答的质量。二、代码系统提示出 systemdefaultSystem表示系统默认提示词针对整个ChatClientsystem会话提示词针对每次会话chatChatClient.builder(deepSeekChatModel).defaultSystem( # 角色 你是一个教育行业的只能小助手 # 要求 1. 永远讲中文 ).build();chatClient.prompt().system(针对当前会话的系统提示出).user(message).stream().content()SystemPromptTemplate提示词模版提示词中允许使用占位符参数 {xxx}ChatClient.builder(deepSeekChatModel).defaultSystem( 你是一个优秀的 {role}, 你擅长 {language} 。 ).build();// 在 system 中传参chatClient.prompt().system(p-p.param(role,程序员).param(language,Java)).user(message).stream().content();用户提示词 useruser用户提示词也支持占位符参数。chatClient.prompt().user(p-p.text( 你是一个优秀的 {role}, 你擅长 {language} , {question}。 .param(role,程序员).param(language,Java).param(question,message))).stream().content();提示词对象 Prompt// 用户消息UserMessageuserMessagenewUserMessage(介绍一下Spring AI);// 组装PromptPromptpromptnewPrompt(userMessage);// 调用模型ChatResponseresponsechatModel.call(prompt);// 获取AI文本结果Stringcontentresponse.getResult().getOutput().getText();System.out.println(content);// 系统设定规定AI角色SystemMessagesystemMessagenewSystemMessage(你是一名Java工程师回答尽量简短。);UserMessageuserMessagenewUserMessage(讲下什么是Prompt);// 多条消息传入Prompt构造器ListMessagemessagesList.of(systemMessage,userMessage);PromptpromptnewPrompt(messages);ChatResponseresponsechatModel.call(prompt);ListMessagehistorynew ArrayList();history.add(newUserMessage(我叫张三));history.add(newAssistantMessage(你好张三很高兴认识你));// 新一轮提问history.add(newUserMessage(我叫什么名字));Prompt promptnewPrompt(history);ChatResponse respchatModel.call(prompt);提示词模版 PromptTemplate提示词过多放在代码中维护不方便可以将提示词放入到文件中维护在企业中常放入到配置中心中如Nacos。.st StringTemplate 的缩写是 Spring AI 官方约定的提示词模板文件后缀对应内部 StTemplateRenderer 模板渲染器。路径一般放在src/main/resources/prompts/xxx.st。模板内占位符语法{变量名}运行时自动替换变量值。.st推荐需要变量渲染SpringAI 模板用途带占位符变量的 Prompt 模板需要 {xxx} 动态填充参数SpringAI 会启用StTemplateRenderer解析文件自动替换{变量}适合业务系统提示词、需要传参、工程化模板文件内容可以写 markdown 格式文本后缀依然用.st.st 里面字面量大括号{、}需要转义IDE 不会识别 st 后缀没有语法高亮可以装 StringTemplate 插件修改.st文件devtools 要开启否则不会热加载需要重启.md仅静态文本不会做变量替换ConfigurationpublicclassSpringAiConfig{BeanpublicChatClientchatClient(DeepSeekChatModeldeepSeekChatModel,Value(classpath:/prompts/system-messages.stResourcesystemResource){returnChatClient.builder(deepSeekChatModel).defaultSystem(systemResource).build();}}rc/main/resources/prompts/system-prompt.st你是专业的{role}请根据{input}回答问题。// 手动加载 resources/prompts/system-prompt.stPromptTemplatepromptTemplatePromptTemplate.from(classpath:/prompts/system-prompt.st);// 填充变量PromptpromptpromptTemplate.create(Map.of(role,Java专家,input,RocketMQ重试机制));ChatResponserespchatClient.prompt(prompt).call();三、从Nacos中加载提示词一个dataId表示一个提示词。tj:ai:prompt:system:chat:data-id:system-chat-message.txtgroup:DEFAULT_GROUPtimeout-ms:20000DataConfigurationConfigurationProperties(prefixtj.ai.prompt)publicclassAIProperties{privateSystemsystem;// 系统提示语用于课程推荐、购买业务DatapublicstaticclassSystem{privateChatchat;// 系统提示语用于课程推荐、购买业务DatapublicstaticclassChat{privateStringdataId;privateStringgroupDEFAULT_GROUP;privatelongtimeoutMs20000L;// 读取的超时时间单位毫秒}}}Slf4jGetterConfigurationRequiredArgsConstructorpublicclassSystemPromptConfig{privatefinalNacosConfigManagernacosConfigManager;privatefinalAIPropertiesaiProperties;// 使用原子引用保证线程安全privatefinalAtomicReferenceStringchatSystemMessagenewAtomicReference();privatefinalAtomicReferenceStringrouteAgentSystemMessagenewAtomicReference();privatefinalAtomicReferenceStringtextSystemMessagenewAtomicReference();PostConstruct// 初始化时加载配置publicvoidinit(){// 读取配置文件loadConfig(aiProperties.getSystem().getChat(),chatSystemMessage);loadConfig(aiProperties.getSystem().getRouteAgent(),routeAgentSystemMessage);loadConfig(aiProperties.getSystem().getText(),textSystemMessage);}privatevoidloadConfig(AIProperties.System.ChatchatConfig,AtomicReferenceStringtarget){try{vardataIdchatConfig.getDataId();vargroupchatConfig.getGroup();vartimeoutMschatConfig.getTimeoutMs();varconfignacosConfigManager.getConfigService().getConfig(dataId,group,timeoutMs);target.set(config);log.info(读取{}成功内容为{},target,config);nacosConfigManager.getConfigService().addListener(dataId,group,newListener(){OverridepublicExecutorgetExecutor(){returnnull;}OverridepublicvoidreceiveConfigInfo(Stringinfo){target.set(info);log.info(更新{}成功内容为{},target,info);}});}catch(Exceptione){log.error(加载配置失败,e);}}}Slf4jServiceRequiredArgsConstructorpublicclassChatServiceImplimplementsChatService{privatefinalChatClientchatClient;privatefinalSystemPromptConfigsystemPromptConfig;OverridepublicFluxChatEventVOchat(Stringquestion,StringsessionId){returnthis.chatClient.prompt().system(promptSystem-promptSystem.text(this.systemPromptConfig.getChatSystemMessage().get())// 设置系统提示语.param(now,DateUtil.now())// 设置当前时间的参数).user(question).stream().chatResponse().map(chatResponse-{// 获取大模型的输出的内容StringtextchatResponse.getResult().getOutput().getText();// 封装响应对象returnChatEventVO.builder().eventData(text).eventType(ChatEventTypeEnum.DATA.getValue()).build();}).concatWith(Flux.just(ChatEventVO.builder()// 标记输出结束.eventType(ChatEventTypeEnum.STOP.getValue()).build()));}}
返回列表