网站建设教程视频西瓜施工企业取得安全生产许可证后
网站建设教程视频西瓜,施工企业取得安全生产许可证后,俄语在线网站制作,想做个外贸网站Spring AI JManus 从入门到实战#xff1a;构建企业级AI应用 从零开始#xff0c;带你掌握Spring AI和JManus的核心技术#xff0c;构建可运行的企业级AI应用。一、引言#xff1a;AI时代的Java开发
1.1 为什么需要 Spring AI#xff1f;
在ChatGPT爆火之后#xff0c…Spring AI JManus 从入门到实战构建企业级AI应用从零开始带你掌握Spring AI和JManus的核心技术构建可运行的企业级AI应用。一、引言AI时代的Java开发1.1 为什么需要 Spring AI在ChatGPT爆火之后大语言模型LLM已经成为应用开发的核心能力。然而对于Java开发者来说直接集成各种AI服务面临诸多挑战开发集成痛点Spring AI应运而生它是Spring生态系统中AI应用的终极解决方案提供统一的API抽象一个接口调用所有AI模型企业级功能对话管理、RAG、流式响应Spring生态集成自动配置、依赖注入、配置管理生产就绪可观测性、弹性、安全性1.2 什么是 JManusJManus是一个轻量级的AI引擎框架专门为Java开发者设计。它提供了智能路由自动选择最合适的AI模型Prompt管理结构化模板支持变量替换上下文管理自动处理对话历史缓存优化减少重复调用降低成本异步支持高性能并发处理Spring AI JManus 的组合让Java开发者可以像使用Spring Data JPA一样简单地使用AI能力二、Spring AI 框架简介2.1 核心架构Spring AI采用了经典的分层架构确保了高度的可扩展性和灵活性。系统架构2.2 核心组件Spring AI由以下核心组件构成核心组件架构AiServiceAI服务接口统一的调用入口public interface AiService { String chat(String message); String chat(String systemPrompt, String userMessage); StreamString chatStream(String message); }JManusEngine智能引擎核心负责模型选择和路由Service public class JManusEngine { private final ListAiModelProvider providers; public String generate(PromptTemplate template) { AiModelProvider provider selectBestProvider(template); return provider.call(template); } }PromptTemplate提示词模板管理PromptTemplate template PromptTemplate.from(你是一个{{role}}请{{task}}) .withVariable(role, 翻译助手) .withVariable(task, 翻译以下文本);ChatMemory对话记忆管理ChatMemory memory new InMemoryChatMemory(); memory.add(user, 你好); memory.add(assistant, 你好有什么我可以帮助你的吗);三、JManus 引擎核心概念3.1 智能模型选择JManus Engine的核心优势在于智能模型选择。它可以根据以下因素自动选择最合适的模型选择因素说明示例任务类型不同任务适合不同模型创意写作→Claude代码生成→GPT-4成本预算根据预算选择性价比高的模型大批量处理→GPT-3.5响应速度实时性要求高的场景客服→文心一言内容语言中文优化模型中文对话→通义千问3.2 Prompt模板系统JManus提供了强大的Prompt模板系统// 基础模板 PromptTemplate template PromptTemplate.from( 你是一个专业的{{role}} 请帮我{{task}}。 要求{{requirements}} ); // 变量替换 String prompt template .withVariable(role, Java开发专家) .withVariable(task, 设计一个钱包系统) .withVariable(requirements, 支持冷热钱包分离) .build();3.3 对话上下文管理自动管理对话历史确保上下文连贯Service public class ConversationService { private final MapString, ListMessage conversations new ConcurrentHashMap(); public String chat(String sessionId, String message) { ListMessage history conversations.get(sessionId); // 构建包含历史的Prompt Prompt prompt buildPromptWithHistory(history, message); // 调用AI String response aiService.chat(prompt); // 保存历史 history.add(new Message(user, message)); history.add(new Message(assistant, response)); return response; } }四、快速开始5分钟搭建第一个AI应用4.1 环境准备快速入门图快速入门4.2 创建项目步骤1使用Spring Initializr创建项目访问 https://start.spring.io/选择Spring Boot 3.2添加依赖Spring Web, Thymeleaf或使用Maven命令mvn archetype:generate \ -DgroupIdcom.jmanus \ -DartifactIdjmanus-demo \ -DarchetypeArtifactIdmaven-archetype-quickstart \ -Dversion1.0.0步骤2添加依赖在pom.xml中添加dependencies !-- Spring Boot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Spring AI OpenAI -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version1.0.0-M4/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement repositories repository idspring-milestones/id nameSpring Milestones/name urlhttps://repo.spring.io/milestone/url /repository /repositories步骤3配置API密钥在application.yml中配置spring: ai: openai: api-key: ${OPENAI_API_KEY:your-api-key-here} base-url: ${OPENAI_BASE_URL:https://api.openai.com} chat: options: model: gpt-3.5-turbo temperature: 0.7 max-tokens: 2000步骤4创建AI服务Service public class AiChatService { private final ChatClient chatClient; public AiChatService(ChatClient chatClient) { this.chatClient chatClient; } public String chat(String message) { Prompt prompt new Prompt(new UserMessage(message)); return chatClient.call(prompt) .getResult() .getOutput() .getContent(); } }步骤5创建ControllerRestController RequestMapping(/ai) public class AiController { Autowired private AiChatService aiChatService; PostMapping(/chat) public String chat(RequestParam String message) { return aiChatService.chat(message); } }步骤6启动应用mvn spring-boot:run访问http://localhost:8080/ai/chat?message你好即可看到AI回复五、核心功能实战5.1 系统交互流程理解系统交互流程是掌握Spring AI JManus的关键交互时序图5.2 多轮对话实现完整的对话系统需要维护会话状态Service public class ConversationService { private final MapString, ListMessage conversations new ConcurrentHashMap(); Autowired private ChatClient chatClient; public ChatResponse chat(ChatRequest request) { String sessionId request.getSessionId(); // 获取或创建会话 ListMessage history conversations.computeIfAbsent( sessionId, k - new ArrayList() ); // 构建Prompt包含历史 Listorg.springframework.ai.chat.messages.Message messages new ArrayList(); // 添加系统提示 if (request.getSystemPrompt() ! null) { messages.add(new SystemMessage(request.getSystemPrompt())); } // 添加历史消息 for (Message msg : history) { if (user.equals(msg.getRole())) { messages.add(new UserMessage(msg.getContent())); } else { messages.add(new AssistantMessage(msg.getContent())); } } // 添加当前消息 messages.add(new UserMessage(request.getMessage())); // 调用AI Prompt prompt new Prompt(messages); String response chatClient.call(prompt) .getResult() .getOutput() .getContent(); // 保存到历史 history.add(new Message(user, request.getMessage())); history.add(new Message(assistant, response)); // 限制历史长度 if (history.size() 20) { conversations.put(sessionId, history.subList(history.size() - 20, history.size())); } return ChatResponse.builder() .content(response) .sessionId(sessionId) .build(); } }5.3 流式响应流式响应可以显著提升用户体验GetMapping(value /stream, produces MediaType.TEXT_EVENT_STREAM_VALUE) public FluxString streamChat(RequestParam String message) { return Flux.create(sink - { ChatClient caller chatClient; // 模拟流式响应 caller.stream(new Prompt(new UserMessage(message))) .subscribe(chatResponse - { String content chatResponse.getResult() .getOutput().getContent(); sink.next(content); }, error - { sink.error(error); }, () - { sink.complete(); }); }); }前端使用SSE接收const eventSource new EventSource(/ai/stream?message你好); eventSource.onmessage function(event) { const response event.data; // 逐步显示响应 appendToChat(response); };六、生产级架构设计6.1 生产环境部署生产环境需要考虑高可用、可扩展性部署架构6.2 核心设计原则1. 分层解耦Controller层接口层 ↓ Service层业务逻辑 ↓ Engine层AI处理 ↓ Provider层模型适配2. 缓存策略Service public class CachedAiService { Cacheable(value ai-responses, key #message) public String chat(String message) { return aiChatService.chat(message); } CacheEvict(value ai-responses, key #sessionId) public void clearCache(String sessionId) { // 清除会话缓存 } }3. 异步处理Service public class AsyncAiService { Async(aiExecutor) public CompletableFutureString chatAsync(String message) { String response aiChatService.chat(message); return CompletableFuture.completedFuture(response); } } Configuration EnableAsync public class AsyncConfig { Bean(aiExecutor) public Executor aiExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(50); executor.setQueueCapacity(100); executor.setThreadNamePrefix(ai-async-); executor.initialize(); return executor; } }七、完整项目实战7.1 数据流转分析理解数据如何流转对构建健壮的AI应用至关重要数据流转7.2 完整的AI请求处理流程AI请求处理流程7.3 核心代码实现AiChatService 完整实现package com.jmanus.service; import com.jmanus.model.ChatRequest; import com.jmanus.model.ChatResponse; import com.jmanus.model.Message; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; Service public class AiChatService { private final ChatClient chatClient; private final MapString, ListMessage conversationHistory new ConcurrentHashMap(); Autowired public AiChatService(ChatClient chatClient) { this.chatClient chatClient; } /** * 简单对话 */ public String chat(String message) { Prompt prompt new Prompt(new UserMessage(message)); return chatClient.call(prompt).getResult().getOutput().getContent(); } /** * 带系统提示的对话 */ public String chat(String systemPrompt, String userMessage) { Listorg.springframework.ai.chat.messages.Message messages new ArrayList(); messages.add(new SystemMessage(systemPrompt)); messages.add(new UserMessage(userMessage)); Prompt prompt new Prompt(messages); return chatClient.call(prompt).getResult().getOutput().getContent(); } /** * 带上下文的对话 */ public String chatWithContext(String sessionId, String message) { ListMessage history conversationHistory.computeIfAbsent(sessionId, k - new ArrayList()); Listorg.springframework.ai.chat.messages.Message messages new ArrayList(); // 添加历史消息 for (Message msg : history) { if (user.equals(msg.getRole())) { messages.add(new UserMessage(msg.getContent())); } else if (assistant.equals(msg.getRole())) { messages.add(new org.springframework.ai.chat.messages.AssistantMessage(msg.getContent())); } } // 添加当前消息 messages.add(new UserMessage(message)); Prompt prompt new Prompt(messages); String response chatClient.call(prompt).getResult().getOutput().getContent(); // 保存历史 history.add(new Message(user, message)); history.add(new Message(assistant, response)); // 限制历史长度 if (history.size() 20) { history history.subList(history.size() - 20, history.size()); conversationHistory.put(sessionId, history); } return response; } /** * 完整的聊天响应 */ public ChatResponse chatResponse(ChatRequest request) { long startTime System.currentTimeMillis(); try { String content; if (request.getSessionId() ! null !request.getSessionId().isEmpty()) { content chatWithContext(request.getSessionId(), request.getMessage()); } else if (request.getSystemPrompt() ! null) { content chat(request.getSystemPrompt(), request.getMessage()); } else { content chat(request.getMessage()); } long duration System.currentTimeMillis() - startTime; return ChatResponse.builder() .success(true) .content(content) .sessionId(request.getSessionId()) .duration(duration) .model(gpt-3.5-turbo) .tokens(content.length() / 2) .build(); } catch (Exception e) { long duration System.currentTimeMillis() - startTime; return ChatResponse.builder() .success(false) .error(e.getMessage()) .duration(duration) .build(); } } /** * 清除对话历史 */ public void clearHistory(String sessionId) { conversationHistory.remove(sessionId); } /** * 获取对话历史 */ public ListMessage getHistory(String sessionId) { return conversationHistory.getOrDefault(sessionId, new ArrayList()); } }AiChatController 完整实现package com.jmanus.controller; import com.jmanus.model.ChatRequest; import com.jmanus.model.ChatResponse; import com.jmanus.model.Message; import com.jmanus.service.AiChatService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import java.util.UUID; Slf4j Controller RequestMapping(/ai) public class AiChatController { Autowired private AiChatService aiChatService; GetMapping public String index() { return index; } PostMapping(/chat) ResponseBody public ChatResponse chat(RequestBody ChatRequest request) { log.info(收到聊天请求: sessionId{}, message{}, request.getSessionId(), request.getMessage()); if (request.getSessionId() null || request.getSessionId().isEmpty()) { request.setSessionId(UUID.randomUUID().toString()); } return aiChatService.chatResponse(request); } GetMapping(/history/{sessionId}) ResponseBody public ListMessage getHistory(PathVariable String sessionId) { return aiChatService.getHistory(sessionId); } DeleteMapping(/history/{sessionId}) ResponseBody public MapString, Object clearHistory(PathVariable String sessionId) { aiChatService.clearHistory(sessionId); return Map.of(success, true, message, 对话历史已清除); } GetMapping(/health) ResponseBody public MapString, Object health() { return Map.of( status, UP, service, Spring AI JManus, timestamp, System.currentTimeMillis() ); } }7.4 前端页面前端页面八、性能优化与最佳实践8.1 缓存策略Redis缓存AI响应Service public class CachedAiService { Autowired private RedisTemplateString, String redisTemplate; Autowired private AiChatService aiChatService; public String chat(String message) { // 生成缓存key String cacheKey ai:response: DigestUtils.md5Hex(message); // 尝试从缓存获取 String cached redisTemplate.opsForValue().get(cacheKey); if (cached ! null) { return cached; } // 调用AI String response aiChatService.chat(message); // 缓存结果1小时 redisTemplate.opsForValue().set(cacheKey, response, 1, TimeUnit.HOURS); return response; } }8.2 连接池优化spring: ai: openai: # 连接池配置 client: connect-timeout: 10s read-timeout: 60s max-connections: 508.3 Prompt工程最佳实践1. 清晰的角色定义String systemPrompt 你是一个专业的Java技术顾问专注于Spring生态系统。 你的回答应该 1. 准确且实用 2. 包含代码示例 3. 考虑生产环境的最佳实践 ;2. 结构化输出String prompt 请以JSON格式返回以下信息 { summary: 问题摘要, solution: 解决方案, code: 代码示例, resources: [参考资源1, 参考资源2] } ;3. 上下文限制// 限制历史长度避免token超限 if (history.size() MAX_HISTORY) { history history.subList(history.size() - MAX_HISTORY, history.size()); }九、企业级实战场景9.1 场景一智能客服系统业务需求构建一个企业级智能客服系统支持意图识别、自动路由和知识库问答。Service public class IntelligentCustomerService { Autowired private ChatClient chatClient; Autowired private KnowledgeBaseService knowledgeBaseService; Autowired private TicketService ticketService; /** * 智能客服路由 - 根据用户问题自动分类处理 */ public CustomerServiceResponse handleCustomerQuery(CustomerQuery query) { // 步骤1: 意图识别 String intent classifyIntent(query.getMessage()); // 步骤2: 根据意图路由 return switch (intent) { case FAQ - handleFAQQuery(query); case TECHNICAL - handleTechnicalIssue(query); case COMPLAINT - handleComplaint(query); case HUMAN - transferToHuman(query); default - handleGeneralQuery(query); }; } /** * 意图分类 - 使用AI识别用户意图 */ private String classifyIntent(String message) { String systemPrompt 你是一个客服意图分类专家。请根据用户消息将意图分类为以下类型之一 - FAQ: 常见问题咨询如营业时间、联系方式 - TECHNICAL: 技术问题如系统故障、功能使用 - COMPLAINT: 投诉建议 - HUMAN: 需要人工介入如复杂问题、紧急情况 - GENERAL: 一般咨询 只返回分类结果不要其他内容。 ; String response chatClient.call( new Prompt(List.of( new SystemMessage(systemPrompt), new UserMessage(message) )) ).getResult().getOutput().getContent(); return response.toUpperCase().trim(); } /** * 处理FAQ查询 - 结合知识库 */ private CustomerServiceResponse handleFAQQuery(CustomerQuery query) { // 先从知识库搜索 ListString relevantDocs knowledgeBaseService.search(query.getMessage(), 3); // 如果找到匹配的知识库文档 if (!relevantDocs.isEmpty()) { String context String.join(\n\n, relevantDocs); String systemPrompt 你是一个客服助手。请根据以下知识库内容回答用户问题。 如果知识库中没有相关信息请礼貌地告知用户。 知识库内容 context 请用简洁、友好的语气回答。 ; String answer chatClient.call( new Prompt(List.of( new SystemMessage(systemPrompt), new UserMessage(query.getMessage()) )) ).getResult().getOutput().getContent(); return CustomerServiceResponse.builder() .answer(answer) .source(KNOWLEDGE_BASE) .confidence(0.95) .build(); } // 知识库没有匹配使用AI回答 return handleGeneralQuery(query); } /** * 处理技术问题 - 引导用户提供详细信息 */ private CustomerServiceResponse handleTechnicalIssue(CustomerQuery query) { String systemPrompt 你是一个技术支持专家。用户遇到了技术问题。 请先表示理解然后引导用户提供以下信息 1. 问题描述 2. 复现步骤 3. 错误信息 4. 系统环境 如果用户已提供这些信息尝试给出解决方案。 ; String answer chatClient.call( new Prompt(List.of( new SystemMessage(systemPrompt), new UserMessage(query.getMessage()) )) ).getResult().getOutput().getContent(); // 自动创建工单 String ticketId ticketService.createTicket( query.getUserId(), TECHNICAL, query.getMessage() ); return CustomerServiceResponse.builder() .answer(answer \n\n工单编号 ticketId) .source(AI_AGENT) .ticketId(ticketId) .confidence(0.85) .build(); } /** * 处理投诉 - 转高级处理 */ private CustomerServiceResponse handleComplaint(CustomerQuery query) { // 优先级提升 String ticketId ticketService.createPriorityTicket( query.getUserId(), COMPLAINT, query.getMessage(), HIGH ); String response 感谢您的反馈。 您的意见对我们非常重要我们已记录并会尽快处理。 工单编号%s 预计回复时间2小时内 .formatted(ticketId); return CustomerServiceResponse.builder() .answer(response) .source(HUMAN_ROUTING) .ticketId(ticketId) .priority(HIGH) .build(); } /** * 转人工客服 */ private CustomerServiceResponse transferToHuman(CustomerQuery query) { // 通知人工客服 notificationService.notifyHumanAgent(query); return CustomerServiceResponse.builder() .answer(正在为您转接人工客服请稍候...) .source(HUMAN_TRANSFER) .estimatedWaitTime(30秒) .build(); } /** * 处理一般咨询 */ private CustomerServiceResponse handleGeneralQuery(CustomerQuery query) { String systemPrompt 你是一个友好的客服助手。请用专业、友好的语气回答用户问题。 如果不确定答案建议用户联系人工客服。 ; String answer chatClient.call( new Prompt(List.of( new SystemMessage(systemPrompt), new UserMessage(query.getMessage()) )) ).getResult().getOutput().getContent(); return CustomerServiceResponse.builder() .answer(answer) .source(AI_AGENT) .confidence(0.75) .build(); } }9.2 场景二API文档自动生成业务需求根据代码自动生成API文档。Service public class ApiDocGenerator { Autowired private ChatClient chatClient; /** * 为Controller生成API文档 */ public ApiDocumentation generateDocs(Class? controllerClass) { // 获取源代码 String sourceCode getSourceCode(controllerClass); // 获取方法签名 ListMethodSignature methods extractMethodSignatures(controllerClass); String systemPrompt 你是API文档专家。请根据以下Controller代码生成详细的API文档。 文档格式要求 ## 接口名称 **描述**接口功能说明 **请求方式**GET/POST/PUT/DELETE **请求路径**/api/path **请求参数** | 参数名 | 类型 | 必填 | 说明 | **响应示例** json {}十、总结场景适用性推荐方案智能客服⭐⭐⭐⭐⭐对话记忆 快速响应代码助手⭐⭐⭐⭐⭐GPT-4 上下文管理内容创作⭐⭐⭐⭐⭐Claude 流式响应数据分析⭐⭐⭐⭐GPT-4 Function Calling翻译服务⭐⭐⭐⭐专用模型 缓存优化