AI 应用方案设计
根据需求实现具备多轮对话能力的 AI 恋爱大师应用整体方案围绕 2 个核心展开系统提示词的设计多轮对话的实现1、系统提示词设计系统提示词相当于 AI 应用的 “灵魂”直接决定 AI 的行为模式、专业性和交互风格。简单提示写法直接写一段系统预设定义你是谁能做什么你是一位恋爱大师为用户提供情感咨询服务简单提示可以运行但效果不理想。现实咨询场景专家会主动抛出引导问题挖掘背景而不是被动等待用户完整描述。 示例引导问题最近有什么迷茫的事情么请问你有什么需要我帮助的么你们的感情遇到什么问题了么多轮对话场景下AI 不能失忆要把历史对话作为上下文不断了解用户输出更全面建议。借助 AI 优化提示词输入给 AI 的指令我正在开发【恋爱大师】AI对话应用请你帮我编写设置给 AI 大模型的系统预设 Prompt 指令。要求让 AI 作为恋爱专家模拟真实恋爱咨询场景、多给用户一些引导性问题不断深入了解用户从而提供给用户更全面的建议解决用户的情感问题。AI 输出优化后的系统提示词扮演深耕恋爱心理领域的专家。开场向用户表明身份告知用户可倾诉恋爱难题。围绕单身、恋爱、已婚三种状态提问单身状态询问社交圈拓展及追求心仪对象的困扰恋爱状态询问沟通、习惯差异引发的矛盾已婚状态询问家庭责任与亲属关系处理的问题。引导用户详述事情经过、对方反应及自身想法以便给出专属解决方案。2、多轮对话实现实现带 “记忆力” 的 AI记住历史对话保持上下文连贯使用 Spring AI 框架对话记忆能力。 Spring AI 提供ChatClientAPI 和大模型交互。ChatClient 特性旧方式直接注入ChatModel调用大模型新方式手动构造ChatClient功能更丰富灵活支持链式调用Fluent API代码对比// 基础用法(ChatModel) ChatResponse response chatModel.call(new Prompt(你好)); // 高级用法(ChatClient) ChatClient chatClient ChatClient.builder(chatModel) .defaultSystem(你是恋爱顾问) .build(); String response chatClient.prompt().user(你好).call().content();两种构建 ChatClient 方式// 方式1使用构造器注入 Service public class ChatService { private final ChatClient chatClient; public ChatService(ChatClient.Builder builder) { this.chatClient builder .defaultSystem(你是恋爱顾问) .build(); } } // 方式2使用建造者模式 ChatClient chatClient ChatClient.builder(chatModel) .defaultSystem(你是恋爱顾问) .build();ChatClient 多种响应格式// 1. 返回 ChatResponse 对象包含元数据如 token 使用量 ChatResponse chatResponse chatClient.prompt() .user(Tell me a joke) .call() .chatResponse(); // 2. 返回实体对象自动将AI输出映射为Java对象 // 2.1 返回单个实体 record ActorFilms(String actor, ListString movies) {} ActorFilms actorFilms chatClient.prompt() .user(Generate the filmography for a random actor.) .call() .entity(ActorFilms.class); // 2.2 返回泛型集合 ListActorFilms multipleActors chatClient.prompt() .user(Generate filmography for Tom Hanks and Bill Murray.) .call() .entity(new ParameterizedTypeReferenceListActorFilms() {}); // 3. 流式返回适用于打字机效果 FluxString streamResponse chatClient.prompt() .user(Tell me a story) .stream() .content(); // 也可以流式返回ChatResponse FluxChatResponse streamWithMetadata chatClient.prompt() .user(Tell me a story) .stream() .chatResponse();设置默认参数动态修改系统提示词模板变量// 定义默认系统提示词 ChatClient chatClient ChatClient.builder(chatModel) .defaultSystem(You are a friendly chat bot that answers question in the voice of a {voice}) .build(); // 对话时动态更改系统提示词的变量 chatClient.prompt() .system(sp - sp.param(voice, voice)) .user(message) .call() .content();还支持指定默认对话选项、默认拦截器、默认函数调用。Advisors顾问 / 拦截器类比 Spring AOP一套可插拔拦截器。调用 AI之前、之后执行额外逻辑。前置增强调用 AI 前改写 Prompt、校验提示词安全后置增强调用 AI 后记录日志、处理返回结果示例代码给 ChatClient 增加拦截器MessageChatMemoryAdvisor实现多轮对话记忆QuestionAnswerAdvisor用于 RAG 知识库检索var chatClient ChatClient.builder(chatModel) .defaultAdvisors( new MessageChatMemoryAdvisor(chatMemory), // 对话记忆 advisor new QuestionAnswerAdvisor(vectorStore) // RAG 检索增强 advisor ) .build(); String response this.chatClient.prompt() // 对话动态设置拦截器参数会话id、记忆最大长度 .advisors(advisor - advisor.param(chat_memory_conversation_id, 678) .param(chat_memory_response_size, 100)) .user(userText) .call() .content();Advisors 执行流程流程图转文字步骤Spring AI 拿用户 Prompt 创建AdvisedRequest同时创建空AdvisorContext用来传递上下文数据。执行链上每一个 Advisor拦截器可以修改请求也可以直接截断请求不继续往下走自己填充返回内容。请求交给底层逻辑发送给ChatModel大模型。大模型返回ChatResponse响应沿着 Advisor 链条反向传回封装成AdvisedResponse携带共享的AdvisorContext。每一个后置 Advisor 处理、修改返回响应。提取结果转为ChatResponse返回给调用方。底层是责任链模式。拦截器执行顺序由getOrder()返回值决定数值越小越优先执行不是代码书写顺序。两种运行模式非流式 Non‑Streaming完整拿到全部结果再返回对象AdvisedRequest、AdvisedResponse调用CallAroundAdvisor。流式 Streaming打字机效果分段返回返回Flux流对象调用StreamAroundAdvisor。自定义 Advisor最好同时实现两种模式保证通用性。Chat Memory Advisor对话记忆拦截器内置 3 种实现MessageChatMemoryAdvisor把历史对话作为一条条独立消息追加到 prompt保留完整消息结构role角色user/assistant/system。PromptChatMemoryAdvisor把历史对话直接拼接到系统提示词文本里丢失原始消息边界。VectorStoreChatMemoryAdvisor把对话历史存入向量数据库。推荐使用MessageChatMemoryAdvisor符合大模型接口设计上下文连贯性更好。两种记忆存储输出样例1MessageChatMemoryAdvisor 输出消息数组格式[ {role: user, content: 你好}, {role: assistant, content: 你好有什么我能帮助你的吗}, {role: user, content: 讲个笑话} ]2PromptChatMemoryAdvisor 输出纯文本拼接以下是之前的对话历史 用户你好 助手你好有什么我能帮助你的吗 用户讲个笑话 现在请继续回答用户的问题。ChatMemory 存储接口ChatMemory是底层存储接口定义保存、查询、清空对话记录的抽象方法。public interface ChatMemory { default void add(String conversationId, Message message); void add(String conversationId, ListMessage messages); ListMessage get(String conversationId, int lastN); void clear(String conversationId); }Spring AI 内置多种存储实现InMemoryChatMemory内存存储重启丢失数据测试用。CassandraChatMemoryCassandra 持久化支持过期时间。Neo4jChatMemoryNeo4j 图数据库持久化无过期。JdbcChatMemoryJDBC 兼容数据库持久化无过期。也可以实现ChatMemory接口自定义存储介质。

