《langchain4j 从零到生产》目录

第 0 章

全书导读——先看地图,再跑环境

本章基线:LangChain4j 1.22.0 + 实验模块 1.22.0-beta32 | JDK 21 | Maven 3.9+ | 最后验证 2026-10-28

本章目标:

  1. 15 分钟内把两个项目跑起来,或者明确知道哪一章可以先跳过
  2. 看懂基础篇、进阶篇、实战篇的依赖关系,自己安排阅读顺序
  3. 认识全系列的写作约定(基线块 / 实测标记 / 坑点表),知道哪些数字可以直接信
  4. 预先踩掉环境层面的高频坑——JDK 版本、API key 欠费、Redis 缺失,本章一次说清

0.1 这套教程给你什么

教程围绕两个可运行的 Spring Boot 项目展开,所有章节的代码都来自它们:

项目 端口 是什么 服务哪些章
smart-doc-assistant 8090 智能文档问答(RAG + Agent,多租户) Ch1~Ch19、Ch21、Ch22(基础篇把它从零搭起来)
hiring-ai-assistant 8091 招聘流程自动化(FSM + 6 Agent + 三护栏 + 自迭代) Ch24/25

全书分三段:

  • 基础篇(Ch1→9):每章一个必备能力,从跑通第一个 AI 接口一路讲到多模态
  • 进阶篇(Ch10→19):两条主线。RAG 主线(Ch10→13)解决“怎么让 AI 答得准、并且知道它到底准不准”;Agent 主线(Ch14→19)解决“怎么让 AI 自己干活、并且干得可控”
  • 横切实战(Ch21/22、Ch24/25):Ch21/22 是防护与可观测两块横切能力,Ch24/25 把前面所有能力组装成一个完整业务系统

全书内容地图:导读与五大板块 25 章 + 配套工程一览

版本口径全系列统一:LangChain4j 用 1.22.0 正式线 + 1.22.0-beta32 实验线(Guardrails、Skills、MCP Server SDK 在实验线里),JDK 推荐 21。

0.2 环境前置

0.2.1 必装

组件 版本要求 说明
JDK 21(推荐) 全书在 21.0.10 上验证;低于 21 编译不过(enforcer 拦下限),更高版本一般也能构建
Maven 3.9+ 两个项目都是标准单模块结构
LLM API Key 任选一家 放 application-local.yml(已被 .gitignore 忽略)

enforcer 只拦下限:低于 21 会报 RequireJavaVersion failed,21 及以上都放行。推荐直接用 21,全书在这版上验证过。机器上装了多个 JDK 时,让 JAVA_HOME 指向 21 再跑 Maven(macOS:export JAVA_HOME=$(/usr/libexec/java_home -v 21))。

0.2.2 按章可选

组件 哪章需要 不装会怎样
Node.js ≥ 18 Ch17、Ch19 MCP demo 服务器起不来;demo-server.mjs 零 npm 依赖,装 Node 即可
MySQL 8 Ch24/25(hiring 项目) hiring 起不来;smart-doc 默认进程内存储,不需要
Redis Ch24 必需(compose 用 redis:7,普通 Redis 够用);Ch11 的 Redis 向量库、Ch5/Ch14 的 Redis 记忆要 Redis Stack(RediSearch / RedisJSON 模块) 普通 Redis 跑向量库和 Redis 记忆会报 unknown command(FT.CREATE / JSON.GET);换 redis/redis-stack-server 镜像,或 smart-doc 加 --chat.memory.backend=memory 绕开
Claude Desktop Ch19.9.2(可选验证) 不装也能用 curl 完成 stdio 模式自测

0.2.3 API Key 放哪

两个项目都从 application-local.yml 读真实 key(模板见 application.yml 的 ${XXX:默认值} 占位)。这个文件已被 .gitignore 忽略,clone 下来需要自己创建一个。全系列实测用过两家:

  • DeepSeek(deepseek-v4-flash):¥1.0/M 输入 + ¥2.0/M 输出,Ch22 有完整成本实测;
  • DashScope qwen(qwen3.7-flash):走 OpenAI 兼容端点。

key 欠费时的报错长这样,见到就该去充值而不是改代码: Access denied, please make sure your account is in good standing。

0.3 五分钟跑通 smart-doc-assistant

git clone <仓库地址> && cd langchain4j-in-production
# 先创建 smart-doc-assistant/src/main/resources/application-local.yml,填入你的 key

cd smart-doc-assistant
mvn spring-boot:run
# 首次启动会下载本地 ONNX 嵌入模型(All-MiniLM-L6-v2,384 维),并自动入库 classpath:docs/ 下的文档

记忆后端默认是 Redis(chat.memory.backend 缺省即 redis)。本机没有 Redis 时加一个参数切到进程内实现:

mvn spring-boot:run \
  -Dspring-boot.run.arguments="--chat.memory.backend=memory"

验证(端口 8090):

curl -s -X POST http://localhost:8090/api/chat \
  -H "Content-Type: application/json" \
  -d '{"sessionId":"first","message":"七天无理由退货的条件是什么?"}'
# → {"answer":"...","inputTokens":...,"outputTokens":...,"totalTokens":...}

