返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

分分钟用Java实现多轮对话记忆功能

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 21:56 |阅读模式 打印 上一主题 下一主题



前言


在 AI 技术飞速发展的今天,越来越多的企业希望通过 AI 技术提升业务能力。目前来看,绝大部分的企业系统都是用 Java 开发。大趋所势,Java 最火热的框架 Spring 与 AI 技术相结合,催生了一个全新的领域:Spring AI。它旨在将 AI 模型与 Spring 生态系统无缝集成,让开发者能够轻松地在 Spring 应用中使用 AI 功能。


Spring AI Alibaba 则是阿里对 Spring AI 的实现和增强,同时完整适配了阿里云通义模型。


在 AI 技术飞速更新的今天,普通的 Java 程序员岗位竞争趋于饱和,但是又衍生出了新的岗位-AI应用开发工程师。因为 Spring AI 使 Java 与 AI 无缝衔接,而且企业系统的代码基本是用 Java 更新迭代了很多年,所以开发 AI 应用,Spring AI 当然是首选,Spring AI 让 Java 再次伟大




身为程序员的我们,当然要赶快学起来,提早坐上这座 AI 的大船!


接下来,我们就用 Java + Spring AI Alibaba 实现一个支持多轮对话记忆的程序




Java 实现 AI 多轮对话记忆,可参考 Spring AI Alibaba 的 示例代码


01

准备环境


开发工具:IDEA

构建工具:Gradle

开发环境:JDK21(17+即可)

技术框架:SpringBoot3.3.0 + Spring AI Alibaba 1.0.0-M6.1


02

引入Gradle依赖


这里我只引入核心依赖,其他的SpringBoot等基础依赖就不做展示了。

implementation'com.alibaba.cloud.ai:spring-ai-alibaba-starter:1.0.0-M6.1'


03

定义系统提示词


假如自己是一位资深软件开发工程师,提示词如下:

/***系统提示词*/privatestaticfinalStringSYSTEM_PROMPT="扮演资深的软件开发专家。开场向用户表明身份,告知用户可以提出难以解决的编程问题。\"+\n"+"\"引导用户详述问题需求,以便给出专属解决方案。";


04

初始化ChatClient


使用 Spring 的构造器注入方‎式来注入阿里大模型dashscopeChatModel 对象,并使用该对象来初始化 ChatCli‍ent。初始化时指定默认的系统 Prompt 和基于内存⁠的对话记忆 Advisor。代码如下:

/***初始化ChatClient*@paramchatModel*/publicCodeAssistantApp(ChatModelchatModel){ChatMemorychatMemory=newInMemoryChatMemory();chatClient=ChatClient.builder(chatModel).defaultSystem(SYSTEM_PROMPT)//拦截器.defaultAdvisors(newMessageChatMemoryAdvisor(chatMemory),//自定义拦截器,按需开启newCustomLoggerAdvisor()//自定义重读拦截器,增强推理能力,增加成本,按需开启//newReReadingAdvisor()).build();}


05

多轮对话记忆


入参message是用户对话内容,chatId是对话的唯一标识,用于区分不同的对话上下文(例如不同用户的对话)将当前对话的 ID(chatId)传入,AI 客户端会根据这个 ID 去查找该对话的历史记录。

/***基础对话(支持多轮对话记忆)*@parammessage*@paramchatId*@returnjava.lang.String*/publicStringdoChat(Stringmessage,StringchatId){ChatResponseresponse=chatClient.prompt().user(message)//将当前对话的ID(chatId)传入,AI客户端会根据这个ID去查找该对话的历史记录.advisors(spec->spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY,chatId)//表示最多获取最近的10条历史消息作为上下文,供AI在生成回复时参考.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY,10)).call().chatResponse();Stringcontent="";if(Objects.nonNull(response)){content=response.getResult().getOutput().getText();}log.info("content:{}",content);returncontent;}


06

完整代码


@Slf4j@ComponentpublicclassCodeAssistantApp{privatefinalChatClientchatClient;/***系统提示词*/privatestaticfinalStringSYSTEM_PROMPT="扮演资深的软件开发专家。开场向用户表明身份,告知用户可以提出难以解决的编程问题。\"+\n"+"\"引导用户详述问题需求,以便给出专属解决方案。";/***初始化ChatClient*@paramchatModel*/publicCodeAssistantApp(ChatModelchatModel){ChatMemorychatMemory=newInMemoryChatMemory();chatClient=ChatClient.builder(chatModel).defaultSystem(SYSTEM_PROMPT)//拦截器.defaultAdvisors(newMessageChatMemoryAdvisor(chatMemory),//自定义拦截器,按需开启newCustomLoggerAdvisor()//自定义重读拦截器,增强推理能力,增加成本,按需开启//newReReadingAdvisor()).build();}/***基础对话(支持多轮对话记忆)*@parammessage*@paramchatId*@returnjava.lang.String*/publicStringdoChat(Stringmessage,StringchatId){ChatResponseresponse=chatClient.prompt().user(message)//将当前对话的ID(chatId)传入,AI客户端会根据这个ID去查找该对话的历史记录.advisors(spec->spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY,chatId)//表示最多获取最近的10条历史消息作为上下文,供AI在生成回复时参考.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY,10)).call().chatResponse();Stringcontent="";if(Objects.nonNull(response)){content=response.getResult().getOutput().getText();}log.info("content:{}",content);returncontent;}}


07

单元测试


@SpringBootTestpublicclassCodeAssistantAppTest{@ResourceprivateCodeAssistantAppcodeAssistantApp;@TestvoidtestChat(){StringchatId=UUID.randomUUID().toString();//第一轮Stringmessage="你好,我是技术但不宅";Stringanswer=codeAssistantApp.doChat(message,chatId);Assertions.assertNotNull(answer);//第二轮message="如何解决空指针异常";answer=codeAssistantApp.doChat(message,chatId);Assertions.assertNotNull(answer);//第三轮message="还有什么更优雅的解决方案";answer=codeAssistantApp.doChat(message,chatId);Assertions.assertNotNull(answer);}}


08

输出结果


因为输出内容过多,这里我就只展示部分内容吧。


bj.96weixin.com



结语


Spring AI 的功能非常强大,多轮对话记忆只是其中一个特性,后续我会分享更多关于 Java & AI 的小案例供大家学习。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