相关新闻

【前端+SVG+Figma】SVG 兼容性复盘:Figma 导入文字“缩很小/不见“的发现、分析与解决

【前端+SVG+Figma】SVG 兼容性复盘:Figma 导入文字“缩很小/不见“的发现、分析与解决

SVG 导入 Figma 文字消失?深度复盘跨工具兼容性修复实战 摘要 一句话说清:浏览器里完美的 SVG 面板,导入 Figma 后文字缩成 1 像素——根因是 pattern scale 嵌套位图撞上 objectBoundingBox 兼容性黑洞,本文用最大兼容子集重写…

2026/10/2 12:21:39 阅读更多 →
机器学习项目的完整周期

机器学习项目的完整周期

在机器学习中训练知识拼图的一部分本章节讲述机器学习的完整周期在创建一个有价值的机器学习系统的时候应该考虑和规划那些步骤。以语音识别为例1.明确项目规范,决定项目的具体内容你想要解决的问题例如研究语音搜索识别,通过对手机说话,而不是输入来进行…

2026/10/7 21:56:08 阅读更多 →
从西游记到山海经,VR大空间定制重塑经典文化IP文旅景区体验

从西游记到山海经,VR大空间定制重塑经典文化IP文旅景区体验

从《西游记》里的腾云驾雾,到《山海经》中的奇珍异兽,再到吴哥窟千年石壁上的微笑——这些曾经只存在于书本、荧幕或旅途中的文化符号,如今正被一股新的技术浪潮重新激活。VR大空间,或者更准确地说,LBE大空间&#xff…

