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

玩轉(zhuǎn)Spring AI MCP:從開發(fā)到部署手把手教你打造并運(yùn)維自己的AI智能體

人工智能
隨著人工智能技術(shù)的發(fā)展,智能對(duì)話系統(tǒng)在各個(gè)行業(yè)中的應(yīng)用越來越廣泛。本項(xiàng)目旨在基于SpringAI Alibaba快速構(gòu)建一個(gè)基于大模型的智能對(duì)話助手,通過提供多種工作模式,滿足用戶在不同場景下的需求,例如通俗解釋、要點(diǎn)總結(jié)、風(fēng)險(xiǎn)分析等。

在人工智能技術(shù)飛速發(fā)展的今天,大模型應(yīng)用開發(fā)已不再是高不可攀的技術(shù)領(lǐng)域。今天,帶著大家使用SpringAI  Alibaba框架,從零開始構(gòu)建一個(gè)功能完善的智能對(duì)話助手。無論你是剛?cè)腴T的新手還是有一定經(jīng)驗(yàn)的開發(fā)者,都能通過本教程快速掌握大模型應(yīng)用開發(fā)的核心技能。

一、項(xiàng)目概述

隨著人工智能技術(shù)的發(fā)展,智能對(duì)話系統(tǒng)在各個(gè)行業(yè)中的應(yīng)用越來越廣泛。本項(xiàng)目旨在基于SpringAI Alibaba快速構(gòu)建一個(gè)基于大模型的智能對(duì)話助手,通過提供多種工作模式,滿足用戶在不同場景下的需求,例如通俗解釋、要點(diǎn)總結(jié)、風(fēng)險(xiǎn)分析等。

我們將分兩個(gè)階段完成這個(gè)項(xiàng)目:

  1. 基礎(chǔ)版本:構(gòu)建具備專業(yè)領(lǐng)域知識(shí)的固定角色智能體
  2. 進(jìn)階版本:實(shí)現(xiàn)多模式切換的智能對(duì)話系統(tǒng)

接下來,我們一起完成這個(gè)SpringAI Alibaba項(xiàng)目。

二、項(xiàng)目初始化與環(huán)境搭建

2.1 創(chuàng)建SpringBoot項(xiàng)目

首先,我們需要搭建項(xiàng)目基礎(chǔ)框架。推薦使用IntelliJ IDEA進(jìn)行開發(fā):

  1. 打開IDEA,選擇 File → New → Project
  2. 在左側(cè)菜單中選擇 Spring Initializr
  3. 配置項(xiàng)目基本信息:
  • Project SDK:選擇JDK 17或更高版本
  • Groupcom.tech-explorer(可根據(jù)實(shí)際情況修改)
  • Artifactai-agent-demo
  • Package namecom.tech-explorer.aiagent
  1. 在Dependencies中添加:
  • Spring Web:用于構(gòu)建Web接口
  • Lombok:簡化代碼編寫

點(diǎn)擊創(chuàng)建,等待項(xiàng)目初始化完成。

2.2 配置項(xiàng)目依賴

打開 pom.xml 文件,添加SpringAI Alibaba相關(guān)依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/>
    </parent>
    
    <groupId>com.tech-explorer</groupId>
    <artifactId>ai-agent-demo</artifactId>
    <version>1.0.0</version>
    <name>AI Agent Demo</name>
    <description>基于SpringAI Alibaba的智能助手Demo</description>
    
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <!-- SpringAI Alibaba 依賴管理 -->
            <dependency>
                <groupId>com.alibaba.cloud.ai</groupId>
                <artifactId>spring-ai-alibaba-bom</artifactId>
                <version>1.0.0.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <!-- Spring Boot 基礎(chǔ)依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- SpringAI Alibaba 核心依賴 -->
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
        </dependency>
        
        <!-- 工具類依賴 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- 測試依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.3 應(yīng)用配置

在 src/main/resources 目錄下創(chuàng)建 application.yml 配置文件:

# 服務(wù)器配置
server:
port:18080
servlet:
    context-path:/api

# Spring AI Alibaba 配置
spring:
ai:
    dashscope:
      # 從環(huán)境變量或配置文件中讀取API密鑰,確保安全
      api-key:${DASHSCOPE_API_KEY:sk-your-api-key-here}
      chat:
        options:
          # 使用通義千問Plus模型,可根據(jù)需要調(diào)整
          model:qwen-plus
          # 溫度參數(shù),控制生成文本的隨機(jī)性(0-1)
          temperature:0.7

# 應(yīng)用信息
app:
name:AI智能助手
version:1.0.0
description:基于SpringAIAlibaba構(gòu)建的智能對(duì)話系統(tǒng)

2.4 項(xiàng)目結(jié)構(gòu)說明

創(chuàng)建完整的項(xiàng)目包結(jié)構(gòu):

