Skip to content

LangChain4j 的 AI Services、Tools 和 RAG 怎么落位

很多 Java 团队第一次看 LangChain4j,会觉得它有一种很强的“正常 Java 代码感”:

  • 不是先塞给你一整套平台概念
  • 而是先给你接口、注解、组件和可组合能力

这也是它最容易让人上手的地方。

但真正到了项目里,问题很快就会从“能不能跑”变成:

  • AI Services 该放在哪一层
  • Tools 应该暴露什么,不该暴露什么
  • Chat Memory 到底记什么,什么不该交给它记
  • RAG 应该从哪一级开始,不要一上来就把复杂度拉满

如果这些边界不先想清楚,LangChain4j 虽然上手快,项目也一样会很快变乱。

先说结论

更实用的理解方式通常是:

text
LangChain4j 更像一套 Java-first 的 LLM 应用工具箱。
先用 AI Services 把“业务入口”写清楚,
再用 Tools 补动作能力,
用 Chat Memory 处理会话连续性,
最后按项目阶段把 RAG 从 Easy 升到 Naive 或 Advanced。

如果再往实战一点落,可以直接记成下面四句话:

  • AI Services 最适合做应用层 AI 能力入口
  • Tools 最适合暴露受控动作,不适合直接暴露底层资源
  • Chat Memory 解决的是会话连续性,不是业务事实存储
  • RAG 最好分阶段引入,不要把 PoC 做成半个平台

一、先别急着堆能力,先把 LangChain4j 放到正确层级

LangChain4j 容易让人喜欢,是因为它不像有些框架那样一开始就要求你接受很多平台术语。

它更像是在说:

  • 你先把一个 Java 应用里的 AI 能力写出来
  • 然后再决定要不要继续长成更复杂的系统

所以它最适合承担的,通常不是:

  • 企业级 Agent 平台总控层
  • 很重的可视化流程编排平台
  • 大规模多智能体治理平台

而更像:

  • 一个 Java 服务里的 AI 能力组织层
  • 一个独立 AI 微服务的应用开发框架
  • 一个业务 PoC 或第一版可上线能力的实现工具箱

这句话很重要,因为它直接决定了你起步时该把重点放在哪:

  • 不是先研究最复杂的 Agent
  • 而是先把一个面向业务的 AI Service 写得像样

二、AI Services 是最适合大多数团队的第一落点

LangChain4j 里最有辨识度、也最容易落地的一层,就是 AI Services

它最重要的价值,不是“写法优雅”,而是:

  • 让 AI 能力在代码组织上更像普通 Java 服务

你不再需要一上来就在 Controller 里:

  • 手动拼 system prompt
  • 手动拼 user prompt
  • 手动管理上下文
  • 手动解析返回文本

而是更适合把能力表达成:

  • 一个摘要服务
  • 一个问答服务
  • 一个分类服务
  • 一个知识助手服务

一个更像真实业务的起步方式

如果要做企业知识库问答,通常更稳的分层不是:

  • Controller 直接调模型

而更像:

  1. Controller 负责接 HTTP 请求
  2. Application Service 负责业务编排
  3. AI Service 接口负责承载“问答”这类 AI 能力
  4. Tools、Memory、Retriever 作为这层能力的增强组件

一个更贴近业务代码的例子可以写成这样:

java
public interface KnowledgeAssistant {

    @SystemMessage("""
            你是企业知识库助手。
            回答时优先依据检索到的文档。
            如果证据不足,请明确说明不知道,不要编造。
            """)
    String answer(@MemoryId String sessionId, @UserMessage String question);
}

这里最值得注意的不是注解本身,而是这层接口在架构里的位置:

  • 它表达的是“业务能力”
  • 不是底层协议细节

这会让后续的事情都顺很多:

  • 换模型时,不必改调用入口形状
  • 接 Tool Calling 时,不必把代码散到控制器里
  • 接 Chat Memory 或 RAG 时,边界也更容易守住

AI Services 更适合承担什么

最适合放到 AI Services 里的,一般是:

  • 摘要
  • 分类
  • 抽取
  • 知识问答
  • 文案生成
  • 业务 Copilot

这些场景有一个共同点:

  • 入口清晰
  • 交互目标清晰
  • 结果可以围绕一个业务接口收敛

不要把 AI Services 误会成“完整架构”

这是很多人最容易踩的第一个坑。

AI Services 非常适合做高层入口,但它不自动等于:

  • 完整流程编排
  • 全部异常治理
  • 复杂权限校验
  • 业务状态流转

如果一个场景里还包含:

  • 人工审批
  • 多阶段状态切换
  • 多系统事务一致性
  • 明确的回滚与补偿

那这些通常还应该回到普通业务服务里做,而不是全部寄希望于模型调用接口。

三、一个更适合长期维护的最小分层

很多 PoC 一开始都能跑,但半年后开始难维护,通常不是模型能力不够,而是代码结构太随意。

