Java 整合大模型之LangChain4j

LangChain是⼀个⼤模型的开发框架,使⽤ LangChain 框架,程序员可以更好的利⽤⼤模型的能⼒,⼤⼤提⾼编程效率。如果你是⼀个 Java 程序员,那么对 LangChain 最简单直观的理解就是, LangChain 是⼤模型领域的Spring 。 LangChain 不光提供了⼀整套快速接⼊各种开放⼤模型的⼯具,更重要的是,他集成了当今程序员使⽤⼤模型能⼒最好的⽅案。
LangChain是⼀个基于 Python 开发的框架,⽽ LangChain4j 则是 LangChain 的 Java 版本。将⼤模型的强⼤能⼒和Java 编程语⾔相结合,这就是 LangChain4j 所做的。实际上, LangChain4j 不光包含了 LangChain 的功能,同时还加⼊了很多⾃⼰的创新。在⽬前阶段, LangChain4j 也是与⼤模型结合最好最成熟的框架。

LangChain4j 的目标是简化与 Java 应用程序 集成大模型。

在课程开始之前,由于LangChain4j是采用JDK17写的,所以大家需要将JDK安装成17版本的。

官网:https://docs.langchain4j.dev/get-started

特性

  • 统一API:LLM( Large Language Model(大语言模型))提供程序(如 OpenAI 或 阿里百炼)和嵌入(向量)存储(如 redis 或 ES) 使用专有 API。LangChain4j 提供了一个统一的 API,以避免为每个 API 学习和实现特定的 API。 要试验不同的LLMs存储或嵌入的存储,您可以在它们之间轻松切换,而无需重新编写代码。 LangChain4j 目前支持 15+ 热门LLM20+ 嵌入模型

  • LangChain4j对比SpringAI

    纬度 SpringAI LangChain4j
    技术绑定 强度依赖Spring生态 无框架依赖,可独立使用
    适用场景 SpringBoot应用快速接入模型 多模型(动态模型)平台

    Demo入门案例,Java整合LangChain4j(存Java)

    接下来,让我们与LangChain4j初识一下,新建一个SpringBoot工程,然后添加以下依赖:

    添加依赖

    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>${langchain4j.verion}</version>
    </dependency>
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-open-ai</artifactId>
        <version>${langchain4j.verion}</version>
    
```

设置版本:

<langchain4j.verion>1.0.0-beta1</langchain4j.verion>

最终效果:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.gec</groupId>
    <artifactId>LangChain4</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>LangChain4</name>
    <description>LangChain4</description>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
        <langchain4j.verion>1.0.0-beta1</langchain4j.verion>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>${langchain4j.verion}</version>
        </dependency>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>${langchain4j.verion}</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.gec.langchain4.LangChain4Application</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

引入了langchain4j的核心依赖、langchain4j集成OpenAi各个模型的依赖。

和OpenAI的第一次对话:

这里由于考虑大家不一定所有人都有OpenAI的密钥采用LangChain4j提供的通用接口来实现:

package com.gec.langchain4;

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class LangChain4ApplicationTests {

    @Test
    void contextLoads() {
        OpenAiChatModel model = OpenAiChatModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .modelName("gpt-4o-mini")
                .build();
        String chat = model.chat("你好,你是谁?");
        System.out.println(chat);
    }

}

这段代码中需要指定两个参数, apikey 和 modelName 。这两个是什么呢?
⾸先,ModelName 是 OpenAI 提供的⼤模型的名字。这与你在⽹⻚上使⽤ ChatGPT 看到的模型名是⼀致的。
不同 的模型有不同的效率(相应速度和对话成熟度 ) 。当然,也有不同的费率。其中这个 gpt-4o-mini 是 OpenAI 提供的⼀ 个可以进⾏免费调试的⼤模型。
然后,apikey 是访问⼤模型需要的身份凭证。正常情况下,调⽤ OpenAI 的这些 API 接⼝,都需要先去 OpenAI 官 ⽹申请⼀个apikey ,之后每次调⽤, OpenAI 会根据这个 apikey 收费。
这⾥给的这个“demo" 的 apikey ,实际上是 langchain4j 框架提供的⼀个测试 key 。 langchain4j 在构建 OpenAiChatModel时,会判断传⼊的 ApiKey 是不是 “demo” 。如果是,就将 OpenAi 的原始 API 地址 " https://api.openai.com/v1 " 改为 " http://langchain4j.dev/demo/openai/v1 " 。这个地址是 langchain4j 专⻔为我们准备的⼀个体 验地址。langchian4j 后端接受到请求后,会将真实请求转发给 openAI ,同时注⼊他们⾃⼰的真实的 apikey 。具体 代码就在OpenAiChatModel 类的构造⽅法当中。

运行结果:

我们会发现, LangChain4j 对于初次接入大模型的开发者十分友好,不需要指定模型,不需要指定apikey, 即可对接大模型进行对话,这是怎么做到的呢?

其实我们对ApiKey为"demo" , 底层会做这些事情:

在底层在构造OpenAiChatModel时,会判断传入的ApiKey是否等于"demo",如果等于会将OpenAi的原始API地址"https://api.openai.com/v1"改为http://langchain4j.dev/demo/openai/v1",这个地址langchain4j专门为我们准备的一个体验地址,实际上这个地址相当于是"https://api.openai.com/v1"的代理,我们请求代理时,代理会去调用真正的OpenAi接口,只不过代理会将自己的ApiKey传过去,从而拿到结果返回给我们。

所以,真正开发时,需要大家设置自己的apiKey或baseUrl,可以这么设置:

OpenAiChatModel model = OpenAiChatModel.builder()
        .baseUrl("http://langchain4j.dev/demo/openai/v1")
      .apiKey("demo")
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