当前位置: 首页 > news >正文

LangChain4j 入门教程

一、LangChain4j 和Spring AI 什么关系

1.1回顾:Spring AI 擅长什么

Spring AI 的核心设计哲学是统一抽象—— 无论底层是 OpenAI、DeepSeek 还是通义千问,上层代码保持一致。它的优势非常明显:

  • 与 Spring 生态无缝集成

  • 多模型切换成本极低

  • 自动配置,开箱即用

但是,Spring AI 在复杂 Agent 逻辑编排方面并不是最擅长的。当你的任务是:

  • 让 AI 自主分解一个多步任务,逐步执行

  • 多个 AI 角色协作完成一个复杂工作流

  • 精细控制每一步的推理过程和工具调用决策

Spring AI 能做,但代码会写得比较“重”,很多底层需要自己搭建。而 LangChain4j 正是在这个方向深耕,提供了更完整的 Agent 开发工具链。

1.2 LangChain4j 是什么

LangChain4j 是一个专为 Java 设计的 LLM 应用开发框架,2023 年开源。它灵感来自 Python 的 LangChain,但不是简单移植——结合了 Java 语言特性做了大量重新设计。

GitHub: https://github.com/langchain4j/langchain4j

官网文档地址:https://docs.langchain4j.dev/

核心特点

1. @AiService:最优雅的 AI 接口定义方式

这是 LangChain4j 最有特色的设计。你只需要定义一个 Java 接口,加几个注解,框架就帮你生成实现。

@AiService interface CustomerServiceAgent { @SystemMessage("你是一个专业客服,只回答产品相关问题") String chat(String userMessage); }

就这几行代码,一个带角色设定的 AI 服务就好了。后面会专门讲解@AiService的威力。

2. Agent 工具链完整

工具定义、执行循环、多步推理、Human-in-the-loop 等能力都有成熟实现,不需要自己造轮子。

3. 支持主流模型和向量库

模型:OpenAI、Anthropic、通义千问、DeepSeek、Ollama……
向量库:PGVector、Qdrant、Milvus、Chroma…… 覆盖面和 Spring AI 不相上下。

1.3 Spring AI vs LangChain4j:到底怎么选?

维度Spring AILangChain4j
定位Spring 官方,统一模型抽象专注 LLM 应用和 Agent 开发
Spring 集成原生支持有官方 Spring Boot Starter
Agent 能力基础 Function Calling完整 Agent 工具链
@AiService核心特性
RAG 管道完整完整,架构略有不同
多模型切换非常方便也支持
社区生态Spring 官方背书活跃独立社区
学习曲线Spring 开发者很低也较低,有 Spring Starter

选型建议

  • 需要快速接入大模型到已有 Spring 项目→ Spring AI

  • 需要构建复杂 Agent 工作流→ LangChain4j

两者不是竞争关系,可以共存于同一项目
很多企业级项目两个都用:Spring AI 处理简单模型调用,LangChain4j 处理复杂 Agent 逻辑。

二、快速上手:从零搭建 Spring Boot + LangChain4j

2.1 创建项目

使用 Spring Initializr,选择:

  • Java 21

  • Spring Boot 3.x

  • 依赖:Spring Web

结构如下:

创建langchain4j模块来跑通第一个langchain4j 应用

2.2引入pom依赖

