LangChain4j LangChain集成Java

LangChain4j介绍

github地址
https://github.com/langchain4j
image

快速开始

引入依赖
<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);
    }

image
该示例通过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类型的参数
image

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

posted @ 2024-06-22 23:43  fchhk  阅读(305)  评论(0编辑  收藏  举报