src/main/java/io/binghe/framework/ai
├── AiAgentApplication.java          # 應(yīng)用啟動(dòng)類
├── config/                          # 配置類目錄
├── controller/                      # 控制器目錄
├── service/                         # 服務(wù)層目錄
├── model/                           # 數(shù)據(jù)模型目錄
└── util/                            # 工具類目錄

三、構(gòu)建基礎(chǔ)版智能助手

3.1 創(chuàng)建應(yīng)用啟動(dòng)類

源碼詳見:io.binghe.framework.ai.AiAgentApplication。

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

3.2 定義響應(yīng)數(shù)據(jù)模型

創(chuàng)建統(tǒng)一響應(yīng)格式。

源碼詳見:io.binghe.framework.ai.model.ApiResponse。

@Data
@NoArgsConstructor
@AllArgsConstructor
publicclass ApiResponse<T> {
    privateboolean success;
    private String message;
    private T data;
    private LocalDateTime timestamp;
    private String requestId;
    
    // 成功響應(yīng)靜態(tài)方法
    publicstatic <T> ApiResponse<T> success(T data) {
        returnnew ApiResponse<>(true, "操作成功", data, LocalDateTime.now(), generateRequestId());
    }
    
    publicstatic <T> ApiResponse<T> success(String message, T data) {
        returnnew ApiResponse<>(true, message, data, LocalDateTime.now(), generateRequestId());
    }
    
    // 失敗響應(yīng)靜態(tài)方法
    publicstatic <T> ApiResponse<T> error(String message) {
        returnnew ApiResponse<>(false, message, null, LocalDateTime.now(), generateRequestId());
    }
    
    private static String generateRequestId() {
        return java.util.UUID.randomUUID().toString().replace("-", "").substring(0, 16);
    }
}

3.3 創(chuàng)建智能助手控制器

源碼詳見:io.binghe.framework.ai.controller.IntelligentAssistantController。

@Slf4j
@RestController
@RequestMapping("/v1/assistant")
@CrossOrigin(origins = "*")  // 允許跨域訪問,生產(chǎn)環(huán)境應(yīng)配置具體域名
publicclass IntelligentAssistantController {
    
    privatefinal ChatClient dashScopeChatClient;
    
    // 金融擔(dān)保專家角色設(shè)定
    privatestaticfinal String FINANCIAL_EXPERT_PROMPT = """
        你是一位專業(yè)的金融擔(dān)保業(yè)務(wù)專家,擁有10年以上的行業(yè)經(jīng)驗(yàn)。
        請(qǐng)嚴(yán)格按照以下要求回答問題:
        
        1. 用通俗易懂的中文解釋專業(yè)術(shù)語
        2. 回答要結(jié)構(gòu)清晰,重點(diǎn)突出
        3. 涉及風(fēng)險(xiǎn)的內(nèi)容要明確提示
        4. 對(duì)于不確定的信息要明確說明
        5. 保持專業(yè)、客觀、中立的態(tài)度
        
        如果用戶的問題超出金融擔(dān)保業(yè)務(wù)范圍,請(qǐng)先說明你的專業(yè)領(lǐng)域,
        然后盡可能提供有幫助的通用建議。
        """;
    
    public IntelligentAssistantController(ChatClient.Builder chatClientBuilder) {
        this.dashScopeChatClient = chatClientBuilder
            .defaultSystem(FINANCIAL_EXPERT_PROMPT)
            .build();
        log.info("智能助手控制器初始化完成");
    }
    
    @GetMapping("/chat")
    public ApiResponse<String> chat(@RequestParam("query") String query) {
        try {
            log.info("收到用戶查詢: {}", query);
            
            if (query == null || query.trim().isEmpty()) {
                return ApiResponse.error("查詢內(nèi)容不能為空");
            }
            
            if (query.length() > 1000) {
                return ApiResponse.error("查詢內(nèi)容過長,請(qǐng)控制在1000字符以內(nèi)");
            }
            
            String response = this.dashScopeChatClient
                .prompt()
                .user(query)
                .call()
                .content();
                
            log.info("AI回復(fù)生成成功,字符數(shù): {}", response.length());
            return ApiResponse.success("回復(fù)生成成功", response);
            
        } catch (Exception e) {
            log.error("處理用戶查詢時(shí)發(fā)生錯(cuò)誤: {}", e.getMessage(), e);
            return ApiResponse.error("系統(tǒng)繁忙,請(qǐng)稍后重試");
        }
    }
    
    @GetMapping("/health")
    public ApiResponse<String> healthCheck() {
        return ApiResponse.success("智能助手服務(wù)運(yùn)行正常");
    }
}

3.4 添加全局異常處理

源碼詳見:io.binghe.framework.ai.exception.GlobalExceptionHandler。

