很多 Java 工程师对 AI 应用的第一反应是「要学 Python」。但企业级 AI 应用的核心工作其实是工程:鉴权、限流、可观测、数据管道——这些恰恰是 Java 生态的主场。Spring AI 把模型调用变成了普通的依赖注入。

五分钟接入大模型

Spring AI 抽象了 ChatModel 接口,切换模型供应商只需要换 starter 和配置,业务代码零改动。这层抽象在「供应商比价」场景下价值巨大。

java
1@RestController2public class ChatController {34    private final ChatClient chatClient;56    public ChatController(ChatClient.Builder builder) {7        this.chatClient = builder8                .defaultSystem("你是一个严谨的技术支持助手,只依据提供的资料回答")9                .build();10    }1112    @PostMapping("/api/chat")13    public Flux<String> chat(@RequestBody ChatRequest request) {14        return chatClient.prompt()15                .user(request.question())16                .stream()17                .content();18    }19}

RAG:让模型基于私有知识回答

通用大模型不了解你的业务文档,直接问会「一本正经地胡说八道」。RAG 的思路是先检索、再生成:把文档向量化入库,提问时先取最相关的片段,作为上下文交给模型。

文档切分与向量化

切分策略直接决定回答质量。我们踩过的坑是固定长度切分把表格和代码拦腰截断,后来改为按标题层级 + 段落边界切分,单块不超过 800 token,相邻块保留 15% 重叠。

java
1@Bean2public TokenTextSplitter textSplitter() {3    return new TokenTextSplitter(4            800,   // 默认每块最大 token5            120,   // 最小块大小6            15,    // 重叠比例(%)7            5000,  // 单文档最大块数8            true); // 保留分隔符9}1011public void importDocs(List<Document> docs) {12    List<Document> chunks = textSplitter.apply(docs);13    vectorStore.add(chunks); // 自动向量化并写入 pgvector14}

检索问答链路

检索阶段用 QuestionAnswerAdvisor 一行接入:它自动把用户问题向量化、查询向量库、把结果模板化注入 prompt。我们在此基础上加了 rerank:先粗排取 top20,再精排取 top5,回答准确率提升了 11 个百分点。

工程化的三个必修课

  • 评估先行:建立 100 条标注问答对作为回归测试集,任何 prompt / 模型变更都必须跑评估,准确率下降就回滚。
  • 成本防御:按用户维度做 token 限额与限流,对长上下文请求做截断降级,防止账单失控。
  • 全链路观测:把 prompt、检索结果、模型响应、耗时与 token 用量全部落结构化日志,排障和迭代优化都依赖它。
AI 应用 80% 的工作量和传统后端一样:设计好接口边界、做好失败兜底、建立可量化的评估。模型只是其中一个会说不确定话的下游依赖。