当前位置: 首页 > article >正文

Spring with AI (3): 定制对话——Prompt模板引入

1 创建模板先在pom.xml引入验证Starterdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency我们定义一个关于“世界各国地理历史知识”的AI模板也简单明了实体定义package com.junteam.ai.demo.model; import jakarta.validation.constraints.NotBlank; public record ChatQuestion( NotBlank(message 标题不能为空) String title, NotBlank(message 问题不能为空) String question) { }模板文件resources/promptTemplates/questionPromptTemplate.st定义你是一个有用的助手负责回答有关“代码编程题”的问题。 如果你对这个编程语言一无所知或不知道答案请回答“我不知道”。 只给出实现代码。 编程语言是 {title}。 问题是 {question}2 实现逻辑package com.junteam.ai.demo.service.impl; import org.springframework.ai.chat.client.ChatClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import com.junteam.ai.demo.model.ChatAnswer; import com.junteam.ai.demo.model.ChatQuestion; import com.junteam.ai.demo.service.ChatService; Service public class OpenAIChatServiceImpl implements ChatService { private final ChatClient chatClient; public OpenAIChatServiceImpl(ChatClient.Builder chatClientBuilder) { this.chatClient chatClientBuilder.build(); } Value(classpath:/promptTemplates/questionPromptTemplate.st) Resource questionPromptTemplate; SuppressWarnings(null) Override public ChatAnswer ask(ChatQuestion chatQuestion) { var answer chatClient.prompt() .user(userSpec - userSpec .text(questionPromptTemplate) .param(title, chatQuestion.title()) .param(question, chatQuestion.question()) ) .call(); var answerText answer.content(); return new ChatAnswer(chatQuestion.title(), answerText); } }3 运行效果测试用例curl http://localhost:8080/web/ask \ -X POST \ -H Content-Type: application/json \ -d {title: java, question: 给定一个非递减排序的整数数组 nums 和一个目标值 target请编写一个函数返回 target 在数组中出现的第一个位置和最后一个位置下标从 0 开始。​\n - 如果 target 未在数组中出现返回 [-1, -1]​\n - 要求时间复杂度不超过 O(logn)空间复杂度 O(1)。​\n示例​\n 1. 输入nums [5,7,7,8,8,10], target 8 → 输出[3,4]​\n 2. 输入nums [5,7,7,8,8,10], target 6 → 输出[-1,-1]​\n 3. 输入nums [], target 0 → 输出[-1,-1]​\n 4. 输入nums [2,2], target 2 → 输出[0,1]}返回结果为了排版笔者进行了截断{ title:JAVA, answer:java\nclass Solution {\n public int findMin(int[] nums) {\n ... }整理出来结果如下class Solution { public int findMin(int[] nums) { int left 0; int right nums.length - 1; while (left right) { int mid left (right - left) / 2; if (nums[mid] nums[right]) { left mid 1; } else { right mid; } } return nums[left]; } }4 更多补充4.1 基于模板扩展内容再引入RAG之前可以用简单的模板填充、来实现一些扩展内容。比如再加一个langRules/java.txt内容形如- java中尽量使用基本数据、而非封装类型。 - java中尽量使用静态方法实现代码。这样可以再模板可以修改为你是一个有用的助手负责回答有关“代码编程题”的问题。 如果你对这个编程语言一无所知或不知道答案请回答“我不知道”。 如果可能使用规则{rules}。 只给出实现代码。 编程语言是 {title}。 问题是 {question}4.2 大模型选项4.2.1 大模型类型在配置讲解中已经提到不再赘述4.2.2 大模型温度temperature参数是生成策略中的核心参数直接影响输出的随机性与创造性。低Temperature0.3-0.7适用于客服机器人等需要精准回答的场景减少错误信息中Temperature0.7-1.2适合创意写作平衡逻辑性与多样性高Temperature1.2-2.0用于头脑风暴工具激发非常规创意ChatOptions chatOptions ChatOptions.builder() .temperature(0.7) .build(); String answerText chatClient.prompt() .user(question.question()) .options(chatOptions) .call() .content();4.2.3 其他选项topP拣选答案的比例比如.topP(0.8)从排名前80%的结果中拣选topK排除答案的比例比如.topP(0.2)排名后20%的结果排除4.3 格式化例如前面所提的在Prompt中指定输出格式为json、或者只保留java代码。这样可以快速实现热门歌单等json接口另外可以把输出格式就设置为流式这样客户端或网页前端可以使用SSE协议接收结果、逐个Token显示。return chatClient.prompt() .system(systemSpec - systemSpec .text(promptTemplate) .param(title, question.title()) .param(rules, langRules)) .user(question.question()) .stream() // 流式 .content();4.4 响应元数据LLM返回的内容例如OpenAI包含了Token使用相关的数据元数据形如{ token_usage: { completion_tokens: 164, prompt_tokens: 17, total_tokens: 181 }, model_name: gpt-4-turbo, system_fingerprint: fp_76f018034d, finish_reason: stop, logprobs: null }这样可以再代码中获取和记录var responseEntity chatClient.prompt() .system(systemSpec - systemSpec .text(promptTemplate) .param(gameTitle, question.gameTitle()) .param(rules, gameRules)) .user(question.question()) .call() .responseEntity(Answer.class); var response responseEntity.response(); var metadata response.getMetadata(); log.info(metadata.getUsage()); // 获得Token使用量 return responseEntity.entity();

