LangChain4j 入门指南

前言

最近经常有小伙伴问我------"老的Java项目做AI应用开发,到底该用什么框架?"

我的回答是:LangChain4j

今天这篇文章,我就从零开始,把LangChain4j的核心概念、底层原理、实战代码从头到尾给你拆解一遍。

希望对你会有所帮助。

更多项目实战在Java突击队网:susan.net.cn/project

一、LangChain4j到底是什么?

有些小伙伴可能会说:"LangChain4j不就是Python LangChain的Java版吗?"

还真不是。

LangChain4j从名字上看确实跟Python的LangChain有关系,但它不是LangChain的简单移植

它完全从头开始设计,遵循Java的编程习惯------类型安全、POJO、注解、接口、依赖注入、流式API。

截至2026年,LangChain4j在GitHub上已经积累了超过12,200颗Star2,300次Fork ,最新版本为1.15.1,保持着活跃的开发节奏。

它原生支持20+个LLM提供商30+个向量存储,并且与Spring Boot、Quarkus、Helidon、Micronaut等主流Java框架有一流集成。

一句话说清:LangChain4j是专为Java/Kotlin开发者打造的大语言模型应用开发框架,提供统一、标准化的API,屏蔽各类大模型、向量数据库、文档解析的底层差异,让Java开发者无需重复造轮子,快速构建稳定、可扩展的AI业务应用。

1.1 不用LangChain4j,你得面对什么?

直接对接大模型API,你要处理的麻烦事可不少:

  • 每个厂商的API格式不一样、参数名不一样、返回结构不一样;
  • 每次调用都要手动处理HTTP请求、JSON解析、认证和重试;
  • 多轮对话要手动管理消息历史;
  • 想让AI基于你的文档回答要做RAG;
  • 想让AI查天气、查订单要做工具调用。

LangChain4j的解决方案:这些复杂功能都已封装成现成组件,拿来就用。

二、一张图看懂LangChain4j的架构

在写代码之前,我们先建立一个整体认知。

LangChain4j的整体架构分层清晰,五大核心模块支撑所有AI业务能力:

  • Model模型层统一封装各类大模型、嵌入模型调用逻辑,屏蔽API差异;

  • Memory记忆层管理多轮对话记忆,支持内存、持久化、分段记忆;

  • Document文档层支持PDF、Word、TXT等多格式文档加载、解析、文本切片、清洗;

  • Embedding & Store向量存储层统一封装向量化与向量检索逻辑。

LangChain4j采用清晰的分层架构设计,核心抽象层(langchain4j-core)是整个框架的基石,定义了所有核心接口和数据模型。

三、LangChain4j的"七件套"

LangChain4j的组件体系非常清晰,下面我逐个给你拆解。

3.1 Model(模型层)

它是AI的"大脑"。

Model是与大模型交互的入口。LangChain4j提供了统一的接口来对接不同的模型提供商。

目前主要有两类API:

  • LanguageModel:输入输出都是String,现在用得越来越少了
  • ChatModel :应用最广泛的API,接收多个ChatMessage作为输入,输出一个AiMessage,支持文本、图片等多模态输入

示例:创建一个ChatModel

bash 复制代码
// 以OpenAI为例
ChatModel model = OpenAiChatModel.builder()
    .apiKey(System.getenv("OPENAI_API_KEY"))
    .modelName("gpt-4")
    .build();

// 发送消息
ChatResponse response = model.chat(
    UserMessage.from("你好,请介绍一下自己")
);
System.out.println(response.aiMessage().text());

3.2 ChatMessage(消息类型)

它是对话的基本单元。

LangChain4j支持五种消息类型:

消息类型 描述 主要用途
UserMessage 用户输入的消息 用户提问
AiMessage AI生成的回复 模型输出
SystemMessage 系统消息 设置AI的角色和行为
ToolExecutionResultMessage 工具执行结果 函数调用后回传结果
CustomMessage 自定义消息 扩展场景

3.3 ChatMemory(记忆层)

它让AI"记住"对话。

大模型本身是无状态的,不会记录对话历史。LangChain4j提供了ChatMemory来管理对话上下文。

