LangChain4j的学习

1. 什么是 LangChain4j?它是干什么的?

定义: LangChain4j (LangChain for Java) 是一个 Java 库,旨在简化将大语言模型(LLM)集成到 Java 应用程序中的过程。

它是干什么的?(核心作用) 想象一下,如果你想在 Java 里连接 MySQL,你不会去手写 TCP 连接和 SQL 解析协议,你会用 JDBCMyBatis/Hibernate 。 LangChain4j 就是 AI 领域的 MyBatis

  • 它帮你连接各种大模型(OpenAI, 阿里云通义千问, Google Gemini, 本地 Ollama 等)。

  • 它帮你管理对话上下文(Memory)。

  • 它帮你把 PDF/文档 喂给 AI(RAG)。

  • 它帮你把 Java 方法变成 AI 的工具(Function Calling)。

2. 有什么好处?

对于 Java 开发者,最大的痛点是 AI 生态被 Python 统治。LangChain4j 的好处在于:

  1. 统一 API (解耦):

    • 今天你用 OpenAI,明天老板想换成阿里云通义千问,后天想换成免费的 DeepSeek。

    • 不用 LangChain4j: 你需要重写所有的 HTTP 请求代码。

    • 用 LangChain4j: 改一行配置文件 (application.yml) 即可,业务代码一行不用动。

  2. Java 原生体验:

    • 不需要额外部署 Python 服务。

    • 支持 Spring Boot Starter,配置极其简单。

    • 强类型支持,可以直接把 AI 的回复转成 Java Bean。

  3. 高层抽象 (AiServices):

    • 你只需要写一个 Java 接口 (Interface),框架自动帮你生成实现类,调用 AI 就像调用本地 Service 一样简单。

3.案例搭建

引入依赖
XML 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>0.36.0</version>
</dependency>
编写配置文件(需要提前准备APIKey 需要去自己申请)
XML 复制代码
aliyun.ai.key=sk-你的apikey
aliyun.ai.apiUrl=https://dashscope.aliyuncs.com/compatible-mode/v1
aliyun.ai.model=qwen-turbo
创建一个测试类进行编写
java 复制代码
package com.qcby.langchain4jdemo;

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

@SpringBootTest
public class AiTest {

    @Value("${aliyun.ai.key}")
    private String apiKey;

    @Value("${aliyun.ai.apiUrl}")
    private String url;

    // 建议把变量名改得具体一点,比如 modelName,避免和下面的对象混淆
    @Value("${aliyun.ai.model}")
    private String modelName;

    @Test
    public void test() {
        // 1. 构建模型客户端
        // 为了区分,我们将这里的变量名改为 chatLanguageModel
        ChatLanguageModel chatLanguageModel = OpenAiChatModel.builder()
                .apiKey(apiKey)
                .baseUrl(url)
                .modelName(modelName) // 使用成员变量配置的模型名
                .build();
        // 2. 核心步骤:调用 generate 方法发送请求!
        // 如果不写这一行,就永远不会发起网络请求
        String response = chatLanguageModel.generate("你好,请讲一个关于程序员的冷笑话。");
        // 3. 打印结果
        System.out.println("----------------------------------");
        System.out.println("AI 回复内容:");
        System.out.println(response);
        System.out.println("----------------------------------");
    }
}

运行查看结果

测试讲解
java 复制代码
@Value("${aliyun.ai.key}")    
    private String apiKey;

    @Value("${aliyun.ai.apiUrl}") 
    private String url;

    @Value("${aliyun.ai.model}")  
    private String modelName;

从配置文件中拿去自己配置的值

接下来是重点

构建 AI 客户端 (LangChain4j 部分)

java 复制代码
// 1. 构建模型客户端
ChatLanguageModel chatLanguageModel = OpenAiChatModel.builder() 
        .apiKey(apiKey)
        .baseUrl(url)
        .modelName(modelName)
        .build();

OpenAiChatModel.builder():

  • 多态性 :虽然我们用的是阿里云通义千问,但因为阿里云支持 OpenAI 的协议标准,所以我们直接复用 LangChain4j 提供的 OpenAiChatModel 客户端类。

  • Builder 模式 :这里使用了设计模式中的"建造者模式"。它允许你通过链式调用(.xxx().xxx())来一步步配置复杂的对象,最后调用 .build() 生成实例。

  • 配置绑定:这里把第一步从 Spring 拿到的配置(Key, URL, ModelName)填入了客户端。

核心调用与输出

java 复制代码
// 2. 核心步骤:调用 generate 方法发送请求!
String response = chatLanguageModel.generate("你好,请讲一个关于程序员的冷笑话。"); 

// 3. 打印结果
System.out.println(response); 

.generate(...):

  • 这是我们在上一节源码分析中看到的 方法 1(最简单的 String 入参)。

  • 网络请求发生地:这行代码执行时,Java 程序会组装一个 HTTP POST 请求,发送给阿里云服务器。

  • 阻塞等待 :这是一个**同步(Synchronous)**方法。代码运行到这里会"卡住"(阻塞),直到 AI 思考完毕并把完整的笑话通过网络传回来,赋值给 response 变量。

整体流程
java 复制代码
    A[application.yml] -->|@Value注入| B(Java变量: apiKey, url, modelName)
    B -->|Builder填充| C[OpenAiChatModel 客户端实例]
    D[测试方法 test()] -->|调用 .generate()| C
    C -->|HTTP POST 请求| E[阿里云服务器 /compatible-mode/v1]
    E -->|生成文本| C
    C -->|返回 String| F[控制台输出]
相关推荐
Engineer邓祥浩2 小时前
设计模式学习(15) 23-13 模版方法模式
java·学习·设计模式
非凡ghost2 小时前
批量转双层PDF(可识别各种语言)
windows·学习·pdf·软件需求
开开心心_Every2 小时前
网络管理员IP配置工具:设置多台电脑地址
运维·服务器·网络·网络协议·学习·tcp/ip·edge
知识分享小能手2 小时前
Oracle 19c入门学习教程,从入门到精通,Oracle 控制文件与日志文件管理详解(8)
数据库·学习·oracle
安静的技术开发者2 小时前
ROS 2学习笔记 我的第一个机器人程序——海龟程序
笔记·学习
Da Da 泓2 小时前
多线程(八)【定时器】
java·学习·多线程·定时器
FAFU_kyp2 小时前
Rust 泛型(Generics)学习教程
开发语言·学习·rust
代码游侠3 小时前
ARM开放——阶段问题综述(一)
arm开发·笔记·嵌入式硬件·学习·架构
试试勇气3 小时前
Linux学习笔记(十二)--用户缓冲区
linux·笔记·学习