数据截至 (上游 commit daa7624a2755)
LangChain4j — 架构与原理
30 秒导读: LangChain4j 是一个 Java 库,让你不写调用代码就能用大模型——你只声明一个带注解的 Java 接口,它用 JDK 动态代理生成实现,背后自动串起记忆、RAG、护栏、工具调用和类型化解析。给的是 Java 工程师熟悉的东西:接口、注解、POJO、依赖注入,而不是 Python 那套链式对象。
1. 这是什么(零基础也能懂)
一句话定义。 LangChain4j 是运行在 JVM 上的 LLM 应用开发库,把"调模型"这件事包装成声明一个 Java 接口。
解决什么问题。 假设你要在一个 Spring Boot 服务里加个客服助手。原始做法你得自己干这些活:
- 拼 HTTP 请求体(每家厂商格式不一样);
- 手动维护对话历史,还要防止超出上下文窗口;
- 把知识库检索到的片段拼进 prompt;
- 模型说"我要调
getOrderStatus(12345)",你得解析这段 JSON、反射调用你的方法、把结果再发 回去,循环直到模型不再要工具; - 模型返回一坨自然语言,你还得把它解析成
Order对象。
这五件事,LangChain4j 全部替你做了,代价是你写一个接口。
给谁用。 JVM 上的应用开发者——尤其是 Spring Boot / Quarkus / Helidon / Micronaut 用户,这些框架都有对应的 LangChain4j 集成(依据:README.md:64-69)。
它能做什么(功能清单):
| 能力 | 一句话 |
|---|---|
| 统一模型 API | 换 OpenAI ↔ Anthropic ↔ Ollama 只改依赖和构造器,业务代码不动 |
| AI Services | 带注解的 Java 接口 → 自动生成实现(本库最核心的东西) |
| 聊天记忆 | 按窗口/按 token 数自动裁剪历史,支持多用户隔离 |
| 工具调用 | @Tool 标在普通方法上,自动生成 schema、自动执行、自动回灌 |
| 结构化输出 | 方法返回 Sentiment、List<String>、任意 POJO,自动生成 JSON Schema 并解析 |
| 护栏 Guardrails | 输入拦截 / 输出校验,输出不合格可自动 reprompt 重试 |
| RAG | 摄取流水线(切分 → 向量化 → 入库)+ 检索流水线(改写 → 路由 → 扇出检索 → 融合 → 注入) |
| agentic | 顺序 / 并行 / 并行 mapper / 循环 / 条件 / supervisor 六种多智能体编排,外加自定义 Planner 出口 |
用起来什么样。 这是官方 javadoc 里给的最小例子(langchain4j/src/main/java/dev/langchain4j/service/AiServices.java:99-109):
// 示意,非源码(改写自 AiServices 的 javadoc 示例)
interface Assistant {
String chat(String userMessage); // 一个方法,没有实现
}
Assistant assistant = AiServices.create(Assistant.class, model); // 动态代理生成实现
String answer = assistant.chat("hello"); // 这一行背后是完整的一次 LLM 调用
再进一步,加上注解就能做分类——注意返回类型是枚举,不是 String:
// 示意,非源码(改写自 AiServices 的 javadoc 示例)
enum Sentiment { POSITIVE, NEUTRAL, NEGATIVE }
interface SentimentAnalyzer {
@UserMessage("Analyze sentiment of {{it}}") // {{it}} = 唯一那个参数
Sentiment analyzeSentimentOf(String text); // 返回枚举 → 框架负责让模型只能吐这三个值
}
重点看:返回类型 Sentiment 不是装饰,它是输入——框架会据此生成 JSON Schema 或往 prompt 里追加格式说明,再把模型的回答解析回枚举。
一句话直觉。 把它当成 LLM 世界的 MyBatis / Feign:你写接口 + 注解,它生成代理实现,把"远程调用"的脏活藏起来。区别是 Feign 代理的是 HTTP,它代理的是"一整条 LLM 编排管线"。
顺便澄清一个常见误会。 尽管叫 LangChain4j,它不是 Python LangChain 的 Java 移植;README 明确写了它的 API、内部实现和发布周期都独立(README.md:42-45)。