@Slf4j
@RestControllerAdvice
publicclass GlobalExceptionHandler {
    
    @ExceptionHandler(Exception.class)
    public ApiResponse<String> handleException(Exception e) {
        log.error("系統(tǒng)異常: {}", e.getMessage(), e);
        return ApiResponse.error("系統(tǒng)內(nèi)部錯(cuò)誤,請(qǐng)稍后重試");
    }
    
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public ApiResponse<String> handleMissingParams(MissingServletRequestParameterException e) {
        return ApiResponse.error("缺少必要參數(shù): " + e.getParameterName());
    }
    
    @ExceptionHandler(NoHandlerFoundException.class)
    public ApiResponse<String> handleNotFound(NoHandlerFoundException e) {
        return ApiResponse.error("請(qǐng)求接口不存在");
    }
}

3.5 測試基礎(chǔ)版本

啟動(dòng)應(yīng)用,訪問以下接口進(jìn)行測試。

源碼詳見:src/main/resources/shell/test.sh。

# 健康檢查
curl "http://localhost:18080/api/v1/assistant/health"

# 基礎(chǔ)對(duì)話測試
curl "http://localhost:18080/api/v1/assistant/chat?query=請(qǐng)解釋什么是連帶責(zé)任保證"

四、構(gòu)建進(jìn)階版多模式智能助手

4.1 擴(kuò)展控制器支持多模式

源碼詳見:io.binghe.framework.ai.controller.MultiModeAssistantController。

@Slf4j
@RestController
@RequestMapping("/v1/assistant")
@CrossOrigin(origins = "*")
publicclass MultiModeAssistantController {

    privatefinal AIChatService aiChatService;

    public MultiModeAssistantController(AIChatService aiChatService) {
        this.aiChatService = aiChatService;
        log.info("多模式智能助手控制器初始化完成");
    }

    /**
     * 多模式聊天接口
     */
    @GetMapping("/chat")
    public ApiResponse<Map<String, Object>> chat(
            @RequestParam("query") String query,
            @RequestParam(value = "mode", defaultValue = "explain") String modeCode) {

        try {
            log.info("收到用戶查詢: {}, 模式: {}", query, modeCode);

            // 參數(shù)驗(yàn)證
            if (query == null || query.trim().isEmpty()) {
                return ApiResponse.error("查詢內(nèi)容不能為空");
            }

            if (query.length() > 2000) {
                return ApiResponse.error("查詢內(nèi)容過長,請(qǐng)控制在2000字符以內(nèi)");
            }

            // 使用AIChatService處理請(qǐng)求
            Map<String, Object> responseData = aiChatService.processChatWithMode(query, modeCode);

            return ApiResponse.success(responseData.get("mode") + "模式回復(fù)生成成功", responseData);

        } catch (Exception e) {
            log.error("處理用戶查詢時(shí)發(fā)生錯(cuò)誤: {}", e.getMessage(), e);
            return ApiResponse.error("系統(tǒng)繁忙,請(qǐng)稍后重試");
        }
    }

    /**
     * 基礎(chǔ)聊天接口(無模式參數(shù))
     */
    @GetMapping("/basic/chat")
    public ApiResponse<String> basicChat(@RequestParam("query") String query) {
        try {
            if (query == null || query.trim().isEmpty()) {
                return ApiResponse.error("查詢內(nèi)容不能為空");
            }

            String response = aiChatService.processBasicChat(query);
            return ApiResponse.success("回復(fù)生成成功", response);

        } catch (Exception e) {
            log.error("處理基礎(chǔ)聊天時(shí)發(fā)生錯(cuò)誤: {}", e.getMessage(), e);
            return ApiResponse.error("系統(tǒng)繁忙,請(qǐng)稍后重試");
        }
    }

    /**
     * 獲取可用工作模式
     */
    @GetMapping("/modes")
    public ApiResponse<Map<String, Object>> getAvailableModes() {
        Map<String, Object> modesInfo = new HashMap<>();
        Map<String, String> modes = aiChatService.getAvailableModes();

        modesInfo.put("modes", modes);
        modesInfo.put("total", modes.size());
        modesInfo.put("defaultMode", "explain");

        return ApiResponse.success("可用工作模式列表", modesInfo);
    }

    /**
     * 健康檢查
     */
    @GetMapping("/health")
    public ApiResponse<String> healthCheck() {
        return ApiResponse.success("智能助手服務(wù)運(yùn)行正常");
    }

    /**
     * 獲取使用統(tǒng)計(jì)
     */
    @GetMapping("/stats")
    public ApiResponse<Map<String, Object>> getUsageStats() {
        Map<String, Object> stats = new HashMap<>();
        stats.put("usageStatistics", aiChatService.getUsageStatistics());
        stats.put("timestamp", java.time.LocalDateTime.now());

        return ApiResponse.success("使用統(tǒng)計(jì)信息", stats);
    }

    /**
     * 清空統(tǒng)計(jì)
     */
    @PostMapping("/stats/reset")
    public ApiResponse<String> resetStats() {
        aiChatService.clearStatistics();
        return ApiResponse.success("統(tǒng)計(jì)信息已清空");
    }
}

4.2 創(chuàng)建服務(wù)層封裝業(yè)務(wù)邏輯

