精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

又一個AI大模型項目完結:基于Spring AI快速搭建MCP服務加入LLM,完整源碼已提交!

人工智能
在技術選型上,Java 生態憑借其成熟的企業級能力和強大的類型系統,為構建生產就緒的 MCP 服務器提供了理想的基礎。特別是 Spring AI 框架的 MCP 支持,讓開發者能夠基于熟悉的技術棧構建可靠、可擴展的智能服務。

在人工智能技術飛速發展的今天,大語言模型正在重塑我們與軟件系統的交互方式。然而,這些強大的模型往往被困在"信息孤島"中——它們擁有驚人的推理能力,卻無法直接訪問企業數據、業務系統或實時信息。這正是 Model Context Protocol (MCP) 要解決的核心問題。

MCP 正在成為連接 AI  模型與現實世界的標準化橋梁。這套專門為大語言模型設計的協議,為模型安全、一致地接入外部數據源和工具服務提供了統一的解決方案。想象一下,你的 AI 助手不僅能回答問題,還能直接查詢數據庫、調用業務接口、生成實時報告——這正是 MCP 帶來的變革。

在技術選型上,Java 生態憑借其成熟的企業級能力和強大的類型系統,為構建生產就緒的 MCP 服務器提供了理想的基礎。特別是 Spring AI 框架的 MCP 支持,讓開發者能夠基于熟悉的技術棧構建可靠、可擴展的智能服務。

一、深入理解 MCP 協議

MCP 不僅僅是一個技術協議,它代表了一種全新的 AI 應用架構思想。與傳統的 REST API 不同,MCP 從設計之初就充分考慮了大語言模型的使用場景和特性。

協議設計的三個核心洞察:

  1. 語義化交互:MCP 使用工具(Tools)、資源(Resources)和提示模板(Prompts)這些對 AI 友好的抽象,讓模型能夠理解每個接口的用途和使用方式。
  2. 標準化通信:通過統一的 JSON-RPC 2. 0 協議,MCP 確保了不同系統之間的互操作性,避免了每個服務都要自定義接口的碎片化問題。
  3. 安全優先:MCP 內置了認證和授權機制,確保企業數據在 AI 交互過程中的安全性。

從技術實現視角看,MCP 的每個"能力"本質上都是一個精心設計的遠程函數。開發者需要提供清晰的 Schema(定義輸入輸出結構)和豐富的元信息描述,讓大語言模型能夠理解:這個工具是做什么的?什么時候使用?需要什么參數?返回什么結果?

這種設計哲學使得 MCP 不僅是一個技術標準,更是一種促進人機協作的交互范式。它讓 AI 系統從被動的問答機器轉變為能夠主動操作業務系統的智能助手。

二、Spring AI MCP技術優勢

在技術選型過程中,我們選擇了 Spring AI MCP 而非 Python 生態的 FastMCP,這背后有著深層的技術考量和企業需求分析。

為什么選擇 Java + Spring AI 技術棧?

(1)類型安全的堅實保障

Java 的強類型系統在構建企業級應用時提供了無可替代的優勢。編譯期的類型檢查能夠捕獲大部分潛在錯誤,這在處理復雜的業務邏輯和數據轉換時尤為重要。想象一下,在金融或醫療等對準確性要求極高的場景中,類型安全不是可選項,而是必選項。

(2)成熟的依賴注入體系

Spring 框架的 IOC 容器讓組件管理和依賴注入變得優雅而高效。這種設計模式特別適合 MCP 服務器的架構,因為工具服務通常需要依賴數據庫連接、外部 API 客戶端、配置管理等多個組件。

(3)企業集成的豐富生態

Spring 生態提供了與各種企業系統集成的成熟解決方案。無論是數據庫訪問(Spring Data)、消息隊列(Spring  Integration)、安全認證(Spring Security)還是監控管理(Spring Boot  Actuator),都有現成的組件可以復用。

(4)生產環境的完備支持

從配置管理、健康檢查到性能監控和日志追蹤,Spring Boot 提供了一整套生產就緒的特性。這些功能對于確保 MCP 服務器在真實業務環境中的穩定運行至關重要。

(5)團隊技術棧的延續性

對于已經擁有 Java 技術積累的團隊,使用 Spring AI MCP 可以最大限度地利用現有知識和工具鏈,降低學習成本,加快項目交付速度。

三、實戰演練

3.1 環境準備與項目初始化