对 LangChain4j 来说,一个很实用的最小分层通常是:

  1. controller:接协议、做参数校验
  2. application service:做业务编排和权限控制
  3. ai service:定义一类 AI 能力接口
  4. tools:承接模型可调用的受控动作
  5. rag/retriever:承接知识检索增强
  6. repository/http client:承接真正的数据访问和外部调用

这个结构的关键不是“层数标准”,而是两条边界:

  • Prompt 不要散落在控制器和定时任务里
  • Tool 不要直接穿透到底层数据库和外部系统

如果你把这两条守住,后面无论是换模型、换向量库,还是引入更复杂的流程,代价都会小很多。

四、Tools 适合暴露“受控动作”,不适合裸露底层能力

LangChain4j 的 Tools 很好用,但它也是最容易被滥用的一层。

很多项目一上来就想把下面这些直接暴露给模型:

  • Repository 查询
  • Mapper 更新
  • 任意 HTTP Client
  • Redis 原子操作
  • 文件删除
  • 订单状态修改

这通常都太危险。

更稳的原则应该是:

  • 暴露“业务动作”
  • 不暴露“底层资源”

也就是不要让模型直接决定怎么操作数据库,而是给它一个边界清晰的方法,比如:

java
class OrderTools {

    @Tool("查询订单当前状态与最近一次物流节点")
    public String getOrderStatus(String orderNo) {
        // 内部可以查 DB、调物流服务、做权限过滤
        return "...";
    }

    @Tool("创建人工客服工单,适用于退款、投诉和异常订单")
    public String createServiceTicket(String orderNo, String reason) {
        // 内部做幂等、审计、参数校验
        return "...";
    }
}

这里更重要的不是 @Tool 注解,而是你暴露出去的是:

  • 已经被业务规则包裹过的动作

而不是:

  • 一个让模型可以自由发挥的底层系统入口

哪些动作比较适合先做成 Tool

通常更适合先暴露的是:

  • 查订单状态
  • 查库存摘要
  • 查用户画像摘要
  • 查知识库片段
  • 创建低风险任务单
  • 触发可审计的只读或弱副作用动作

哪些动作不要轻易直接暴露

要更谨慎的通常是:

  • 直接扣款
  • 直接改库存
  • 直接删数据
  • 直接调用高风险运维接口
  • 跨多个系统的复合事务

如果确实要做,也更适合走:

  • 模型提出建议
  • 应用层做人审或规则校验
  • 最后再执行真正动作

这会比“让模型自己发指令改生产数据”稳得多。

五、Chat Memory 解决的是会话连续,不是事实真相

很多人第一次接触 Chat Memory,很容易把它想成:

  • 一个什么都能记住的长期大脑

但工程里更准确的理解应该是:

  • 它首先解决的是多轮对话如何连续

LangChain4j 官方文档里也把它放在对话连续性这条线上,而不是业务主数据存储线上。

这意味着它很适合存的通常是:

  • 最近几轮对话
  • 本次会话里的短期偏好
  • 当前问答上下文
  • 需要传给下一轮的临时语义信息

但不适合只靠它来存的通常是:

  • 用户账户余额
  • 订单真实状态
  • 合同规则
  • 审批结论
  • 长期业务事实

一个很常见的错误做法

比如用户在对话里说:

  • “帮我查一下昨天那笔退款”

下一轮又说:

  • “那你直接帮我通过吧”

这时 Chat Memory 可以帮你记住“前文说的是哪笔退款”,但不能替代:

  • 权限校验
  • 审批规则判断
  • 真实订单状态查询

也就是说:

  • 会话记忆负责连续性
  • 业务事实仍然应该来自数据库、缓存、工作流状态或外部系统

如果把这两件事混在一起,越往后问题越大。

六、RAG 最好按阶段引入,不要一开始就冲高级形态

LangChain4j 在 RAG 上很值得肯定的一点,是它把复杂度层级区分得比较清楚。

官方文档把它拆成:

  • Easy RAG
  • Naive RAG
  • Advanced RAG

这不是为了多造概念,而是在提醒你:

  • RAG 不是只有“一种正确做法”

1. Easy RAG:适合 PoC 和教学验证

这层最适合:

  • 先把文档喂进去
  • 先把检索增强问答跑通
  • 先验证知识库问答是不是有业务价值

它的优点很直接:

  • 成本低
  • 上手快
  • 很快就能看到结果

它的边界也很直接:

  • 可控性有限
  • 难以细调召回质量
  • 对分块、过滤、重排和多路数据控制不够细

所以更适合:

  • Demo
  • PoC
  • 培训
  • 内部试点

2. Naive RAG:适合第一版可上线服务

当你已经开始关心下面这些问题时,通常就进入 Naive RAG 区间了:

  • Embedding 模型选哪个
  • 向量库怎么选
  • 召回几条更合适
  • 相似度阈值怎么定
  • 不同租户怎么隔离
  • 元数据过滤怎么做

