LangChain4j入门指南:Java开发者的AI应用新起点

什么是LangChainLangChain4j?

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

LangChain4j快速上⼿ 

LangChain4j 官⽹地址: https://docs.langchain4j.dev/
⽬前 LangChain4j 完成了与多个⼤模型产品的对接。具体参⻅官⽹ https://docs.langchain4j.dev/integrations/la
nguage-models 。 其中,国外的 OpenAI ⼤模型⾃然是我们学习接⼊的⾸选。⽽国内的⼤模型, LangChan4j ⽬前 ⽀持百度千帆和智谱AI还有阿里通义千问等

快速开始与OpenAI的对话

接下来,我们快速搭建一个spring boot项目来集成LangChain4j,完成与大模型的对话

这里支持多种大模型,每种大模型的依赖都不一样,均提供普通maven和spring两个版本的。大家可以根据自己的需求来添加合适的依赖。

这里以OpenAI为例,因为 Deepseek 的 API 设计与 OpenAI 的 API 兼容,所以调用deepseek默认使用OpenAI的这一套就可以了

首先引入pom依赖

 <!-- langchain4j 核心底层-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
        </dependency>
<!-- 是langchain4j集成openai的依赖-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
        </dependency>
这个是 LangChain4j的核心依赖,我引入的是普通maven的依赖
然后,就可以写⼀个简单的应⽤,开始与 OpenAI 的第⼀对话。
@Test
    void contextLoads() {
        ChatLanguageModel model = OpenAiChatModel.builder().apiKey("demo")
                .modelName("gpt-4o-mini").build();
        String result = model.generate("你是哪个");
        System.out.println(result);
    }

运行结果:

这段代码中需要指定两个参数, 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 类的构造⽅法当中。

 那么接下来我们看看deepseek的使用方法:

如图所示代码没有多大的变化, 前面我们说因为 Deepseek 的 API 设计与 OpenAI 的 API 兼容,所以使用OpenAI的那一套就行。只不过deepseek好像没有默认的apikey,所以只能填入你自己的apikey了,具体可以去deepseek官网查看。

才发现deepseek居然可以充值了。

大模型理解上下文

 好了继续我们上面的,从图中可以看出

        ⼤模型并不能够理解” 再说⼀次 的含义。这是因为,在⽬前的代码中,每次调⽤ generate() 就是⼀次新的会话。
        
        所以对⼤模型来说,没有第⼀次的“ 你是谁 的记录,⼤模型⾃然就⽆法理解 再说⼀次 的含义。
        如何让⼤模型能够了解之前的聊天记录呢?在ChatLanguageModel 中,提供了 generate ⽅法的多个重载⽅法。 除了可以传⼊⼀条消息,还可以传⼊多个ChatMessage
代码如下:
  @Test
    public void test2(){
        ChatLanguageModel model = OpenAiChatModel.builder().apiKey("demo")
                .modelName("gpt-4o-mini").build();
        UserMessage userMessage1 = UserMessage.userMessage("你好,你是谁?");
        Response<AiMessage> response1 = model.generate(userMessage1);
        AiMessage aiMessage1 = response1.content();
        System.out.println(aiMessage1.text());
        System.out.println("-------");
        UserMessage userMessage2 = UserMessage.userMessage("请再重复⼀次");
        Response<AiMessage> response2 = model.generate(userMessage1, aiMessage1,
                userMessage2);
        System.out.println(response2.content().text());
    }

这样⼤模型才真正理解了"重复⼀次"的含义。

这个案例中⽤到了 UserMessage AiMessage ,他们都是 ChatMessage 接⼝的实现类。⽬前 ChatMessage 接 ⼝提供了四个实现类,这些实现类分别代表着与⼤模型交互的四种聊天消息。

如图所示: 

  • UserMessage: ⽤户想要发送给⼤模型的消息。
  • AiMessage:代表AI⼤模型⽣成的消息。
  • SystemMessage:系统实际发送给AI⼤模型的消息。通常,作为⼀个应⽤开发者,你应该对⽤户提供的消息 进⾏⼀些包装,从⽽让⼤模型能够给出更精确的结果。例如,⽤户想要AI⼤模型帮忙写⼀篇博⽂,可以直接 "帮我写⼀篇关于AI⼤模型的博⽂"。⽽作为应⽤开发者,通常就可以对提示词进⾏⼀些包装,例如"你是⼀ 个 有多年经验的Java架构师,帮我写⼀篇关于AI⼤模型的博⽂"。后⾯这个包装后的消息就是 SystemMessage,之前没有包装过的就是UserMessage。通常要注意不要让⽤户接触到SystemMessage
  • ToolExecutionResultMessage:⽤户发送给AI⼤模型的⼯具的执⾏结果。 关于LangChain4j中的⼯具,后续 章节会介绍。

