从 Java 后端到大模型工程:为什么你的 Agent 一上线就崩?权限与可观测性…
2026/7/21 12:29:55 网站建设 项目流程

《我用Java经验做了次 AI 项目,最先失效的是旧方法》看起来是个大话题,但真落到项目里,常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。

摘要

先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及从哪里动手。

摘要:很多 Java 程序员转做大模型应用时,往往沉迷于 Prompt 工程和 Agent 编排,却忽视了传统软件工程中最基础的权限控制与可观测性。本文复盘了一次真实的联调失败经历,对比 Demo 与生产环境的差异,分享如何利用 Spring AI 等工具链,构建具备生产级健壮性的 AI 应用,并给出具体的排查路径和面试建议。

目录

  • 别再迷信“智能”,先搞定“可控”
  • Java 开发者的天然优势:工程化思维的迁移
  • 实战复盘:一次典型的联调失败与排查路径
  • 学习路线建议:从“调包”到“架构”
  • 面试准备:如何展示你的“工程化”价值
  • 总结

别再迷信“智能”,先搞定“可控”

前阵子,我带着团队的一个内部工具从本地 Demo 走向生产环境,结果栽了一个跟头,这个跟头摔得非常有代表性。

我们在本地调试的时候,Agent 表现完美。它能准确读取用户的历史订单,甚至能根据用户的语气调整回复风格。面试官看了代码,觉得我们用了最新的 LangChain4j,Agent 链路设计得很优雅,当场就给了口头 Offer。

然而,一上线,第二天就被运维报警炸翻了。

问题出在哪?不是模型不准,也不是 Prompt 写得烂。而是一个普通用户,通过构造特定的输入,竟然绕过了一层薄薄的鉴权逻辑,试图让 Agent 去执行“删除所有测试数据”的操作。虽然最终因为数据库没有对应权限没删成,但整个系统日志里一片混乱,我们根本不知道是哪个环节漏掉了校验,也不知道 Agent 到底执行了什么中间步骤。

那一刻我意识到:对于 Java 后端出身的人来说,转做大模型开发,最大的陷阱不是学不会 Python 或 PyTorch,而是习惯性地用写 CRUD 的思维去写 AI 应用。 在 Demo 阶段,我们关注的是“能不能跑通”;在生产阶段,我们必须关注“谁有权跑”、“跑的过程有没有记录”、“失败了怎么兜底”。

这就是为什么我说,权限隔离与可观测性,才是区分 Demo 与生产环境的生死线。

Java 开发者的天然优势:工程化思维的迁移

很多人觉得转 AI 很难,要补大量的数学和算法知识。其实,对于已经深耕多年的 Java 后端来说,真正的壁垒在于工程化落地能力。

大模型应用本质上是“不确定性组件”+“确定性业务逻辑”的组合。

  • 确定性部分:用户鉴权、数据持久化、事务管理、API 网关路由。这正是 Java 生态(尤其是 Spring Boot)的强项。
  • 不确定性部分:LLM 的输出、Embedding 的质量、RAG 的检索精度。这部分需要新的工具链来治理。

我在转型初期,刻意没有去深究 Transformer 的底層原理,而是把精力放在了如何将 LLM 作为一个“黑盒服务”集成到现有的微服务架构中。我发现,Spring AI 和 LangChain4j 这两个框架,很好地继承了我们熟悉的依赖注入和配置管理理念,上手难度远低于从零开始搭 Python 服务。

实战复盘:一次典型的联调失败与排查路径

回到开头提到的那个事故。为了搞清楚责任边界,我们需要重构我们的 Agent 调用链路。

1. 权限边界的重新定义

在旧代码中,我们将权限校验放在 Controller 层。但当 Agent 介入后,中间可能经过多个 Tool Call(工具调用)。如果只在入口处校验,Agent 内部调用的deleteData工具就可能被恶意利用。

修正方案:
将权限校验下沉到每一个具体的 Tool 实现类中,或者使用一个全局的拦截器,在 Tool 执行前进行二次确认。