这个阶段更像真实项目的第一版:

  • 有明确数据源
  • 有明确召回范围
  • 有一定准确率要求
  • 还没复杂到需要很多检索链路编排

很多企业知识库问答、内部文档助手,长期都会停在这个层级,而且完全够用。

3. Advanced RAG:适合复杂知识检索系统

当你的问题已经从“查得到”升级成“查得准、查得稳、查得可控”时,才更接近 Advanced RAG

这时你更可能关心的是:

  • Query Transform
  • Query Router
  • 多路检索聚合
  • 重排
  • 注入策略
  • 多知识源协同

这通常意味着你的系统已经不是单一知识库助手,而更像:

  • 多领域知识平台
  • 多数据源企业搜索助手
  • 高准确率要求的专业问答系统

一个更实用的落地顺序

如果你不想一开始就把项目复杂度做爆,一个很稳的顺序通常是:

  1. 先用 Easy RAG 验证值不值得做
  2. 再用 Naive RAG 做第一版线上能力
  3. 只有当召回质量和链路复杂度真的上来时,再进入 Advanced RAG

这个顺序往往比“一上来就追求最先进 RAG 架构”更接近真实团队的演进方式。

七、把它放进真实项目里,最常见的起步路线是什么

如果你现在就要在 Java 项目里引入 LangChain4j,一个更稳的起步路线通常是:

第一步:先做一个清晰的 AI Service

先选一个边界明确的小场景,例如:

  • 工单摘要
  • 报表解释
  • 知识问答
  • 文本分类

先把接口形状、Prompt 风格和返回结果稳定下来。

第二步:再补一两个低风险 Tool

例如:

  • 查订单摘要
  • 查用户最近操作
  • 查知识条目

优先选择只读或低风险动作,先把模型可调用能力接起来。

第三步:如果是多轮场景,再引入 Chat Memory

不是所有场景都一开始需要记忆。

如果只是单次摘要、单次抽取、单次分类,其实完全可以先不接。

只有在下面这些场景里,记忆价值才会明显:

  • 连续问答
  • 客服助手
  • 业务 Copilot
  • 需要记住上文目标的复杂对话

第四步:最后再决定 RAG 的级别

不要在“是否要做知识库问答”都还没验证时,就先搭一套很重的向量化和检索体系。

先验证:

  • 用户是否真的会问知识问题
  • 现有文档是否足够支撑回答
  • 检索增强是否显著提升效果

这些结论跑出来之后,再决定 RAG 要走到哪一级。

八、LangChain4j 最常见的几个落坑点

1. 把 Prompt 散落到各层

Controller 一段、Service 一段、工具里再补一段,这会让系统很快变得不可维护。

更稳的做法是:

  • 把一类 AI 能力收敛到一组 AI Services

2. 把 Tool 当成底层资源直通车

这会让模型拥有过大的执行权限,也会让权限、审计、幂等、异常处理全部失控。

更稳的做法是:

  • 只暴露业务封装后的动作

3. 把 Chat Memory 当数据库

记忆能帮助对话连续,但不能保证业务事实正确,更不能替代正式状态存储。

4. PoC 跑通后直接原样上线

PoC 阶段能接受的很多东西,线上都不够稳,比如:

  • 没有审计
  • 没有兜底
  • 没有结构化结果约束
  • 没有质量评估
  • 没有召回观察指标

5. 一开始就追高级 RAG 形态

很多团队不是做不出 RAG,而是过早做复杂 RAG,结果业务价值还没验证,系统复杂度已经先膨胀了。

九、什么时候优先选它,什么时候不要勉强选它

LangChain4j 很适合:

  • 快速做 Java 侧 AI 原型
  • 做一个独立 AI 微服务
  • 用接口方式组织 AI 能力
  • 先把 Tools、Memory、RAG 组合出第一版业务能力

但下面这些场景里,你要额外判断:

  • 团队非常强调 Spring Boot 统一抽象和自动配置
  • 需要和现有 Spring 观测体系深度对齐
  • 需要多 Agent 编排、Graph 运行时和平台治理

这时你可能会分别更偏向:

  • Spring AI
  • Spring AI Alibaba

这不代表 LangChain4j 不行,而是:

  • 它更擅长做 Java 应用里的 AI 能力组织
  • 不一定是每个复杂平台问题的第一答案

一句话总结

LangChain4j 最值得采用的地方,不只是“Java 写起来顺手”,而是它很适合把 AI 能力以工程上可接受的方式接进一个应用。

更稳的路线通常不是一上来把所有高级能力都打开,而是:

  • 先用 AI Services 定义业务入口
  • 再用 Tools 补受控动作
  • Chat Memory 处理会话连续
  • 最后按阶段把 RAG 从易到难往上升级

如果你把这四层的职责分清楚,LangChain4j 往往能很快帮你做出第一版真正可用的 Java AI 服务。

参考资料

把零散经验整理成可查、可复用、可持续更新的企业级知识门户