LangChain4j LangChain集成Java
LangChain4j介绍
github地址
https://github.com/langchain4j
快速开始
引入依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.31.0</version>
</dependency>
ChatLanguageModel
public static void main(String[] args) {
String me = "helloWord!";
System.out.println("用户:" + me);
OpenAiChatModel demo = OpenAiChatModel.withApiKey("demo");
String content = demo.generate(me);
System.out.println("AI:" + content);
}
该示例通过generate方法将String作为输入并返回String类型的content作为输出。
注:这只是最简单的实现方式,OpenAiChatModel提供了多种属性用于灵活配置自己的LLM。
OpenAiChatModel chatGlmChatModel = OpenAiChatModel.builder()
// 模型地址
.baseUrl("http://127.0.0.1:8305/v1/")
// 模型key
.apiKey("EMPTY")
// 最大令牌数
.maxTokens(1000)
// 精确度
.temperature(0d)
// 超时时间
.timeout(Duration.ofSeconds(3))
// 模型名称
.modelName("chat-gpt")
// 重试次数
.maxRetries(3)
.build();
ChatMessage
通过上面的方法,我们可以实现和AI和对话并得到AI输出的答案,但实际开发中generate实际接受的是ChatMessage类型的参数
ChatMessage代表聊天消息的基本接口。
消息类型
LangChain4j目前支持四种类型的聊天信息,每种类型对应消息的来源:
UserMessage:用户类型消息,可以包含文本(String)或者图像(Image)。
AiMessage:AI类型消息,通常是响应UserMessage,OpenAiChatModel的generate方法在接受到Message类型的消息时,会返回一个Reponse。
ToolExecutionResultMessage:这是 ToolExecutionRequest 的结果。
SystemMessage:系统类型消息,作为开发人员在构建prompt的时候,需要提前引导LLM在这次对话中的角色、表现、风格等,LLM受过训练,它更关注SystemMessage类型的消息,所以SystemMessage类型的消息一般放在开头。
UserMessage userForm = UserMessage.from("hello!");
Response<AiMessage> generate = chatGlmChatModel.generate(userForm);
System.out.println(generate);
多个ChatMessage
现在,为什么您需要提供多个ChatMessage而不是一个作为输入?这是因为 LLM 本质上是无状态的,这意味着它们不维护对话的状态。因此,如果您想支持多轮对话,您应该注意管理对话的状态。
假设你想构建一个聊天机器人。想象一下用户和聊天机器人(AI)之间的简单多轮对话:
用户:你好,我叫 Klaus
AI:您好,克劳斯,有什么可以帮您的吗?
用户:我叫什么名字?
人工智能:克劳斯
与的交互如下ChatLanguageModel:
UserMessage firstUserMessage = UserMessage.from("Hello, my name is Klaus");
AiMessage firstAiMessage = model.generate(firstUserMessage).content(); // Hi Klaus, how can I help you?
UserMessage secondUserMessage = UserMessage.from("What is my name?");
AiMessage secondAiMessage = model.generate(firstUserMessage, firstAiMessage, secondUserMessage).content(); // Klaus
如您所见,在generate方法的第二次调用中,我们不仅提供了单条消息secondUserMessage,还提供对话中的先前消息。
手动维护和管理这些消息非常麻烦。因此,存在的概念ChatMemory