源碼詳見:io.binghe.framework.ai.service.AIChatService。

@Slf4j
@Service
publicclass AIChatService {

    privatefinal ChatClient chatClient;
    privatefinal Map<String, Integer> usageStats = new ConcurrentHashMap<>();

    // 工作模式定義
    publicenum WorkMode {
        EXPLAIN("explain", "通俗解釋", """
            請(qǐng)用通俗易懂的語言解釋以下內(nèi)容,避免使用專業(yè)術(shù)語。
            如果必須使用專業(yè)術(shù)語,請(qǐng)用簡單的語言進(jìn)行說明。
            目標(biāo)受眾是非專業(yè)人士,請(qǐng)確保他們能夠完全理解。
            """),

        SUMMARIZE("summarize", "要點(diǎn)總結(jié)", """
            請(qǐng)總結(jié)以下內(nèi)容的關(guān)鍵要點(diǎn),要求:
            1. 用條目式列出主要觀點(diǎn)
            2. 每個(gè)要點(diǎn)要簡潔明了
            3. 突出最重要的信息
            4. 保持邏輯清晰
            """),

        RISK_ANALYSIS("risk", "風(fēng)險(xiǎn)分析", """
            請(qǐng)從專業(yè)角度分析以下內(nèi)容可能存在的風(fēng)險(xiǎn),包括:
            1. 主要風(fēng)險(xiǎn)點(diǎn)識(shí)別
            2. 風(fēng)險(xiǎn)發(fā)生概率評(píng)估
            3. 風(fēng)險(xiǎn)影響程度分析
            4. 風(fēng)險(xiǎn)防范建議
            請(qǐng)用嚴(yán)謹(jǐn)?shù)膽B(tài)度進(jìn)行分析。
            """),

        LEGAL_REVIEW("legal", "法律審查", """
            請(qǐng)從法律專業(yè)角度審查以下內(nèi)容:
            1. 法律合規(guī)性分析
            2. 潛在法律風(fēng)險(xiǎn)提示
            3. 條款明確性評(píng)估
            4. 改進(jìn)建議
            注意:本分析僅供參考,不構(gòu)成正式法律意見。
            """),

        COMPARE("compare", "對(duì)比分析", """
            請(qǐng)對(duì)以下內(nèi)容進(jìn)行對(duì)比分析:
            1. 明確比較的維度
            2. 各自的優(yōu)缺點(diǎn)
            3. 適用場景說明
            4. 選擇建議
            保持客觀公正的態(tài)度。
            """);

        privatefinal String code;
        privatefinal String name;
        privatefinal String instruction;

        WorkMode(String code, String name, String instruction) {
            this.code = code;
            this.name = name;
            this.instruction = instruction;
        }

        public static WorkMode fromCode(String code) {
            for (WorkMode mode : values()) {
                if (mode.code.equals(code)) {
                    return mode;
                }
            }
            return EXPLAIN; // 默認(rèn)模式
        }

        public String getCode() { return code; }
        public String getName() { return name; }
        public String getInstruction() { return instruction; }
    }

    public AIChatService(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
        log.info("AI聊天服務(wù)初始化完成");
    }

    /**
     * 處理帶模式的聊天請(qǐng)求
     */
    public Map<String, Object> processChatWithMode(String userQuery, String modeCode) {
        // 獲取工作模式
        WorkMode workMode = WorkMode.fromCode(modeCode);

        // 構(gòu)建最終提示詞
        String finalPrompt = workMode.getInstruction() + "\n\n用戶問題:\n" + userQuery;

        // 調(diào)用AI服務(wù)
        String response = this.chatClient
                .prompt()
                .user(finalPrompt)
                .call()
                .content();

        // 記錄使用統(tǒng)計(jì)
        usageStats.merge(modeCode, 1, Integer::sum);

        // 構(gòu)建響應(yīng)數(shù)據(jù)
        Map<String, Object> responseData = new ConcurrentHashMap<>();
        responseData.put("answer", response);
        responseData.put("mode", workMode.getName());
        responseData.put("modeCode", workMode.getCode());
        responseData.put("queryLength", userQuery.length());
        responseData.put("responseLength", response.length());

        log.info("{}模式回復(fù)生成成功,字符數(shù): {}", workMode.getName(), response.length());
        return responseData;
    }

    /**
     * 處理基礎(chǔ)聊天請(qǐng)求(無模式)
     */
    public String processBasicChat(String userQuery) {
        String response = this.chatClient
                .prompt()
                .user(userQuery)
                .call()
                .content();

        usageStats.merge("basic", 1, Integer::sum);
        return response;
    }

    /**
     * 獲取使用統(tǒng)計(jì)
     */
    public Map<String, Integer> getUsageStatistics() {
        returnnew ConcurrentHashMap<>(usageStats);
    }

    /**
     * 清空統(tǒng)計(jì)
     */
    public void clearStatistics() {
        usageStats.clear();
        log.info("使用統(tǒng)計(jì)已清空");
    }

    /**
     * 獲取所有可用模式
     */
    public Map<String, String> getAvailableModes() {
        Map<String, String> modes = new ConcurrentHashMap<>();
        for (WorkMode mode : WorkMode.values()) {
            modes.put(mode.getCode(), mode.getName());
        }
        return modes;
    }
}

