网站链轮内有死链广告优化师适合女生吗

张小明 2026/1/7 0:11:22
网站链轮内有死链,广告优化师适合女生吗,网站开发数据共享,怎样做免费商城网站1. 工程结构概览Spring AI 提供了完整的对话记忆#xff08;Chat Memory#xff09;能力#xff0c;支持将对话历史持久化到各种存储后端。记忆能力是构建多轮对话应用的基础。spring-ai-model/└── chat/memory/ # 记忆核心抽象├── ChatMemory.java # 记忆接口├── …1. 工程结构概览Spring AI 提供了完整的对话记忆Chat Memory能力支持将对话历史持久化到各种存储后端。记忆能力是构建多轮对话应用的基础。spring-ai-model/└── chat/memory/ # 记忆核心抽象├── ChatMemory.java # 记忆接口├── ChatMemoryRepository.java # 存储仓库接口├── MessageWindowChatMemory.java # 窗口记忆实现└── InMemoryChatMemoryRepository.java # 内存实现memory/repository/ # 持久化实现├── spring-ai-model-chat-memory-repository-jdbc/ # JDBC 实现├── spring-ai-model-chat-memory-repository-mongodb/ # MongoDB 实现├── spring-ai-model-chat-memory-repository-neo4j/ # Neo4j 实现├── spring-ai-model-chat-memory-repository-cassandra/ # Cassandra 实现└── spring-ai-model-chat-memory-repository-cosmos-db/ # Cosmos DB 实现2. 技术体系与模块关系记忆系统采用分层设计记忆接口 → 存储仓库 → 具体实现image.png3. 关键场景示例代码3.1 基础使用使用内存记忆// 创建内存记忆ChatMemory memory new MessageWindowChatMemory(new InMemoryChatMemoryRepository(),10 // 窗口大小保留最近 10 条消息);// 添加消息memory.add(conversation-1, new UserMessage(你好));memory.add(conversation-1, new AssistantMessage(你好有什么可以帮助你的));// 获取对话历史ListMessage history memory.get(conversation-1);3.2 使用 JDBC 持久化使用数据库持久化记忆Autowiredprivate DataSource dataSource;Beanpublic ChatMemory chatMemory() {JdbcChatMemoryRepository repository JdbcChatMemoryRepository.builder().dataSource(dataSource).build();return new MessageWindowChatMemory(repository, 20);}3.3 使用 MongoDB使用 MongoDB 持久化Autowiredprivate MongoTemplate mongoTemplate;Beanpublic ChatMemory chatMemory() {MongoChatMemoryRepository repository MongoChatMemoryRepository.builder().mongoTemplate(mongoTemplate).build();return new MessageWindowChatMemory(repository, 30);}3.4 在 ChatClient 中使用记忆可以通过 Advisor 集成到 ChatClientChatMemory memory new MessageWindowChatMemory(repository, 10);MessageChatMemoryAdvisor memoryAdvisor MessageChatMemoryAdvisor.builder().chatMemory(memory).conversationId(user-123).build();ChatClient chatClient ChatClient.builder(chatModel).defaultAdvisors(memoryAdvisor).build();// 对话会自动保存到记忆String response chatClient.prompt().user(我的名字是张三).call().content();// 后续对话会自动包含历史String response2 chatClient.prompt().user(我的名字是什么).call().content(); // 模型会记住名字是张三4. 核心实现图4.1 记忆存储和检索流程image.png5. 入口类与关键类关系image.png6. 关键实现逻辑分析6.1 ChatMemory 接口设计ChatMemory 接口提供了简单的记忆 APIpublic interface ChatMemory {void add(String conversationId, ListMessage messages);ListMessage get(String conversationId);void clear(String conversationId);}这个接口设计简洁但功能强大。它支持多对话管理通过 conversationId 区分不同对话批量添加支持一次添加多条消息清理功能支持清除特定对话的记忆6.2 MessageWindowChatMemory 实现MessageWindowChatMemory 实现了窗口记忆策略public class MessageWindowChatMemory implements ChatMemory {private final ChatMemoryRepository repository;private final int windowSize;Overridepublic void add(String conversationId, ListMessage messages) {// 1. 获取现有消息ListMessage existing repository.findByConversationId(conversationId);// 2. 添加新消息ListMessage allMessages new ArrayList(existing);allMessages.addAll(messages);// 3. 应用窗口策略只保留最近的 N 条ListMessage windowed applyWindow(allMessages);// 4. 保存repository.saveAll(conversationId, windowed);}Overridepublic ListMessage get(String conversationId) {ListMessage messages repository.findByConversationId(conversationId);return applyWindow(messages);}private ListMessage applyWindow(ListMessage messages) {if (messages.size() windowSize) {return messages;}// 只返回最近的 N 条消息return messages.subList(messages.size() - windowSize, messages.size());}}窗口策略的优势控制上下文长度避免上下文过长导致 token 超限保持相关性最近的对话通常更相关性能优化减少需要处理的消息数量6.3 JDBC 实现JDBC 实现支持多种数据库public class JdbcChatMemoryRepository implements ChatMemoryRepository {private final JdbcTemplate jdbcTemplate;private final ChatMemoryRepositoryDialect dialect;Overridepublic ListMessage findByConversationId(String conversationId) {String sql dialect.getSelectByConversationIdSql();return jdbcTemplate.query(sql,new Object[]{conversationId},(rs, rowNum) - {String content rs.getString(content);String type rs.getString(type);MapString, Object metadata parseMetadata(rs.getString(metadata));return createMessage(type, content, metadata);});}Overridepublic void saveAll(String conversationId, ListMessage messages) {// 1. 删除现有消息deleteByConversationId(conversationId);// 2. 批量插入新消息String sql dialect.getInsertSql();ListObject[] batchArgs messages.stream().map(msg - new Object[]{conversationId,msg.getText(),msg.getMessageType().name(),toJson(msg.getMetadata()),Timestamp.from(Instant.now())}).collect(toList());jdbcTemplate.batchUpdate(sql, batchArgs);}}支持的数据库PostgreSQLMySQL/MariaDBH2SQLiteOracleSQL ServerHSQLDB每个数据库都有自己的 Dialect 实现处理 SQL 方言差异。6.4 MongoDB 实现MongoDB 实现使用文档存储public class MongoChatMemoryRepository implements ChatMemoryRepository {private final MongoTemplate mongoTemplate;Overridepublic ListMessage findByConversationId(String conversationId) {Query query Query.query(Criteria.where(conversationId).is(conversationId)).with(Sort.by(timestamp).descending());ListConversation conversations mongoTemplate.find(query, Conversation.class);return conversations.stream().map(this::mapMessage).collect(toList());}Overridepublic void saveAll(String conversationId, ListMessage messages) {// 1. 删除现有消息deleteByConversationId(conversationId);// 2. 转换为文档并保存ListConversation conversations messages.stream().map(msg - new Conversation(conversationId,new Conversation.Message(msg.getText(),msg.getMessageType().name(),msg.getMetadata()),Instant.now())).collect(toList());mongoTemplate.insert(conversations, Conversation.class);}}MongoDB 文档结构{conversationId: user-123,message: {text: 你好,type: USER,metadata: {}},timestamp: 2025-01-01T00:00:00Z}6.5 Neo4j 实现Neo4j 实现使用图数据库public class Neo4jChatMemoryRepository implements ChatMemoryRepository {Overridepublic ListMessage findByConversationId(String conversationId) {String cypher MATCH (s:Session {id: $conversationId})-[:HAS_MESSAGE]-(m:Message)OPTIONAL MATCH (m)-[:HAS_METADATA]-(metadata:Metadata)OPTIONAL MATCH (m)-[:HAS_MEDIA]-(media:Media)RETURN m, metadata, collect(media) as mediasORDER BY m.idx ASC;return driver.executableQuery(cypher).withParameters(Map.of(conversationId, conversationId)).execute(record - mapToMessage(record));}Overridepublic void saveAll(String conversationId, ListMessage messages) {String cypher MERGE (s:Session {id: $conversationId})WITH sUNWIND $messages AS msgCREATE (m:Message {text: msg.text,type: msg.type,idx: msg.idx})CREATE (s)-[:HAS_MESSAGE]-(m);driver.executableQuery(cypher).withParameters(Map.of(conversationId, conversationId,messages, toMessageParams(messages))).execute();}}Neo4j 图结构(Session {id: user-123})-[:HAS_MESSAGE]-(Message {text: 你好, type: USER})(Session {id: user-123})-[:HAS_MESSAGE]-(Message {text: 你好, type: ASSISTANT})6.6 Cassandra 实现Cassandra 实现使用分布式存储public class CassandraChatMemoryRepository implements ChatMemoryRepository {Overridepublic ListMessage findByConversationId(String conversationId) {BoundStatement stmt getStmt.boundStatementBuilder().setString(conversation_id, conversationId).build();ResultSet rs session.execute(stmt);return rs.all().stream().map(this::mapToMessage).collect(toList());}Overridepublic void saveAll(String conversationId, ListMessage messages) {// 1. 删除现有消息deleteByConversationId(conversationId);// 2. 批量插入BatchStatement batch BatchStatement.builder(BatchType.LOGGED).build();for (Message msg : messages) {BoundStatement stmt addStmt.boundStatementBuilder().setString(conversation_id, conversationId).setString(content, msg.getText()).setString(type, msg.getMessageType().name()).setMap(metadata, msg.getMetadata()).build();batch.add(stmt);}session.execute(batch);}}7. 实现对比分析特性 JDBC MongoDB Neo4j Cassandra存储模型 关系型 文档型 图型 列族型查询方式 SQL Query DSL Cypher CQL适用场景 通用 灵活结构 关系查询 大规模分布式性能 中等 高 中等 极高扩展性 好 很好 好 优秀事务支持 ✅ ✅ ✅ ❌8. 外部依赖不同实现的依赖8.1 JDBCSpring JDBCJDBC 模板数据库驱动PostgreSQL、MySQL 等8.2 MongoDBSpring Data MongoDBMongoDB 集成8.3 Neo4jNeo4j Java DriverNeo4j 官方驱动8.4 CassandraCassandra Java DriverCassandra 官方驱动9. 工程总结Spring AI 的记忆能力设计有几个值得学习的地方分层抽象。ChatMemory 提供高级 APIChatMemoryRepository 提供存储抽象具体实现处理数据库差异。这种设计让记忆功能既易用又灵活。想换存储后端换个 ChatMemoryRepository 实现就行。窗口记忆策略。MessageWindowChatMemory 实现了智能的消息管理只保留最近的 N 条消息这既控制了上下文长度又保持了相关性。不会因为对话历史太长导致 token 超限。多存储后端支持。支持 JDBC、MongoDB、Neo4j、Cassandra 等多种存储用户可以根据需求选择最合适的后端。想用关系数据库用 JDBC。想用图数据库用 Neo4j。统一的数据模型。所有实现都使用相同的 Message 模型这让切换存储后端变得简单。今天用 PostgreSQL明天想换 MongoDB改个配置就行。自动模式初始化。大多数实现都支持自动创建表/集合简化了部署。不用手动建表启动时自动搞定。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网搜网南宁seo做法哪家好

