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接口自定义存储介质。

相关新闻

最新新闻

4.3自定义类

4.3自定义类

1.class Xxx{field字段 constructor构造器 method方法}class Employee {//实例字段private String name;private double salary;private LocalDate hireDay;//构造器,总是和new操作符一起调用public Employee(String n,double s,int year,int month,int day){namen;…

2026/8/8 7:58:49
Airtable收购HyperAgent:低代码平台如何集成AI智能体实现智能业务自动化

Airtable收购HyperAgent:低代码平台如何集成AI智能体实现智能业务自动化

1. 这篇文章真正要解决的问题 当“HyperAgent 成 Airtable 新篇章,1.285B 收购引热议”这样的标题出现时,很多开发者可能会感到困惑:这和我有什么关系?是又一个资本故事,还是真的会改变我的工作流? 这恰恰…

2026/8/8 7:58:49
Claude Code开源部署与二次开发指南:从零构建AI编程助手

Claude Code开源部署与二次开发指南:从零构建AI编程助手

1. 从“闭源黑盒”到“开源白盒”:Claude Code 开源意味着什么 今天早上,我的开发工具链里发生了一件大事。当我像往常一样打开编辑器,准备开始一天的编码时,社区和各大技术论坛已经炸开了锅——Anthropic 官方宣布,其…

2026/8/8 7:58:49
飘窗内开窗技术解析:密封、保温与安全性的工程实践

飘窗内开窗技术解析:密封、保温与安全性的工程实践

1. 这篇文章真正要解决的问题 如果你正在装修,或者家里有飘窗,大概率听过一个说法:飘窗最好做内开窗。但为什么?仅仅是因为“密封性好”吗?今天这篇文章,我们不谈营销话术,从技术、工程和实际居…

2026/8/8 7:58:49
数独游戏开发全解析:从回溯算法到产品级应用实现

数独游戏开发全解析:从回溯算法到产品级应用实现

1. 项目概述:从填字游戏到逻辑思维的终极训练场数独,这个由9x9方格构成的数字谜题,早已超越了其作为报纸副刊填字游戏的原始身份。它从一个简单的消遣,演变成了全球数千万爱好者锻炼逻辑思维、提升专注力的首选工具。我接触数独超…

2026/8/8 7:58:49
从 CDS 读权限到个人数据保护,彻底理解 SAP ABAP AccessControl Annotations

从 CDS 读权限到个人数据保护,彻底理解 SAP ABAP AccessControl Annotations

在 SAP S/4HANA 项目里做 CDS 数据模型时,有一类问题很容易被低估。 我们写好了一个 CDS View Entity,通过 Service Definition 暴露成 OData V4,再交给 SAP Fiori elements 做 List Report 或 Object Page。页面能打开,数据也能查出来,看起来整个链路已经跑通。可一旦把…

2026/8/8 7:53:48