如果只是简单的往 generate ⽅法中传⼊⼀个字符串,那么返回结果也是⼀个字符串。但是如果通过 ChatMessage传⼊,那么 generate() ⽅法将返回⼀个封装了 AiMessage Response 对象。在这个对象中不光包含 了响应结果,同时还包含了其他元数据信息,例如token AI ⼤模型通常都是按照 token 进⾏计费的。

大模型流式响应

在之前的代码中,调用大模型都是整段文字一起出来,这样如果响应慢的话用户体验很不好,

所以很多⼤模型为了提⾼响应的实时性,也都提供了按照 token 逐步给出相应的实现⽅式。 ( 类似
于在 ChatGPT 上看到的⼀个词⼀个词蹦出来的响应⽅式。 ) 。在 LangChain4j 中,就提供了另⼀个接⼝ StreamingChatLanguageModel,⽤来⽀持这种按照 token 输出的⽅式。
这里我的依赖用的最新的版本
0.31.0

如果大家用不了没有任何输出的话就把版本升级到最新或者采用下方的办法手动添加相关依赖

流式处理需要额外引入http相关的依赖库。不然出不来。

  • retrofit2:retrofit(HTTP 客户端)
  • retrofit2:converter-jackson(JSON 转换)
  • okhttp3:okhttp(网络请求)
  • okhttp3:okhttp-sse(Server-Sent Events 支持)

 pom文件引入相关依赖

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>converter-jackson</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp-sse</artifactId>
    <version>4.12.0</version>
</dependency>

如果可以的话上面的依赖就不需要了,推荐用最新的版本

当前版本限制,使⽤langchain的测试接⼝,返回全是? 。如果要拿到结果,可以直接访问OpenAI。或者使用deepseek,这里我使用deepseek为大家演示。

这种⽅式就可以实现按照 Token 依次输出的流式响应结果。⽽这种⽅式打印出的每⼀⾏的字或词,就是⼀个 Token。

ModerationModel温和模式

ModerationModel 能够校验输⼊中是否存在敏感内容

他目前的效果是直接返回了null.

ImageModel⽂⽣图模型

 文生图由于我的openaiKey没有钱了这里采用阿里的万象大模型来生成。

首先引入依赖

官方这里提供了前1.0.0-alpha1和1.0.0-alpha1以及之后的版本:

我在这里试1.0.0-alpha1之后的版本他没有WanxImageModel模型,所以采用之前的版本来开发。

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-dashscope</artifactId>
    <version>${previous version here}</version>
</dependency>
代码如下:我们来让他生成一个美女的图片
WanxImageModel wanxImageModel = WanxImageModel.builder()
                .modelName("wanx2.1-t2i-plus")
                .apiKey("自己的密钥")
                .build();

        Response<Image> response = wanxImageModel.generate("美女");
        System.out.println(response.content().url());

 如上图这里会生成一个网页链接,我们点击他就会下载到本地。

看这个发丝,质量还是非常的高的。

本章总结

本节介绍了 LangChain4j 的基本使⽤,演示了如何与 OpenAI和deepseek以及阿里万象 进⾏交互,也总结了 LangChain4j 的⼏个常⽤的顶级 抽象接⼝。
  • ChatLanguageModel:聊天模型接⼝
  • ChatMessage:与AI交互的消息接⼝
  • ModerationModel:温和模式交互接⼝
  • WanxImageModel:图⽚模型接⼝
LangChain4j 就是以这些接⼝来逐步抽象与各个⼤模型的交互⽅式。与其他 AI ⼤模型的交互,也基本是按照同样 的⽅式进⾏。⼤家也可以引⼊相应依赖包,⾃⼰进⾏尝试。
🌟🌟🌟🌟🌟推荐大家使用阿里云白炼提供的大模型,新用户赠送100万token官网地址 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
好了本期使用maven项目介绍了 LangChain4j的基本使用方法,下期将介绍spring集成LangChain4j。感谢大家的关注,我们下期再见!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞鹰@四海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值