讓我們從最基礎的環境搭建開始。首先確保你的開發環境滿足以下要求:

  • JDK 17 或更高版本
  • Maven 3.6+ 或 Gradle 7+
  • 支持 Spring Boot 3.x 的 IDE

創建項目時,我們建議使用 Spring Initializr 生成項目骨架,確保依賴版本的一致性。在 pom.xml 中,除了基礎的 Spring Boot 依賴,我們還需要添加 MCP 相關的特定依賴。

依賴選擇的深層考量:

選擇 spring-ai-mcp-server-spring-boot-starter 而不是基礎的手動配置,是因為 starter 提供了自動配置、合理的默認值以及與 Spring 生態的無縫集成。這顯著降低了配置復雜度,讓開發者能夠專注于業務邏輯的實現。

創建SpringBoot項目,添加如下核心依賴。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
        <version>1.0.0-M6</version>
    </dependency>
</dependencies>

3.2 核心服務架構設計

在實現具體功能之前,我們需要理解 Spring AI MCP 服務器的核心架構組件:

// Application.java - 服務啟動入口
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
publicclass Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public ToolCallbackProvider mathTools(MathService mathService) {
        return MethodToolCallbackProvider.builder()
                .toolObjects(mathService)
                .build();
    }
}

這個簡單的啟動類背后包含了 Spring AI MCP 的智能設計:

  • 自動配置機制:Spring Boot 會自動配置 MCP 服務器端點、消息處理和傳輸層
  • 工具發現系統:通過 ToolCallbackProvider 自動掃描和注冊所有帶有 @Tool 注解的方法
  • 生命周期管理:Spring 容器負責組件的創建、依賴注入和銷毀

3.3 業務工具的實現

工具(Tools)是 MCP 服務器的核心能力載體。每個工具都應該設計得專注、可復用且易于理解。

// MathService.java - 數學計算工具
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;

@Service
publicclass MathService {

    @Tool(name = "add", description = "Add two integers and return the sum")
    public int add(
            @ToolParam(description = "First integer operand") int a,
            @ToolParam(description = "Second integer operand") int b) {
        // 輸入驗證和業務邏輯處理
        if (a < 0 || b < 0) {
            thrownew IllegalArgumentException("Negative numbers are not supported");
        }
        return a + b;
    }

    @Tool(name = "multiply", description = "Multiply two numbers and return the product")
    public double multiply(
            @ToolParam(description = "First number") double a,
            @ToolParam(description = "Second number") double b) {
        // 處理浮點數精度問題
        BigDecimal result = BigDecimal.valueOf(a).multiply(BigDecimal.valueOf(b));
        return result.doubleValue();
    }
}

工具設計的最佳實踐:

  1. 清晰的命名和描述:工具名稱應該直觀,描述應該準確說明功能、輸入輸出和可能的副作用。
  2. 完善的參數注解:每個參數都應該有詳細的描述,幫助 AI 模型理解何時以及如何提供這個參數。
  3. 健壯的錯誤處理:工具應該能夠處理各種邊界情況,并提供有意義的錯誤信息。
  4. 性能考慮:對于可能被頻繁調用的工具,要考慮性能優化和資源管理。

3.4 資源配置與管理策略

資源(Resources)在 MCP 中代表只讀數據,它們可以是靜態配置信息,也可以是基于參數的動態數據。

// ResourceService.java - 資源管理服務
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Service
publicclass ResourceService {

    @Tool(name = "get_version", description = "Retrieve current server version and build information")
    public Map<String, Object> getVersion() {
        return Map.of(
            "version", "1.0.0",
            "build_time", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME),
            "environment", "production"
        );
    }

    @Tool(name = "get_user_profile", description = "Retrieve detailed user profile information by user ID")
    public Map<String, Object> getUserProfile(
            @ToolParam(description = "Unique identifier of the user") int userId) {
        
        // 模擬從數據庫或外部服務獲取用戶信息
        // 在實際項目中,這里會集成真實的數據源
        return Map.of(
            "user_id", userId,
            "name", "User " + userId,
            "status", "active",
            "created_at", "2024-01-01T00:00:00",
            "last_login", LocalDateTime.now().minusDays(1).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME),
            "permissions", new String[]{"read", "write", "execute"}
        );
    }
}

資源設計的關鍵考慮:

  1. 數據一致性:確保資源數據在不同調用之間保持一致
  2. 緩存策略:對于不經常變化的數據,考慮實現緩存機制
  3. 數據脫敏:敏感信息應該在返回前進行適當的脫敏處理
  4. 版本管理:資源結構的變化應該考慮版本兼容性

3.5 配置管理

MCP 服務器的配置管理需要平衡靈活性和嚴謹性。我們采用分層配置策略,適應不同環境的需求。

# application.yml - 基礎配置
server:
port:8080
servlet:
    context-path:/api

spring:
application:
    name:mcp-server
ai:
    mcp:
      server:
        name:enterprise-mcp-server
        version:1.0.0
        type:ASYNC
        sse-endpoint:/sse
        sse-message-endpoint:/mcp/messages
        # 高級配置選項
        max-concurrent-requests:100
        request-timeout:30s

management:
endpoints:
    web:
      exposure:
        include:health,info,metrics,prometheus
endpoint:
    health:
      show-details:always
    metrics:
      enabled:true

logging:
level:
    org.springframework.ai:INFO
    com.yourcompany.mcp:DEBUG

配置設計的工程考量:

  1. 環境隔離:使用 Spring Profile 管理不同環境的配置
  2. 安全敏感信息:密碼、密鑰等敏感信息應該通過環境變量或配置中心管理
  3. 性能調優參數:根據預期負載調整連接數、超時時間等參數
  4. 監控和可觀測性:配置適當的日志級別和監控端點

四、高級特性與實踐

4.1 上下文感知的智能工具

在復雜的業務場景中,工具往往需要訪問會話上下文信息。Spring AI MCP 提供了強大的上下文支持。

// ContextAwareService.java - 上下文感知服務
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
publicclass ContextAwareService {
    
    privatefinal RestTemplate restTemplate;
    privatestaticfinal Logger logger = LoggerFactory.getLogger(ContextAwareService.class);
    
    public ContextAwareService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @Tool(name = "summarize_content", 
          description = "Fetch content from a URL and generate a concise summary")
    public String summarizeContent(
            @ToolParam(description = "URL of the content to summarize") String url) {
        
        // 記錄詳細的操作日志
        logger.info("Starting content summarization for URL: {}", url);
        long startTime = System.currentTimeMillis();
        
        try {
            // 驗證 URL 格式
            if (!isValidUrl(url)) {
                thrownew IllegalArgumentException("Invalid URL format: " + url);
            }
            
            // 獲取遠程內容
            logger.debug("Fetching content from: {}", url);
            String content = fetchContentSafely(url);
            
            if (content == null || content.trim().isEmpty()) {
                return"No content available from the provided URL";
            }
            
            // 生成智能摘要
            String summary = generateIntelligentSummary(content);
            long processingTime = System.currentTimeMillis() - startTime;
            
            logger.info("Successfully summarized content in {} ms", processingTime);
            return String.format("Summary (%d chars): %s", summary.length(), summary);
            
        } catch (Exception e) {
            logger.error("Error summarizing content from URL: {}", url, e);
            return"Error processing content: " + e.getMessage();
        }
    }
    
    private boolean isValidUrl(String url) {
        return url != null && 
               (url.startsWith("http://") || url.startsWith("https://"));
    }
    
    private String fetchContentSafely(String url) {
        try {
            // 設置合理的超時時間
            return restTemplate.getForObject(url, String.class);
        } catch (Exception e) {
            logger.warn("Failed to fetch content from URL: {}", url, e);
            returnnull;
        }
    }
    
    private String generateIntelligentSummary(String content) {
        // 在實際項目中,這里可以集成 AI 摘要服務
        // 當前實現提供基礎的文本處理
        String cleanContent = content.replaceAll("\\s+", " ").trim();
        
        // 智能截斷,盡量在句子邊界處斷開
        int maxLength = 200;
        if (cleanContent.length() <= maxLength) {
            return cleanContent;
        }
        
        String truncated = cleanContent.substring(0, maxLength);
        int lastSentenceEnd = Math.max(
            truncated.lastIndexOf('.'),
            Math.max(
                truncated.lastIndexOf('!'),
                truncated.lastIndexOf('?')
            )
        );
        
        if (lastSentenceEnd > maxLength * 0.6) {
            return truncated.substring(0, lastSentenceEnd + 1) + "..";
        }
        
        return truncated + "...";
    }
}

4.2 安全架構與認證授權

在生產環境中,安全是不可妥協的要求。我們采用多層安全防護策略。

// SecurityConfig.java - 安全配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.config.http.SessionCreationPolicy;