4.3 添加配置類

源碼詳見:io.binghe.framework.ai.config.WebConfig。

@Configuration
publicclass WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .maxAge(3600);
    }
    
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        returnnew WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("*")
                        .allowedMethods("*");
            }
        };
    }
}

五、測試與驗(yàn)證

5.1 創(chuàng)建測試用例

源碼詳見:io.binghe.framework.ai.test.IntelligentAssistantControllerTest。

@SpringBootTest
@AutoConfigureMockMvc
class IntelligentAssistantControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @Test
    void testHealthCheck() throws Exception {
        mockMvc.perform(get("/api/v1/assistant/health"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(true))
                .andExpect(jsonPath("$.message").exists());
    }
    
    @Test
    void testGetAvailableModes() throws Exception {
        mockMvc.perform(get("/api/v1/assistant/modes"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(true))
                .andExpect(jsonPath("$.data.modes").exists());
    }
}

5.2 完整的API測試腳本

創(chuàng)建 test-api.sh 測試腳本:

源碼詳見:bin/test-api.sh。

#!/bin/bash

BASE_URL="http://localhost:18080/api/v1/assistant"

echo "=== 智能助手API測試 ==="

# 測試健康檢查
echo "1. 測試健康檢查..."
curl -s "${BASE_URL}/health" | jq .

# 測試獲取可用模式
echo -e "\n2. 測試獲取可用模式..."
curl -s "${BASE_URL}/modes" | jq .

# 測試不同模式
echo -e "\n3. 測試通俗解釋模式..."
curl -s "${BASE_URL}/chat?query=請(qǐng)解釋抵押和質(zhì)押的區(qū)別&mode=explain" | jq .

echo -e "\n4. 測試要點(diǎn)總結(jié)模式..."
curl -s "${BASE_URL}/chat?query=總結(jié)擔(dān)保合同的主要注意事項(xiàng)&mode=summarize" | jq .

echo -e "\n5. 測試風(fēng)險(xiǎn)分析模式..."
curl -s "${BASE_URL}/chat?query=分析小微企業(yè)擔(dān)保貸款的風(fēng)險(xiǎn)&mode=risk" | jq .

echo -e "\n測試完成!"

六、部署與運(yùn)行

6.1 創(chuàng)建啟動(dòng)腳本

startup.sh:

源碼詳見:bin/startup.sh。

#!/bin/bash

# 設(shè)置環(huán)境變量
export DASHSCOPE_API_KEY="your-actual-api-key"
export JAVA_OPTS="-Xms512m -Xmx1024m"

echo "啟動(dòng)AI智能助手服務(wù)..."
java $JAVA_OPTS -jar ai-agent-demo-1.0.0.jar

echo "服務(wù)已啟動(dòng),訪問地址: http://localhost:18080/api/v1/assistant/health"

6.2 創(chuàng)建Docker部署文件

Dockerfile:

源碼詳見:docker/Dockerfile。

FROM openjdk:17-jdk-slim

# 設(shè)置工作目錄
WORKDIR /app

# 復(fù)制JAR文件
COPY target/ai-agent-demo-1.0.0.jar app.jar

# 創(chuàng)建非root用戶
RUN groupadd -r spring && useradd -r -g spring spring
USER spring

# 暴露端口
EXPOSE18080

# 啟動(dòng)應(yīng)用
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

docker-compose.yml:

源碼詳見:docker/docker-compose.yml。

version: '3.8'

services:
ai-assistant:
    build:.
    ports:
      -"18080:18080"
    environment:
      -DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY}
    restart:unless-stopped
    healthcheck:
      test:["CMD","curl","-f","http://localhost:18080/api/v1/assistant/health"]
      interval:30s
      timeout:10s
      retries:3

七、項(xiàng)目總結(jié)

截止到目前,我們成功構(gòu)建了一個(gè)功能完善的智能對(duì)話助手系統(tǒng),具備以下特點(diǎn):

7.1 核心功能

  • 多模式對(duì)話:支持5種不同的工作模式
  • 專業(yè)領(lǐng)域知識(shí):專注于金融擔(dān)保業(yè)務(wù)
  • 統(tǒng)一接口規(guī)范:標(biāo)準(zhǔn)的RESTful API設(shè)計(jì)
  • 完善的錯(cuò)誤處理:全局異常處理機(jī)制
  • 使用統(tǒng)計(jì):基礎(chǔ)的使用情況統(tǒng)計(jì)功能