两种内置的记忆淘汰策略

  • MessageWindowChatMemory:基于消息滑动窗口,仅保留最近的N条消息
  • TokenWindowChatMemory:基于Token滑动窗口,只保留最近的N个Token
bash 复制代码
// 创建记忆,保留最近10条消息
ChatMemory memory = MessageWindowChatMemory.builder()
    .maxMessages(10)
    .build();

// 添加用户消息
memory.add(UserMessage.from("我叫张三"));
// 获取AI回复
AiMessage response = model.chat(memory.messages()).aiMessage();
memory.add(response);

// 下一轮对话会自动带上历史
memory.add(UserMessage.from("我叫什么名字?"));
AiMessage response2 = model.chat(memory.messages()).aiMessage();
// 模型会记得你叫张三

💡 一个关键概念:LangChain4j提供的是"记忆"而非"历史记录"。

记忆会根据算法对历史进行改造------淘汰某些消息、总结多条消息、去除不重要的细节、注入额外信息等。

3.4 Tools(工具层)

它让AI"长出手脚"。

Tools(函数调用)是LangChain4j最强大的功能之一。它让LLM可以调用外部工具------网络搜索、调用外部API、执行特定代码等。

示例:定义一个数学工具

bash 复制代码
import dev.langchain4j.agent.tool.Tool;

public class CalculatorTools {
    
    @Tool("对给定的2个数字求和")
    double sum(double a, double b) {
        return a + b;
    }
    
    @Tool("返回给定数字的平方根")
    double squareRoot(double x) {
        return Math.sqrt(x);
    }
}

⚠️ 重点:工具描述一定要写清楚,AI能否正确调用工具全看这个描述!

让AI使用工具

bash 复制代码
ChatModel model = OpenAiChatModel.builder()
    .apiKey(System.getenv("OPENAI_API_KEY"))
    .modelName("gpt-4")
    .build();

// 把工具传给模型
ChatRequest request = ChatRequest.builder()
    .messages(UserMessage.from("475695037565的平方根是多少?"))
    .toolSpecifications(ToolSpecifications.from(CalculatorTools.class))
    .build();

ChatResponse response = model.chat(request);
// AI会返回一个toolExecutionRequest,表示它想调用squareRoot工具

工具调用的完整流程 :AiServices发送消息和工具架构给LLM,LLM回复函数调用(如add(42, 58)),LangChain4j执行Calculator方法,将结果反馈回去。

3.5 AiServices(高层API)

它能做声明式AI开发。

AiServices是LangChain4j的高层API,也是最让Java开发者感到亲切的部分

它的核心思想是面向接口编程 :你只需要定义一个Java接口,用注解标明它需要哪些能力(系统提示词、用户消息模板、记忆、工具等),AiServices会为你生成一个动态代理对象,内部自动编排所有组件。

最简单的AiService示例

bash 复制代码
interface Assistant {
    String chat(String userMessage);
}

// 创建AI服务
Assistant assistant = AiServices.builder(Assistant.class)
    .chatLanguageModel(model)
    .build();

// 直接调用
String reply = assistant.chat("你好,请介绍一下自己");
System.out.println(reply);

带系统提示词和记忆的AiService

bash 复制代码
interface ChatAssistant {
    
    @SystemMessage("你是一个专业的Java技术顾问,请用中文回答问题")
    String chat(@UserMessage String userMessage);
}

// 创建带记忆的AI服务
ChatMemory chatMemory = MessageWindowChatMemory.builder()
    .maxMessages(10)
    .build();

ChatAssistant assistant = AiServices.builder(ChatAssistant.class)
    .chatLanguageModel(model)
    .chatMemory(chatMemory)
    .build();

// 多轮对话自动带记忆
String reply1 = assistant.chat("我叫张三");
String reply2 = assistant.chat("我叫什么名字?"); // AI记得你叫张三

AiServices支持的能力包括:

  • 静态/动态系统消息 :通过@SystemMessage注解或systemMessageProvider()配置
  • 静态/动态用户消息 :通过@UserMessage注解或@UserMessage标注参数
  • 共享记忆 :通过chatMemory(ChatMemory)配置
  • 多用户记忆 :通过chatMemoryProvider()@MemoryId标注参数
  • RAG检索增强 :通过contentRetriever()retrievalAugmentor()配置