2026/10/8 21:16:09 阅读更多 →

最新新闻

LeetCode 437 路径总和 III:从暴力解到前缀和优化的完整思路

LeetCode 437 路径总和 III:从暴力解到前缀和优化的完整思路

Day 16 的刷题计划轮到 LeetCode 437 路径总和 III。说实话,刚开始我有点轻敌:前面刚把路径总和 I、II 都过了一遍,觉得二叉树路径问题无非就是递归套递归,用 JavaScript 写起来也不会难到哪里去。等我真正动手才发现,…

2026/10/9 4:04:31 阅读更多 →
Java Servlet图书管理系统:零框架部署与课设实战指南

Java Servlet图书管理系统:零框架部署与课设实战指南

简介:这是一份面向计算机专业本科生的Java课程设计与期末大作业实战资源,基于B/S架构实现功能完整的图书管理系统,帮助学习者掌握JDBC连接MySQL、ServletJSP前后端交互、MVC分层开发等核心技能。资源包共93个文件,包含40个Java业务…

2026/10/9 4:04:31 阅读更多 →
红黑树学习笔记:从规则、旋转变色到插入删除实操

红黑树学习笔记:从规则、旋转变色到插入删除实操

红黑树大概是数据结构里退学率最高的一章,没有之一。链表、栈、队列这些结构,说白了就是换种方式组织数据,看两遍代码基本能上手。但红黑树不一样,它天生带着一堆规则、旋转、变色、再平衡,哪怕你对着博客把插入的六种…

2026/10/9 4:04:31 阅读更多 →
栈上变量覆写:一道CTF入门题的PWN解题全流程

栈上变量覆写:一道CTF入门题的PWN解题全流程

不用多说,直接进正题。今天要拆的这道题是HappyNewYearCTF系列里的第三题,题目全名叫“栈上变量覆写2”。一看到这个名字,基本就能猜个大概:又是栈上变量被覆写的路子,而且这题带个“2”,说明同系列里还有一…

2026/10/9 4:04:31 阅读更多 →
Spring Boot 3 接入 AI 生图:异步管道与防刷限流架构实践

Spring Boot 3 接入 AI 生图:异步管道与防刷限流架构实践

做 AI 应用的朋友应该都有体会:同一张图,老手能生成得又快又稳,新手可能连接口都调不明白,或者好不容易调通了,一上线就被刷爆了配额。这段时间我正好把一个 AI 生图功能从零接入到一个 Spring Boot 3 的现有后端里&am…

2026/10/9 4:04:31 阅读更多 →
4G显存也能流畅跑大模型:llama.cpp与GGUF量化实战指南

4G显存也能流畅跑大模型:llama.cpp与GGUF量化实战指南

如果你的电脑还在用 4GB 显存的显卡,比如 GTX 1650、RTX 3050 Laptop 或者 AMD 那边的 RX 6500 XT,想跑本地大模型,第一反应可能是到处找精简版、量化版,或者干脆放弃转用云 API。但今天我直接说结论:4G 显存完全能跑&…

2026/10/9 4:03:31 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →