当前位置: 首页 > news >正文

东莞网站关键词扁平化个人网站

东莞网站关键词,扁平化个人网站,获取微信公众号首图,微商引流人脉推广软件前言 在上一篇文章中#xff0c;我们成功地“驯服”了AI#xff0c;让它能够按照我们的指令返回结构化的Java对象。这是一个巨大的进步#xff0c;但我们的Assistant依然存在一个致命的弱点#xff1a;它完全没有记忆。 你和它的每一次交互都是一次全新的开始。你告诉它“…前言 在上一篇文章中我们成功地“驯服”了AI让它能够按照我们的指令返回结构化的Java对象。这是一个巨大的进步但我们的Assistant依然存在一个致命的弱点它完全没有记忆。 你和它的每一次交互都是一次全新的开始。你告诉它“我叫张三”它礼貌地回应紧接着你问“我叫什么名字”它只会一脸茫然地回答“我不知道”。这就像和一条只有七秒记忆的金鱼对话无法形成真正有意义的交流。 今天我们将解决这个核心痛点。我们将探索LangChain4j中强大的**记忆Memory**机制为我们的AI助手装上“记忆芯片”打造一个能真正联系上下文、进行多轮对话的智能聊天机器人。 第一部分为什么需要记忆无状态对话的痛点 HTTP协议本身是无状态的这意味着每一次API请求都是独立的。当我们调用大模型API时默认情况下模型也不知道这次请求和上一次请求有任何关联。 为了让模型理解上下文我们必须在每次请求时都把之前的对话历史一起发送给它。一个包含了对话历史的请求体Payload看起来是这样的 {model: deepseek-chat,messages: [{ role: user, content: 你好我叫张三。 },{ role: assistant, content: 你好张三很高兴认识你。有什么可以帮你的吗 },{ role: user, content: 我叫什么名字 } // -- 当前问题] }只有当模型看到完整的messages列表时它才能正确回答“你的名字是张三”。 手动管理这个messages列表非常繁琐你需要自己存储每一轮的对话并在下一次请求时重新构建这个列表。而LangChain4j的ChatMemory机制就是为了将我们从这个繁琐的工作中彻底解放出来。 第二部分LangChain4j的记忆核心ChatMemory ChatMemory是LangChain4j中用于处理对话历史的组件。它的工作原理非常简单 在每次与AI交互之后它会自动保存用户提问和AI的回答。 在下一次与AI交互之前它会自动加载已保存的对话历史并将其添加到发送给AI的提示中。 这一切都在后台自动发生对我们开发者来说几乎是透明的。 LangChain4j提供了多种ChatMemory的实现最常用的是 MessageWindowChatMemory只保留最近的N条消息。这是一种简单有效的策略可以防止对话历史过长导致API请求成本过高或超出模型的Token限制。TokenWindowChatMemory更精确的控制方式只保留最近的N个Token内的消息。 第三部分实战为每个用户提供独立的记忆 在Web应用中我们不能只有一个全局的记忆否则所有用户的对话都会混在一起。我们需要为每一个独立的对话或用户提供一个独立的记忆实例。LangChain4j为此提供了ChatMemoryProvider。 ChatMemoryProvider可以被看作一个MapConversationId, ChatMemory。它根据你提供的唯一对话ID来存取对应的聊天记录。 1. 创建ChatMemoryProvider Bean 在我们的config包下修改LangChain4jConfig.java添加一个ChatMemoryProvider的Bean。 package com.example.aidemoapp.config;// ... other imports import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.chat.ChatMemoryProvider; import dev.langchain4j.memory.chat.MessageWindowChatMemory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class LangChain4jConfig {// ... chatLanguageModel Bean ...Beanpublic ChatMemoryProvider chatMemoryProvider() {// 这个Bean会为每个用户由memoryId标识创建一个MessageWindowChatMemory实例// withMaxMessages(10)表示每个对话最多保留最近的10条消息return memoryId - MessageWindowChatMemory.withMaxMessages(10);} }2. 将记忆提供者关联到AI服务 现在我们需要告诉AiService使用我们刚刚创建的ChatMemoryProvider。 修改Assistant.java接口 package com.example.aidemoapp.service;import dev.langchain4j.service.MemoryId; import dev.langchain4j.service.SystemMessage; import dev.langchain4j.service.spring.AiService;// 使用chatMemoryProvider属性指向我们定义的Bean的名字 AiService(chatMemoryProvider chatMemoryProvider) public interface Assistant {// 在需要记忆的chat方法中增加一个用MemoryId注解的参数SystemMessage(You are a polite and helpful assistant.)String chat(MemoryId String conversationId, String userMessage); }代码解析 AiService(chatMemoryProvider chatMemoryProvider)将Assistant与我们定义的记忆提供者Bean关联起来。MemoryId String conversationId这是最关键的一步。我们为chat方法增加了一个参数并用MemoryId注解它。LangChain4j会把传入这个参数的值比如用户ID或Session ID作为从ChatMemoryProvider中存取ChatMemory的Key。 第四部分改造Controller并进行测试 最后我们需要修改ChatController以便在API请求中传入这个conversationId。 package com.example.aidemoapp.controller;// ... importsRestController RequestMapping(/api/v2/chat) RequiredArgsConstructor public class ChatController {private final Assistant assistant;GetMappingpublic String chat(RequestParam(id) String conversationId, // 新增id参数RequestParam(message) String message) {return assistant.chat(conversationId, message);}// ... 其他方法 ... }测试我们的记忆功能 现在你可以用不同的id来模拟不同的用户对话。 开启对话1 (iduser123) 请求URL: http://localhost:8080/api/v2/chat?iduser123message你好我叫张三 AI可能会回答: 你好张三很高兴认识你。 继续对话1 请求URL: http://localhost:8080/api/v2/chat?iduser123message我叫什么名字 AI现在应该回答: 你的名字是张三。 (成功它记住了) 开启一个全新的对话2 (iduser456) 请求URL: http://localhost:8080/api/v2/chat?iduser456message我叫什么名字 AI应该回答: 抱歉我不知道你的名字。 (成功不同用户的记忆是隔离的) 为对话2提供信息 请求URL: http://localhost:8080/api/v2/chat?iduser456message我叫李四 AI可能会回答: 好的李四。 再次测试对话1的记忆 请求URL: http://localhost:8080/api/v2/chat?iduser123message我叫什么名字 AI依然回答: 你的名字是张三。 (成功记忆没有被混淆) 总结 今天我们为AI助手解决了“失忆症”这个最大的痛点。通过使用LangChain4j的ChatMemoryProvider和MemoryId注解我们以一种极其优雅和简单的方式实现了可持久化的、按用户隔离的多轮对话能力。 我们的AI助手现在不仅能“说会道”还能“过耳不忘”这让它离一个真正的智能应用更近了一大步。 到目前为止我们的AI助手的所有知识都来源于它预训练时所用的通用数据。但如果我们想让它成为一个特定领域的专家比如让它学习我们公司的内部产品文档、技术手册并基于这些私有知识来回答问题该怎么做呢 下一篇预告 《Java大模型开发入门 (8/15)连接外部世界(上) - RAG入门与文档加载》—— 我们的AI已经很会“聊”了但它只知道公开的知识。如何让它学习我们的私有文档如PDF、Word并回答相关问题我们将开启通往构建企业级知识库问答机器人的核心技术——RAG检索增强生成之旅
http://www.w-s-a.com/news/212516/

