news 2026/8/18 13:51:55

langchain4j (二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
langchain4j (二)

使用模型

langchain4j-community-dashscope。
在 1.0.0-alpha1 之前:
dev.langchain4j langchain4j-dashscopepreviousversionhere</version></dependency>1.0.0−alpha1及之后版本:<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j−community−dashscope</artifactId><version>{previous version here}</version></dependency> 1.0.0-alpha1 及之后版本: <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-community-dashscope</artifactId> <version>previousversionhere</version></dependency>1.0.0alpha1及之后版本:<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4jcommunitydashscope</artifactId><version>{latest version here}

langchain4j-community-dashscope 提供以下四种模型供使用:
QwenChatModel
QwenStreamingChatModel
QwenLanguageModel
QwenStreamingLanguageModel
langchain4j-dashscope 提供文本生成图像模型:
WanxImageModel

dev.langchain4j langchain4j-community-bom ${langchain4j-community.version} pom import dev.langchain4j langchain4j-community-dashscope

/*
测试langchain4j 集成其他模型 文生图
*/
@Test
public 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”)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 13:51:17

如何批量重命名文件夹中的文件名称?快来试试这三个简单的方法

在日常工作和学习中&#xff0c;我们经常会遇到需要管理大量文件的情况&#xff0c;尤其是在处理项目文档、照片集、视频资料或是任何形式的数字资产时。随着文件数量的不断增加&#xff0c;如何高效地组织和管理这些文件成为了一个不可忽视的问题。批量重命名文件夹中的文件名…

作者头像 李华
网站建设 2026/8/18 13:45:56

一文读懂KMS_VL_ALL_AIO:Windows与Office激活的正确打开方式

一文读懂KMS_VL_ALL_AIO&#xff1a;Windows与Office激活的正确打开方式 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 每年都有大量Windows用户和Office用户因为激活问题焦头烂额。笔者的朋友…

作者头像 李华
网站建设 2026/8/18 13:39:06

Kovenant性能调优:poll策略选型让异步任务快10倍的秘密

Kovenant性能调优&#xff1a;poll策略选型让异步任务快10倍的秘密 【免费下载链接】kovenant Kovenant. Promises for Kotlin. 项目地址: https://gitcode.com/gh_mirrors/ko/kovenant Kovenant 是 Kotlin 生态中一款简洁易用的异步编程库&#xff0c;它用 Promise 模式…

作者头像 李华