背景及意义在校园心理健康服务精细化、互助场景便捷化需求升级的背景下,传统校园心理支持存在 “求助渠道单一、隐私保护不足、互动性弱” 的痛点,基于微信小程序 SpringBoot 构建的校园心理健康互助社区系统,适配学生、心理老师、辅导员、管…

张小明 2026/1/5 21:42:43 网站建设

做淘宝客网站能赚到钱吗iis怎么建设网站内容

在学术的浩瀚海洋中,每一位硕士生都是勇敢的航海者,面对论文写作的浪潮,既怀揣着探索未知的渴望,又难免遭遇选题迷茫、逻辑构建复杂、语言表述不专业等暗礁。幸运的是,随着人工智能技术的飞速发展,一款名为…

张小明 2026/1/5 21:43:43 网站建设

网站的营销功能东莞市网络优化推广公司

在软件工程、嵌入式开发、自动化控制乃至人工智能等领域,一个成功的项目往往始于一个扎实的起点。然而,对于广大的开发者、学生和工程师而言,“从零开始”构建一个复杂系统,不仅意味着漫长的学习曲线和巨大的工作量,更…

张小明 2026/1/6 10:26:42 网站建设

湖州城市投资建设集团网站帮人家做网站

Torchtune终极指南:快速掌握大语言模型微调技术 【免费下载链接】torchtune A Native-PyTorch Library for LLM Fine-tuning 项目地址: https://gitcode.com/GitHub_Trending/to/torchtune Torchtune是一个专为大语言模型微调设计的原生PyTorch库&#xff0c…

张小明 2026/1/6 16:25:06 网站建设

上海城乡建设部网站首页网站建设的预算费用

paperxie-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 https://www.paperxie.cn/ai/openingReporthttps://www.paperxie.cn/ai/openingReport 作为 CSDN 社区里带过两届本科毕设的工科导师,每年 3 月都会收到一堆 “开题报告写不下去” 的求助&am…

张小明 2026/1/6 16:31:23 网站建设

霞山手机网站建设公司wordpress代码修改插件

SeedVR2视频修复完整指南:告别Sora2模糊画质的终极方案 【免费下载链接】SeedVR2-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR2-7B 你是否曾经为Sora2生成的视频在大屏幕上显得模糊不清而苦恼?现在,字节跳…

张小明 2026/1/6 16:27:39 网站建设