3.6 RAG(检索增强生成)

它让AI"有据可查"。

RAG是LangChain4j的核心能力之一。

它的流程是:用户提问 → 从知识库检索相关文档 → 把问题和检索到的文档一起发给AI → AI生成基于文档的回复。

在LangChain4j中,RAG的核心组件是RetrievalAugmentor

它就像RAG系统的"中央处理器",专门负责给用户的问题"加料"------通过调用各种检索渠道,把找到的相关知识片段"贴"到原始问题里,让大模型回答时能参考这些资料。

bash 复制代码
// 1. 加载文档
Document document = FileSystemDocumentLoader.loadDocument("knowledge.txt");

// 2. 切片
DocumentSplitter splitter = DocumentSplitters.recursive(300, 0);
List<TextSegment> segments = splitter.split(document);

// 3. 向量化存储
EmbeddingModel embeddingModel = new BgeSmallEnV15EmbeddingModel();
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
for (TextSegment segment : segments) {
    Embedding embedding = embeddingModel.embed(segment).content();
    embeddingStore.add(embedding, segment);
}

// 4. 创建ContentRetriever
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
    .embeddingStore(embeddingStore)
    .embeddingModel(embeddingModel)
    .maxResults(3)
    .build();

// 5. 创建带RAG的AiService
Assistant assistant = AiServices.builder(Assistant.class)
    .chatLanguageModel(model)
    .contentRetriever(retriever)
    .build();

// 6. 提问,AI会基于知识库回答
String answer = assistant.chat("公司的请假流程是什么?");

标准版RAG还可以做更多定制:加载Markdown文档并按需切割、补充文件名信息、自定义Embedding模型、自定义内容检索器。

进阶版RAG支持查询转换器、查询路由、内容聚合器、内容注入器等特性,将整个RAG流程流水线化(RAG Pipeline)。

3.7 MCP协议

它让AI拥有"USB接口"。

有些小伙伴可能会问:"除了自定义工具,LangChain4j还能接入外部服务吗?"

MCP(Model Context Protocol) 就是干这个的。

你可以把MCP想象成AI应用的"USB接口",它为AI提供了与外部工具、资源和服务交互的标准化方式。

在LangChain4j中集成MCP非常方便:

bash 复制代码
<!-- 引入MCP依赖 -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-mcp</artifactId>
    <version>1.1.0-beta7</version>
</dependency>
bash 复制代码
@Configuration
public class McpConfig {
    @Bean
    public McpToolProvider mcpToolProvider() {
        // 1. 配置与MCP服务的通讯方式(SSE)
        McpTransport transport = new HttpMcpTransport.Builder()
            .sseUrl("https://open.bigmodel.cn/api/mcp/web_search/sse?Authorization=" + apiKey)
            .build();
        // 2. 创建MCP客户端
        McpClient mcpClient = new DefaultMcpClient.Builder()
            .transport(transport)
            .build();
        // 3. 从MCP客户端获取工具提供者
        return McpToolProvider.builder()
            .mcpClients(mcpClient)
            .build();
    }
}

四、实战

光说不练假把式。

下面我用Spring Boot + LangChain4j快速搭建一个AI对话应用。

4.1 第一步:创建项目并添加依赖

bash 复制代码
<properties>
    <java.version>21</java.version>
    <spring-boot.version>3.4.5</spring-boot.version>
    <langchain4j.version>1.15.1</langchain4j.version>
</properties>

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- LangChain4j核心 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
    
    <!-- OpenAI兼容适配器(兼容DeepSeek/Ollama/DashScope等) -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-open-ai</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
    
    <!-- Spring Boot集成 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-spring-boot-starter</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
</dependencies>

关键理解langchain4j-open-ai不只是对接OpenAI,它是一个OpenAI兼容协议适配器。任何提供/v1/chat/completions端点的服务(DeepSeek、Ollama、SiliconFlow、通义千问DashScope)都能用。

4.2 第二步:配置application.yml

bash 复制代码
langchain4j:
  open-ai:
    chat-model:
      api-key: ${OPENAI_API_KEY}
      model-name: gpt-4
      temperature: 0.7
      log-requests: true
      log-responses: true
    embedding-model:
      api-key: ${OPENAI_API_KEY}
      model-name: text-embedding-ada-002