@Configuration
@EnableWebSecurity
publicclass SecurityConfig {
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // 禁用 CSRF,因為 MCP 使用無狀態認證
            .csrf(csrf -> csrf.disable())
            
            // 配置會話管理為無狀態
            .sessionManagement(session -> session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            )
            
            // 配置請求授權
            .authorizeHttpRequests(authz -> authz
                // MCP 端點需要認證
                .requestMatchers("/mcp/**").authenticated()
                // 健康檢查端點允許匿名訪問
                .requestMatchers("/actuator/health").permitAll()
                // 其他 API 端點需要認證
                .requestMatchers("/api/**").authenticated()
                .anyRequest().permitAll()
            )
            
            // 配置 OAuth2 資源服務器
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(jwt -> {
                    // JWT 配置可以在 application.yml 中指定
                })
            );
        
        return http.build();
    }
}

安全設計的深度考量:

  1. 防御性編程:所有輸入都應該驗證,所有輸出都應該過濾
  2. 最小權限原則:每個工具只應該擁有完成其功能所需的最小權限
  3. 審計日志:記錄所有的敏感操作以便事后審計
  4. 密鑰管理:使用專業的密鑰管理服務,避免硬編碼密鑰

4.3 客戶端集成與測試策略

一個完整的 MCP 解決方案需要強大的客戶端支持和全面的測試覆蓋。

// MCPClientService.java - 客戶端服務
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
publicclass MCPClientService {
    
    privatefinal ChatClient chatClient;
    privatestaticfinal Logger logger = LoggerFactory.getLogger(MCPClientService.class);
    
    public MCPClientService(ChatClient chatClient) {
        this.chatClient = chatClient;
    }
    
    public String processNaturalLanguageQuery(String userQuery) {
        logger.info("Processing natural language query: {}", userQuery);
        
        try {
            String result = chatClient.prompt()
                    .user(userQuery)
                    .call()
                    .content();
            
            logger.debug("Successfully processed query, result length: {}", 
                        result != null ? result.length() : 0);
            return result;
            
        } catch (Exception e) {
            logger.error("Failed to process query: {}", userQuery, e);
            return"Sorry, I encountered an error while processing your request: " + 
                   e.getMessage();
        }
    }
}

// TestClient.java - 集成測試客戶端
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("dev") // 只在開發環境運行
publicclass TestClient implements CommandLineRunner {
    
    privatefinal MCPClientService clientService;
    
    public TestClient(MCPClientService clientService) {
        this.clientService = clientService;
    }
    
    @Override
    public void run(String... args) throws Exception {
        System.out.println("=== MCP Server Integration Tests ===");
        System.out.println();
        
        // 測試數學計算功能
        testMathOperations();
        
        // 測試資源訪問功能  
        testResourceAccess();
        
        // 測試復雜查詢處理
        testComplexQueries();
        
        System.out.println("=== All Tests Completed ===");
    }
    
    private void testMathOperations() {
        System.out.println("1. Testing Math Operations:");
        
        String[] mathQueries = {
            "Calculate 15 + 25",
            "What is 6.5 multiplied by 4.2?",
            "Add 100 and 200 together"
        };
        
        for (String query : mathQueries) {
            System.out.println("   Query: " + query);
            String result = clientService.processNaturalLanguageQuery(query);
            System.out.println("   Result: " + result);
            System.out.println();
        }
    }
    
    private void testResourceAccess() {
        System.out.println("2. Testing Resource Access:");
        
        String[] resourceQueries = {
            "What version is the server running?",
            "Get information for user ID 12345",
            "Show me the server status"
        };
        
        for (String query : resourceQueries) {
            System.out.println("   Query: " + query);
            String result = clientService.processNaturalLanguageQuery(query);
            System.out.println("   Result: " + result);
            System.out.println();
        }
    }
    
    private void testComplexQueries() {
        System.out.println("3. Testing Complex Queries:");
        
        String[] complexQueries = {
            "First add 10 and 20, then multiply the result by 3",
            "Get the server version and then show me user 999's profile"
        };
        
        for (String query : complexQueries) {
            System.out.println("   Query: " + query);
            String result = clientService.processNaturalLanguageQuery(query);
            System.out.println("   Result: " + result);
            System.out.println();
        }
    }
}

4.4 與 LLM 應用集成

部署完成后,下一步是將 MCP 服務器集成到大語言模型應用中。以下示例展示如何與 OpenAI API 集成:

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.web.client.RestTemplate;
import org.springframework.stereotype.Service;