相关文章:

  • 做性的网站有哪些苏州专业网站设计制作公司
  • 陵水网站建设友创科技十大优品店排名
  • 想换掉做网站的公司简要说明网站制作的基本步骤
  • 国企公司网站制作wordpress 浮动定位
  • 网站网页直播怎么做的企业网站建设推荐兴田德润
  • 网站建设熊猫建站厦门seo全网营销
  • 扁平网站设计seo是什么岗位的缩写
  • 工商企业网站群晖配置wordpress 80端口
  • 企业网站建设流程步骤镇江东翔网络科技有限公司
  • 网络工程师和做网站哪个难网络建站如何建成
  • 网站建设需要哪些项目游民星空是用什么做的网站
  • 旅游网站建设要如何做百度商城网站建设
  • destoon 网站搬家中国企业500强都有哪些企业
  • 商城网站前端更新商品天天做吗哈尔滨做网站优化
  • 新乡网站开发wordpress 产品分类侧边栏
  • 网站自己做自己的品牌好做互联网企业分类
  • 项目网站建设方案石家庄网站快速排名
  • 网站开发大作业报告做电商网站的参考书
  • Apache局域网网站制作wordpress外链自动保存
  • 网站备案号要怎么查询千锋教育培训机构地址
  • 门户网站建设要求几款免费流程图制作软件
  • 花生壳域名可以做网站域名吗wordpress内链工具
  • 猎头公司网站模板网站伪静态作用
  • 工程建设教育网站html成品网页模板下载
  • 同一ip 网站 权重wordpress 菜单 小图标
  • 网站没有icp备案wordpress d8主题 4.1
  • 手机网站建设推荐企业宣传页模板
  • 杭州市富阳区建设局网站动态域名做网站
  • 网站如何免费做SEO优化靖安县城乡规划建设局网站
  • 室内设计网站平台学新媒体运营最好的培训学校