ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java开发者AI入门指南:从Spring AI到AI Agent实战

Java开发者AI入门指南:从Spring AI到AI Agent实战 最近在技术社区和招聘市场上AI 与 Java 的结合热度持续攀升。很多 Java 开发者想切入 AI 领域却不知从何下手是直接啃大模型论文还是学 Python其实Java 生态已经涌现出强大的 AI 技术栈从 Spring AI 这样的官方框架到构建复杂智能体的 AI Agent 开发Java 开发者完全可以在自己熟悉的语言体系内高效地构建企业级 AI 应用。本文将为你梳理一条清晰的 Java AI 学习路径从必学基础 Spring AI 入手逐步深入到 AI Agent 的核心开发与项目实战并提供精准的框架选型建议助你快速掌握 JavaAI 的开发能力。1. Java AI 技术栈全景与学习路线规划在深入具体技术之前我们需要对 Java 领域的 AI 生态有一个宏观的认识。这有助于你理解不同工具的角色并规划出高效的学习路径。1.1 为什么选择 Java 进行 AI 开发对于广大 Java 后端开发者而言转向 AI 开发并非必须抛弃 Java 生态。选择 Java 进行 AI 开发有以下几个核心优势企业级整合优势Java 是企业级应用开发的主流语言拥有成熟的微服务架构Spring Cloud、稳定的中间件Kafka, Redis和强大的运维体系。将 AI 能力集成到现有 Java 系统中可以最小化架构改造成本实现平滑升级。工程化与性能Java 的 JVM 生态在内存管理、并发处理、性能监控方面有深厚的积累。对于需要高并发、高可用的 AI 服务如智能客服、风控模型服务Java 能提供生产级别的稳定性和可维护性。丰富的 AI 框架涌现以Spring AI为代表Java 生态正在快速构建对主流大模型OpenAI GPT, Anthropic Claude, 国内大模型等的标准化接入能力。此外还有 Deep Java Library (DJL)、Tribuo 等专注于机器学习的库。人才与团队协同在已有的 Java 技术团队中引入 AI 能力可以降低学习门槛让后端工程师、架构师也能参与到 AI 应用的构建中促进业务与技术的融合。1.2 Java AI 核心技术栈分层解析我们可以将 Java AI 技术栈分为四个层次从底层基础设施到上层业务应用层次核心组件/技术代表框架/工具作用与定位基础设施层JVM、向量数据库、GPU支持JDK, Milvus, Pinecone, JNI/CUDA提供 AI 应用运行的基础环境包括计算、存储特别是向量数据。模型接入与推理层大模型 API 客户端、本地模型推理Spring AI, OpenAI Java Client, Hugging Face API, Ollama, DJL核心学习点。负责与各类大模型进行交互是 AI 能力的“发动机”。AI Agent 框架层智能体编排、工具调用、记忆管理LangChain4J, Haystack (Java版), 自定义框架进阶核心。将大模型与工具、知识库结合构建能自主完成复杂任务的智能体。应用与集成层Web 服务、业务系统集成Spring Boot, Spring MVC, 消息队列将 AI 能力封装成 REST API、消息处理器等嵌入到现有业务流中。学习路径建议对于初学者应遵循“模型接入 - Agent 开发 - 系统集成”的顺序。首先掌握如何使用 Java 调用大模型Spring AI然后学习如何让模型具备使用工具和记忆的能力AI Agent最后将智能体工程化集成到 Spring Boot 应用中。1.3 精准框架选型指南面对众多工具如何选择这里给出一个基于场景的选型建议快速原型与标准集成首选Spring AI。它是 Spring 官方项目与 Spring Boot 无缝集成提供了统一的 API 来接入 OpenAI、Azure OpenAI、Anthropic、Cohere 等众多模型极大降低了入门和集成复杂度。复杂 AI Agent 开发LangChain4J是目前 Java 生态中最接近 Python LangChain 的框架提供了丰富的链Chain、工具Tool、记忆Memory和检索Retriever抽象。适合构建需要多步骤推理、工具调用和知识库检索的复杂智能体。本地模型部署与推理如果数据安全要求高或需要离线环境考虑Ollama管理本地模型 Spring AI的 Ollama 连接器。对于更底层的机器学习任务可以关注Deep Java Library (DJL)它支持在 JVM 上运行 PyTorch、TensorFlow 模型。向量检索需求如果需要为自己的 AI 应用添加私有知识库RAG则需要引入向量数据库。Milvus、Pinecone云服务和PgvectorPostgreSQL 扩展都有对应的 Java 客户端Spring AI 也内置了向量存储的抽象接口。对于大多数从零开始的 Java 开发者以 Spring AI 为起点逐步扩展到 LangChain4J 和向量数据库是一条稳健且实用的路径。2. 环境准备与基础工具工欲善其事必先利其器。开始 Java AI 开发前需要配置好基础环境。2.1 基础开发环境Java 版本推荐使用JDK 17 或 JDK 21 (LTS版本)。Spring AI 等框架对高版本 JDK 支持更好。可通过java -version验证。构建工具Maven或Gradle。本文示例以 Maven 为主。确保安装并配置好。IDEIntelliJ IDEA社区版或旗舰版是 Java 开发的首选其对 Spring 和 Maven/Gradle 的支持非常出色。API 密钥准备一个OpenAI API Key或国内大模型如智谱AI、通义千问的 API Key。这是调用云端大模型服务的通行证。请妥善保管不要提交到代码仓库。2.2 初始化 Spring Boot 项目最快的方式是使用 Spring Initializr 生成项目骨架。Project: MavenLanguage: JavaSpring Boot: 选择最新的稳定版如 3.2.xDependencies: 添加Spring Web和Spring AI。注意Spring AI 是一个独立项目在 Initializr 中需要点击 “ADD DEPENDENCIES” 并搜索 “AI” 来添加。点击 “GENERATE” 下载项目压缩包并用 IDE 打开。你也可以使用 IDEA 内置的 Spring Initializr 功能直接创建。检查生成的pom.xml文件应包含类似依赖版本号可能更新dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Spring AI 核心依赖 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId !-- 请使用最新版本 -- /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies !-- 需要添加 Spring AI 的 BOM (Bill of Materials) 来管理版本 -- dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version0.8.1/version !-- 使用最新稳定版 -- typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement3. Spring AI 核心入门你的第一个 AI 应用Spring AI 的核心目标是提供一套统一的 API让开发者能以相似的方式与各种大模型交互。我们从一个最简单的聊天应用开始。3.1 配置模型连接首先在application.properties或application.yml中配置 OpenAI 连接信息。application.yml示例spring: ai: openai: api-key: ${OPENAI_API_KEY:sk-your-openai-key-here} # 建议使用环境变量 chat: options: model: gpt-3.5-turbo # 或 gpt-4 temperature: 0.7重要强烈建议将api-key通过环境变量OPENAI_API_KEY传入避免密钥硬编码。在运行应用前在终端执行export OPENAI_API_KEYsk-xxx(Linux/Mac) 或set OPENAI_API_KEYsk-xxx(Windows)。3.2 编写第一个聊天服务创建一个简单的 Controller 来暴露聊天接口。// 文件路径src/main/java/com/example/aidemo/controller/ChatController.java package com.example.aidemo.controller; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import.springframework.web.bind.annotation.RestController; import java.util.Map; RestController public class ChatController { private final ChatClient chatClient; Autowired // 构造器注入 public ChatController(ChatClient chatClient) { this.chatClient chatClient; } GetMapping(/ai/chat) public MapString, String chat(RequestParam(value message, defaultValue Hello) String message) { // 调用 ChatClient 生成回复 String response chatClient.call(message); return Map.of(question, message, answer, response); } // 更细粒度的控制获取完整的 ChatResponse GetMapping(/ai/chat/detail) public ChatResponse chatDetail(RequestParam String message) { Prompt prompt new Prompt(message); return chatClient.call(prompt); } }3.3 运行与测试启动 Spring Boot 应用。打开浏览器或使用curl、Postman 测试访问http://localhost:8080/ai/chat?message用Java写一个Hello World程序访问http://localhost:8080/ai/chat/detail?message介绍一下Spring AI你将收到来自 GPT 模型的回复。通过这个简单的例子你已经成功使用 Java 调用了大模型ChatClient是 Spring AI 的核心接口它屏蔽了底层不同模型供应商的差异。3.4 理解核心概念Prompt、Message、ChatResponsePrompt提示发送给模型的输入可以包含指令、上下文、问题等。它不仅是一个字符串还可以包含Message对象列表。Message消息代表对话中的一条信息有角色属性如SystemMessage系统指令、UserMessage用户输入、AssistantMessage助手回复。ChatResponse聊天响应模型返回的完整响应包含Generation列表可能的多个回复、元数据如使用令牌数等。下面是一个使用Prompt和SystemMessage的进阶示例用于设定 AI 的角色// 文件路径src/main/java/com/example/aidemo/service/AdvancedChatService.java package com.example.aidemo.service; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.messages.Message; import org.springframework.stereotype.Service; import java.util.List; Service public class AdvancedChatService { private final ChatClient chatClient; public AdvancedChatService(ChatClient chatClient) { this.chatClient chatClient; } public String chatWithRole(String userInput) { // 1. 构建系统指令 SystemMessage systemMessage new SystemMessage(你是一位专业的Java架构师用简洁清晰的方式回答问题。); // 2. 构建用户输入 UserMessage userMessage new UserMessage(userInput); // 3. 组合成 Prompt Prompt prompt new Prompt(List.of(systemMessage, userMessage)); // 4. 调用并获取文本回复 ChatResponse response chatClient.call(prompt); return response.getResult().getOutput().getContent(); } }4. 从 Spring AI 到 AI Agent构建具备“行动力”的智能体仅仅调用模型进行对话是不够的。AI Agent智能体的核心在于让大模型具备使用工具、记忆对话和自主规划的能力从而完成更复杂的任务。4.1 什么是 AI Agent你可以将 AI Agent 理解为一个具备感知、决策和执行能力的智能程序。感知接收用户指令或环境信息通过 Prompt。决策大模型作为“大脑”分析信息并决定下一步行动是直接回答还是调用某个工具。执行根据决策调用预定义的工具如查询数据库、调用 API、执行计算或直接生成回复。记忆将本次交互的上下文保存下来供后续决策参考。一个典型的例子是用户说“查一下北京明天天气然后推荐一件合适的衣服”。Agent 需要先调用“天气查询工具”获取天气再根据结果调用“穿衣推荐逻辑”生成最终回复。4.2 使用 Spring AI 构建简单 Agent工具调用Spring AI 提供了基础的Tool抽象来支持工具调用。我们来实现一个简单的计算器 Agent。第一步定义一个工具Tool工具需要实现Tool接口或使用Tool注解需配合EnableTools。// 文件路径src/main/java/com/example/aidemo/tool/CalculatorTool.java package com.example.aidemo.tool; import org.springframework.ai.tool.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Component; Component public class CalculatorTool implements Tool { Override public String getName() { return “calculator”; } Override public String getDescription() { return “一个简单的计算器用于执行基本的数学运算。支持加()、减(-)、乘(*)、除(/)。”; } // 工具的执行方法 public String calculate( ToolParam(description “第一个运算数”) double a, ToolParam(description “运算符必须是 , -, *, / 中的一个”) String operator, ToolParam(description “第二个运算数”) double b) { switch (operator) { case ““: return String.valueOf(a b); case “-“: return String.valueOf(a - b); case “*“: return String.valueOf(a * b); case “/“: if (b 0) { return “错误除数不能为零”; } return String.valueOf(a / b); default: return “错误不支持的运算符 ‘“ operator “’。请使用 , -, *, /。”; } } }第二步启用工具并调用我们需要配置一个ChatClient让它能感知并使用我们定义的工具。Spring AI 的OpenAiChatClient支持函数调用Function Calling。// 文件路径src/main/java/com/example/aidemo/service/AgentService.java package com.example.aidemo.service; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.openai.OpenAiChatOptions; import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.ai.tool.annotation.EnableTools; import jakarta.annotation.PostConstruct; import java.util.List; Service EnableTools // 启用工具扫描 public class AgentService { Value(“${spring.ai.openai.api-key}”) private String openAiApiKey; private ChatClient chatClient; PostConstruct public void init() { // 1. 创建 OpenAiApi 实例 OpenAiApi openAiApi new OpenAiApi(openAiApiKey); // 2. 构建 ChatOptions启用函数调用 OpenAiChatOptions options OpenAiChatOptions.builder() .withModel(“gpt-3.5-turbo”) .withFunctionCalling(“auto”) // 关键启用自动函数调用 .build(); // 3. 创建支持工具调用的 ChatClient // 注意Spring AI 可能在未来版本提供更简洁的 Bean 配置方式 // 此处为演示原理实际生产可能通过配置 Bean 实现 this.chatClient new OpenAiChatClient(openAiApi, options); // 实际项目中Tool 的注册和绑定通常通过 Spring 容器自动完成这里简化了流程。 // 完整实现需要配置 ToolCallbackProvider 并将工具注册进去。 } public String executeWithTool(String userQuery) { // 构建系统提示告诉模型可以使用计算器工具 SystemMessage systemMsg new SystemMessage(“你是一个智能助手可以回答用户问题。当你需要计算时必须使用 calculator 工具。工具描述” new CalculatorTool().getDescription()); UserMessage userMsg new UserMessage(userQuery); Prompt prompt new Prompt(List.of(systemMsg, userMsg)); // 这里 chatClient 在调用时如果模型认为需要计算会返回一个要求调用工具的响应。 // 实际完整的工具调用流程涉及对模型响应的解析和工具执行结果的再次提交Spring AI 正在完善此流程。 // 更成熟的做法是使用 LangChain4J。 ChatResponse response chatClient.call(prompt); return response.getResult().getOutput().getContent(); } }注意Spring AI 对复杂 Agent 和工具调用的完整支持仍在演进中。上述示例展示了概念但生产级、流畅的 Agent 开发目前更推荐使用LangChain4J。4.3 使用 LangChain4J 构建企业级 AgentLangChain4J 提供了更成熟、更灵活的 Agent 构建范式。我们来看一个使用 LangChain4J 的典型示例。第一步添加依赖在pom.xml中添加 LangChain4J 和 OpenAI 的依赖。dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai/artifactId version0.28.0/version !-- 使用最新版本 -- /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version0.28.0/version /dependency第二步构建一个具备工具调用和记忆的 Agent// 文件路径src/main/java/com/example/aidemo/service/LangChainAgentService.java package com.example.aidemo.service; import dev.langchain4j.agent.tool.Tool; import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.service.AiServices; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.time.LocalTime; Service public class LangChainAgentService { // 定义 Agent 的接口 interface Assistant { String chat(String userMessage); } private final Assistant assistant; public LangChainAgentService(Value(“${spring.ai.openai.api-key}”) String apiKey) { // 1. 创建模型 OpenAiChatModel model OpenAiChatModel.builder() .apiKey(apiKey) .modelName(“gpt-3.5-turbo”) .temperature(0.7) .build(); // 2. 创建聊天记忆保留最近10轮对话 ChatMemory chatMemory MessageWindowChatMemory.withMaxMessages(10); // 3. 使用 AiServices 绑定模型、工具和记忆创建 Agent 实例 this.assistant AiServices.builder(Assistant.class) .chatLanguageModel(model) .chatMemory(chatMemory) .tools(new MyTools()) // 注册工具类 .build(); } // 工具类 static class MyTools { Tool(“获取当前服务器时间”) public String getCurrentTime() { return “当前时间是” LocalTime.now().toString(); } Tool(“计算两个数字的和”) public double add(double a, double b) { return a b; } } public String chat(String userMessage) { // 调用 Agent return assistant.chat(userMessage); } }第三步在 Controller 中调用// 文件路径src/main/java/com/example/aidemo/controller/AgentController.java package com.example.aidemo.controller; import com.example.aidemo.service.LangChainAgentService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Map; RestController public class AgentController { private final LangChainAgentService agentService; public AgentController(LangChainAgentService agentService) { this.agentService agentService; } GetMapping(“/agent/chat”) public MapString, String agentChat(RequestParam String message) { String response agentService.chat(message); return Map.of(“question”, message, “answer”, response); } }现在你可以测试/agent/chat接口。尝试发送“现在几点了” - Agent 会调用getCurrentTime工具。“123 加 456 等于多少” - Agent 会调用add工具。“我叫小明记住我的名字。” 然后问 “我叫什么” - Agent 会利用记忆回答。这个例子展示了 LangChain4J 如何优雅地将模型、工具、记忆组合成一个真正的智能体。5. 企业级核心项目实战构建智能客服知识库助手 (RAG)我们将综合运用 Spring AI、向量数据库和 AI Agent 技术构建一个企业级智能客服助手。其核心是RAG (Retrieval-Augmented Generation检索增强生成)架构通过检索私有知识库如产品文档、FAQ来增强大模型的回复使其更准确、更专业。5.1 项目架构与流程知识库预处理将 PDF、Word、TXT 等文档进行文本分割通过嵌入模型Embedding Model转换为向量存储到向量数据库中。用户查询用户提出问题。检索将用户问题转换为向量在向量数据库中搜索最相关的文本片段。增强提示将检索到的相关片段作为上下文与用户问题一起构成增强后的 Prompt发送给大模型。生成回复大模型基于提供的上下文生成精准、专业的回复。5.2 技术选型与依赖Spring AI用于统一接入 OpenAI 的聊天模型和嵌入模型。向量数据库选择PgvectorPostgreSQL 扩展因为它与关系型数据库结合紧密易于管理。也可以使用Milvus。数据库PostgreSQL。添加依赖到pom.xml!-- Spring AI OpenAI (已添加) -- !-- Spring AI PostgreSQL VectorStore -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-postgresql-vector-store-spring-boot-starter/artifactId /dependency !-- PostgreSQL 驱动 -- dependency groupIdorg.postgresql/groupId artifactIdpostgresql/artifactId scoperuntime/scope /dependency !-- Spring Data JPA (可选用于方便操作) -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency5.3 核心代码实现第一步配置数据源和向量存储# application.yml spring: datasource: url: jdbc:postgresql://localhost:5432/ai_knowledge_db username: postgres password: yourpassword driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: validate show-sql: true ai: openai: api-key: ${OPENAI_API_KEY} vectorstore: postgresql: index-type: HNSW # 向量索引类型 dimensions: 1536 # OpenAI text-embedding-ada-002 模型的向量维度第二步实现文档嵌入与存储服务// 文件路径src/main/java/com/example/aidemo/service/KnowledgeBaseService.java package com.example.aidemo.service; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.reader.TextReader; import org.springframework.ai.transformer.splitter.TokenTextSplitter; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Service; import org.springframework.util.FileCopyUtils; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.List; Service public class KnowledgeBaseService { private final EmbeddingClient embeddingClient; private final VectorStore vectorStore; private final ResourceLoader resourceLoader; public KnowledgeBaseService(EmbeddingClient embeddingClient, VectorStore vectorStore, ResourceLoader resourceLoader) { this.embeddingClient embeddingClient; this.vectorStore vectorStore; this.resourceLoader resourceLoader; } /** * 从文本文件加载知识到向量库 */ public void loadKnowledgeFromFile(String filePath) throws IOException { Resource resource resourceLoader.getResource(“classpath:” filePath); // 例如: “faq.txt” String content FileCopyUtils.copyToString( new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)); // 1. 创建文档 Document document new Document(content); // 2. 文本分割避免文档过长 TokenTextSplitter splitter new TokenTextSplitter(500, 100, 10, 1000); // 参数块大小、重叠等 ListDocument splitDocuments splitter.split(document); // 3. 将分割后的文档存入向量库会自动调用 EmbeddingClient 生成向量 vectorStore.add(splitDocuments); } /** * 相似性搜索 */ public ListDocument searchRelevantDocuments(String query, int topK) { return vectorStore.similaritySearch(query, topK); } }第三步实现 RAG 问答服务// 文件路径src/main/java/com/example/aidemo/service/RagQaService.java package com.example.aidemo.service; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.document.Document; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; Service public class RagQaService { private final ChatClient chatClient; private final KnowledgeBaseService knowledgeBaseService; // 从外部文件加载 Prompt 模板 Value(“classpath:/prompts/rag-prompt-template.st”) private Resource ragPromptTemplateResource; public RagQaService(ChatClient chatClient, KnowledgeBaseService knowledgeBaseService) { this.chatClient chatClient; this.knowledgeBaseService knowledgeBaseService; } public String answerQuestion(String question) throws IOException { // 1. 从知识库检索相关文档 ListDocument relevantDocs knowledgeBaseService.searchRelevantDocuments(question, 3); String context relevantDocs.stream() .map(Document::getContent) .collect(Collectors.joining(“\n\n---\n\n”)); // 2. 构建增强后的 Prompt String promptTemplate FileCopyUtils.copyToString( new InputStreamReader(ragPromptTemplateResource.getInputStream(), StandardCharsets.UTF_8)); MapString, Object model new HashMap(); model.put(“context”, context); model.put(“question”, question); PromptTemplate template new PromptTemplate(promptTemplate); Prompt prompt template.create(model); // 3. 调用大模型生成答案 ChatResponse response chatClient.call(prompt); return response.getResult().getOutput().getContent(); } }Prompt 模板文件 (resources/prompts/rag-prompt-template.st)你是一个专业的客服助手请严格根据以下提供的上下文信息来回答问题。如果上下文信息不足以回答问题请如实告知“根据现有资料我无法回答这个问题”不要编造信息。 上下文信息 {context} 用户问题{question} 请根据上下文信息给出准确、有帮助的回答第四步创建控制器// 文件路径src/main/java/com/example/aidemo/controller/RagController.java package com.example.aidemo.controller; import com.example.aidemo.service.KnowledgeBaseService; import com.example.aidemo.service.RagQaService; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.Map; RestController RequestMapping(“/rag”) public class RagController { private final RagQaService ragQaService; private final KnowledgeBaseService knowledgeBaseService; public RagController(RagQaService ragQaService, KnowledgeBaseService knowledgeBaseService) { this.ragQaService ragQaService; this.knowledgeBaseService knowledgeBaseService; } PostMapping(“/load”) public String loadKnowledge(RequestParam String filePath) { try { knowledgeBaseService.loadKnowledgeFromFile(filePath); return “知识库加载成功”; } catch (IOException e) { return “知识库加载失败” e.getMessage(); } } GetMapping(“/ask”) public MapString, String askQuestion(RequestParam String question) { try { String answer ragQaService.answerQuestion(question); return Map.of(“question”, question, “answer”, answer); } catch (IOException e) { return Map.of(“question”, question, “answer”, “系统错误” e.getMessage()); } } }5.4 运行与测试确保 PostgreSQL 已安装并运行创建数据库ai_knowledge_db并安装pgvector扩展 (CREATE EXTENSION vector;)。在resources目录下放置一个faq.txt文件里面包含一些客服问答对。启动应用。调用POST /rag/load?filePathfaq.txt加载知识库。调用GET /rag/ask?question你们的产品支持退款吗进行提问。系统会先从向量库中检索与“退款”相关的文档片段然后将这些片段作为上下文发送给大模型最终生成一个基于知识库的准确回复。6. 常见问题与排查思路在 Java AI 应用开发中你会遇到一些典型问题。下表列出了常见问题及其解决方法问题现象可能原因排查思路与解决方案启动报错找不到 Spring AI 相关类Maven/Gradle 依赖未正确引入或版本冲突。1. 检查pom.xml中spring-ai-bom的版本管理。2. 确保依赖名称正确如spring-ai-openai-spring-boot-starter。3. 运行mvn dependency:tree查看依赖关系。调用 OpenAI API 超时或连接失败网络问题、API Key 错误或无效、代理设置。1. 检查spring.ai.openai.api-key配置是否正确。2. 检查网络是否能访问api.openai.com。3. 如有需要在OpenAiChatOptions中配置代理 (proxy)。向量数据库连接失败数据库地址/端口/密码错误或未安装向量扩展。1. 检查application.yml中的数据库连接配置。2. 登录 PostgreSQL执行CREATE EXTENSION IF NOT EXISTS vector;。3. 检查 Spring AI 向量存储的dimensions是否与嵌入模型匹配。Agent 不调用工具工具描述不清晰、模型未启用函数调用、Prompt 未引导。1. 确保工具方法有清晰的Tool描述。2. 在模型配置中启用函数调用如withFunctionCalling(“auto”)。3. 在系统 Prompt 中明确告知模型可以使用哪些工具。内存溢出 (OutOfMemoryError)处理大量文本嵌入或大模型返回巨大响应。1. 调整 JVM 堆内存参数 (-Xmx)。2. 对输入文本进行合理分块 (TokenTextSplitter)。3. 对于流式响应使用ChatClient的流式 API。RAG 回答与知识库无关检索到的上下文不相关或 Prompt 模板未强制模型使用上下文。1. 调整向量搜索的相似度阈值或返回数量 (topK)。2. 优化文本分割策略避免破坏语义。3. 强化 Prompt 模板使用“必须根据上下文”等强硬指令。本地模型响应慢本地模型对硬件要求高或未使用 GPU 加速。1. 确保机器配置尤其是 GPU 和内存满足模型要求。2. 考虑使用量化后的较小模型。3. 对于生产环境评估使用 API 服务的性价比。7. 最佳实践与工程建议将 AI 能力集成到企业级 Java 应用中需要遵循良好的工程实践。配置外部化与安全永远不要将 API Key、数据库密码等敏感信息硬编码在代码中。使用 Spring Boot 的application-{profile}.yml和环境变量管理配置。考虑使用配置中心如 Apollo、Nacos或云服务商提供的密钥管理服务。异常处理与降级对 AI 服务调用如 OpenAI API进行完善的异常捕获和重试机制。设计降级策略当 AI 服务不可用时提供默认回复或切换到规则引擎。Service public class RobustAIService { private static final Logger logger LoggerFactory.getLogger(RobustAIService.class); Retryable(value {ResourceAccessException.class}, maxAttempts 3) public String robustChat(String message) { try { return chatClient.call(message); } catch (Exception e) { logger.error(“AI 服务调用失败”, e); // 降级返回预设回复或调用备用服务 return “网络似乎不太稳定请稍后再试。当前问题已记录。”; } } }性能与监控对 AI 调用添加监控记录耗时、令牌使用量、成功率等指标。使用缓存如 Redis存储频繁查询的向量检索结果或模型回复减少重复计算和 API 调用。对于耗时操作如文档嵌入考虑异步处理。Prompt 工程与管理将 Prompt 模板存储在外部文件或数据库中便于迭代优化无需重新部署。对不同的业务场景设计专门的系统 Prompt明确 AI 的角色、职责和输出格式。建立 Prompt 的版本管理和 A/B 测试机制。数据隐私与合规明确哪些数据可以发送给第三方 AI 服务如 OpenAI敏感数据必须进行脱敏或使用本地模型。了解并遵守相关数据保护法规如 GDPR。对用户与 AI 的交互日志进行加密存储和访问控制。测试策略单元测试测试工具类、文档处理逻辑等。集成测试测试向量存储的增删改查、模型连接等。端到端测试模拟用户场景测试整个 RAG 或 Agent 流程的准确性和稳定性。使用 Mock 对象来模拟 AI 模型响应避免在测试中产生真实 API 调用费用。Java AI 开发是一个快速发展的领域核心在于将成熟的 Java 工程化能力与前沿的 AI 能力相结合。从 Spring AI 入门掌握模型调用再深入 LangChain4J构建具备工具和记忆的智能体最终通过 RAG 等项目实战解决企业实际业务问题。这条路径让你能充分利用现有 Java 技能栈平稳、高效地过渡到 AI 应用开发。建议你从本文的示例代码开始动手搭建环境修改调试并尝试将其集成到你自己的业务系统中在实践中不断深化理解。
返回列表