@Service
publicclass LLMIntegrationService {
    
    privatefinal ChatClient chatClient;
    privatefinal RestTemplate restTemplate;
    
    public LLMIntegrationService(ChatClient chatClient, RestTemplate restTemplate) {
        this.chatClient = chatClient;
        this.restTemplate = restTemplate;
    }
    
    public String processWithLLM(String userQuery) {
        // 使用 MCP 工具處理用戶查詢
        String toolResult = chatClient.prompt()
                .user(userQuery)
                .call()
                .content();
        
        // 將結果傳遞給 LLM 進行進一步處理
        String llmPrompt = String.format(
            "Based on the calculation result '%s', provide a user-friendly explanation of what this means in practical terms.",
            toolResult
        );
        
        // 調用外部 LLM API(示例使用模擬響應)
        return enhanceWithLLM(llmPrompt);
    }
    
    private String enhanceWithLLM(String prompt) {
        // 實際項目中這里會調用真實的 LLM API
        // 示例中使用模擬邏輯
        if (prompt.contains("calculation") || prompt.contains("result")) {
            return"The calculation has been completed successfully. This result can be used for further analysis or decision making.";
        }
        return"I've processed your request using the available tools. Is there anything else you'd like to know?";
    }
}

五、部署與運維

5.1 容器化與云原生部署

現代應用部署越來越傾向于容器化和云原生架構。以下是我們的 Docker 和 Kubernetes 配置實踐。

Dockerfile 優化:

# 使用多階段構建減小鏡像大小
FROM eclipse-temurin:17-jdk as builder
WORKDIR /app
COPY . .
RUN ./mvnw clean package -DskipTests

# 生產階段
FROM eclipse-temurin:17-jre
WORKDIR /app

# 創建非root用戶運行應用
RUN groupadd -r spring && useradd -r -g spring spring
USER spring

