2026/8/18 13:52:01

langchain4j (二)

langchain4j (二) 使用模型langchain4j-community-dashscope。在 1.0.0-alpha1 之前dev.langchain4j langchain4j-dashscopepreviousversionhere/version/dependency1.0.0−alpha1及之后版本dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j−community−dashscope/artifactIdversion{previous version here}/version/dependency 1.0.0-alpha1 及之后版本 dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-community-dashscope/artifactId versionpreviousversionhere/version/dependency1.0.0−alpha1及之后版本dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j−community−dashscope/artifactIdversion{latest version here}langchain4j-community-dashscope 提供以下四种模型供使用QwenChatModelQwenStreamingChatModelQwenLanguageModelQwenStreamingLanguageModellangchain4j-dashscope 提供文本生成图像模型WanxImageModeldev.langchain4j langchain4j-community-bom ${langchain4j-community.version} pom import dev.langchain4j langchain4j-community-dashscope/*测试langchain4j 集成其他模型 文生图*/Testpublic void testChatModelOtherModule() {WanxImageModel wanxImageModel WanxImageModel.builder().apiKey(System.getenv(“aliQwen-key”)).modelName(“wanx2.1-t2i-turbo”) //图片生成 https://help.aliyun.com/zh/model-studio/text-to-image.build();Response imageResponse wanxImageModel.generate(“美女”);System.out.println(imageResponse.content().url());}流式输出流式输出spi 流式应该存在jvm里的String answer00 chatTokenWindowChatMemory.chatWithChatMemory(1L, “我的名字是什么”);System.out.println(“answer00返回结果”answer00);chatTokenWindowChatMemory.chatWithChatMemory(1L, “你好我的名字是mysql”);String answer01 chatTokenWindowChatMemory.chatWithChatMemory(1L, “我的名字是什么”);System.out.println(“answer01返回结果”answer01);默认情况下ChatMemory 的实现将 ChatMessages 存储在内存中。如果需要持久化可以实现一个自定义的 ChatMemoryStore将 ChatMessages 存储在你选择的任何持久化存储中class PersistentChatMemoryStore implements ChatMemoryStore {Override public List getMessages(Object memoryId) { // TODO: 实现通过 memory ID 从持久化存储中获取所有消息。 // 可使用 ChatMessageDeserializer.messageFromJson(String) // 和 ChatMessageDeserializer.messagesFromJson(String) 辅助方法从 JSON 反序列化。 }Override public void updateMessages(Object memoryId, List messages) { // TODO: 实现通过 memory ID 更新持久化存储中的所有消息。 // 可使用 ChatMessageSerializer.messageToJson(ChatMessage) // 和 ChatMessageSerializer.messagesToJson(List) 辅助方法将消息序列化为 JSON。 }Override public void deleteMessages(Object memoryId) { // TODO: 实现通过 memory ID 删除持久化存储中的所有消息。 } }ChatMemory chatMemory MessageWindowChatMemory.builder() .id(“12345”) .maxMessages(10) .chatMemoryStore(new PersistentChatMemoryStore()) .build();updateMessages() 方法在每次向 ChatMemory 添加新的 ChatMessage 时都会被调用。这通常在每次与 LLM 交互期间发生两次一次是在添加新的 UserMessage 时另一次是在添加新的 AiMessage 时。updateMessages() 方法应更新与给定记忆 ID 关联的所有消息。ChatMessages 可以单独存储例如每条消息一个记录/行/对象或一起存储例如整个 ChatMemory 一个记录/行/对象。注请注意从 ChatMemory 淘汰的消息也将从 ChatMemoryStore 中淘汰。当一条消息被淘汰时updateMessages() 方法会被调用其消息列表中不包含被淘汰的消息。getMessages() 方法在 ChatMemory 的用户请求所有消息时被调用。这通常在每次与 LLM 交互期间发生一次。Object memoryId 参数的值与创建 ChatMemory 时指定的 id 对应可用于区分多个用户和/或对话。getMessages() 方法应返回与给定记忆 ID 关联的所有消息。deleteMessages() 方法在调用 ChatMemory.clear() 时被调用。如果你不使用此功能可以使此方法为空。SystemMessage 是一种特殊类型的消息因此它的处理方式与其他消息类型不同一旦添加SystemMessage 始终被保留。每次只能保留一个 SystemMessage。如果添加内容相同的新 SystemMessage它将被忽略。如果添加内容不同新的 SystemMessage它会替换旧的。如果包含 ToolExecutionRequest 的 AiMessage 被淘汰则其后续的孤立 ToolExecutionResultMessage(s) 也会自动被淘汰以避免某些 LLM 提供商如 OpenAI禁止在请求中发送孤立 ToolExecutionResultMessage(s) 的问题。持久化​模板地址消息模板现在让我们看一个更复杂的例子。我们将强制 LLM 使用俚语回答 这通常通过在 SystemMessage 中提供指令来实现。interface Friend {SystemMessage(“You are a good friend of mine. Answer using slang.”) String chat(String userMessage);}Friend friend AiServices.create(Friend.class, model);String answer friend.chat(“Hello”); // Hey! What’s up?系统消息也可以使用系统消息提供者动态定义Friend friend AiServices.builder(Friend.class) .chatModel(model) .systemMessageProvider(chatMemoryId - “You are a good friend of mine. Answer using slang.”) .build();正如你所看到的你可以根据聊天记忆 ID用户或对话提供不同的系统消息。​现在假设我们使用的模型不支持系统消息或者我们只是想为此目的使用 UserMessage。interface Friend {UserMessage(“You are a good friend of mine. Answer using slang. {{it}}”) String chat(String userMessage);}Friend friend AiServices.create(Friend.class, model);String answer friend.chat(“Hello”); // Hey! What’s shakin’?我们用 UserMessage 注解替换了 SystemMessage并指定了一个包含变量 it 的提示模板it 指代唯一的 方法参数。还可以使用 V 注解 String userMessage 并为提示模板变量分配一个自定义名称interface Friend {UserMessage(“You are a good friend of mine. Answer using slang. {{message}}”) String chat(V(“message”) String userMessage);}注请注意当与 Quarkus 或 Spring Boot 一起使用 LangChain4j 时使用 V 并不是必需的。只有在 Java 编译时未启用 -parameters 选项时才需要此注解。UserMessage 也可以从资源中加载提示模板UserMessage(fromResource “my-prompt-template.txt”)​