首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java + AI:在企业级应用中集成大模型的工程实践

Java + AI:在企业级应用中集成大模型的工程实践

原创
作者头像
资源大佬 jzit-top
发布于 2026-10-09 17:44:04
发布于 2026-10-09 17:44:04
510
举报

Java 长期占据企业级后端主流,而 AI 能力正在成为业务系统的标配。如何在 Spring 生态中优雅地集成大模型,兼顾可观测、可降级、可扩展,是 Java 工程师必须掌握的新技能。本文以 Spring Boot 3 + Spring AI 为主线,结合原生 HTTP 调用与向量检索,给出可落地的代码骨架。

一、技术选型

Java 集成 AI 有三条路径:

  • Spring AI:Spring 官方抽象,统一 ChatClient、Embedding、VectorStore,适合标准场景。
  • LangChain4j:功能丰富,支持 RAG、Agent、工具调用,社区活跃。
  • 原生 HTTP:用 WebClient 直接调 OpenAI 兼容接口,最灵活,适合定制协议。

生产项目推荐 Spring AI 打底,特殊需求用原生补位。

二、Maven 依赖

代码语言:javascript
复制
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  <version>1.0.0-M4</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

配置 application.yml:

代码语言:javascript
复制
spring:
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      base-url: https://api.openai.com
      chat:
        options:
          model: gpt-4o-mini
          temperature: 0.2

三、基础对话服务

封装一个可注入的 ChatService,统一处理超时、重试与审计:

代码语言:javascript
复制
@Service
public class ChatService {

    private final ChatClient chatClient;
    private final MeterRegistry metrics;

    public ChatService(ChatClient.Builder builder, MeterRegistry metrics) {
        this.chatClient = builder
            .defaultSystem("你是企业客服助手,仅依据事实回答。")
            .build();
        this.metrics = metrics;
    }

    public String ask(String question) {
        Timer.Sample sample = Timer.start(metrics);
        try {
            String answer = chatClient.prompt()
                .user(question)
                .call()
                .content();
            metrics.counter("ai.chat.success").increment();
            return answer;
        } catch (Exception e) {
            metrics.counter("ai.chat.failure").increment();
            throw new AiInvocationException("模型调用失败", e);
        } finally {
            sample.stop(metrics.timer("ai.chat.latency"));
        }
    }
}

ChatClient 由 Spring AI 自动装配,天然支持流式输出、结构化输出与函数调用。

四、结构化输出:从自由文本到 Java 对象

企业系统要的不是散文,而是可入库的数据。用 BeanOutputConverter 让模型直接返回 JSON 并映射为对象:

代码语言:javascript
复制
public record TicketResult(String category, String priority, String summary) {}

@Service
public class TicketClassifier {

    private final ChatClient chatClient;
    private final BeanOutputConverter<TicketResult> converter =
        new BeanOutputConverter<>(TicketResult.class);

    public TicketClassifier(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    public TicketResult classify(String content) {
        String prompt = """
            对以下工单进行分类,类别限定为 [退款, 物流, 技术, 其他],
            优先级限定为 [P0, P1, P2],并给出20字内摘要。
            工单内容:%s
            %s
            """.formatted(content, converter.getFormat());
        return chatClient.prompt().user(prompt).call()
            .entity(converter);
    }
}

调用侧只处理强类型对象,避免手动解析 JSON 带来的脆弱性。

五、RAG:接入私有知识库

企业问答的准确率依赖检索增强。Spring AI 提供 VectorStore 与 EmbeddingModel:

代码语言:javascript
复制
@Service
public class KnowledgeService {

    private final VectorStore vectorStore;
    private final ChatClient chatClient;

    public KnowledgeService(VectorStore vectorStore, ChatClient.Builder builder) {
        this.vectorStore = vectorStore;
        this.chatClient = builder.build();
    }

    public void ingest(List<Document> docs) {
        vectorStore.add(docs);
    }

    public String ask(String question) {
        List<Document> docs = vectorStore.similaritySearch(
            SearchRequest.query(question).withTopK(5));
        String context = docs.stream()
            .map(Document::getContent)
            .collect(Collectors.joining("\n"));
        return chatClient.prompt()
            .system("仅根据以下上下文回答,不确定则说不知道:\n" + context)
            .user(question)
            .call()
            .content();
    }
}

向量库可选 PGVector、Redis、Milvus,生产环境建议独立部署并做租户隔离。

六、函数调用:让模型操作业务系统

模型本身不能改数据库。用 @Tool 或 FunctionCallback 暴露受控接口:

代码语言:javascript
复制
@Component
public class OrderTools {

    private final OrderRepository repo;

    public OrderTools(OrderRepository repo) { this.repo = repo; }

    @Tool(description = "根据订单号查询订单状态")
    public OrderStatus queryOrder(@ToolParam String orderId) {
        return repo.findById(orderId)
            .map(o -> new OrderStatus(o.getId(), o.getStatus()))
            .orElseThrow(() -> new NotFoundException(orderId));
    }
}

注册后,模型可自主决定何时调用,但权限白名单与幂等键仍由 Java 层控制。

七、生产化要点

  1. 降级:模型超时或限流时返回缓存答案或转人工,避免阻塞主链路。
  2. 可观测:记录 token 用量、延迟、成功率,接入 Micrometer 与 Prometheus。
  3. 成本控制:小模型分类、大模型生成,相同问题走缓存。
  4. 安全:提示词注入防护、输出内容过滤、敏感操作二次确认。
  5. 异步:批量任务用 @Async 或消息队列,避免占用 Web 线程。

总结:Java 集成 AI 的关键不是调用 API,而是把模型当作一个不可靠的外部依赖来治理。用 Spring AI 统一抽象,用强类型约束输出,用 RAG 补充事实,用工具调用打通业务。代码结构清晰,边界明确,AI 才能真正进入企业生产环境。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、技术选型
  • 二、Maven 依赖
  • 三、基础对话服务
  • 四、结构化输出:从自由文本到 Java 对象
  • 五、RAG:接入私有知识库
  • 六、函数调用:让模型操作业务系统
  • 七、生产化要点
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档