Spring-AI-上下文记忆

  1. 引入依赖
    pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/> <!-- lookup parent from repository --></parent><!-- Generated by https://start.springboot.io --><!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn --><groupId>com.example</groupId><artifactId>spring-ai-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-ai-demo</name><description>spring-ai-demo</description><properties><java.version>17</java.version><spring-ai.version>0.8.1</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>
  2. 配置yml

    spring:ai:openai:api-key: #没有账号,可以在淘宝,2元购买keybase-url: # 淘宝上会给你中转的urlretry:max-attempts: 3
  3. Controller

    @RestController
    public class IndexController {// key:sessionId  value:会话聊天的上下文private static final Map<String, List<Message>> messageMap = new HashMap<>();@Resourceprivate OpenAiChatClient chatClient;@GetMappingpublic String index(HttpSession session, @RequestParam(name = "message", defaultValue = "使用Java,写一个冒泡算法") String message) {// 检查是否已有会话List<Message> messageList = messageMap.get(session.getId());if (messageList == null) {messageList = new ArrayList<>();messageMap.put(session.getId(), messageList);}// 将用户消息,加入上下文messageList.add(messageList.size(), new UserMessage(message));// 发送消息时,传递的是上下文的所有信息,不单单是你当前发送的一条消息// 所有最好为list设置容量的限制,不然你的api-key的资源会消耗很快String result = chatClient.call(new Prompt(messageList)).getResult().getOutput().getContent();// 将ai消息,加入上下文messageList.add(messageList.size(), new AssistantMessage(result));return result;}
    }
    

    优化代码:(可以使用redis来代替 存储messageMap)
    OpenAiService.java

    /*** 记录上下文聊天信息*/
    @Service
    public class OpenAiService {private static final Map<String, LinkedList<Message>> messageMap = new HashMap<>();@Resourceprivate OpenAiChatClient chatClient;private void addUserMessage(LinkedList<Message> messageList, String message) {checkMessageCapacity(messageList);messageList.addLast(new UserMessage(message));}private void addAssistantMessage(LinkedList<Message> messageList, String message) {checkMessageCapacity(messageList);messageList.add(messageList.size(), new AssistantMessage(message));}public String chat(String sessionId, String message) {LinkedList<Message> messageList = messageMap.get(sessionId);if (messageList == null) {messageList = new LinkedList<>();messageMap.put(sessionId, messageList);}addUserMessage(messageList, message);String result = chatClient.call(new Prompt(messageList)).getResult().getOutput().getContent();addAssistantMessage(messageList, result);return result;}public void checkMessageCapacity(LinkedList<Message> messages) {if (messages.size() >= 10) {messages.removeFirst();}}
    }

    IndexController.java

    @RestController
    public class IndexController {@Resourceprivate OpenAiService openAiService;@GetMappingpublic String index(HttpSession session, @RequestParam(name = "message", defaultValue = "使用Java,写一个冒泡算法") String message) {String result = "";synchronized (session.getId().intern()) {result = openAiService.chat(session.getId(), message);}return result;}
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 73.矩阵置零————2024 春招冲刺百题计划

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例 2&#xff1a; 输入&#xff1a;matrix […

华为OD机试 - 连续天数的最高利润额(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

高效、稳定、兼容:中国星坤MINI PCIE连接器优势明显

电子设备的性能要求日益提高&#xff0c;尤其是在数据传输和连接稳定性方面。中国星坤推出的MINI PCIE连接器&#xff0c;以其出色的性能和显著的优势&#xff0c;迅速成为行业内的佼佼者&#xff0c;为现代电子设备提供了高效、稳定的连接解决方案。 在性能方面&#xff0c;中…

限制登录Linux服务器的几种方式

一.第一种方法 通过修改TCP Wrappers服务访问控制来实现限制登录Linux 1.这里以sshd服务为例&#xff0c;配置完成后&#xff0c;只允许配置允许的IP才能ssh连接本机服务器&#xff0c;其他IP拒绝判断某一个基于tcp协议的服务是否支持tcp_wrapper&#xff0c;要先判断它是否支…

登录页界面设计详细教程:打造令人印象深刻的用户登录体验

我们日常使用的软件都会有注册和登录页&#xff0c;为什么注册登录页面是必不可少的呢&#xff1f;对于企业&#xff0c;目的是将访客转化为产品用户&#xff0c;有助于获得用户画像和各种数据&#xff0c;针对用户的个性化服务进行产品的迭代更新。对于个人&#xff0c;则根据…

鸿蒙应用开发之下拉菜单选择组件

前面学习了搜索框组件,接着下来学习下位菜单选择组件。它实现了一个下拉式的菜单,当用户点击下拉菜单中某一项,就会被选中。 这个组件的界面大体如下: 这个组件可以设置每一项的图标,以及文本显示。由于它是下拉式的菜单,所以候选的内容建议不要太多,否则会滚动比较麻烦…

Redis-键值设计

Redis-键值设计 1.设置key的规范 遵循基本格式&#xff1a;【业务名称】&#xff1a;【数据名】&#xff1a;【id】 可读性强&#xff0c;在客户端的情况下使用:如果前缀相同会分目录层级长度不超过44字节 string数据结构的三种类型&#xff0c;在44字节之内是embstring 内存…

【零基础学数据结构】链表

目录 1.链表的概念 ​编辑 2.链表的雏形 ​编辑 3.链表的组成 ​编辑 4.链表代码 4.1创建节点 4.2链表的打印 4.3链表的尾插 4.4链表的头插 4.5链表的尾删 4.6链表的头删 4.7链表的查找 4.8链表在指定位置之前插⼊数据 4.9链表在指定位置之后插⼊数据 4.9-1删除pos节点 4.9…

做抖音小店保证金可以不交吗?不交保证金,会有什么后果?

哈喽~我是电商月月 说到最赚钱的软件&#xff0c;大家第一个想的就是抖音了&#xff0c;很多不想直播&#xff0c;但又想在抖音上赚钱的人就选择了抖音小店 但普通人创业&#xff0c;开店遇到的第一个困难就是类目保证金的缴纳 几千块钱虽然能拿的出来&#xff0c;但怕就怕在…

数据结构 -- 二分查找

本文主要梳理了二分查找算法的几种实现思路&#xff0c;基本概念参考 顺序、二分、哈希查找的区别及联系_生成一个大小为10万的有序数组,随机查找一个元素,分别采用顺序查找和二分查找方式-CSDN博客 1、基本概念 &#xff08;1&#xff09;前提条件&#xff1a;待查找数据必须…

java--包装类

目录 1、包装类的定义 2、意义 3、八大基本类型的包装类 4、转换 5、自动拆箱和自动装箱 6、面试问题&#xff1a;请阐述128陷阱以及出现的原因 1、包装类的定义 把基本类型包装--包装类 2、意义 1、在面向对象中&#xff0c;“一切皆为对象”&#xff0c;但是基本类型不…

手机移动端网卡信息获取原理分析

有些场景我们需要获取当前手机上的网卡信息&#xff08;如双卡双待、Wifi等&#xff09;。本文准备研究一下这块的原理&#xff0c;以便更好的掌握相关技术原理。 1、底层系统接口 getifaddrs 使用 getifaddrs 接口可以达到我们的目的&#xff0c;该接口会返回本地所有网卡的信…

fiddler使用(三)-工具栏介绍

Fiddler是一个强大的网络调试工具&#xff0c;它可以帮助用户捕获HTTP和HTTPS请求和响应&#xff0c;从而进行调试和分析。在Fiddler的用户界面中&#xff0c;工具栏是一个非常重要的组成部分&#xff0c;它提供了许多常用的操作和功能&#xff0c;方便用户进行网络调试。以下是…

3d max快捷键命令大全

文章目录 3dmax快捷键汇总一、主界面快捷键1、菜单快捷键2、主工具栏和浮动工具栏快捷键3、视口快捷键4、关键点和时间控制项快捷键5、视口导航控制项快捷键6、方形菜单快捷键7、虚拟视口快捷键8、次对象快捷键9、层次快捷键10、可编辑网格快捷键11、可编辑多边形快捷键12、NUR…

分组带给了我们哪些?

在我们的班级里&#xff0c;你们可能已经注意到我们最近进行了一项特别的举措——分组学习。你们可能会想&#xff0c;为什么我们要这样做&#xff1f;今天&#xff0c;我想与大家分享一些关于分组学习的见解和想法。请读下面的两个故事。 --- 故事一&#xff1a;亚马逊团队创…

布局香港之零售中小企篇 | 传承之味,迈向数字化经营的时代

随着内地与香港两地经贸合作日渐紧密&#xff0c;越来越多内地消费品牌将目光投向香港这片充满机遇的热土&#xff0c;纷纷入驻香港市场。「北店南下」蔚然成风&#xff0c;其中不乏已在内地市场深耕多年的传统老字号。数字化经营时代&#xff0c;老字号焕新刻不容缓&#xff0…

蓝队面试经验总结

Sql注入 1、sql注入漏洞原理 开发者没有在网页传参点做好过滤&#xff0c;导致恶意 sql 语句拼接到数据库进行执行 2、sql注入分类 联合注入 、布尔盲注 、时间盲注 、堆叠注入 、宽字节注入 、报错注入 3、堆叠注入原理 在 mysql 中&#xff0c;分号 代表一个查询语句的…

Git-常规用法-含解决分支版本冲突解决方法

目录 前置条件 已经创建了Gitee账号 创建一个远程仓库 Git的优点 版本控制 Git 下载 Git的使用 检查Git的是否安装成功 git的常用命令 常用流程 Git 分支 分支流程 Git 远程仓库 远程仓库流程 特殊 可能遇到的问题 前置条件 已经创建了Gitee账号 创建一个远程仓…

求1000以内正整数的平方根(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;int number 0;int result 0;//提示用户&#xff1b;printf("请输入1000以内求平方根的…

【c++leetcode】14. Longest Common Prefix

问题入口 解决方案 class Solution { public:string longestCommonPrefix(vector<string>& v) {string ans "";sort(v.begin(), v.end());int n v.size();string first v[0],last v[n - 1];for(int i 0; i < min(first.size(),last.size()); i){…