4.3 第三步:定义AiService接口

bash 复制代码
package com.example.service;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.spring.AiService;

@AiService
public interface ChatAssistant {
    
    @SystemMessage("你是一个专业的AI助手,请用中文回答问题,简洁友好。")
    String chat(@UserMessage String userMessage);
    
    // 带会话ID的多用户记忆
    @SystemMessage("你是一个专业的AI助手,请用中文回答问题。")
    String chat(@MemoryId String sessionId, @UserMessage String userMessage);
}

4.4 第四步:写Controller

bash 复制代码
package com.example.controller;

import com.example.service.ChatAssistant;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/chat")
public class ChatController {
    
    private final ChatAssistant chatAssistant;
    
    public ChatController(ChatAssistant chatAssistant) {
        this.chatAssistant = chatAssistant;
    }
    
    @PostMapping
    public String chat(@RequestBody ChatRequest request) {
        return chatAssistant.chat(request.getMessage());
    }
    
    @PostMapping("/session")
    public String chatWithSession(@RequestBody SessionChatRequest request) {
        return chatAssistant.chat(request.getSessionId(), request.getMessage());
    }
}

record ChatRequest(String message) {}
record SessionChatRequest(String sessionId, String message) {}

4.5 第五步:启动应用

bash 复制代码
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        runApplication(Application.class, args);
    }
}

启动后,访问 POST /api/chat 就能跟AI对话了。

前后不到50行代码,一个完整的AI对话服务就跑起来了。

五、进阶用法

5.1 结构化输出

它让AI返回Java对象。

许多LLM支持生成结构化格式(通常是JSON)的输出,这些输出可以轻松映射到Java对象并在应用程序中使用。

bash 复制代码
// 1. 定义要提取的数据结构
public class PersonInfo {
    public String name;
    public int age;
    public String city;
}

// 2. 在AiService中指定返回类型
interface PersonExtractor {
    @UserMessage("从以下文本中提取人物信息:{{text}}")
    PersonInfo extractPerson(@V("text") String text);
}

// 3. 调用
PersonExtractor extractor = AiServices.builder(PersonExtractor.class)
    .chatLanguageModel(model)
    .build();

PersonInfo info = extractor.extractPerson("张三,今年28岁,住在北京");
System.out.println(info.name); // 张三
System.out.println(info.age); // 28

5.2 流式响应

它能像ChatGPT一样逐字输出。

通过StreamingChatLanguageModel实现流式传输,无需等待完整答案加载,实时响应用户。

bash 复制代码
StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder()
    .apiKey(System.getenv("OPENAI_API_KEY"))
    .modelName("gpt-4")
    .build();

model.chat(UserMessage.from("写一首关于Java的诗"), 
    new StreamingResponseHandler<AiMessage>() {
        @Override
        public void onNext(String token) {
            System.out.print(token); // 实时打印每个token
        }
        @Override
        public void onComplete(Response<AiMessage> response) {
            System.out.println("\n--- 生成完成 ---");
        }
        @Override
        public void onError(Throwable error) {
            error.printStackTrace();
        }
    }
);

六、优缺点

优点

1. 统一API,多模型无缝切换

LangChain4j提供统一的API屏蔽了不同LLM提供商和向量存储的差异。从OpenAI切换到通义千问,只需改配置,业务代码几乎不用动。

2. 极致多模型适配

原生支持OpenAI、通义千问、文心一言、Llama3、Claude等15+主流大模型,一套代码无缝切换。

3. 声明式开发,效率极高

AiServices让开发者只需定义接口加注解,框架自动生成实现。告别冗余的模板代码。

4. 模块化可插拔架构

对话、记忆、文档加载、切片、向量存储、工具调用组件完全解耦,按需组合。

5. 全场景能力覆盖

原生支持RAG、流式对话、多轮记忆、函数调用、Agent智能编排、文档解析。

6. 与Spring生态完美融合

提供Spring Boot Starter,完美融入Java主流技术栈。

7. 社区活跃,迭代快速

自2023年初启动以来,社区持续活跃。2026年已发布1.14.0、1.15.1等多个版本。

