掘金 人工智能 04月27日 14:57
LangChain4j—持久化聊天记忆 Persistence(五)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了大模型中聊天记忆的持久化存储方案,重点介绍了如何利用MongoDB实现这一功能。文章首先分析了MySQL、Redis、MongoDB和Cassandra等数据库在聊天记忆存储中的适用场景,然后详细介绍了MongoDB的安装、使用、以及与SpringBoot的整合,并提供了代码示例。最后,文章展示了如何创建一个自定义的MongoChatMemoryStore,实现聊天记忆的持久化,为开发者提供了实用的技术指导。

💡 存储介质选择:文章对比了MySQL、Redis、MongoDB和Cassandra等数据库的特点及其在聊天记忆存储中的适用场景。MySQL适用于结构化数据和复杂查询;Redis适用于实时性要求高的应用;MongoDB适合存储多样化、半结构化或非结构化的数据;Cassandra则适用于大规模、高并发的聊天应用。

💾 MongoDB 简介:MongoDB是一个基于文档的NoSQL数据库,使用集合(Collections)存储文档(Documents)。文档以BSON格式存储,类似于JSON对象,可以包含其他文档和数组。

💻 MongoDB安装与使用:文章提供了在Windows环境下安装MongoDB的步骤,包括服务器、命令行客户端和图形客户端。同时,介绍了使用mongosh命令行客户端连接MongoDB服务器,并执行基本的数据库操作,如查看数据库、切换数据库、查询、插入、更新和删除文档等CRUD操作。

⚙️ SpringBoot整合:通过引入Spring Boot Starter Data MongoDB依赖,配置远程连接,以及创建实体类和测试类,展示了MongoDB与SpringBoot的整合过程,包括插入、查询、更新和删除文档的操作。

🔑 持久化实现:文章给出了一个使用MongoDB实现聊天记忆持久化的示例,包括实体类、MongoChatMemoryStore的创建,以及在SeparateChatAssistantConfig中配置MongoChatMemoryStore,从而实现聊天记录的持久化存储。

持久化聊天记忆 Persistence

默认情况下,聊天记忆存储在内存中。如果需要持久化存储,可以实现一个自定义的聊天记忆存储类,以便将聊天消息存储在你选择的任何持久化存储介质中。

1、存储介质的选择

大模型中聊天记忆的存储选择哪种数据库,需要综合考虑数据特点、应用场景和性能要求等因素,以下是一些常见的选择及其特点:

1. MySQL

2.Redis

3.MongoDB

不需要预先定义严格的表结构,适合存储半结构化或非结构化的数据

息格式可能会频繁变化时,MongoDB 能很好地适应这种灵活性。例如,一些社交应用中用户可

能会发送各种格式的消息,使用 MongoDB 可以方便地存储和管理这些不同类型的数据。

4.Cassandra

特点:是一种分布式的 NoSQL 数据库,具有高可扩展性和高可用性,能够处理大规模的分布

式数据存储和读写请求。适合存储海量的、时间序列相关的数据

适用场景:对于大型的聊天应用,尤其是用户量众多、聊天数据量巨大且需要分布式存储和处

理的场景,Cassandra 能够有效地应对高并发的读写操作。例如,一些面向全球用户的社交媒

体平台,其聊天数据需要在多个节点上进行分布式存储和管理,Cassandra 可以提供强大的支

持。

2、MongoDB

简介

MongoDB 是一个基于文档的 NoSQL 数据库,由 MongoDB Inc. 开发。

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数

据库的数据库管理系统的统称。

MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求

MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于 JSON 对象,字段值可以包含其他文档,数组及文档数组:

安装MongoDB

服务器:mongodb-windows-x86_64-8.0.6-signed.msiwww.mongodb.com/try/downloa…

命令行客户端 : mongosh-2.5.0-win32-x64.zipwww.mongodb.com/try/downloa…

图形客户端: mongodb-compass-1.39.3-win32-x64.exewww.mongodb.com/try/downloa…

使用 mongosh

启动MongoDB Shell:在命令行中输入mongosh,启动MongoDB Shell ,如果MongoDB服务器运行在本地默认端口27017,则可以直接连接

连接到 MongoDB 服务器:如果MongoDB服务器运行在非默认端口或者远程服务器,则可以用以下命令连接:

mongosh --host <hostname>:<port>

其中 <hostname> 是 MongoDB 服务器的主机名或 IP 地址, <port> 是 MongoDB 服务器的端口号。

执行基本操作:

连接成功后,可以执行各种 MongoDB 数据库操作。例如:

CRUD:

# 插入文档test> db.mycollection.insertOne({ name: "Alice", age: 30 })# 查询文档test> db.mycollection.find()# 更新文档test> db.mycollection.updateOne({ name: "Alice" }, { $set: { age: 31 } })# 删除文档test> db.mycollection.deleteOne({ name: "Alice" })# 退出 MongoDB Shelltest> quit()

使用mongodb-compass

整合SpringBoot

引入MongoDB依赖:

<!-- Spring Boot Starter Data MongoDB --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>

添加远程连接配置:

#MongoDB连接配置spring.data.mongodb.uri=mongodb://localhost:27017/chat_memory_db

测试

实体类

package com.atguigu.java.ai.langchain4j.bean;@Data@AllArgsConstructor@NoArgsConstructor@Document("chat_messages")public class ChatMessages {    //唯一标识,映射到 MongoDB 文档的 _id 字段    @Id    private ObjectId messageId;    private String content; //存储当前聊天记录列表的json字符串}

测试类:

package com.atguigu.java.ai.langchain4j;@SpringBootTestpublic class MongoCrudTest {    @Autowired    private MongoTemplate mongoTemplate;    /**    * 插入文档    */    /* @Test    public void testInsert() {        mongoTemplate.insert(new ChatMessages(1L, "聊天记录"));    }    */    /**    * 插入文档    */    @Test    public void testInsert2() {        ChatMessages chatMessages = new ChatMessages();        chatMessages.setContent("聊天记录列表");        mongoTemplate.insert(chatMessages);    }    /**    * 根据id查询文档    */    @Test    public void testFindById() {        ChatMessages chatMessages = mongoTemplate.findById("6801ead733ba9c4a0d9b6c7b",        ChatMessages.class);        System.out.println(chatMessages);    }        /**    * 修改文档    */    @Test    public void testUpdate() {        Criteria criteria = Criteria.where("_id").is("6801ead733ba9c4a0d9b6c7b");        Query query = new Query(criteria);        Update update = new Update();        update.set("content", "新的聊天记录列表");        //修改或新增        mongoTemplate.upsert(query, update, ChatMessages.class);    }    /**    * 新增或修改文档    */    @Test    public void testUpdate2() {        Criteria criteria = Criteria.where("_id").is("100");        Query query = new Query(criteria);        Update update = new Update();        update.set("content", "新的聊天记录列表");        //修改或新增        mongoTemplate.upsert(query, update, ChatMessages.class);    }

3、持久化聊天

实体类

package com.atguigu.java.ai.langchain4j.bean;@Data@AllArgsConstructor@NoArgsConstructor@Document("chat_messages")public class ChatMessages {    //唯一标识,映射到 MongoDB 文档的 _id 字段    @Id    private ObjectId id;    private int messageId;    private String content; //存储当前聊天记录列表的json字符串}

创建持久化类

创建一个类实现ChatMemoryStore接口

package com.atguigu.java.ai.langchain4j.store;@Componentpublic class MongoChatMemoryStore implements ChatMemoryStore {@Autowiredprivate MongoTemplate mongoTemplate;@Overridepublic List<ChatMessage> getMessages(Object memoryId) {    Criteria criteria = Criteria.where("memoryId").is(memoryId);    Query query = new Query(criteria);        ChatMessages chatMessages = mongoTemplate.findOne(query, ChatMessages.class);    if(chatMessages == null) return new LinkedList<>();    return ChatMessageDeserializer.messagesFromJson(chatMessages.getContent());}@Overridepublic void updateMessages(Object memoryId, List<ChatMessage> messages) {    Criteria criteria = Criteria.where("memoryId").is(memoryId);    Query query = new Query(criteria);    Update update = new Update();    update.set("content", ChatMessageSerializer.messagesToJson(messages));    //根据query条件能查询出文档,则修改文档;否则新增文档    mongoTemplate.upsert(query, update, ChatMessages.class);}@Overridepublic void deleteMessages(Object memoryId) {    Criteria criteria = Criteria.where("memoryId").is(memoryId);    Query query = new Query(criteria);    mongoTemplate.remove(query, ChatMessages.class);    }}

在SeparateChatAssistantConfig中,添加MongoChatMemoryStore对象的配置

package com.atguigu.java.ai.langchain4j.config;@Configurationpublic class SeparateChatAssistantConfig {    //注入持久化对象    @Autowired    private MongoChatMemoryStore mongoChatMemoryStore;    @Bean    ChatMemoryProvider chatMemoryProvider() {        return memoryId -> MessageWindowChatMemory.builder()        .id(memoryId)        .maxMessages(10)        .chatMemoryStore(mongoChatMemoryStore)//配置持久化对象        .build();    }}

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

大模型 聊天记忆 MongoDB 持久化
相关文章