langchain4j使用中遇到的疑惑与分析

2025-04-06T19:59:11.860+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : 获取记忆
2025-04-06T19:59:11.833+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.856+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] c.n.b.Utility.Config.LangChainConf       : MemoryId:memory:user:1:robot:2
2025-04-06T19:59:11.860+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : 获取记忆
2025-04-06T19:59:11.860+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.863+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : 修改记忆:[SystemMessage { text = "你是一个聊天助手,语言应尽量避免冗长机械,并遵循以下设定:无" }]
2025-04-06T19:59:11.922+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.930+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : 获取记忆
2025-04-06T19:59:11.930+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.975+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : 修改记忆:[SystemMessage { text = "你是一个聊天助手,语言应尽量避免冗长机械,并遵循以下设定:无" }, UserMessage { name = null contents = [TextContent { text = "我喜欢" }] }]
2025-04-06T19:59:11.984+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.987+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : 获取记忆
2025-04-06T19:59:11.987+08:00  INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore    : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:12.035+08:00 DEBUG 34068 --- [Bot-Heart] [ntLoopGroup-5-1] d.l.http.client.log.LoggingHttpClient    : HTTP request:

上述为在自定义的记忆存储中增删查方法的日志记录,memoryKey是传入的键memoryId。

问题:为什么要多次获取记忆和修改记忆?

      分析

        前置知识:检索器

        第一次获取记忆后紧跟着memoryId(检索器中打印的),可以判断是检索器先获取了chatMemory并填充到了Query的metadata中

        

        第二次获取记忆和第三次获取记忆是在分别将SystemMessage和UserMessage填充进对话历史中。ps:这个过程一共调用了两次修改记忆,我推测可能是方便不同信息种类的分类处理,因为不同信息类的差别较大,分别存储只需要拼接,会方便很多。

        第三次获取记忆就很明了了,将拼接好用户信息和系统信息的对话历史一起发送给LLM获取响应,最后调用修改记忆填充AIMessage。

        

LangChain4j 是一个专为 Java 开发者设计的 AI 框架,它通过模块化的设计使得大型语言模型(LLM)集成变得简单高效。以下是关于如何使用 LangChain4j 的指南和示例教程。 ### 快速入门 #### 添加依赖 首先,在你的项目中引入 LangChain4j 的核心模块和你所需的集成模块。例如,如果你想使用 OpenAI 作为 LLM 提供商,可以添加以下 Maven 依赖: ```xml <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-core</artifactId> <version>0.24.0</version> </dependency> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-openai</artifactId> <version>0.24.0</version> </dependency> ``` #### 初始化 ChatLanguageModel 接下来,初始化一个 `ChatLanguageModel` 实例,并配置必要的参数,例如 API 密钥和模型名称: ```java import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.openai.OpenAiChatModel; public class LangChain4jExample { public static void main(String[] args) { ChatLanguageModel model = OpenAiChatModel.builder() .apiKey("your-api-key") .modelName("gpt-3.5-turbo") .build(); } } ``` #### 使用 ChatMemory 管理对话历史 为了管理对话历史,LangChain4j 提供了两种现成的实现:`MessageWindowChatMemory` 和 `TokenWindowChatMemory`。你可以根据需求选择合适的实现方式。 ##### MessageWindowChatMemory 适用于保留最近的 N 条消息,适合快速原型开发: ```java import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.message.MessageWindowChatMemory; ChatMemory chatMemory = new MessageWindowChatMemory(10); // 保留最近的 10 条消息 ``` ##### TokenWindowChatMemory 适用于保留最近的 N 个 token,需要提供一个 `Tokenizer` 来计算每条消息中的 token 数量: ```java import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.token.TokenWindowChatMemory; import dev.langchain4j.model.openai.OpenAiTokenizer; ChatMemory chatMemory = new TokenWindowChatMemory(new OpenAiTokenizer(), 1000); // 保留最近的 1000 个 token ``` #### 发送请求并获取响应 最后,将对话历史传递给模型,并获取响应: ```java import dev.langchain4j.model.output.Response; import dev.langchain4j.service.AiServices; public interface MyAiService { String chat(String userMessage); } MyAiService aiService = AiServices.builder(MyAiService.class) .chatLanguageModel(model) .chatMemory(chatMemory) .build(); String response = aiService.chat("你好!"); System.out.println(response); ``` ### 示例教程 #### 定义自定义服务 你可以通过 `AiServices` 创建自定义的服务接口,从而简化 LLM 的交互。例如,定义一个简单的问答服务: ```java public interface QaService { String answer(String question); } QaService qaService = AiServices.builder(QaService.class) .chatLanguageModel(model) .build(); String answer = qaService.answer("什么是人工智能?"); System.out.println(answer); ``` #### 输出解析 如果需要对模型的输出进行解析,可以使用 `OutputParser`。例如,将输出解析为 JSON 格式: ```java import dev.langchain4j.parser.JsonOutputParser; JsonOutputParser parser = new JsonOutputParser(); String jsonOutput = parser.parse("{'name': 'John', 'age': 30}"); System.out.println(jsonOutput); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值