Java 开发者如何用 LangChain4j 打造下一代 AI 应用

Java 开发者如何用 LangChain4j 打造下一代 AI 应用

在当今数字化时代,人工智能(AI)技术正以前所未有的速度改变着软件开发的格局。对于 Java 开发者而言,LangChain4j 如同一把钥匙,打开了通往 AI 世界的大门。本文将通过实际代码示例,展示如何使用 LangChain4j 实现智能对话、图像生成和内容审核等功能,帮助你快速上手 AI 开发,打造下一代智能应用。

20250220222724943-QQ图片20250220222602

一、LangChain4j 简介

LangChain4j 是 Java 版本的 LangChain,它为开发者提供了一个框架,用于构建具有大语言模型(LLM)能力的应用程序。随着大模型技术的不断发展,如何在传统应用中更好地利用这些模型的能力,成为了一个重要的趋势。LangChain4j 正是为了解决这一问题而生,它帮助开发者将大模型的能力与 Java 编程语言相结合,从而打造出更加智能的应用。(LangChain4j JavaAIP文档

二、环境搭建

首先,我们需要搭建开发环境。创建一个 Maven 工程,并在 pom.xml 文件中添加以下依赖:
xml复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qjc</groupId>
    <artifactId>langchain4j-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <langchain4j.version>0.27.1</langchain4j.version>
    </properties>

    <dependencies>
        <!-- LangChain4j 核心依赖 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
        <!-- LangChain4j OpenAI 集成 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
        <!-- 日志依赖 -->
        <dependency>
            <groupId>org.tinylog</groupId>
            <artifactId>tinylog-impl</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.tinylog</groupId>
            <artifactId>slf4j-tinylog</artifactId>
            <version>2.6.2</version>
        </dependency>
    </dependencies>
</project>

三、与 OpenAI 的第一次对话

接下来,我们通过一个简单的示例,展示如何使用 LangChain4j 与 OpenAI 的 GPT 模型进行对话。创建一个 Java 类 HelloAI,并添加以下代码:
java复制
package com.qjc.demo;

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;

public class HelloAI {
    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.withApiKey("demo");
        String answer = model.generate("你好,你是谁?");
        System.out.println(answer);
    }
}
运行上述代码,你将看到类似以下的输出:

你好,我是一个人工智能助手。我可以回答你的问题和提供帮助。有什么可以帮到你的吗?

这里,我们使用了 LangChain4j 提供的 OpenAiChatModel,并通过传入 demo 作为 API 密钥来调用 OpenAI 的 GPT 模型。实际上,LangChain4j 在底层将 demo 密钥替换为了自己的代理地址,从而让我们能够体验到与 OpenAI 模型的交互。

四、多轮对话

在实际应用中,我们常常需要与 AI 模型进行多轮对话。为了实现这一功能,LangChain4j 提供了 ChatMemory 组件。以下是一个示例,展示如何使用 ChatMemory 实现多轮对话:
java复制
package com.qjc.demo;

import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.output.Response;

public class MultiTurnConversation {
    public static void main(String[] args) {
        ChatLanguageModel model = OpenAiChatModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .build();

        ChatMemory chatMemory = MessageWindowChatMemory.builder().build();

        UserMessage userMessage1 = UserMessage.userMessage("你好,我是小齐");
        Response<AiMessage> response1 = model.generate(userMessage1, chatMemory);
        AiMessage aiMessage1 = response1.content();
        System.out.println(aiMessage1.text());

        UserMessage userMessage2 = UserMessage.userMessage("我叫什么");
        Response<AiMessage> response2 = model.generate(userMessage2, chatMemory);
        AiMessage aiMessage2 = response2.content();
        System.out.println(aiMessage2.text());
    }
}
运行上述代码,你将看到类似以下的输出:
你好,小齐。有什么可以帮助你的吗?
你的名字是小齐,对吗?
通过 ChatMemory,我们能够将多轮对话的历史记录保存下来,从而让 AI 模型更好地理解上下文,生成更准确的回复。

五、打字机流式响应

有时候,我们希望 AI 模型的回复能够以流式的方式呈现,就像打字机一样逐字显示。LangChain4j 提供了 StreamingChatLanguageModel 来实现这一功能。以下是一个示例:
package com.qjc.demo;

import dev.langchain4j.model.StreamingResponseHandler;
import dev.langchain4j.model.chat.StreamingChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;