相关文章:

Spring with AI (3): 定制对话——Prompt模板引入

1 创建模板先在pom.xml引入验证Starter&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>我们定义一个关于“世界各国地理历史知识”的AI&…...

Skills 系统——让 AI 秒变专家

1. 技能的本质&#xff1a;提示词工程 在 nanobot 中&#xff0c;一个技能就是一个文件夹&#xff0c;核心是里面的 SKILL.md。 nanobot内置的skills放在project_path/nanobot/skills目录下&#xff0c;用户自定义的skills放在workspace/.nanobot/skills目录下 以 weather 技…...

三线制SPI通信原理与ZYNQ实现方案

1. 三线制SPI通信的背景与应用场景 在嵌入式系统设计中&#xff0c;SPI(Serial Peripheral Interface)总线是最常用的通信接口之一。传统四线制SPI包含SCLK(时钟)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)和SS(片选)四条信号线。但在某些特定应用场景下&#xff0c;为…...

2026届毕业生推荐的六大降重复率平台解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要是为了切实有效地去降低文本所具备的AIGC也就是人工智能生成内容的特征&#xff0c;那就建…...

2025届必备的六大降重复率平台横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在内容创作范畴当中&#xff0c;要是打算削减 AIGC 特性&#xff0c;那就得从语言风格、逻辑…...

嵌入式JPEG解码库JPEGDecoder深度解析

1. JPEGDecoder 库深度技术解析&#xff1a;面向嵌入式显示系统的轻量级 JPEG 解码实践1.1 库定位与工程价值JPEGDecoder 是一个专为资源受限嵌入式平台设计的轻量级 JPEG 解码库&#xff0c;其核心目标并非替代 PC 级全功能解码器&#xff0c;而是在 MCU 级别实现“够用、可控…...

CWW Morse Transmit:嵌入式摩尔斯电码生成与侧音实现

1. CWW Morse Transmit 库深度解析&#xff1a;嵌入式系统中的摩尔斯电码生成与音频侧音实现摩尔斯电码&#xff08;Morse Code&#xff09;作为人类历史上首个成熟的数字通信协议&#xff0c;自1837年塞缪尔莫尔斯发明以来&#xff0c;持续在军事、航海、业余无线电及应急通信…...

OpenClaw+千问3.5-9B数据清洗:Excel表格异常值检测与修复

OpenClaw千问3.5-9B数据清洗&#xff1a;Excel表格异常值检测与修复 1. 为什么需要AI辅助数据清洗&#xff1f; 上周处理一份客户调研数据时&#xff0c;我遇到了典型的数据清洗难题——表格里混杂着空值、格式混乱的日期、重复记录和错误拼写。手动处理不仅耗时&#xff0c;…...

知识竞赛软件售后服务哪家好?真实用户评价与选购指南

知识竞赛软件售后服务哪家好&#xff1f;真实用户评价揭秘在数字化教学与企业培训普及的今天&#xff0c;知识竞赛软件已成为学校、企业和各类机构开展活动的得力工具。然而&#xff0c;软件购买并非一锤子买卖&#xff0c;售后服务的质量直接关系到软件能否长期稳定运行、活动…...