7.2 技術(shù)亮點(diǎn)

  • 采用SpringAI Alibaba框架,簡化大模型集成
  • 模塊化設(shè)計(jì),易于擴(kuò)展和維護(hù)
  • 完整的配置管理和環(huán)境隔離
  • 容器化部署支持
  • 全面的測試覆蓋

7.3 擴(kuò)展建議

項(xiàng)目后續(xù)可以進(jìn)一步擴(kuò)展:

  • 對(duì)話歷史管理:添加用戶會(huì)話歷史記錄
  • 流式響應(yīng):支持SSE流式輸出
  • 權(quán)限控制:添加API密鑰認(rèn)證
  • 性能監(jiān)控:集成監(jiān)控和告警系統(tǒng)
  • 多模型支持:支持切換不同的大模型

這個(gè)項(xiàng)目提供一個(gè)大模型應(yīng)用開發(fā)基礎(chǔ),大家可以基于此框架快速開發(fā)各種行業(yè)專用的智能助手應(yīng)用,星球也在基于此項(xiàng)目熱更AI大模型基礎(chǔ)工程代碼。

責(zé)任編輯:武曉燕 來源: 冰河技術(shù)
相關(guān)推薦

2025-04-07 09:40:00

智能體AI代碼

2024-03-18 18:07:38

VSCode插件文件

2021-09-26 16:08:23

CC++clang_forma

2024-05-30 10:30:39

2022-01-04 08:52:14

博客網(wǎng)站Linux 系統(tǒng)開源

2021-02-26 11:54:38

MyBatis 插件接口

2025-08-26 01:32:00

2025-03-05 08:02:10

2017-09-05 13:01:11

CocoaPods開源庫GitHub

2025-03-26 08:50:00

OllamaFastGPTDeepseek

2023-03-27 08:28:57

spring代碼,starter

2025-08-27 00:00:00

ClaudeCodeAI生成工具

2024-04-02 08:58:13

2024-03-05 18:27:43

2021-06-10 07:49:28

Python詞云圖wordcloud

2011-05-03 15:59:00

黑盒打印機(jī)

2011-01-10 14:41:26

2025-05-07 00:31:30

2025-05-26 00:00:00

DifyAI 應(yīng)用工具

2025-02-14 00:00:00

DeepSeek模型接口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