public class TypewriterResponse {
    public static void main(String[] args) {
        StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .build();

        model.generate("你好,你是谁?", new StreamingResponseHandler<AiMessage>() {
            @Override
            public void onNext(String token) {
                System.out.print(token);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(Throwable error) {
                error.printStackTrace();
            }
        });
    }
}
运行上述代码,你将看到 AI 模型的回复逐字显示在控制台上,模拟了打字机的效果。

六、整合 Spring Boot

在企业级应用中,我们常常使用 Spring Boot 框架来构建 Web 应用。LangChain4j 也提供了与 Spring Boot 的集成方式。以下是一个示例,展示如何在 Spring Boot 应用中使用 LangChain4j:
  1. pom.xml 中添加 Spring Boot 依赖:
xml复制
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.1</version>
</parent>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>0.27.1</version>
</dependency>
  1. 创建 Spring Boot 启动类 MainApplication
java复制
package com.qjc.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}
  1. 创建一个控制器 HelloAIController
java复制
package com.qjc.demo.controller;

import dev.langchain4j.model.chat.ChatLanguageModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloAIController {
    @Autowired
    private ChatLanguageModel chatLanguageModel;

    @GetMapping("/hello")
    public String hello() {
        return chatLanguageModel.generate("你好啊");
    }
}
  1. application.properties 文件中配置 API 密钥:

langchain4j.open-ai.chat-model.api-key=demo

启动 Spring Boot 应用后,访问 http://localhost:8080/hello,你将看到 AI 模型的回复。

七、使用 Elasticsearch 作为嵌入存储

在构建智能应用时,我们常常需要对文本进行语义搜索和知识检索。LangChain4j 支持使用 Elasticsearch 作为嵌入存储,从而实现高效的相似性检索。以下是一个示例,展示如何使用 Elasticsearch 作为嵌入存储:
  1. 创建嵌入模型:
java复制
package com.qjc.demo;

import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;

public class EmbeddingExample {
    public static void main(String[] args) {
        EmbeddingModel model = OpenAiEmbeddingModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .modelName("text-embedding-ada-002")
                .build();

        String text = "Java 是一种广泛使用的编程语言";
        double[] embedding = model.embed(text);
        System.out.println("嵌入向量长度: " + embedding.length);
    }
}
  1. 将嵌入向量存储到 Elasticsearch 中:
java复制
package com.qjc.demo;

import dev.langchain4j.storage.elastic.ElasticsearchEmbeddingStorage;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;

public class ElasticsearchStorageExample {
    public static void main(String[] args) {
        EmbeddingModel model = OpenAiEmbeddingModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .modelName("text-embedding-ada-002")
                .build();

        ElasticsearchEmbeddingStorage storage = ElasticsearchEmbeddingStorage.builder()
                .elasticsearchUrl("http://localhost:9200")
                .indexName("langchain4j-embeddings")
                .build();

        String text = "Java 是一种广泛使用的编程语言";
        double[] embedding = model.embed(text);
        storage.save("java-programming", embedding);
    }
}
  1. 搜索相似的嵌入向量:
java复制
package com.qjc.demo;

import dev.langchain4j.storage.elastic.ElasticsearchEmbeddingStorage;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;

public class SimilaritySearchExample {
    public static void main(String[] args) {
        EmbeddingModel model = OpenAiEmbeddingModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .modelName("text-embedding-ada-002")
                .build();

        ElasticsearchEmbeddingStorage storage = ElasticsearchEmbeddingStorage.builder()
                .elasticsearchUrl("http://localhost:9200")
                .indexName("langchain4j-embeddings")
                .build();

        String queryText = "我需要学习一种编程语言";
        double[] queryEmbedding = model.embed(queryText);
        List<String> similarIds = storage.search(queryEmbedding, 3);
        System.out.println("相似的文档 ID: " + similarIds);
    }
}
通过上述示例,我们可以看到如何使用 LangChain4j 将文本嵌入到向量空间中,并利用 Elasticsearch 进行高效的相似性检索。

八、总结

LangChain4j 为 Java 开发者提供了一个强大的工具,用于构建具有 AI 能力的应用程序。通过本文的介绍,展示了如何使用 LangChain4j 实现智能对话、图像生成、内容审核等功能,并通过实际代码示例帮助你快速上手。希望本文能够激发你的灵感,让你在 AI 开发的道路上更进一步。如果你有任何问题或建议,欢迎在评论区留言,我们一起探讨。
© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容