缺点

1. 学习曲线较陡

需要理解LLM应用开发的新概念:Prompt模板、记忆管理、工具调用、RAG、Agent等。相比Spring AI,LangChain4j配置更多、学习曲线更陡,但胜在能拿捏细节、掌控力拉满。

2. 版本迭代快,存在破坏性变更

版本更新频繁可能导致API变化,升级时需要关注Release Notes。

3. 官方文档不够完善

有开发者反映"根本找不到关键内容的官方文档,该有的重要内容是一点都不介绍"。

4. 部分高级功能仍在开发中

虽然核心功能已经就位,但部分功能还在开发中。

七、LangChain4j vs Spring AI

很多开发者会纠结:到底选Spring AI还是LangChain4j?

对比维度 Spring AI LangChain4j
核心定位 Spring生态的AI基础设施 JVM上的LLM应用开发工具箱
框架依赖 强依赖Spring Boot 不依赖Spring,是通用Java库
功能丰富度 基础功能 功能更丰富、更灵活
学习曲线 较低 较高
适用场景 简单功能、快速接入 复杂工作流、Agent、高级定制

选型建议

  • 如果你是Spring生态的深度用户,刚开始学习AI,推荐先从Spring AI入门,快速完成模型接入
  • 当需要构建复杂的Agent、RAG或工作流 时,推荐LangChain4j
  • 两者也可以混用------在Spring Boot项目中按需使用LangChain4j的特定能力

本质区别:如果说Spring AI是个熟练的装配工,那LangChain4j就更像是个逻辑缜密的架构师。

八、生产避坑指南

有些小伙伴可能会在实践过程中踩坑,这里我整理了几个常见问题:

坑1:工具调用的描述要写清楚

AI能否正确调用工具全看@Tool的描述。描述太模糊,AI可能不知道该在什么时候调用。

坑2:多模型切换时注意配置冲突

当同时配置多个模型提供商时,需要为每个命名模型明确指定provider。

坑3:对话记忆不是历史记录

LangChain4j提供的是"记忆"而非完整"历史记录",记忆会根据算法对历史进行改造。

坑4:模型能力不一致

同一品牌不同型号的能力差别很大,先跑最小可用Demo验证。

坑5:AiMessage.text()为null的情况

在多Agent设置中,当LLM返回纯工具调用响应(无文本内容)时,处理AiMessage的text字段可能抛出NPE。

坑6:依赖版本要匹配

LangChain4j的版本要与后端模型SDK的版本对齐,避免兼容性问题。

更多项目实战在Java突击队网:susan.net.cn/project

九、写在最后

回到最初的问题:Java做AI应用开发,到底该用什么框架?

如果你是一个Java后端开发者,想在Spring Boot项目里快速集成AI能力------LangChain4j是目前最好的选择之一

它不是Python LangChain的简单移植,而是为Java从头设计的、遵循Java编程习惯的AI应用开发框架

它提供统一的API、声明式的AiServices、丰富的组件库、与Spring生态的无缝集成

相关推荐
回家路上绕了弯12 分钟前
为什么 AI 写代码时,总喜欢“防御性编程”?
后端
灯澜忆梦16 分钟前
【Redis中间件】#4 | 进阶数据类型语法
redis·后端
广州山泉婚姻19 分钟前
前后端分离的核心优势
前端·后端
IT_陈寒38 分钟前
Vue的响应式让我加班到凌晨,问题竟出在这个不起眼的地方
前端·人工智能·后端
乱码三千1 小时前
使用 Docker-compose 搭建SRS直播中转服务端
后端·架构·github
y1su1 小时前
【Leetcode】1477. 找两个和为目标值且不重叠的子数组
数据结构·后端·算法·leetcode·职场和发展
愛芳芳1 小时前
Swagger2 多环境动态配置实战指南
java·后端·maven·springboot·swagger
JaguarJack2 小时前
PHP 8.6 只是个小版本,三十项弃用却已在为 PHP 9.0 铺路
后端·php·服务端
BingoGo2 小时前
PHP 8.6 只是个小版本,三十项弃用却已在为 PHP 9.0 铺路
后端·php
Bs_MoneyMagnet5 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计