视频在线观看一区二区三区| 国产成人精品av| 亚洲最色的网站| 国语自产在线不卡| 婷婷激情5月天| 精品欧美一区二区久久久久| 欧美动物xxx| 国产精品一区免费视频| 最近2019年中文视频免费在线观看 | 日韩区在线观看| 日韩亚洲欧美精品| 日本在线小视频| 欧美激情三级| 亚洲欧洲日本在线| 国产精品久久视频| 人妻aⅴ无码一区二区三区| 伊人春色在线观看| 97久久视频| 亚洲国产成人tv| 亚洲自拍偷拍在线| 日韩在线一卡二卡| 99亚洲伊人久久精品影院| 久久综合九色综合97_久久久| 欧美精品videos性欧美| 国产男女无遮挡猛进猛出| 日本成人网址| 精品无人区卡一卡二卡三乱码免费卡| 亚洲欧美日韩中文在线制服| 欧美日韩黄色一级片| 亚洲精品视频专区| 欧美日韩精品| 欧美sm美女调教| 2019日韩中文字幕mv| 国产小视频免费观看| 激情欧美国产欧美| 亚洲国产成人久久综合| 黄色免费福利视频| 菠萝蜜视频国产在线播放| 国产精品自拍三区| 国产欧美精品日韩| 青青青在线免费观看| 亚洲精品一区二区三区在线| 亚洲国产wwwccc36天堂| 中文精品一区二区三区| 国产又色又爽又黄又免费| 自拍偷拍欧美专区| 欧美刺激脚交jootjob| 免费在线观看视频a| 日韩电影在线观看完整版| 奶水喷射视频一区| 久久精品国产精品亚洲| www.亚洲自拍| 色戒汤唯在线观看| 国产欧美日韩另类一区| 成人有码在线播放| 一级aaa毛片| 很黄很黄激情成人| 亚洲欧美在线一区| 亚洲精品性视频| 麻豆福利在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 久久久久久99| japanese国产在线观看| 国产高清一区| 亚洲精品乱码久久久久久金桔影视 | 国产精品久久久久久久久婷婷| 91精品国产乱码在线观看| 国内精品久久久久久久影视简单| 欧美疯狂性受xxxxx喷水图片| 精品丰满人妻无套内射| av免费不卡| 日韩一区在线播放| 国产精品99久久久久久大便| 婷婷色在线视频| 久久爱www久久做| 91av视频在线| 国产又粗又硬视频| 国产精品宾馆| 在线播放日韩导航| 国产又大又硬又粗| 国产羞羞视频在线播放| 中文文精品字幕一区二区| 国产精品久久亚洲| 亚洲欧洲成人在线| 久草中文综合在线| av资源站久久亚洲| 一区二区自拍偷拍| 免播放器亚洲| 午夜精品久久久久久久久久久久久| 2017亚洲天堂| 狠狠做六月爱婷婷综合aⅴ| 三级精品视频久久久久| 久久精品波多野结衣| 97视频精品| 久久久伊人日本| 波多野结衣理论片| 国产电影一区二区三区| 国产成人亚洲精品| 国产浮力第一页| 国产自产高清不卡| 国产精品自拍小视频| 精品人妻伦一区二区三区久久| 美国毛片一区二区三区| 国产高清在线不卡| 国产富婆一级全黄大片| 久久亚洲精精品中文字幕早川悠里| 亚洲精品久久区二区三区蜜桃臀 | 日韩小视频在线观看| 人人妻人人藻人人爽欧美一区| 澳门成人av| 日韩欧美成人激情| 欧美人与性囗牲恔配| 欧美女优在线视频| 亚洲色图欧美制服丝袜另类第一页| 啪啪一区二区三区| 亚洲综合国产| 91手机在线观看| 精品人妻少妇AV无码专区| 久久久国产综合精品女国产盗摄| 欧美大片免费播放| 在线观看小视频| 色视频成人在线观看免| 人妻内射一区二区在线视频| 天堂精品久久久久| 亚洲精品一区二区三区在线观看 | 九九九久久国产免费| 污软件在线观看| 久久精品影视| 欧美高清电影在线看| 九九免费精品视频| 久久电影网电视剧免费观看| 日本一区二区三区视频在线观看| 国产永久免费高清在线观看视频| 国产婷婷一区二区| 亚洲一区二区免费视频软件合集| 尤物网在线观看| 亚洲女与黑人做爰| www.射射射| 日韩一区免费| 欧美成人午夜免费视在线看片 | 国产在线三区| 日韩欧美国产视频| www.国产区| 成人影院网站ww555久久精品| 日韩精品一区二区三区视频在线观看| 日韩一级片在线免费观看| 男女精品网站| 日本精品一区二区三区不卡无字幕| 中文在线资源| 91麻豆精品国产91久久久更新时间| 欧美福利第一页| 日本美女视频一区二区| **亚洲第一综合导航网站| 欧洲美女少妇精品| 在线成人免费视频| 卡通动漫亚洲综合| 国产精品白丝av| 免费看日本黄色| 桃色一区二区| 国产一区二区三区在线观看网站 | 在线播放国产一区| 国产精品99久久久久久有的能看 | 18av在线播放| 波多野结衣电影在线播放| yourporn在线观看中文站| 26uuu久久天堂性欧美| 亚洲 国产 日韩 综合一区| 中文字幕在线观看网站| 欧美一级欧美三级在线观看| 国产va在线播放| 不卡区在线中文字幕| 亚洲精品一区二区三区樱花| 久久99国产精品二区高清软件| 精品久久久久99| 日韩欧美三级视频| 国产欧美一区二区三区网站| 天天操天天干天天做| 国产主播精品| 精品国产乱码久久久久久久软件 | 成人午夜免费av| 亚洲成人自拍视频| 成人黄色理论片| 性欧美亚洲xxxx乳在线观看| 精品亚洲综合| 欧美一区二区私人影院日本| 午夜精产品一区二区在线观看的| 男女激情视频一区| 看欧美日韩国产| jizz一区二区三区| 亚洲欧美日韩综合| 国产毛片毛片毛片毛片毛片| 国产午夜亚洲精品不卡| 一个色综合久久| 在线观看一区| 午夜精品一区二区三区在线观看| 欧美a在线观看| 欧美亚洲国产精品| 全部免费毛片在线播放一个| 亚洲激情自拍偷拍| 婷婷激情5月天| 国产亚洲精品bv在线观看| 国产成人亚洲欧美| 肉体视频在线| 日韩欧美国产系列| 久久青青草视频| 丁香婷婷综合激情五月色| 日韩毛片在线免费看| 欧美.日韩.国产.一区.二区| 91亚洲精华国产精华| 国产在线观看免费麻豆| 制服丝袜亚洲色图| 国产精品久久久久久99| 亚洲另类在线一区| 免费看裸体网站| 成人av在线播放网站| 91看片破解版| 免费精品视频在线| 六月丁香激情网| 欧美日韩mv| 中文字幕中文字幕在线中一区高清 | 欧美精品vⅰdeose4hd| 日本高清不卡码| 国产色一区二区| 精品人妻一区二区三区日产| 国产主播精品| 裸体大乳女做爰69| 欧美电影院免费观看| 国产精品视频26uuu| 中文在线免费视频| 欧美性受xxx| 国产黄大片在线观看| 亚洲人a成www在线影院| 老熟妇高潮一区二区高清视频| 911精品国产一区二区在线| 97人妻一区二区精品视频| 中文字幕第一页久久| 深爱五月激情网| 久久99国产精品久久99果冻传媒| 已婚少妇美妙人妻系列| 中文在线一区| 免费国产黄色网址| 欧美三级伦理在线| 91精品久久久久久久久中文字幕 | 99国产精品久久久久老师| а天堂中文最新一区二区三区| 欧美精品18videos性欧| 99热国产在线| 欧美大胆在线视频| av毛片在线看| 欧美极品少妇与黑人| 日本电影在线观看| 欧美黄色免费网站| 91高清视频在线观看| 午夜精品一区二区三区视频免费看| 91麻豆国产福利在线观看宅福利| 久久69精品久久久久久久电影好| 怡红院在线播放| 欧美日韩成人在线视频| 丁香花视频在线观看| 91国产一区在线| 不卡av播放| 欧美高清一级大片| 欧美一卡二卡| 992tv在线成人免费观看| 亚洲妇女成熟| 国产精品日韩欧美综合| www一区二区三区| 国产伦精品一区二区三区高清| 欧美电影在线观看免费| 国产精品永久在线| 2019中文亚洲字幕| 成人免费在线一区二区三区| 美女午夜精品| 97人人澡人人爽| 国产精品18hdxxxⅹ在线| 久久精品国产一区二区三区不卡| 精品中文一区| 中国 免费 av| 亚洲美女91| 午夜久久资源| 综合国产在线| 日本www在线播放| 激情久久婷婷| 日韩欧美在线播放视频| 毛片av一区二区三区| 性活交片大全免费看| 精彩视频一区二区三区| wwwxx日本| 国产日韩欧美高清| 欧美丰满艳妇bbwbbw| 一本大道综合伊人精品热热| 日本a在线观看| 在线观看日韩电影| 国产一级淫片a视频免费观看| 欧美视频完全免费看| 波多野结衣电影在线播放| 日韩一区二区三区电影| 男人的天堂在线| 日韩大陆欧美高清视频区| 91在线免费看| 深夜福利国产精品| a国产在线视频| 成人中文字幕+乱码+中文字幕| 欧美大奶一区二区| 国产精品一区在线免费观看| 久久久久久久波多野高潮日日| 久久久久亚洲av无码麻豆| 国产尤物一区二区在线| 欧美做受喷浆在线观看| 91在线视频免费91| 男人的天堂影院| 成人欧美一区二区三区在线播放| 国产精品一区二区6| 欧美一级在线观看| aiai在线| 国产精品999999| 精品网站aaa| 日产精品久久久久久久蜜臀| 精品综合久久久久久8888| 大又大又粗又硬又爽少妇毛片| 一区二区三区在线看| 一区二区国产欧美| 日韩免费在线观看| 伊人免费在线| 国产精品免费网站| 免费视频一区三区| 成年人看的毛片| 国产精品自拍三区| 国产又粗又硬又长又爽| 欧美日韩国产片| 国产av一区二区三区| 在线观看日韩视频| 精品3atv在线视频| 国产成人av网址| 日韩欧美影院| 亚洲精品成人三区| 销魂美女一区二区三区视频在线| wwwxx日本| 亚洲va天堂va国产va久| 6080午夜伦理| 日韩成人av网| 色黄视频在线观看| 欧美激情论坛| 久久久久久美女精品| 岛国av在线免费| 成人午夜伦理影院| 欧美日韩精品亚洲精品| 日韩欧美一区二区视频| 欧美激情成人动漫| 国产成人精品日本亚洲11| 黄色成人av网站| 欲求不满的岳中文字幕| 亚洲国产精品99久久久久久久久 | 久久国产精品 国产精品| 一本综合久久| 中文字幕免费高清| 欧美偷拍一区二区| 免费在线观看av| 5g国产欧美日韩视频| 激情五月***国产精品| 伊人网综合视频| 色婷婷综合久久久中文一区二区| 国产高清免费av在线| 久久99久久亚洲国产| 91成人在线精品视频| 精品国产一二三四区| 国产亚洲欧洲一区高清在线观看| 最近中文字幕在线观看视频| 亚洲国产99精品国自产| 色网在线免费观看| 日韩国产精品一区二区三区| 另类小说综合欧美亚洲| a级片在线观看免费| 日韩极品精品视频免费观看| 日本精品在线中文字幕| 精品久久久久久亚洲| 久久天堂成人| 蜜臀av午夜精品久久| 亚洲精品98久久久久久中文字幕| 啊v在线视频| 91在线视频免费| 亚洲乱亚洲高清| 亚洲AV成人无码网站天堂久久| 日韩久久免费av| 婷婷午夜社区一区| 国产小视频免费| 国产欧美日韩精品一区| 精品人妻一区二区三区含羞草 | 免费的一级黄色片| av一本久道久久综合久久鬼色| 五月天激情丁香| 亚洲精品国产免费| 欧美在线一级| 亚洲欧美一区二区原创| 国产成人8x视频一区二区| 亚洲不卡在线播放| 日韩激情视频在线播放| 精品国产乱码久久久久久樱花| 欧美三级一级片| 亚洲欧美日韩中文播放|