<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.14</version> <relativePath/> </parent> <groupId>com.studying</groupId> <artifactId>langchain4j</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>21</java.version> <!-- LangChain4j 最新稳定版2026/05/02,使用 OpenAI 兼容接口对接通义千问 --> <langchain4j.version>1.14.0</langchain4j.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-bom</artifactId> <version>${langchain4j.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- LangChain4j Spring Boot Starter(核心 + 自动配置) --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-spring-boot-starter</artifactId> </dependency> <!-- OpenAI 模块——通义千问提供 OpenAI 兼容接口,通过 base-url 指向 DashScope --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> </project>

2.3 配置application.yml

langchain4j: open-ai: # base-url 必须写在每个子节点下,顶层写不生效(Starter 不读) chat-model: base-url: https://dashscope.aliyuncs.com/compatible-mode/v1 api-key: ${DASHSCOPE_API_KEY} # 从环境变量读,不要硬编码 model-name: qwen-max temperature: 0.7 max-tokens: 2048 streaming-chat-model: base-url: https://dashscope.aliyuncs.com/compatible-mode/v1 api-key: ${DASHSCOPE_API_KEY} model-name: qwen-max

2.4第一个对话——最简单的方式

最简单的用法——直接注入ChatModel并调用:

package com.stduying.controller; import dev.langchain4j.model.chat.ChatModel; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/chat") public class SimpleChatController { private final ChatModel chatModel; public SimpleChatController(ChatModel chatModel) { this.chatModel = chatModel; } @GetMapping public String chat(@RequestParam String message) { return chatModel.chat(message); } }

2.5 流式输出

LangChain4j 使用回调接口实现流式输出,配合 Spring 的SseEmitter

package com.stduying.controller; import dev.langchain4j.model.chat.StreamingChatModel; import dev.langchain4j.model.chat.response.ChatResponse; import dev.langchain4j.model.chat.response.StreamingChatResponseHandler; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @RestController @RequestMapping("/chat") public class StreamingChatController { private final StreamingChatModel streamingChatModel; public StreamingChatController(StreamingChatModel streamingChatModel) { this.streamingChatModel = streamingChatModel; } @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter streamChat(@RequestParam String message) { SseEmitter emitter = new SseEmitter(60_000L); streamingChatModel.chat(message, new StreamingChatResponseHandler() { @Override public void onPartialResponse(String partialResponse) { try { emitter.send(partialResponse); } catch (Exception e) { emitter.completeWithError(e); } } @Override public void onCompleteResponse(ChatResponse completeResponse) { emitter.complete(); } @Override public void onError(Throwable error) { emitter.completeWithError(error); } }); return emitter; } }

2.6对比 Spring AI 的集成方式

Spring AI

LangChain4j

ChatModel

ChatModel

StreamingChatModel(返回Flux)

StreamingChatModel(回调方式)

SystemMessageUserMessageAssistantMessage

SystemMessageUserMessageAiMessage

spring.ai.xxx

langchain4j.open-ai.xxx(DashScope 走兼容接口)

ChatClient流式 Builder

@AiService接口注解

最大的区别马上就来。建立 LangChain4j 的整体认知地图,有了这张图再看后面每节才不会迷失。

三、核心概念全览——LangChain4j 的认知地图

3.1 LangChain4j 的整体架构

3.2 ChatModel——模型调用的核心接口

public interface ChatModel { String chat(String userMessage); ChatResponse chat(ChatRequest request); }

最底层的接口,直接和大模型 API 通信。实际开发中很少直接用它,更多是通过上层@AiService或 Agent 间接使用。

LangChain4j 支持的模型(部分):

模型

Starter

通义千问(DashScope OpenAI 兼容)

langchain4j-open-ai-spring-boot-starter+ base-url

OpenAI / DeepSeek

langchain4j-open-ai-spring-boot-starter

Anthropic Claude

langchain4j-anthropic-spring-boot-starter

Ollama(本地)

langchain4j-ollama-spring-boot-starter

Google Gemini

langchain4j-google-ai-gemini-spring-boot-starter

3.3 @AiService——AI 接口层

这是 LangChain4j 最有特色的设计,也是后面用得最多的。

核心思路:用 Java 接口定义 AI 能力,框架自动生成实现。这是 LangChain4j 设计最优雅的地方

// 1. 定义接口 @AiService interface TechAssistant { @SystemMessage("你是一个 Java 技术助手,只回答 Java 相关问题,用简洁的语言回答") String chat(String question); @SystemMessage("你是一个代码审查专家") CodeReviewResult reviewCode(@UserMessage String code); } // 2. 注入使用(LangChain4j 自动生成实现) @Autowired TechAssistant techAssistant; // 3. 调用 String answer = techAssistant.chat("什么是 Spring AOP?");

3.4 Tools——工具体系

工具让模型能调用外部能力——查天气、查数据库、发邮件……

@Component public class WeatherTools { @Tool("查询指定城市的实时天气") public String getWeather(String city) { // 调用天气 API return city + ":晴天,18°C,微风"; } @Tool("查询汇率") public double getExchangeRate(String from, String to) { // 调用汇率 API return 7.24; } }

3.5 ChatMemory——对话记忆

没有记忆的 AI 每次都当第一次见面,用户体验很差。LangChain4j 提供了ChatMemory管理对话历史:

// 消息窗口记忆:保留最近 N 条消息 ChatMemory memory = MessageWindowChatMemory.withMaxMessages(10); // Token 窗口记忆:按 Token 数量限制,不超过上下文窗口 ChatMemory memory = TokenWindowChatMemory.withMaxTokens(4096, tokenizer);

配合@AiService使用:

@AiService interface ChatService { @SystemMessage("你是一个友好的助手") String chat(@MemoryId String sessionId, @UserMessage String message); // ↑ 用 sessionId 区分不同用户的对话历史 }

3.6 RAG Pipeline——检索增强生成

让模型能回答私有知识库里的问题。LangChain4j 的 RAG 分两条管道:

Ingestion Pipeline(入库管道):

原始文档(PDF/Word/TXT) → DocumentLoader(加载) → DocumentTransformer(分块) → EmbeddingModel(向量化) → EmbeddingStore(存入向量库)

Retrieval Pipeline(检索管道):

用户问题 → EmbeddingModel(向量化问题) → EmbeddingStore(相似度检索) → ContentRetriever(取回文档片段) → RetrievalAugmentor(注入 Prompt 上下文) → ChatModel(带上下文回答)

3.7 Agent——自主推理执行

Agent 是把上面所有组件组合起来,形成一个能自主推理、调工具、多步执行的系统。鸡哥认为这是整个模块四最重要的部分,前面讲的所有组件最终都是为 Agent 服务的。

用户输入 ↓ Think(推理:我需要什么信息/操作) ↓ Act(行动:调用工具或 RAG 检索) ↓ Observe(观察:看工具返回了什么) ↓ Think(再次推理:够了吗?还需要什么?) ↓ ...循环直到有足够信息... ↓ Answer(最终答案)

LangChain4j 的 Agent 实现:

// Agent 需要:模型 + 工具 + 记忆 Agent agent = AiServices.builder(Agent.class) .chatModel(chatModel) .tools(weatherTools, searchTools, calculatorTools) .chatMemory(MessageWindowChatMemory.withMaxMessages(20)) .build();

3.8各组件的关系总结

组件

类比

核心职责

ChatModel

数据库连接

和模型 API 通信的底层接口

@AiService

DAO 接口

声明式定义 AI 能力,框架生成实现

Tools

服务方法

给模型提供调用外部系统的能力

ChatMemory

Session

管理多轮对话历史

EmbeddingStore

向量数据库

存储和检索向量化的知识

Agent

业务服务

组合所有组件,自主完成复杂任务

http://www.jsqmd.com/news/742865/

相关文章:

  • 从实验室原型到北斗三号量子加密车载终端:C语言跨平台调试的4层抽象泄漏与3次重构血泪教训
  • 基于 GitHub Actions 的自动化工作流实践:从代码检查到发布部署
  • 如何管理Taotoken平台上的API密钥并设置访问控制与审计
  • YOLO11性能暴增:Backbone换血 | 引入ShuffelNetV2极速主干,针对通道打乱机制进行YOLO适配,提速首选
  • 拯救你的Dell G15:开源温度控制软件TCC-G15全面评测与使用指南
  • SNIP框架:动态混合精度训练优化大模型计算效率
  • 用Python和Logisim仿真,5分钟搞定三人表决电路(附保姆级教程)
  • Go协程池gortex实战:高并发任务管理与内存优化指南
  • 从PLC握手到电子锁上锁:一文拆解CCS2直流充电的完整信号交互流程
  • 初次接入Taotoken后从控制台获取并管理API Key的完整步骤
  • BBDown:命令行玩家的终极B站视频下载解决方案
  • HPH内部结构拆解指南
  • 在 OpenClaw Agent 工作流中接入 Taotoken 实现多模型调度
  • 2026成都旧沙发翻新厂家怎么选:成都上门维修沙发、成都沙发翻新、成都真皮沙发维修、旧沙发翻新上门服务、沙发上门维修选择指南 - 优质品牌商家
  • 如何用400+免费RPG Maker插件快速打造专业级游戏:从新手到高手的完整指南
  • 告别‘系统找不到指定的文件’:Windows下用MinGW搞定GCC和Make的完整配置流程
  • ARM Cortex-A35调试组件识别寄存器详解
  • Vim横向导航优化:sideways.vim插件实现参数级跳转与交换
  • 告别启动失败:手把手教你用mkimage为ARM Linux内核制作正确的uImage(附64字节头详解)
  • 通过Taotoken管理控制台精细化管控API Key的访问权限
  • CAN与CANopen技术:工业控制与汽车电子的核心通信方案
  • MITS算法:动态采样优化PMI计算效率
  • HPH高压加热器构造全解析
  • 本地化AI编程:用Ollama与Cursor构建离线代码助手
  • 用快马AI十分钟搭建科幻感反重力官网原型,悬浮动效一键生成
  • 量子退火原理、应用与混合优化架构解析
  • ESP8266刷机避坑指南:手把手教你用CH340给智能插座烧录固件
  • 2026成都公司注册服务机构优质推荐榜:成都代理记账报税/成都代理记账收费标准/成都代理记账服务/成都代理记账机构/选择指南 - 优质品牌商家
  • 2026年5月阿里云如何部署Hermes Agent/OpenClaw?百炼token Plan配置全解析
  • 在Ubuntu 22.04上用Conda虚拟环境搞定Drake机器人库(附VSCode配置避坑)