51单片机入门难点解析与高效学习路径

1. 为什么51单片机入门难&#xff1f;问题出在哪里&#xff1f;很多初学者在接触51单片机时&#xff0c;都会遇到一个奇怪的现象&#xff1a;明明大家都说51单片机简单&#xff0c;但自己学起来却特别吃力。作为一个带过上百名单片机新手的工程师&#xff0c;我发现这个问题通常…...

二极管特性与19种经典应用电路详解

1. 二极管基础特性与工作原理二极管作为电子电路中最基础的半导体器件之一&#xff0c;其核心特性源于PN结的单向导电性。当P型半导体&#xff08;空穴多数载流子&#xff09;与N型半导体&#xff08;电子多数载流子&#xff09;结合时&#xff0c;在交界处形成耗尽层&#xff…...

智慧校园厂家怎么选?看懂这 5 个核心功能再决定不迟

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

智慧校园软件怎么选?看懂这 5 个核心功能再决定不迟

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园软件(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

程序内存管理:堆与栈的核心原理与应用

1. 内存分配基础概念解析在计算机编程中&#xff0c;内存管理是每个程序员必须掌握的核心技能。程序运行时&#xff0c;操作系统会为其分配一块虚拟内存空间&#xff0c;这块空间被划分为几个关键区域&#xff0c;每个区域都有其特定的用途和管理方式。1.1 程序内存布局典型的程…...

智慧校园系统怎么选?看懂这 5 个核心功能再决定不迟

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园系统(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

手把手教你用WouoUI-PageVersion打造128*64 OLED炫酷UI(附Air001移植避坑指南)

嵌入式UI开发实战&#xff1a;WouoUI-PageVersion在128*64 OLED屏上的高效移植与优化 在资源受限的嵌入式设备上实现流畅的UI动画一直是个技术挑战。本文将带你深入探索如何利用WouoUI-PageVersion框架&#xff0c;在仅有4KB RAM和32KB Flash的Air001等微控制器上&#xff0c;打…...

arduinoWebSockets库深度解析:嵌入式WebSocket RFC6455实现

1. WebSockets 库深度技术解析&#xff1a;面向嵌入式系统的 RFC6455 实现WebSocket 协议&#xff08;RFC6455&#xff09;作为现代 Web 实时通信的基石&#xff0c;其在资源受限的嵌入式设备上的落地一直面临巨大挑战。arduinoWebSockets库并非简单的 HTTP 封装&#xff0c;而…...

保姆级教程:用SNAP处理哨兵2号L1C数据,5分钟搞定大气校正生成L2A

零基础实战&#xff1a;SNAP快速处理哨兵2号L1C数据的完整指南 当第一次拿到哨兵2号L1C级数据时&#xff0c;很多研究者都会面临一个共同问题&#xff1a;如何高效地将原始数据转换为可直接用于分析的表面反射率产品&#xff1f;本文将手把手带你完成从数据准备到大气校正的全流…...

QT无边框窗口圆角化实战:用paintEvent和样式表两种方法,打造你的专属UI(附完整代码)

QT无边框圆角窗口开发指南&#xff1a;从原理到实战的深度解析 在当今追求极致用户体验的桌面应用开发领域&#xff0c;无边框圆角窗口已经成为现代化UI设计的标配元素。从音乐播放器的沉浸式界面到社交软件的柔和视觉风格&#xff0c;圆角设计不仅能够降低用户的视觉疲劳&…...

ARM架构解析:从基础原理到嵌入式开发实践

1. ARM处理器架构概述作为一名嵌入式开发者&#xff0c;我经常需要和ARM处理器打交道。第一次接触ARM是在大学时期的一个智能小车项目上&#xff0c;当时使用的是STM32F103系列芯片&#xff0c;基于ARM Cortex-M3内核。从那时起&#xff0c;我就被ARM架构的精巧设计所吸引。经过…...

蒙特卡洛方法与科学计算十大经典算法解析

1. 蒙特卡洛方法&#xff1a;从赌场到科学计算的跨界革命 1946年&#xff0c;三位天才科学家在洛斯阿拉莫斯实验室的咖啡时间里&#xff0c;可能不会想到他们正在创造一种将彻底改变科学计算的方法。蒙特卡洛方法的名字来源于摩纳哥著名的赌城&#xff0c;这暗示了其核心思想—…...

[具身智能-231]:OpenCV的库文件为啥是cv2, 而不是cv?

这是一个非常经典的问题&#xff01;很多初学者在写代码时都会感到困惑&#xff1a;明明安装的是 opencv-python&#xff0c;为什么导入时却要写 import cv2&#xff1f;而且这个 "2" 到底代表 OpenCV 2 还是 OpenCV 3/4&#xff1f;简单直接的回答是&#xff1a;cv2…...

[具身智能-230]:OpenCV常见的“踩坑”有哪些?

在 OpenCV 的开发过程中&#xff0c;确实存在许多容易让人“踩坑”的地方。这些问题往往不涉及复杂的算法原理&#xff0c;而是源于一些反直觉的设计细节或环境配置问题。结合最新的开发实践和常见报错&#xff0c;我为你总结了 OpenCV 开发中最高频的“踩坑”清单&#xff0c;…...

[具身智能-230]:大模型编程的一个最佳实践:先通过自然语言让大模型编写Python语言代码,功能和性能调通后,再让大模型把python程序转换成C++或其他语言的程序

这种“Python 原型验证 C 性能落地”的开发模式&#xff0c;完美契合了大模型&#xff08;LLM&#xff09;的能力特点以及现代软件工程的需求。结合最新的行业实践和技术原理&#xff0c;我为你深度解析为什么这种工作流如此有效&#xff0c;以及在实际操作中需要注意的关键点…...

[具身智能-228]:OpenCV的主要功能

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;被誉为计算机视觉领域的“瑞士军刀”。它是一个基于 BSD 许可发行的开源库&#xff0c;提供了超过 2500 个优化算法&#xff0c;涵盖了从底层像素处理到高层视觉理解的完整技术链路。结合最新的技术资料&…...

I2C设备扫描器:嵌入式系统总线拓扑发现与地址诊断工具

1. I2C设备扫描器&#xff1a;嵌入式系统中总线拓扑发现的核心工具IC&#xff08;Inter-Integrated Circuit&#xff09;总线因其仅需两根信号线&#xff08;SCL时钟线与SDA数据线&#xff09;、支持多主多从架构、内置仲裁与应答机制等特性&#xff0c;成为嵌入式系统中传感器…...

电路接口技术解析:从TTL到无线通信的演进

1. 电路接口概述&#xff1a;信号传输的关键桥梁在嵌入式系统和电子电路设计中&#xff0c;接口技术就像城市之间的高速公路系统。当不同模块需要通信时&#xff0c;就像不同方言的人群需要找到共同语言。我曾参与过一个工业控制器项目&#xff0c;CPU与传感器间的通信故障导致…...

STM32驱动X-NUCLEO-IHM02A1实现工业级步进电机控制

1. X-NUCLEO-IHM02A1 驱动开发深度解析&#xff1a;面向工业级步进电机控制的 STM32 底层实现 X-NUCLEO-IHM02A1 是意法半导体&#xff08;STMicroelectronics&#xff09;推出的高性能双通道步进电机驱动扩展板&#xff0c;专为 STM32 Nucleo 开发平台设计。该板基于 STSPIN22…...

Bugtton:ATmega328P专用超低开销按钮消抖库

1. 项目概述Bugtton 是一款专为 ATmega328P 微控制器深度优化的轻量级按钮消抖库&#xff0c;其设计哲学直指嵌入式系统中一个被长期忽视却至关重要的性能瓶颈&#xff1a;空闲状态下的 CPU 周期开销。在传统 Arduino 风格的按钮处理方案中&#xff0c;digitalRead()函数因其通…...

OpenClaw任务编排:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF处理依赖型工作流

OpenClaw任务编排&#xff1a;Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF处理依赖型工作流 1. 为什么需要任务编排 去年夏天&#xff0c;我接手了一个数据分析项目&#xff0c;需要定期从十几个网站抓取数据&#xff0c;清洗后生成分析报告&#xff0c;再邮件发送给团…...