尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AI 应用方案设计

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