
大家好我是Java1234_小锋老师。过去两年大家聊 AI 应用开口闭口都是 Python。Java 这边其实也没闲着。Quarkus 把大模型、RAG、工具调用和 MCP 直接嵌进了熟悉的开发体验里写起来很像在写一个普通的 CDI 服务。先认识一下 QuarkusQuarkus 是面向云原生的 Java 框架口号很直白给 Java 开发者一套更轻、更快、更适合容器的开发方式。它在构建期就把大量工作做完启动快、内存占用低还能打成 GraalVM Native Image。日常开发里热部署、Dev UI、统一配置这些东西用过一次就很难回去。很多人第一次接触 Quarkus是冲着“微服务启动只要几十毫秒”去的。这几年它的重心已经不只是快而是把 Java 生态里那些常用能力REST、反应式、消息、安全、数据访问都收成一套一致的扩展模型。你加一个扩展配置几行属性剩下的交给框架。Quarkus 把云原生 Java 和大模型能力接到了一起。AI 到来之后这套思路被原封不动地带了过来。接入大模型不再是先搭一套 Python 服务再让 Java 去 HTTP 调用你可以直接在 Quarkus 应用里声明一个 AI 服务像注入普通 Bean 一样用它。为什么是 Quarkus 做 AIJava 做 AI以前总有点“隔了一层”的感觉模型在外面业务在里面两边靠 REST 硬连。Quarkus 走的是另一条路核心是 Quarkus LangChain4j 扩展。它把 LangChain4j 的能力收进 Quarkus 的扩展体系里常见能力大致就这几块声明式 AI Service一个接口加上注解就能对话、摘要、分类多模型接入OpenAI、Azure OpenAI、Ollama、Hugging Face 等换模型主要是改配置Tools / Function Calling模型可以调用你写好的 Java 方法RAG把文档检索和大模型拼在一起回答能落到自家资料上MCP用标准协议发现和调用外部工具可观测性日志、指标、链路跟踪跟着 Quarkus 那套走Native ImageAI 应用也能打成原生镜像启动仍然很快AI Service、RAG、Tools、MCP是现在这套能力的四块底座。一次典型的调用大概是这样查文档查系统查外部服务直接回答用户提问AI Service需要业务数据?RAG 检索本地 ToolMCP 工具大模型生成返回结果看着复杂落到代码上其实就几个注解。下面按使用顺序过一遍。声明式 AI Service写接口就能对话这是最容易上手的一层。你不用自己拼 Prompt、不用自己管理 HTTP 客户端定义一个接口就行。/** * 客服助手负责回答用户的自然语言问题。 */RegisterAiServicepublicinterfaceCustomerAssistant{/** * 与用户对话返回模型生成的回复。 */SystemMessage(你是电商客服回答要简洁不确定的事情不要编造。)Stringchat(UserMessageStringquestion);}配置也集中在application.properties里本地用 Ollama、线上切 OpenAI通常不用改 Java 代码# 本地开发可以用 Ollama quarkus.langchain4j.ollama.chat-model.model-namellama3.1 quarkus.langchain4j.ollama.chat-model.temperature0.2REST 层注入就能用和普通业务服务没有两样/** * 对外提供对话接口。 */Path(/chat)publicclassChatResource{InjectCustomerAssistantassistant;/** * 接收用户问题并返回 AI 回复。 */POSTpublicStringask(Stringquestion){returnassistant.chat(question);}}第一次写的时候会有点不习惯一个没有实现类的接口居然就能聊天。后面你会发现Quarkus 在构建期就把模型调用、JSON 映射、CDI 装配这些事做掉了。这正是它一贯的风格。Tools让模型去调你的业务方法纯聊天很快会碰到天花板。用户问“我的订单发了没”模型自己并不知道仓库里有什么。这时就把业务方法暴露成 Tool模型觉得需要时会自己调用。/** * 订单查询工具供大模型在对话中按需调用。 */ApplicationScopedpublicclassOrderTools{InjectOrderRepositoryorderRepository;/** * 根据订单号查询物流状态。 */Tool(根据订单号查询当前物流状态)publicStringfindOrderStatus(StringorderNo){OrderorderorderRepository.findByOrderNo(orderNo);if(ordernull){return未找到该订单;}return订单 orderNo 当前状态order.getStatus();}}AI 服务这边用ToolBox把工具挂上去/** * 能查询订单的客服助手。 */RegisterAiServicepublicinterfaceOrderAssistant{SystemMessage(你是订单助手。只有在需要查真实订单时才调用工具不要编造物流信息。)ToolBox(OrderTools.class)Stringchat(Stringquestion);}用户说“帮我看看 A2026001 发货了没”模型会先调用findOrderStatus再把结果组织成自然语言。业务规则还是你自己的 Java 代码模型只负责决定什么时候用、怎么把结果讲清楚。这个分工很重要别把库存扣减、权限校验交给 Prompt。RAG先查资料再开口说话模型的训练数据停在某个时间点也看不到你们公司的内部文档。RAG 的做法很朴素先把文档切块、向量化、存起来提问时先检索相关片段再把片段塞进 Prompt。Quarkus 这边可以自己实现RetrievalAugmentor也可以用 Easy RAG 走配置。一个常见写法是这样/** * 文档问答助手回答必须基于检索到的内容。 */RegisterAiServiceApplicationScopedSystemMessage(你是文档助手。优先根据检索到的资料作答资料里没有的内容请直接说不知道。)publicinterfaceDocsAssistant{/** * 基于知识库回答问题。 */Stringask(Stringquestion);}检索增强器可以做成一个 CDI Bean框架会自动挂到 AI 服务上/** * 把向量检索结果补充进用户问题。 */ApplicationScopedpublicclassDocsRetrievalAugmentorimplementsSupplierRetrievalAugmentor{InjectEmbeddingModelembeddingModel;InjectEmbeddingStoreTextSegmentembeddingStore;OverridepublicRetrievalAugmentorget(){EmbeddingStoreContentRetrieverretrieverEmbeddingStoreContentRetriever.builder().embeddingModel(embeddingModel).embeddingStore(embeddingStore).maxResults(3).build();returnDefaultRetrievalAugmentor.builder().contentRetriever(retriever).build();}}向量库可以接 Redis、PgVector、Chroma、Neo4j 这些常见存储。文档问答、内部知识库、制度查询基本都是这个模式。MCP把外部能力接进模型Tool 适合封装自家代码。可一旦工具散落在别的系统里每个都手写适配就累了。MCPModel Context Protocol就是为这件事准备的标准协议服务端暴露工具客户端按需发现和调用。Quarkus 两边都能做。你可以写一个 MCP Server把已有接口贡献出去也可以在 AI 服务里当 MCP Client去调用别人提供的工具。/** * 旅行助手通过 MCP 调用外部天气服务。 */RegisterAiServicepublicinterfaceTravelAssistant{SystemMessage( 你是旅行助手。用户问天气时先查地点再查气温 不要凭印象回答。 )McpToolBox(weather)Stringchat(Stringquestion);}对应配置大致如下quarkus.langchain4j.mcp.weather.transport-typestreamable-http quarkus.langchain4j.mcp.weather.urlhttp://localhost:8081/mcp本地方法用ToolBox远程能力用McpToolBox注解风格是统一的。对写 Java 的人来说学习成本很低。云原生这一套AI 也能跟着吃AI 功能接上之后Quarkus 原来的好处并没有丢掉。开发期可以用 Dev UI 看模型配置、试对话、检查工具有没有被扫描到。运行期日志、指标、链路跟踪仍然走 Micrometer 和 OpenTelemetry。部署时还能打成 Native Image冷启动和内存占用依然是 Quarkus 的强项。这对 Serverless、缩容到零、边缘节点这类场景很有用AI 服务不再必须是一个又重又慢的常驻进程。启动快、镜像小、链路可观测AI 服务也能按云原生的方式落地。实际项目里我比较推荐这个组合开发阶段用 Ollama 跑本地模型调试 Prompt 和工具知识类问题走 RAG别把公司文档全塞进 System Message业务动作走 Tool把真正的规则留在 Java 里跨系统能力走 MCP避免每个外部服务都写一套胶水代码上线前把模型切换、超时、限流和观测补齐写在最后Quarkus 拥抱 AI不是另起一套框架而是把大模型能力收进它本来就擅长的那套开发模型构建期优化、声明式 API、统一配置、云原生部署。如果你已经在用 Quarkus 做服务补 AI 能力的路径很短。先写一个RegisterAiService接口再按需要挂上 Tool、RAG 或 MCP。Java 做智能应用现在已经不必绕路了。