@Component public class OrderTool implements Tool { @Autowired private PermissionService permissionService; @Tool(description = "根据订单ID获取详情") public String getOrderDetails(@ToolParam("orderId") String orderId) { // 关键改动:每个 Tool 内部独立校验权限,而非依赖外部网关 if (!permissionService.hasReadAccess(CurrentUser.getId(), orderId)) { throw new SecurityException("无权访问该订单"); } // ... 实际的业务查询逻辑 return orderRepository.findById(orderId).toJson(); } }

这种做法虽然增加了少量代码,但保证了最小权限原则在 Agent 内部流转中的严格执行。

2. 可观测性:让“黑盒”变透明

Java 后端最擅长的是 Trace 链路追踪。但在引入 LLM 后,Prompt 发送了什么、Token 消耗了多少、Response 是什么、Retrieval 召回了哪些片段,这些信息往往是分散的。

我们引入了 OpenTelemetry 并结合 Spring AI 的 Tracing 支持,构建了统一的日志视图。

排查路径示例:
当用户反馈“回答错误”时,不再是通过猜测去查日志,而是直接通过TraceID查看完整的调用链:
1. User Input -> Model Input (Prompt 1)
2. RAG Retrieval -> Top 3 Docs (Snippet A, B, C)
3. Model Output -> Thought Process (Thinking Step 1)
4. Tool Call ->get_weather(city="Beijing")
5. Final Answer

如果没有这些细粒度的日志,我们永远不知道是 RAG 召回错了,还是 Model 理解错了,或者是 Tool 执行失败了。

3. 代码块:简单的 Observability 拦截器

为了实现这一层,我们写了一个简单的 AOP 拦截器,记录每次 LLM 调用的元数据:

@Aspect @Component @Slf4j public class LlmObservabilityAspect { @Around("execution(* com.example.service.ChatService.*(..))") public Object traceLlmCalls(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); String traceId = UUID.randomUUID().toString(); log.info("[AI-TRACE] Start call. TraceId: {}, Method: {}", traceId, joinPoint.getSignature().getName()); try { Object result = joinPoint.proceed(); log.info("[AI-TRACE] Success. TraceId: {}, Duration: {}ms", traceId, System.currentTimeMillis() - start); return result; } catch (Exception e) { log.error("[AI-TRACE] Failed. TraceId: {}, Error: {}", traceId, e.getMessage()); throw e; } } }

这段代码看似简单,但它将原本散落在各处的日志串联了起来。在生产环境中,配合 ELK 或 Prometheus,你可以清晰地看到哪些 Prompt 最容易超时,哪些 Tool 报错率最高。

学习路线建议:从“调包”到“架构”

如果你也是 Java 背景,我建议的学习路线如下:

1. 第一阶段:熟悉工具链(1-2 周)
* 重点掌握 Spring AI或LangChain4j。不需要精通底层算法,但要会用它们提供的抽象类去封装 LLM 调用。
* 实践一个简单的 RAG 应用,体验 Embedding 和 Vector Store 的配合。

2. 第二阶段:工程化加固(2-3 周)
* 这是最关键的一步。按照上面的复盘,给你的应用加上严格的权限校验、输入过滤(防止 Prompt Injection)、结构化输出校验(JSON Schema)。
* 搭建基本的监控看板,关注 Token 成本和响应延迟。

3. 第三阶段:复杂场景优化(持续)
* 研究多 Agent 协作(Multi-Agent),这时候你会发现,Agent 之间的通信协议、状态管理比单个 Agent 更难。
* 探索 Finetuning(微调)在特定垂直领域的适用性,以及何时该用 RAG,何时该用微调。

面试准备:如何展示你的“工程化”价值

在面试中,不要只说“我做了个 Chatbot”。面试官更想听的是:

  • 如何处理幻觉? 比如:“我们通过引入 ReAct 模式,让模型在不确定时先查询知识库,而不是凭空捏造。同时,我们在输出层加了 JSON Schema 校验,确保数据结构符合预期。”
  • 如何保证安全? 比如:“我们实现了基于 RBAC 的工具调用权限控制,每个 Tool 都有独立的鉴权逻辑,防止越权操作。”
  • 如何优化成本? 比如:“我们通过缓存常见的 Embedding 结果,并将短上下文请求路由到 cheaper 的模型,长上下文才走 expensive 模型,从而降低了 30% 的 API 费用。”

这些答案背后,体现的是一个成熟后端工程师对稳定性、安全性、成本的思考,这才是你区别于纯算法工程师或初级 AI 应用开发者的核心竞争力。

总结

从 Java 后端转向大模型开发,不是抛弃过去的经验,而是将过去的工程化能力应用到新的领域。

Demo 跑通只是起点,权限、日志、可观测性才是生产环境的护城河。

不要急于追求 Agent 的“智能”上限,先把它做“稳”。当你能够熟练地在一个复杂的微服务架构中,安全、可控、可观测地嵌入 LLM 能力时,你就真正完成了这次职业升级。这条路,比单纯学几个新框架要宽广得多。

资料展示

下面是我整理的AI大模型学习资料和工具包预览,适合收藏后按主题逐步学习。

如果你想看完整资料目录,可以在评论区留言「资料」;也欢迎告诉我你更关注AI大模型里的哪类内容。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询