hiring 项目(Ch24/25)需要 MySQL + Redis 先就位,启动与 E2E 验证见 Ch24 的 24.8 节,那里有完整实测记录。

0.4 章节地图与学习路径

基础篇(Ch1→9)把 smart-doc-assistant 从空目录一路搭到 v0.7,按序读最省力;有经验的读者可以直接进进阶篇,缺什么回来查。

章 主题 前置 外部服务
Ch1 环境搭建与 Hello World — LLM key
Ch2 AI Services 声明式编程 Ch1 LLM key
Ch3 模型参数与 Prompt Engineering 上一章 LLM key
Ch4 流式输出与 SSE 上一章 LLM key
Ch5 对话记忆 ChatMemory 上一章 LLM key、可选 Redis
Ch6 工具调用 Tools 上一章 LLM key
Ch7 结构化输出 上一章 LLM key
Ch8 Embedding 与语义检索 上一章 无(本地 ONNX 即可)
Ch9 多模态与图像模型 上一章 多模态模型 API(DashScope)

进阶篇与实战篇(Ch10 起)的依赖关系:

进阶篇与实战篇的学习路径:两条主线 + 两个横切 + 一个总装

章 主题 前置 外部服务
Ch10 文档管线(解析/分块/入库) Ch8 无(本地嵌入模型)
Ch11 向量库(选型与切换) Ch10 可选 Redis
Ch12 高级 RAG(父子分块 + 混合检索 + 重排) Ch10、Ch11 LLM key
Ch13 RAG 评估(金标集 + MRR 门禁) Ch12 LLM key
Ch14 Agent 基础(@Tool 与工具循环) Ch6 LLM key
Ch15 Agentic 编排模式(官方六种多 Agent 协作) Ch14 LLM key
Ch16 Agent 工程(动态供给/审计/并发/护栏) Ch14 LLM key
Ch17 MCP 客户端(接外部工具生态) Ch14 Node ≥ 18
Ch18 Skills(按需加载行为手册) Ch14、Ch17 更佳 无
Ch19 MCP 服务端(stdio + Streamable HTTP) Ch17 Node、可选 Claude Desktop
Ch21 Guardrails(输入/输出/工具三层防护) Ch14 无(护栏单测不需要 Spring)
Ch22 可观测性(token 计量 + 成本对账 + 告警阈值) Ch2 LLM key
Ch24/25 企业级实战:招聘自动化全链路 全部 MySQL + Redis

两个“顺序不敏感”的地方:Ch15~18 可以互换顺序(都只依赖 Ch14);Ch21/22 是横切能力,插在主线任意位置读都成立。Ch17/19 是 MCP 的客户端/服务端一对,对照读收获最大。只有 Ch13 建议放在 Ch12 之后立刻读——评估是前面所有优化的裁判,没有它的 MRR 数字,Ch12 里“父子分块更好”就只是一句主张。

0.5 全系列约定

进阶篇与实战篇(Ch10 起)每章开头有一块基线(项目 / 端口 / LangChain4j 版本 / JDK / 最后验证日期),先看它再读正文——版本对不上,某些 API 可能已经变了;基础篇(Ch1~9)不设这块,版本与端口口径统一以本章为准。

正文里的数字分两档,处理方式不同:

  • 实测数字(MRR 0.652、单次成本 ¥0.000285、误杀率 10%):都是标注了日期的真实运行结果,环境是“本项目 + 指定模型”。你换模型、换语料后数字会变,结论的方向通常不变,数值请自己重测;
  • 演示数字(单价表、吞吐估算):来自厂商官网或公开资料,只用于演示公式,用前自己核对。

进阶篇与实战篇每章末尾有坑点表(来自真实踩坑——源码核实、javap 反编译、当天报错,不是“可能遇到的问题”清单)和练习题(分动手和思考两档,动手题都验证过可行);基础篇的坑写在正文对应位置(如 Ch1 的「坑 1~4」小节)。代码块遵守一个硬约束:单行不超过 94 个显示宽度(汉字算 2),保证不横向滚动——这也是你读代码时不用左右拖动的原因。

教学版与生产版的边界在每章单独声明(内存存储、mock 工具、演示单价等)。教学版只证明机制成立,上生产前要按各章“生产建议”逐条补齐。

0.6 常见环境问题速查

症状 原因 处理
构建报 RequireJavaVersion failed JDK 低于 21 JAVA_HOME 指向 21(推荐)或更高版本
启动报 JedisConnectionException 没装 Redis 但配置要连 加 --chat.memory.backend=memory,或装 Redis
调模型报 Access denied ... good standing API key 欠费 去厂商控制台充值;或换另一家 key
启动报 Conflict: multiple HTTP clients MCP 依赖引入了第二个 HTTP SPI 实现 pom 已排除 langchain4j-http-client-jdk,不要删那个 exclusion
POST /api/chat 返回 500 请求体缺 sessionId(@MemoryId 不接受 null) 请求体带上 sessionId 字段
8090/8091 端口被占 上一个实例没退 lsof -ti:8090 | xargs kill 后重启

本章参考

下一站:从 Ch10 文档管线开始,或者直接跳到你需要的章节——每章都是自包含的,缺的前置在“章节地图”里。