# 復制構建產物
COPY --from=builder /app/target/*.jar app.jar

# 配置JVM參數
ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100"

EXPOSE8080

# 使用 exec form 啟動應用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

Kubernetes 部署配置:

# deployment.yaml
apiVersion:apps/v1
kind:Deployment
metadata:
name:mcp-server
labels:
    app:mcp-server
spec:
replicas:3
selector:
    matchLabels:
      app:mcp-server
template:
    metadata:
      labels:
        app:mcp-server
      annotations:
        prometheus.io/scrape:"true"
        prometheus.io/port:"8080"
        prometheus.io/path:"/actuator/prometheus"
    spec:
      containers:
      -name:mcp-server
        image:your-registry/mcp-server:latest
        ports:
        -containerPort:8080
        env:
        -name:SPRING_PROFILES_ACTIVE
          value:"prod"
        -name:JAVA_OPTS
          value:"-Xmx512m -Xms256m"
        resources:
          requests:
            memory:"512Mi"
            cpu:"250m"
          limits:
            memory:"1Gi"
            cpu:"500m"
        livenessProbe:
          httpGet:
            path:/actuator/health
            port:8080
          initialDelaySeconds:60
          periodSeconds:10
        readinessProbe:
          httpGet:
            path:/actuator/health/readiness
            port:8080
          initialDelaySeconds:30
          periodSeconds:5
---
apiVersion:v1
kind:Service
metadata:
name:mcp-service
spec:
selector:
    app:mcp-server
ports:
-port:80
    targetPort:8080
type:ClusterIP

5.2 監控與可觀測性

在生產環境中,完善的監控體系是保證服務可靠性的關鍵。

應用監控配置:

# application-prod.yml - 生產環境監控配置
management:
endpoints:
    web:
      exposure:
        include:health,info,metrics,prometheus,loggers
endpoint:
    health:
      show-details:always
      show-components:always
    metrics:
      enabled:true
    prometheus:
      enabled:true
metrics:
    export:
      prometheus:
        enabled:true
    distribution:
      percentiles-histogram:
        "[http.server.requests]":true
    tags:
      application:${spring.application.name}
      environment:prod

logging:
level:
    org.springframework.ai:INFO
    com.yourcompany.mcp:INFO
pattern:
    level:"%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"

# 自定義健康檢查指標
endpoints:
health:
    custom:
      mcp-connection:
        enabled:true
      external-api:
        enabled:true

六、總結

通過 Spring AI MCP,Java 開發者能夠快速構建企業級的 MCP 服務器,為大型語言模型提供穩定可靠的外部能力接入。相比 Python 方案,Java 版本在類型安全、企業集成和生產就緒方面具有顯著優勢。

無論是構建內部 AI 助手還是開發面向客戶的智能應用,Spring AI MCP 都提供了從概念驗證到生產部署的完整技術路徑。

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2020-02-18 20:28:23

AI人工智能

2025-11-10 07:47:53

2025-11-19 09:18:11

SpringAIAlibaba智能體

2022-02-06 20:55:39

jsEsbuild項目

2019-09-14 22:05:19

人臉識別地鐵AI

2025-11-07 09:30:11

2023-11-13 08:11:30

Golang測試驅動開發

2023-05-14 23:38:43

Glarity用戶視頻

2012-04-12 09:53:02

2025-04-16 01:00:00

API工具AI

2024-08-20 13:15:22

2025-07-24 00:45:00

AIMCP服務端

2025-04-29 09:07:21

2025-02-26 07:00:00

Go 語言Ollama 模型dubbogo

2022-11-30 10:59:20

2014-10-11 09:15:36

2009-04-22 15:16:30

2020-01-20 14:40:39

工具代碼開發

2021-01-29 09:07:39

數據保護信息安全數據隱私

2011-09-14 09:48:09

點贊
收藏

51CTO技術棧公眾號

国产精品高潮呻吟久久| 亚洲永久免费| 日韩精品综合一本久道在线视频| 日韩不卡视频一区二区| 熟妇人妻一区二区三区四区| 日韩av电影天堂| 久久国产加勒比精品无码| 亚洲乱妇老熟女爽到高潮的片| 日本а中文在线天堂| 国产精品拍天天在线| 国产精品欧美久久| 亚洲影视一区二区| 亚洲美女黄网| 日日狠狠久久偷偷四色综合免费| 成人欧美精品一区二区| 精品123区| 午夜精品视频在线观看| 在线观看欧美一区| 牛牛影视精品影视| 成人午夜视频在线观看| 国产精品pans私拍| 日韩和一区二区| 99精品一区| 亚洲天堂网站在线观看视频| 色综合久久久无码中文字幕波多| 日日夜夜天天综合| 午夜久久福利影院| 国产肉体ⅹxxx137大胆| 免费在线毛片网站| 国产亚洲欧美一级| 精品久久久久久综合日本| av观看在线免费| 蜜桃久久av一区| 全球成人中文在线| 国产午夜精品一区二区理论影院| 91久久电影| 中文字幕日本精品| 女人又爽又黄免费女仆| 欧美电影在线观看完整版| 欧美一级生活片| 国产免费中文字幕| 粉嫩91精品久久久久久久99蜜桃| 欧美性猛交xxxx免费看久久久| 男人日女人的bb| 国内精品久久久久久野外| 欧美国产综合色视频| 欧美在线3区| 欧美偷拍视频| 久久久噜噜噜久久人人看| 国产一区再线| 亚洲欧洲精品视频| 91首页免费视频| 狼狼综合久久久久综合网| 少妇av一区二区| 99精品热视频| 精品欧美一区二区久久久伦 | 欧美熟乱第一页| 精品久久久久av| 天堂久久午夜av| 在线视频欧美精品| www.色偷偷.com| 成人在线免费电影网站| 欧美日韩专区在线| 国内外成人免费在线视频| 久久精品97| 日韩一二在线观看| 国产无套精品一区二区三区| 8x国产一区二区三区精品推荐| 91精品国产综合久久福利软件 | 成人一区二区三区在线观看| 成人蜜桃视频| 污视频在线免费| 国产嫩草影院久久久久| 亚洲第一精品区| 亚洲丝袜一区| 精品成人国产在线观看男人呻吟| 亚洲中文字幕无码专区| 久久野战av| 91精品在线一区二区| 最新国产精品自拍| 亚洲va久久| 社区色欧美激情 | 久久香蕉精品视频| 欧美资源在线| 91视频-88av| 少妇av一区二区| 国产精品色一区二区三区| 日本中文字幕一级片| 蜜桃视频在线观看播放| 91久久国产综合久久| 婷婷激情综合五月天| 极品一区美女高清| 色天天综合狠狠色| 日本在线观看中文字幕| 免费的成人av| 国产青春久久久国产毛片 | 久久视频免费在线播放| 国产乱码久久久久久| 日韩电影网1区2区| 国产免费一区二区三区| 香蕉视频在线播放| 亚洲成人在线免费| 91日韩视频在线观看| 欧美一区在线观看视频| 亚洲欧洲日产国产网站| 国产三级精品在线不卡| 这里只有久久精品| 欧美69wwwcom| 日韩欧美第一页| 性视频1819p久久| 亚洲欧美一二三区| 成人黄色国产精品网站大全在线免费观看| 欧美一区观看| 国产污视频在线播放| 777午夜精品免费视频| 久久丫精品国产亚洲av不卡 | 激情图片qvod| 亚洲伦乱视频| 日韩黄色av网站| 九九视频在线免费观看| 蜜桃视频一区二区三区| 久久一区二区三区av| 性欧美videos高清hd4k| 精品视频1区2区| 日本理论中文字幕| 欧美专区在线| 久久av免费一区| 福利写真视频网站在线| 在线播放/欧美激情| 日本理论中文字幕| 视频在线观看91| 精品欧美国产| 成人在线观看免费高清| 少妇一级淫免费放| 久久伊人资源站| 午夜精品一区二区三区视频| 羞羞答答国产精品www一本| 亚洲一区久久久| 欧美videos极品另类| 在线亚洲高清视频| 成人黄色av网| 国产视频第二页| 国产精品午夜久久| av视屏在线播放| 免费欧美激情| 青青青国产精品一区二区| 天天av综合网| 精品成人在线视频| 最新在线黄色网址| 欧美亚洲免费| 免费看成人片| 二区三区不卡| 亚洲人成啪啪网站| av手机天堂网| 欧美—级在线免费片| 日日噜噜夜夜狠狠| 99久久99久久精品国产片果冰| 国产精品老牛影院在线观看| 成人在线免费公开观看视频| 欧美日韩国产中文| 亚洲人与黑人屁股眼交| 国产在线日韩欧美| 日韩亚洲欧美一区二区| 岛国精品一区| 日本91av在线播放| av在线三区| 欧美精品电影在线播放| 国产1区2区3区4区| 成人蜜臀av电影| 欧美国产激情视频| 日韩av密桃| 91天堂在线观看| 国精一区二区三区| 亚洲欧美精品在线| 中文字幕在线播放不卡| 亚洲女与黑人做爰| 欧美夫妇交换xxx| 久久国产主播| 宅男一区二区三区| xxxx日韩| 国产激情久久久久| 最新国产在线拍揄自揄视频| 亚洲高清久久久久久| 欧美 日韩 精品| 一区二区中文字幕在线| 亚洲成年人在线观看| 午夜在线播放视频欧美| 亚洲午夜高清视频| 成人台湾亚洲精品一区二区 | 内射毛片内射国产夫妻| 国产乱淫av一区二区三区| 亚洲国产成人精品无码区99| 精品国产一区一区二区三亚瑟 | 五月综合久久| 成人激情视频在线观看| 国产黄色大片在线观看| 亚洲欧美精品在线| www.成人精品| 欧美综合一区二区| 国产无码精品在线播放| 中文幕一区二区三区久久蜜桃| 性生活一级大片| 久久动漫亚洲| 大胆欧美熟妇xx| 欧美亚洲激情| 国产九色精品| 二区三区精品| 国产成人avxxxxx在线看| 成人黄色网址| 一本色道久久综合狠狠躁篇的优点| 99热这里只有精品66| 91福利视频网站| 日韩av综合在线| 亚洲婷婷在线视频| 国产又大又粗又爽的毛片| 国产精品中文有码| 亚洲国产精品三区| 国产农村妇女毛片精品久久莱园子| 正在播放国产精品| 国产成人影院| 久久99精品国产一区二区三区| 日韩在线视频免费播放| 欧美美女色图| 亚洲午夜免费福利视频| av资源在线免费观看| 91亚洲精品久久久蜜桃网站| 久久精品久久99| 麻豆一区二区99久久久久| 免费无码国产v片在线观看| 欧美日韩第一区| 亚洲最新在线| 亚洲天堂av网站| 超碰在线公开| 久久香蕉国产线看观看av| 极品美乳网红视频免费在线观看| 精品国一区二区三区| 国产情侣在线播放| 欧美精品v日韩精品v韩国精品v| 成人h动漫精品一区二区下载| 黑人狂躁日本妞一区二区三区 | caoporm在线视频| 亚洲综合精品| 日本少妇高潮喷水视频| 日韩网站在线| 青青在线视频免费观看| 中文字幕亚洲精品乱码| 五月天在线免费视频| 国产91绿帽单男绿奴| 亚洲网友自拍偷拍| 久久亚洲AV无码| 亚洲一区二区三区四区在线观看| av成人免费网站| 悠悠色在线精品| 欧美精品一级片| 性做久久久久久免费观看| 懂色av.com| 亚洲va欧美va人人爽午夜| 日韩精品视频免费播放| 动漫精品一区二区| 色av性av丰满av| 在线视频一区二区三| 中文字幕日韩三级| 欧美精品1区2区| 国产精品久久婷婷| 日韩亚洲欧美成人一区| 亚洲精品国产suv一区| 亚洲第一天堂无码专区| 网站黄在线观看| 亚洲欧美自拍一区| 亚洲欧美视频一区二区| 久久亚洲精品视频| h片在线观看视频免费免费| 91精品国产91久久久久| 四虎4545www国产精品| 国产精品自产拍高潮在线观看| 不卡一区视频| 国产一级特黄a大片99| 中文字幕精品影院| 天天综合中文字幕| 好吊日精品视频| 红桃av在线播放| 麻豆精品蜜桃视频网站| 亚洲AV成人精品| 91麻豆123| 免费看特级毛片| 天涯成人国产亚洲精品一区av| 日本三级一区二区三区| 91精品国产全国免费观看| 欧美一级一区二区三区| 在线观看欧美视频| 日本色护士高潮视频在线观看| 欧美一级在线播放| 国产精品久久久久久av公交车| 精品福利影视| 91精品国产91久久久久久黑人| 加勒比成人在线| 久久国产精品第一页| 白嫩情侣偷拍呻吟刺激| 国产精品国产三级国产三级人妇| 国产极品在线播放| 欧美日韩激情一区| 亚州精品国产精品乱码不99按摩| 色先锋资源久久综合5566| 51精品视频| 91久久精品国产91久久性色| 午夜先锋成人动漫在线| 国产精品无码电影在线观看 | www.夜夜爽| av激情亚洲男人天堂| 搜索黄色一级片| 色天使色偷偷av一区二区| 成人爽a毛片一区二区| 色999日韩欧美国产| 日韩av一卡| 999在线观看免费大全电视剧| 日韩av在线播放网址| 国产免费毛卡片| 成人中文字幕电影| 国产大片免费看| 欧美揉bbbbb揉bbbbb| 青青草在线免费视频| 久久久久久久久久久久av| 国产精品一区免费在线| 亚洲精品在线视频观看| 男人天堂欧美日韩| 熟妇人妻久久中文字幕| 亚洲激情图片qvod| av免费中文字幕| 欧美在线导航| 成人国产在线看| 国产精品66部| 欧美成人777| 欧美日韩免费不卡视频一区二区三区 | 精品一区二区综合| 极品蜜桃臀肥臀-x88av| 色中色一区二区| 欧美色图另类| 国产999在线| 最新亚洲精品| 四虎永久在线精品无码视频| 99精品视频一区| 中文字幕一区二区三区精品| 精品乱人伦小说| 国产羞羞视频在线播放| 丁香五月网久久综合| 国产精品久久| 天天躁日日躁狠狠躁av麻豆男男| 亚洲国产成人91porn| 丰满人妻一区二区| 国外成人性视频| 久久影院资源站| 久久精品.com| 国产欧美一区在线| 在线观看av大片| 久久久极品av| 一区二区三区国产好| 亚洲中文字幕无码一区二区三区| 国产在线视视频有精品| 欧美精品xxxxx| 亚洲精品美女久久久| 写真福利精品福利在线观看| 日韩欧美手机在线| 久久 天天综合| 精国产品一区二区三区a片| 亚洲国产精品99| 97se综合| 亚洲三级一区| 粉嫩av一区二区三区在线播放| 亚洲精品在线观看av| 精品一区二区三区四区| 国产伊人久久| 天堂а√在线中文在线| av不卡一区二区三区| 天堂网中文字幕| 日韩三级成人av网| 1769国产精品视频| 国产免费成人在线| 国产精品成人免费在线| 欧美熟妇交换久久久久久分类| 欧美自拍视频在线观看| 首页国产精品| 国产人成视频在线观看| 欧美性色aⅴ视频一区日韩精品| 久草资源在线观看| 精品乱码一区| 蜜桃一区二区三区四区| 天天操天天射天天爽| 亚洲一级黄色片| 2020最新国产精品| 免费裸体美女网站| 亚洲免费视频中文字幕| 三级毛片在线免费看| 91色精品视频在线| 欧美亚洲三级| 激情综合网五月天| 一本色道久久综合狠狠躁篇怎么玩| 国产午夜久久av| 热久久精品国产| 亚洲一区视频在线观看视频| 国产福利电影在线|