精品欧美一区二区三区在线观看 _久久久久国色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)

国产午夜麻豆影院在线观看| 日本少妇色视频| a视频在线观看免费| 成人亚洲精品久久久久软件| 国产91|九色| 一二三四在线观看视频| 亚洲开心激情| 欧美性猛交xxxx乱大交3| 亚洲精品欧洲精品| 黄色美女一级片| 日韩高清电影一区| 欧美日韩xxxxx| 免费观看a级片| 天堂av一区| 色成人在线视频| 少妇大叫太大太粗太爽了a片小说| 人人妻人人澡人人爽久久av| 美女脱光内衣内裤视频久久网站 | 欧美日韩精品一区二区| 无码日本精品xxxxxxxxx| 久热av在线| 大白屁股一区二区视频| 国产剧情日韩欧美| 国产午夜免费福利| 欧美涩涩网站| 日韩在线视频网站| 国产人妻大战黑人20p| 中文字幕区一区二区三| 欧美手机在线视频| 日韩av资源在线| 金瓶狂野欧美性猛交xxxx| 中文在线一区二区| 欧美另类一区| 手机在线观看毛片| 国产精品1024| 成人日韩在线电影| 中文字幕资源网| 另类av一区二区| 97婷婷大伊香蕉精品视频| 欧美三级视频网站| 免费短视频成人日韩| 亚洲激情免费观看| xxxwww国产| 超碰成人在线观看| 日韩欧美不卡在线观看视频| 欧美美女一级片| 精品裸体bbb| 色94色欧美sute亚洲线路一久| 女人天堂av手机在线| 狂野欧美性猛交xxxxx视频| 亚洲免费在线看| 一区二区三区偷拍| 黄色网页在线观看| 中文字幕综合网| 中文字幕欧美日韩一区二区| 午夜在线播放| 中文字幕佐山爱一区二区免费| 天堂v在线视频| 免费av网站在线看| 亚洲摸摸操操av| 成年人深夜视频| 日本精品600av| 亚洲成在线观看| 极品美女扒开粉嫩小泬| 水蜜桃在线视频| 日韩欧美精品中文字幕| 嫩草av久久伊人妇女超级a| 香蕉视频亚洲一级| 欧美在线不卡视频| 91女神在线观看| 国产日本亚洲| 亚洲成人av资源网| 亚洲自拍偷拍一区二区| 欧美影院三区| 久久精品国产清自在天天线| 免费无遮挡无码永久在线观看视频| 韩国在线视频一区| 97色在线观看| 中文 欧美 日韩| 国产一区二区三区四区在线观看| yy111111少妇影院日韩夜片| 日批视频在线播放| 国产午夜精品在线观看| 亚洲午夜在线观看| 羞羞的网站在线观看| 天天做天天摸天天爽国产一区| 亚洲国产精品久久久久爰色欲| 高清亚洲高清| 日韩女优视频免费观看| 亚洲国产精品成人综合久久久| 精品无人区麻豆乱码久久久| 久久资源免费视频| 日韩乱码一区二区| 免费人成精品欧美精品| 国产精品久久精品国产| 岛国在线视频免费看| 自拍视频在线观看一区二区| 日韩欧美一区三区| 伊人久久综合网另类网站| 欧美成人vr18sexvr| 无码一区二区三区在线| 午夜精品久久| 国产精品网站入口| 五月婷婷丁香网| 1024精品合集| 国产精品第12页| 综合激情五月婷婷| 色偷偷av一区二区三区| 久久夜靖品2区| 国产中文字幕一区| 日本免费高清一区二区| 狂野欧美性猛交xxxxx视频| 欧美系列在线观看| 污污内射在线观看一区二区少妇| 国产精品毛片久久| 欧美做受高潮电影o| 国产chinasex对白videos麻豆| 久久嫩草精品久久久精品一| 真实国产乱子伦对白视频| 国产电影一区二区三区爱妃记| 亚洲国产日韩一区| 久久久91视频| 久久成人羞羞网站| 日韩精品不卡| 亚洲私拍视频| 亚洲成色999久久网站| 特一级黄色录像| 葵司免费一区二区三区四区五区| 国产精品乱码| 在线看一级片| 91精品国产91久久综合桃花| 成人免费视频入口| 天堂一区二区在线免费观看| 精品九九九九| 高清电影在线免费观看| 欧美一区二区三区免费观看视频 | 亚洲人成网站在线| 在线观看高清免费视频| 中文有码一区| 欧美在线观看一区二区三区| 欧洲成人一区二区三区| 亚洲最大成人网4388xx| 免费看的av网站| 亚洲午夜精品一区 二区 三区| 国产精品午夜国产小视频| 国产区高清在线| 日本久久精品电影| 日韩精品无码一区二区三区久久久| 亚洲免费大片| 好吊色欧美一区二区三区| www.综合网.com| 欧美精品一区二区久久久| 国产午夜视频在线播放| 成人午夜大片免费观看| 免费网站在线观看视频 | 日韩精品一区国产麻豆| 免费看一级一片| 国产99久久久精品| 免费无码毛片一区二三区| 国偷自产av一区二区三区| 韩国日本不卡在线| 色视频在线观看免费| 日韩欧美在线一区| 中文字幕成人动漫| 蜜桃久久久久久| 日本黄色播放器| 中文字幕日韩高清在线| 午夜精品免费视频| 牛牛澡牛牛爽一区二区| 在线看一区二区| 少妇视频一区二区| 福利一区福利二区| 北条麻妃在线视频观看| av一区二区高清| 亚洲www在线| av免费不卡| 国产亚洲激情在线| 国产美女永久免费| 午夜久久久影院| 人与嘼交av免费| 国内久久精品视频| 成年人午夜免费视频| 欧美极品中文字幕| 91在线观看免费观看| 欧美hdxxx| 亚洲天堂av高清| 国产成人精品无码高潮| 精品成人乱色一区二区| 综合 欧美 亚洲日本| 国产精品91xxx| 成人在线免费观看av| 日韩精品首页| 国产精品v欧美精品∨日韩| 美女福利一区二区三区| 久久天天躁狠狠躁夜夜躁2014| 三级在线观看网站| 欧美久久一区二区| 国产黄色免费观看| 亚洲激情第一区| 熟女俱乐部一区二区| 国产麻豆精品视频| 国产情侣av自拍| 在线免费观看日本欧美爱情大片| 久久久久久欧美精品色一二三四| 日本免费在线一区| 538国产精品一区二区免费视频| 日本在线视频观看| 国产视频久久久久久久| 国产成人精品白浆久久69| 色老汉av一区二区三区| 免费在线视频观看| 国产精品丝袜黑色高跟| xxxx黄色片| 国产美女精品在线| 免费看污污网站| 国产欧美一级| 国产 欧美 日韩 一区| 久久亚洲国产| 欧美一区二区视频在线| 久久久亚洲欧洲日产| 91久久精品一区| 欧美啪啪网站| 国产精品福利小视频| a国产在线视频| 美女av一区二区| 色多多视频在线观看| 亚洲欧美日韩精品久久| 欧美 日韩 国产 在线| 91精品国产综合久久福利软件| 懂色av蜜臀av粉嫩av分享吧最新章节| 亚洲成人免费视频| 少妇影院在线观看| 亚洲摸摸操操av| 国产免费久久久久| 国产精品蜜臀av| 在线观看免费小视频| 久久久av毛片精品| 国产精品无码网站| 99精品偷自拍| 偷偷色噜狠狠狠狠的777米奇| 处破女av一区二区| 曰本三级日本三级日本三级| 国产在线精品国自产拍免费| 伊人国产精品视频| 极品少妇一区二区三区精品视频| 精品999在线| 蜜桃一区二区三区四区| 少妇激情一区二区三区| 丝袜a∨在线一区二区三区不卡| 99999精品视频| 亚洲一区二区动漫| 欧美成人免费高清视频| 丝袜亚洲精品中文字幕一区| 精品少妇无遮挡毛片| 青青草91视频| 久久久精品高清| 国产一区二区精品久久99| 黄色片子免费看| 粉嫩一区二区三区在线看 | 久久亚洲二区三区| 亚洲综合色一区| 中文字幕精品一区| 91狠狠综合久久久| 亚洲精品中文在线影院| 欧美激情图片小说| 亚洲成人一区二区| 日日夜夜操视频| 在线成人小视频| 亚洲卡一卡二卡三| 日韩久久午夜影院| av在线电影播放| 久久午夜a级毛片| segui88久久综合| 欧美中文字幕在线视频| 久久人人视频| 亚洲最大福利网站| 亚州综合一区| 亚洲欧美日产图| 欧美韩日精品| 日本中文字幕片| 久久99国内精品| 无码人妻一区二区三区精品视频| 久久影音资源网| 激情无码人妻又粗又大| 亚洲一区二区三区激情| 91丝袜一区二区三区| 欧美精品九九99久久| 天天爽夜夜爽夜夜爽| 中文字幕亚洲精品| 国产乱码在线| 国产精品美女久久| 超碰在线亚洲| 一区二区免费在线观看| 亚洲视频观看| 亚洲一区二区三区四区五区xx| 国产高清一区日本| 干b视频在线观看| 亚洲精品福利视频网站| 香蕉影院在线观看| 日韩一区二区三区在线观看| 每日更新在线观看av| 欧美成人午夜激情在线| 欧美不卡高清一区二区三区| 成人蜜桃视频| 成人激情视频| 91国视频在线| 国产成a人亚洲| 免费黄色片网站| 婷婷国产v国产偷v亚洲高清| 国产精品探花视频| 亚洲午夜未删减在线观看| 爱情岛亚洲播放路线| 国产精品丝袜高跟| 九色精品91| 一二三四视频社区在线| 国产黄人亚洲片| 婷婷激情四射网| 欧美主播一区二区三区美女| 天天干免费视频| 免费97视频在线精品国自产拍| 国产成人77亚洲精品www| 欧美13一14另类| 亚洲美女一区| 天天躁日日躁狠狠躁免费麻豆| 亚洲日本一区二区三区| 最近中文字幕在线观看| 亚洲乱码国产乱码精品精天堂| sm在线观看| 精品久久久久久亚洲| 怡红院精品视频在线观看极品| 黄色a级三级三级三级| 国产精品免费观看视频| 日本三级一区二区三区| 亚洲欧美第一页| 亚洲黄色中文字幕| 狠狠色综合色区| 精品电影一区| 日批视频免费看 | 国产免费观看av| 亚洲国产第一页| 9999在线视频| 国产私拍一区| 99在线精品免费视频九九视| 女性生殖扒开酷刑vk| 亚洲一级二级三级在线免费观看| 国产高清在线观看视频| 欧美乱大交xxxxx另类电影| 在线一区二区三区视频| 日韩亚洲欧美一区二区| 国产成人午夜视频| av资源吧首页| 亚洲韩国日本中文字幕| 免费成人在线电影| 精品网站在线看| 另类国产ts人妖高潮视频| 蜜臀久久99精品久久久久久| 欧洲视频一区二区| 久cao在线| 国产98在线|日韩| 国产一区二区三区久久久久久久久| 五月婷婷综合在线观看| 91久久线看在观草草青青 | 欧美激情18p| 理论片一区二区在线| av黄色在线网站| 日本一区二区综合亚洲| 一级片视频免费| 欧美大片欧美激情性色a∨久久| 亚洲一区二区免费在线观看| 无码 制服 丝袜 国产 另类| 久久综合久色欧美综合狠狠| 不卡av电影在线| 精品国产美女在线| 91精品尤物| 日本在线观看a| 亚洲私人影院在线观看| 亚洲精品成人电影| 欧美亚洲视频在线看网址| av中文一区| 免费看的av网站| 欧美视频在线视频| 日本在线播放| 国产日韩在线一区二区三区| 久久精品伊人| 欧美激情精品久久| 亚洲免费小视频| 国产aa精品| 69堂免费视频| 亚洲欧洲日产国产综合网| 天堂成人在线视频| 成人国产精品免费视频| 一区二区国产精品| 精品国产国产综合精品| 亚洲韩国日本中文字幕| 亚洲国产aⅴ精品一区二区三区| www.亚洲成人网| 国产女人水真多18毛片18精品视频 | 国产又粗又猛又色| 欧美群妇大交群中文字幕| 波多野结衣中文字幕久久|