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

网站图片优化工具江西省城住房和城乡建设厅网站

网站图片优化工具,江西省城住房和城乡建设厅网站,建设网站服务请示,申请一个免费的网站空间前言 在上一篇文章中,我们成功地“驯服”了AI,让它能够按照我们的指令返回结构化的Java对象。这是一个巨大的进步,但我们的Assistant依然存在一个致命的弱点:它完全没有记忆。 你和它的每一次交互都是一次全新的开始。你告诉它“…
前言

在上一篇文章中,我们成功地“驯服”了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可以被看作一个Map<ConversationId, 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;// ... imports@RestController
@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. 开启对话1 (id=user123)
    请求URL: http://localhost:8080/api/v2/chat?id=user123&message=你好,我叫张三
    AI可能会回答: 你好,张三!很高兴认识你。

  2. 继续对话1
    请求URL: http://localhost:8080/api/v2/chat?id=user123&message=我叫什么名字?
    AI现在应该回答: 你的名字是张三。 (成功!它记住了!)

  3. 开启一个全新的对话2 (id=user456)
    请求URL: http://localhost:8080/api/v2/chat?id=user456&message=我叫什么名字?
    AI应该回答: 抱歉,我不知道你的名字。 (成功!不同用户的记忆是隔离的!)

  4. 为对话2提供信息
    请求URL: http://localhost:8080/api/v2/chat?id=user456&message=我叫李四
    AI可能会回答: 好的,李四。

  5. 再次测试对话1的记忆
    请求URL: http://localhost:8080/api/v2/chat?id=user123&message=我叫什么名字?
    AI依然回答: 你的名字是张三。 (成功!记忆没有被混淆!)

总结

今天,我们为AI助手解决了“失忆症”这个最大的痛点。通过使用LangChain4j的ChatMemoryProvider@MemoryId注解,我们以一种极其优雅和简单的方式,实现了可持久化的、按用户隔离的多轮对话能力。

我们的AI助手现在不仅能“说会道”,还能“过耳不忘”,这让它离一个真正的智能应用更近了一大步。

到目前为止,我们的AI助手的所有知识都来源于它预训练时所用的通用数据。但如果我们想让它成为一个特定领域的专家,比如让它学习我们公司的内部产品文档、技术手册,并基于这些私有知识来回答问题,该怎么做呢?


下一篇预告:
Java大模型开发入门 (8/15):连接外部世界(上) - RAG入门与文档加载》—— 我们的AI已经很会“聊”了,但它只知道公开的知识。如何让它学习我们的私有文档(如PDF、Word)并回答相关问题?我们将开启通往构建企业级知识库问答机器人的核心技术——RAG(检索增强生成)之旅!


文章转载自:

http://MlqNHbWx.dkqyg.cn
http://g2c5MvyF.dkqyg.cn
http://N7ZwE3kK.dkqyg.cn
http://M8Iy9KEb.dkqyg.cn
http://XgtQ0v6n.dkqyg.cn
http://QW6Fef2D.dkqyg.cn
http://WqpTciCa.dkqyg.cn
http://VbvyRov2.dkqyg.cn
http://SmsIF5Us.dkqyg.cn
http://V7INwKPr.dkqyg.cn
http://fvZXQe6Z.dkqyg.cn
http://mcgyTv8I.dkqyg.cn
http://1edPupn1.dkqyg.cn
http://6NKsnzPu.dkqyg.cn
http://gT5GTms6.dkqyg.cn
http://4FVBXxhB.dkqyg.cn
http://ijMVhAzT.dkqyg.cn
http://zGUKUJKt.dkqyg.cn
http://DbBEDGW3.dkqyg.cn
http://m4njEaBZ.dkqyg.cn
http://7d4lmCet.dkqyg.cn
http://5P7PlrVm.dkqyg.cn
http://2PMZoX7k.dkqyg.cn
http://nVs4R3oP.dkqyg.cn
http://r2aXyZih.dkqyg.cn
http://zQ6L9zt8.dkqyg.cn
http://sw6oSYjO.dkqyg.cn
http://LeKG8AC2.dkqyg.cn
http://JV8GwbYa.dkqyg.cn
http://k2MrwHgr.dkqyg.cn
http://www.dtcms.com/wzjs/752829.html

相关文章:

  • 哪个公司做网站网站广告牌制作教程
  • 平台建网站山西教育学会网站建设
  • .net网站开发文档网站建设代理都有哪些
  • 做彩票网站需要什么技术百度怎么网站排名
  • 固安建设行政主管部门官方网站厦门网站建设哪里好
  • 建设商城网站公司 百度百科谷歌amp wordpress
  • 企业品牌网站建设定制开发南充网络推广
  • 有优惠券网站 怎么做代理自动发货网站建设
  • 南京网站建设外贸云南建设网站澜沧项目
  • 网站的购物车怎么做数商云怎么样
  • 静态网站建设报告网站主机托管
  • 网站开发难点分析手机官网制作
  • 网站开发认证考试在线阅读小说网站怎么建设
  • 北京南站在几环网站开发培训流程
  • 爱站工具包手机版用ae做模板下载网站
  • wordpress获取标签页优化平台建设公司
  • 如何开发移动网站免费软件app推荐
  • 中国空间站设计在轨飞行多少年318全讯申请网址
  • 深圳外贸网站建设制作方法wordpress redis插件
  • 网站架构有哪些重庆互联网公司排行榜
  • 广告网站建设原创网站首页设计排版要点
  • 做网站接广告赚钱吗做h5的软件
  • 沙井营销型网站建设短视频拍摄剪辑培训班
  • wordpress修改站点logo大小一起合伙做项目的网站
  • 苏州网站开发公司兴田德润放心东莞微网站建设报价
  • 餐饮设计网站深圳市室内设计公司排名
  • 可信网站认证 代理商网络空间安全专业大学排名
  • 建筑人才网 中高端招聘网站wordpress4.9.x火车头发布
  • 帮人负责做网站叫什么工作做网站做得好的公司有哪些
  • 做设计外包的网站北京网站设计公司哪家公司好