99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Spring AI 2.0實(shí)戰(zhàn):Java開發(fā)者快速構(gòu)建多模型Agent應(yīng)用

Spring AI 2.0實(shí)戰(zhàn):Java開發(fā)者快速構(gòu)建多模型Agent應(yīng)用 從 2024 年開始AI 應(yīng)用開發(fā)幾乎成了 Python 開發(fā)者專屬賽道LangChain、LlamaIndex 各種框架層出不窮。Java 開發(fā)者想在自己的 Spring Boot 項(xiàng)目里接一個(gè)大模型要么寫裸 HTTP 請求調(diào)用 OpenAI 兼容接口要么硬套 Python 生態(tài)的思路代碼風(fēng)格割裂維護(hù)成本極高。到了 2026 年這個(gè)局面的答案已經(jīng)非常明確Spring AI 2.0。這篇文章要把 Spring AI 2.0 里最重要的五件事——多模型、Tools、MCP、Skills、Agent——完整串起來講一遍。不是單純介紹概念而是從一個(gè)小型實(shí)戰(zhàn)項(xiàng)目出發(fā)把每一步的配置、代碼、踩坑點(diǎn)全部鋪開。如果你是一個(gè) Java 工程師正在糾結(jié)怎么在公司項(xiàng)目里落地 AI 能力這篇文章可以直接當(dāng)參考手冊用。先說結(jié)論Spring AI 2.0 真正解決的問題是把“和大模型打交道”這件事變成了符合 Spring 編程模型的普通后端開發(fā)。它不追求把 LangChain 那套 Python 生態(tài)搬過來而是用 Spring 自己的依賴注入、自動配置、約定優(yōu)于配置把多模型切換、工具調(diào)用、協(xié)議接入、Agent 編排統(tǒng)一成一個(gè)標(biāo)準(zhǔn)范式。讀完這篇文章你能獨(dú)立搭出一個(gè)支持多模型切換、能調(diào)用自定義工具、能通過 MCP 接入外部服務(wù)、帶記憶和會話的客服 Agent 原型。1. 這篇文章真正要解決的問題很多 Java 開發(fā)者學(xué) AI 編程的第一反應(yīng)是先去學(xué) Python。這個(gè)認(rèn)知正在變成一種路徑依賴。如果項(xiàng)目底層是 Java團(tuán)隊(duì)是 Java 團(tuán)隊(duì)業(yè)務(wù)邏輯都在 Spring Boot 服務(wù)里那用 Python 重寫一套 AI 應(yīng)用等于把整個(gè)工程體系復(fù)制了一份。Spring AI 2.0 的價(jià)值就在這里。它處理的不只是“調(diào)一次大模型接口”這種小事而是一整套企業(yè)級 AI 應(yīng)用開發(fā)中必須面對的問題同一個(gè)業(yè)務(wù)要支持多家模型供應(yīng)商比如線上用 GPT-4o本地開發(fā)用 Ollama 里的開源模型怎么做到切換模型而不改業(yè)務(wù)代碼模型返回的是 JSON 文本怎么穩(wěn)定地映射成 Java 對象而不是靠正則硬解析大模型不知道你的訂單數(shù)據(jù)、用戶數(shù)據(jù)怎么安全地讓它調(diào)用你已有的 Service 方法外部工具生態(tài)已經(jīng)約定了統(tǒng)一接入?yún)f(xié)議比如數(shù)據(jù)庫 MCP Server、文件系統(tǒng) MCP ServerSpring 項(xiàng)目怎么接入最省事一個(gè)智能客服 Agent 需要有角色設(shè)定、工具列表、會話記憶、多輪上下文這些怎么工程化管理這些問題的答案就是 Spring AI 2.0 的核心抽象體系。它跟 Python 的 LangChain 解決的問題高度重合但實(shí)現(xiàn)思路完全是 Java 式的自動配置、Bean 管理、類型安全、Starter 依賴。從實(shí)用角度看這篇文章適合四類讀者還沒接觸過 Spring AI但項(xiàng)目里已經(jīng)有 Spring Boot 3.x 基礎(chǔ)想快速上手已經(jīng)在用 Spring AI 1.x想知道 2.0 在 Tools、MCP、Skills、Agent 這幾個(gè)方向有什么變化被“多模型”“MCP”“Agent”這些概念繞暈需要一個(gè)能跑通的最小案例準(zhǔn)備把 AI 能力集成進(jìn)企業(yè)系統(tǒng)的架構(gòu)師或技術(shù)負(fù)責(zé)人需要判斷技術(shù)選型和工程邊界。有 Spring Boot 基礎(chǔ)的人今天就能把鏈路跑通。2. Spring AI 2.0 核心概念從 ChatModel 到 Agent2.1 最核心的抽象ChatModelSpring AI 對 LLM 的抽象核心就是ChatModel接口。不管底層是 OpenAI、Anthropic、通義千問、DeepSeek 還是 Ollama 里的本地模型對上層業(yè)務(wù)代碼來說暴露出來的都是同一個(gè)接口。public interface ChatModel { ChatResponse call(Prompt prompt); }這個(gè)設(shè)計(jì)的價(jià)值在業(yè)務(wù)方不在實(shí)現(xiàn)方。你寫的 Service 層不需要關(guān)心當(dāng)前接的是哪個(gè)大模型。以后要從 GPT 切到本地模型只改配置不碰 Java 代碼。這就是多模型支持的第一層含義。圍繞ChatModelSpring AI 還提供了幾個(gè)配套抽象ChatClient更面向業(yè)務(wù)的流式調(diào)用入口支持 system prompt、user prompt、工具注冊、結(jié)構(gòu)化輸出。這是最常用的對象。EmbeddingModel負(fù)責(zé)把文本轉(zhuǎn)成向量用于 RAG、語義搜索等場景。StructuredOutputConverter將模型輸出解析為指定 Java 類型。2.2 Tools讓大模型調(diào)用你的函數(shù)大模型本身不持有你的業(yè)務(wù)數(shù)據(jù)它只能“說出”一個(gè)新的 JSON 結(jié)構(gòu)表達(dá)“我想調(diào)用某個(gè)函數(shù)”。Tools 就是把這層機(jī)制封裝成了 Spring 風(fēng)格的工具方法。在 Spring AI 中只需要在方法上標(biāo)記Tool注解框架自動完成“模型生成函數(shù)調(diào)用參數(shù) → 框架反射調(diào)用方法 → 把結(jié)果回傳給模型 → 模型基于結(jié)果繼續(xù)生成”的循環(huán)。這里真正容易踩坑的地方在于模型是否真的會調(diào)用你的 Tool取決于你寫的description是否足夠清晰。描述寫得含糊模型就會跳過函數(shù)調(diào)用直接憑幻覺回答。2.3 MCP模型上下文協(xié)議MCPModel Context Protocol是 Anthropic 在 2024 年底提出的開放協(xié)議目標(biāo)是標(biāo)準(zhǔn)化“模型如何發(fā)現(xiàn)并調(diào)用外部工具/數(shù)據(jù)源”。它把工具、資源、提示詞統(tǒng)一成一套標(biāo)準(zhǔn)接口。一個(gè)團(tuán)隊(duì)只要實(shí)現(xiàn)了 MCP Server任何支持 MCP 的客戶端都能復(fù)用。Spring AI 2.0 對 MCP 的支持是完整的可以作為 MCP Client連接現(xiàn)成的 MCP Server比如文件系統(tǒng)、數(shù)據(jù)庫、藍(lán)湖設(shè)計(jì)稿、GitHub 等也可以作為 MCP Server把 Spring 服務(wù)里的能力暴露給其他 AI 應(yīng)用。MCP 和 Tools 的關(guān)系不是二選一。Tools 是 Spring AI 內(nèi)部的函數(shù)調(diào)用機(jī)制MCP 是跨應(yīng)用、跨語言的工具發(fā)現(xiàn)與傳輸標(biāo)準(zhǔn)。MCP Server 在遠(yuǎn)端提供的工具最終會被 Spring AI 包裝成本地 Tool 參與模型對話。2.4 Skills更貼近業(yè)務(wù)的 Agent 能力封裝如果說 Tools 解決的是“單個(gè)函數(shù)”的調(diào)用那么 Skills 解決的是“一組能力”的復(fù)用。一個(gè) Skill 通常包含多部分內(nèi)容清晰的技能描述、可能用到的多個(gè)工具方法、提示詞模板、輸入校驗(yàn)規(guī)則甚至內(nèi)部的異常處理邏輯。從 Spring AI 2.0 的演進(jìn)方向看Skill 就是為 Agent 誕生的“能力包”。舉個(gè)例子一個(gè)“訂單查詢技能”可以包含“按訂單號查狀態(tài)”“按手機(jī)號查訂單列表”“查詢物流軌跡”三個(gè)工具并統(tǒng)一處理參數(shù)校驗(yàn)和返回格式。Agent 只需要知道“有一個(gè)訂單查詢技能”就能在合適的時(shí)候調(diào)用它。2.5 Skill 和 MCP 的區(qū)別這是很多初學(xué)者最暈的地方。用一句話概括它們的差異MCP 是標(biāo)準(zhǔn)與協(xié)議Skills 是業(yè)務(wù)封裝。MCP 解決的是“怎么連接、傳什么格式”的問題比如你用 npx 啟動一個(gè) filesystem MCP Server客戶端連上它就能列出可用的工具列表。Skill 解決的是“以什么方式參與 Agent 編排”的問題它更像是一個(gè)高層的業(yè)務(wù)抽象背后既可以封裝本地 Tools也可以封裝對 MCP 工具的調(diào)用。打個(gè)比方MCP 像是 USB-C 接口標(biāo)準(zhǔn)任何設(shè)備只要按這個(gè)標(biāo)準(zhǔn)生產(chǎn)就能互聯(lián)Skill 則像一個(gè)“即插即用的功能包”比如一個(gè)“高清投屏技能”它可能包含了軟件、驅(qū)動和推薦配置。兩者不在同一個(gè)抽象層。2.6 Agent用對話能力編排一切Agent 不是一個(gè)新框架而是ChatModel Tools Skills 記憶 多輪編排的組合產(chǎn)物。在 Spring AI 2.0 中一個(gè) Agent 的編程模型非常簡單準(zhǔn)備好一個(gè)ChatClient給它配置系統(tǒng)角色、工具列表和會話記憶剩下的循環(huán)推理全部交給框架。Agent 內(nèi)部會反復(fù)執(zhí)行“模型生成 → 決定是否調(diào)用工具 → 拿到結(jié)果 → 繼續(xù)生成”的流程直到它能給出最終回答。不過簡單不代表沒有難點(diǎn)。真正考驗(yàn)工程能力的是 Agent 的安全邊界、工具權(quán)限、會話存儲、失敗降級這些外圍問題。后面會專門用一整節(jié)說清楚。3. 環(huán)境準(zhǔn)備與前置條件3.1 JDK 與構(gòu)建工具Spring AI 2.x 基于 Spring Framework 6.x 和 Spring Boot 3.x要求 JDK 17 及以上。推薦直接使用 JDK 21理由很實(shí)際虛擬線程、更完善的 ZGC 行為以及 Spring Boot 對 JDK 21 的完整官方支持。構(gòu)建工具用 Maven 或 Gradle 都可以。本文示例以 Maven 為主因?yàn)閲鴥?nèi) Java 項(xiàng)目里 Maven 還是絕對主流。版本方面Spring AI 的版本更新速度比較快不建議把具體版本號寫死在文章里。正確做法在pom.xml里通過spring-ai-bom做依賴管理版本統(tǒng)一放到屬性里使用 Maven Central 上的最新穩(wěn)定版。!-- 文件路徑pom.xml 片段 -- properties java.version21/java.version spring-boot.version3.4.x/spring-boot.version spring-ai.version2.0.x/spring-ai.version /properties實(shí)際使用中把x替換成發(fā)布時(shí)的具體小版本號即可。3.2 Spring Boot 項(xiàng)目初始化先在 Spring Initializr 上生成一個(gè)基礎(chǔ)工程或者直接在 IDEA 里用 Spring Initializr 創(chuàng)建。需要選擇的依賴如下Spring WebSpring AI OpenAISpring AI OllamaLombok可選Spring AI MCP Client WebMVC如果你需要把 Spring 服務(wù)本身暴露成 MCP Server還需要加Spring AI MCP Server WebMVC。本文的示例會先做 MCP Client 接入。3.3 模型 API Key 準(zhǔn)備至少準(zhǔn)備一個(gè)可用的大模型 API Key。如果公司有統(tǒng)一的模型網(wǎng)關(guān)也可以把 base-url 指向網(wǎng)關(guān)地址。本地開發(fā)優(yōu)先推薦 Ollama 方式下載 Ollama再拉一個(gè)支持 function calling 的模型比如qwen2.5系列。這樣即使沒有公網(wǎng) API Key也可以完成 Tools 和 Agent 的全流程測試。這里補(bǔ)充一個(gè)重要約定任何 API Key 都不要硬編碼到application.yml里更不要提交到 Git 倉庫。用環(huán)境變量注入例如${OPENAI_API_KEY:}。如果你有配置中心例如 Apollo、Nacos Config應(yīng)該走配置中心統(tǒng)一管理。4. 核心流程拆解從配置到 Agent 的六步鏈路4.1 第一步配置多模型目標(biāo)是一個(gè) Spring Boot 項(xiàng)目里同時(shí)存在多個(gè)ChatModelBean。Spring AI 的自動配置會為每個(gè)已引入的模型 Starter 創(chuàng)建對應(yīng)的ChatModelBean比如引入spring-ai-openai會自動創(chuàng)建OpenAiChatModel引入spring-ai-ollama會自動創(chuàng)建OllamaChatModel。但問題來了如果項(xiàng)目里同時(shí)有多個(gè)ChatModelBean注入ChatClient.Builder時(shí) Spring 會由于類型不唯一而報(bào)錯(cuò)。解決辦法就是顯式聲明一個(gè)多模型路由服務(wù)用 Map 按名稱保存所有模型。這個(gè)設(shè)計(jì)本質(zhì)上是“多模型策略模式”后續(xù)切換模型時(shí)業(yè)務(wù)層只面向ChatModel接口編程選誰用誰由配置或路由邏輯決定。這是 Spring AI 多模型落地最實(shí)用的架構(gòu)。4.2 第二步搞定結(jié)構(gòu)化輸出大模型返回的是自然語言但業(yè)務(wù)系統(tǒng)需要的是FlightReservation、UserInfo這樣的 Java 對象。Spring AI 的ChatClient.entity()方法幫你做了類型轉(zhuǎn)換。實(shí)際操作時(shí)不要在實(shí)體里放太多復(fù)雜嵌套類型。大模型不是 JSON Schema 解析器越復(fù)雜的類型越容易解析失敗。先用扁平化的 record跑通后再逐步增加字段。4.3 第三步讓模型能調(diào)用工具定義一個(gè)繼承自Component的類在業(yè)務(wù)方法上標(biāo)注Tool描述要寫到“模型一聽就懂”的程度。然后用ChatClient.Builder.defaultTools()把工具傳進(jìn)去。驗(yàn)證這一步是否成功最直接的辦法是問一個(gè)必須靠工具才能回答的問題比如“北京今天天氣怎么樣”。如果模型準(zhǔn)確返回了天氣說明函數(shù)調(diào)用鏈路已經(jīng)通了。4.4 第四步接入 MCP引入 MCP Client 依賴在配置里聲明要連的 stdio MCP ServerSpring AI 會自動把這個(gè)服務(wù)器提供的工具合并到模型對話中。如果公司內(nèi)部有 HTTP 方式的 MCP Server也可以走 SSE 或 WebMVC 配置。接入方式和 stdio 略有不同但核心思想一致遠(yuǎn)程工具被包裝成本地 Tool不需要業(yè)務(wù)代碼感知。4.5 第五步封裝 Skills把“散裝工具提示詞規(guī)則”收斂成一個(gè)高內(nèi)聚的類。Skill 通常是普通 Spring Service內(nèi)部依賴多個(gè) Tool 方法再通過構(gòu)造器注入到ChatClient。這里的一個(gè)工程建議每個(gè) Skill 類都寫清楚Description讓 Agent 知道這個(gè)技能在什么場景下使用。Agent 判斷“該不該用這個(gè)技能”依賴的就是這個(gè)描述。4.6 第六步用 Agent 編排落地把系統(tǒng)角色、工具列表、Skills、會話記憶整合到一個(gè)ChatClientBean 里對外暴露一個(gè)chat(userMessage, conversationId)方法。這個(gè) Bean 就是你的客服 Agent。會話記憶的實(shí)現(xiàn)方式依賴于ChatClient的id(conversationId)參數(shù)框架會把同一 id 的多輪對話保存到ChatMemory。生產(chǎn)環(huán)境應(yīng)該替換成 Redis 或數(shù)據(jù)庫存儲避免單機(jī)內(nèi)存丟失。現(xiàn)在整條鏈路就通了。下面用可運(yùn)行代碼過一遍。5. 完整示例代碼實(shí)現(xiàn)本節(jié)的工程結(jié)構(gòu)如下src/main/java/com/example/ai/ ├── AiApplication.java ├── config/ │ └── ChatClientConfig.java ├── controller/ │ ├── ChatController.java │ ├── StructuredOutputController.java │ └── MultiModelController.java ├── service/ │ ├── MultiModelService.java │ └── OrderQuerySkill.java ├── tool/ │ └── WeatherTools.java ├── agent/ │ └── CustomerServiceAgent.java └── entity/ └── FlightReservation.java5.1 新增 Maven 依賴先更新pom.xml加入 Spring AI BOM 以及所需的 Starter!-- 文件路徑pom.xml -- dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-ollama/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-client-webmvc/artifactId /dependency /dependenciesspring-ai-bom的作用是統(tǒng)一管理所有 Spring AI 模塊的版本號避免手動逐個(gè)對齊版本。5.2 配置文件在application.yml中配置多模型和 MCP Client# 文件路徑src/main/resources/application.yml server: port: 8080 spring: application: name: spring-ai-demo ai: openai: base-url: ${OPENAI_BASE_URL:https://api.openai.com} api-key: ${OPENAI_API_KEY:} chat: options: model: gpt-4o-mini temperature: 0.7 ollama: base-url: http://localhost:11434 chat: options: model: qwen2.5:7b temperature: 0.7 mcp: client: stdio: servers: filesystem: command: npx args: -y,modelcontextprotocol/server-filesystem,/tmp/data這里最需要注意的地方是args的寫法。Spring AI 的 MCP 配置要求 args 是一個(gè)數(shù)組不同版本對分隔符的處理略有差異。如果啟動時(shí) MCP Server 沒有連上第一優(yōu)先排查的就是這個(gè)參數(shù)里的逗號分隔是否正確以及本機(jī)是否安裝并可以使用 npx。5.3 多模型調(diào)用用具體的ChatModel實(shí)現(xiàn)類型做構(gòu)造器注入這樣不會被多 Bean 問題干擾// 文件路徑src/main/java/com/example/ai/service/MultiModelService.java Service public class MultiModelService { private final OpenAiChatModel openAiChatModel; private final OllamaChatModel ollamaChatModel; public MultiModelService(OpenAiChatModel openAiChatModel, OllamaChatModel ollamaChatModel) { this.openAiChatModel openAiChatModel; this.ollamaChatModel ollamaChatModel; } public String chatWith(String provider, String message) { ChatModel chatModel switch (provider) { case openai - openAiChatModel; case ollama - ollamaChatModel; default - throw new IllegalArgumentException(未知模型: provider); }; return chatModel.call(new Prompt(message)) .getResult() .getOutput() .getText(); } }這段代碼的關(guān)鍵點(diǎn)是“面向接口編程”。業(yè)務(wù)方拿到的是ChatModel具體實(shí)現(xiàn)可以隨時(shí)替換。以后新增模型供應(yīng)商只需要增加一個(gè) Starter 依賴再在 switch 里加一行分支。5.4 結(jié)構(gòu)化輸出定義一個(gè)實(shí)體類用 record 保持簡潔// 文件路徑src/main/java/com/example/ai/entity/FlightReservation.java public record FlightReservation( String flightNumber, String from, String to, String departureTime, String price ) { }不推薦在這個(gè) record 里放LocalDateTime、BigDecimal這類需要強(qiáng)類型轉(zhuǎn)換的字段。大模型返回的 JSON 字符串在解析成本地類型時(shí)一旦格式不匹配會直接拋出類型轉(zhuǎn)換異常。先用字符串類型跑通是結(jié)構(gòu)化輸出最容易成功的路徑。再寫一個(gè) Controller 展示如何使用// 文件路徑src/main/java/com/example/ai/controller/StructuredOutputController.java RestController RequestMapping(/api/structured) public class StructuredOutputController { private final ChatClient chatClient; public StructuredOutputController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/parse-reservation) public FlightReservation parseReservation(RequestParam String text) { return chatClient.prompt() .system(你是航班信息解析助手。請從用戶文本中抽取航班編號、出發(fā)地、目的地、出發(fā)時(shí)間和價(jià)格。) .user(text) .call() .entity(FlightReservation.class); } }5.5 自定義 Tools定義一個(gè)天氣工具類。這是本文最典型的Tool用法// 文件路徑src/main/java/com/example/ai/tool/WeatherTools.java Component public class WeatherTools { Tool(description 根據(jù)城市名稱查詢當(dāng)前天氣) public String getWeatherByCity(String city) { // 實(shí)際項(xiàng)目里替換為天氣服務(wù) API 調(diào)用 if (北京.equals(city)) { return 北京晴25℃東南風(fēng)2級; } return city 多云22℃東北風(fēng)1級; } Tool(description 根據(jù)城市名稱查詢未來三天天氣預(yù)報(bào)需要傳入城市和天數(shù)) public String getForecast(String city, int days) { return city 未來 days 天晴轉(zhuǎn)多云最低18℃最高27℃; } }注意Tool的描述寫清楚“需要傳入什么參數(shù)”這直接影響模型生成參數(shù)的成功率。5.6 MCP 客戶端接入前面已經(jīng)在application.yml里配置了 filesystem 這個(gè) stdio 服務(wù)。當(dāng) Spring AI 檢測到 MCP Client 依賴時(shí)會自動連接該服務(wù)并把它暴露出的工具合并到工具注冊表。如果不想使用 stdio 方式也可以把spring-ai-mcp-client-webmvc換成或互補(bǔ)使用 HTTP 方式spring: ai: mcp: client: url: http://localhost:8081url方式適合連接已經(jīng)部署為獨(dú)立服務(wù)的 MCP Server。這里強(qiáng)調(diào)一個(gè)重要過程MCP 工具是“動態(tài)發(fā)現(xiàn)”的。你在代碼里看不到 filesystem 工具的 Java 類但它會在運(yùn)行期被注冊成一個(gè)ToolCallback。排查 MCP 工具是否生效看啟動日志里是否打印了 MCP 工具調(diào)用的注冊信息即可。5.7 Skill 定義用一個(gè)高內(nèi)聚的 Skill 類封裝“訂單查詢”能力。它不僅包含工具方法還包含面向 Agent 的描述和參數(shù)校驗(yàn)邏輯// 文件路徑src/main/java/com/example/ai/service/OrderQuerySkill.java Service public class OrderQuerySkill { Tool(description 根據(jù)訂單號查詢訂單狀態(tài)和物流信息訂單號為數(shù)字字符串) public String queryOrderStatus(String orderId) { if (orderId null || !orderId.matches(\\d{6,})) { return 訂單號格式不正確; } // 實(shí)際項(xiàng)目里注入 OrderRepository 查詢數(shù)據(jù)庫 return 訂單 orderId 狀態(tài)已發(fā)貨預(yù)計(jì) 3 天內(nèi)送達(dá); } Tool(description 根據(jù)用戶手機(jī)號查詢最近三個(gè)月訂單列表) public String listRecentOrders(String mobile) { if (mobile null || !mobile.matches(1\\d{10})) { return 手機(jī)號格式不正確; } return 最近訂單2026030101已簽收、2026021502已發(fā)貨; } }所謂 Skill 和普通 Tool 類的差別更多體現(xiàn)在設(shè)計(jì)意圖上。一個(gè) Skill 可以包含多個(gè) Tool并負(fù)責(zé)它們之間的業(yè)務(wù)規(guī)則。Agent 只需要注入這一個(gè)類就能獲得整套能力。5.8 Agent 編排最后把所有能力整合到一個(gè)客服 Agent 中// 文件路徑src/main/java/com/example/ai/agent/CustomerServiceAgent.java Component public class CustomerServiceAgent { private final ChatClient chatClient; public CustomerServiceAgent(ChatClient.Builder builder, WeatherTools weatherTools, OrderQuerySkill orderQuerySkill) { this.chatClient builder .defaultSystem(你是企業(yè)智能客服回答要簡潔、準(zhǔn)確、友好。當(dāng)用戶詢問天氣時(shí)必須使用天氣工具 當(dāng)用戶查詢訂單時(shí)必須使用訂單查詢技能不要編造訂單數(shù)據(jù)。) .defaultTools(weatherTools, orderQuerySkill) .build(); } public String chat(String userMessage, String conversationId) { return chatClient.prompt() .id(conversationId) .user(userMessage) .call() .content(); } public String chatWithSystem(String systemPrompt, String userMessage, String conversationId) { return chatClient.prompt() .system(systemPrompt) .id(conversationId) .user(userMessage) .call() .content(); } }sytem提示詞里明確寫了“必須使用天氣工具”“不要編造訂單數(shù)據(jù)”這種約束是 Agent 工程質(zhì)量的重要來源。模型有概率忽略模糊指令但你把指令寫進(jìn)系統(tǒng)提示詞輔助工具描述清晰成功率會大幅提高。再提供一個(gè)入口 Controller// 文件路徑src/main/java/com/example/ai/controller/ChatController.java RestController RequestMapping(/api/agent) public class ChatController { private final CustomerServiceAgent customerServiceAgent; private final MultiModelService multiModelService; public ChatController(CustomerServiceAgent customerServiceAgent, MultiModelService multiModelService) { this.customerServiceAgent customerServiceAgent; this.multiModelService multiModelService; } GetMapping(/chat) public String chat(RequestParam String message, RequestParam(defaultValue default) String conversationId) { return customerServiceAgent.chat(message, conversationId); } GetMapping(/multi) public String multi(RequestParam String provider, RequestParam String message) { return multiModelService.chatWith(provider, message); } }到這里一個(gè)支持多模型、自定義 Tools、MCP 外部工具、Skill 能力封裝、多輪會話記憶的 Agent 原型已經(jīng)完整落地。下面看看怎么驗(yàn)證它。6. 運(yùn)行結(jié)果與效果驗(yàn)證啟動項(xiàng)目mvn spring-boot:run如果本地Ollama已經(jīng)拉取了qwen2.5:7b啟動日志里會同時(shí)出現(xiàn) OpenAI 和 Ollama 的模型初始化信息。MCP Client 啟動時(shí)會嘗試執(zhí)行npx -y modelcontextprotocol/server-filesystem /tmp/data日志里會出現(xiàn) MCP Server connected 之類的記錄。依次驗(yàn)證幾個(gè)核心能力基礎(chǔ)對話curl http://localhost:8080/api/agent/chat?message你好conversationIdtest-001預(yù)期輸出一句問候語說明ChatClient鏈路正常。結(jié)構(gòu)化輸出curl http://localhost:8080/api/structured/parse-reservation?text幫我訂明天從北京到上海的MU5111航班價(jià)格850元提醒我上午十點(diǎn)出發(fā)預(yù)期返回 JSON{flightNumber:MU5111,from:北京,to:上海,departureTime:10:00,price:850元}工具調(diào)用聯(lián)動curl http://localhost:8080/api/agent/chat?message北京今天天氣怎么樣conversationIdtest-001如果模型沒有調(diào)工具可能只會回答“我無法獲取實(shí)時(shí)天氣”。如果正確調(diào)用了WeatherTools.getWeatherByCity會返回“北京晴25℃”等相關(guān)信息。多輪會話驗(yàn)證curl http://localhost:8080/api/agent/chat?message我的手機(jī)號是13800138000幫我查一下最近訂單conversationIdtest-001 curl http://localhost:8080/api/agent/chat?message再看看第一單的物流conversationIdtest-001第二次提問依賴第一次的上下文。如果返回結(jié)果包含第一單的訂單號或狀態(tài)說明會話記憶已生效。判斷 Agent 是否正常不能只看是否返回結(jié)果還要看它是不是在正確的步驟調(diào)用了正確的工具。建議在本地開發(fā)時(shí)打開 Spring AI 的調(diào)試日志logging: level: org.springframework.ai: DEBUG這樣可以在控制臺看到完整的工具調(diào)用鏈模型請求 → 工具調(diào)用 → 工具返回 → 模型最終回答。如果失敗優(yōu)先看這幾個(gè)位置啟動階段MCP Server 是否連接成功Ollama 服務(wù)是否可用調(diào)用階段模型返回是否超時(shí)工具階段Tool方法是否有日志返回內(nèi)容是否被模型正確消費(fèi)。7. 常見問題與排查思路問題現(xiàn)象可能原因排查方式解決方案啟動報(bào)錯(cuò)說存在多個(gè) ChatModel Bean同時(shí)引入了多個(gè)模型 Starter自動配置創(chuàng)建了多個(gè)同類型 Bean查看啟動日志中 Bean 創(chuàng)建記錄用Qualifier或顯式配置指定使用的模型或封裝多模型路由服務(wù)請求時(shí)模型長時(shí)間無響應(yīng)模型 API Key 無效、網(wǎng)絡(luò)不通、本地 Ollama 沒有啟動先 curl 模型供應(yīng)商接口查看 Ollama 是否在 11434 端口監(jiān)聽修正 API Key / base-url啟動 Ollama 并確認(rèn)模型已拉取工具沒有被調(diào)用模型直接瞎回答Tool的描述不夠清晰或 system prompt 沒有強(qiáng)制要求檢查工具描述打開 DEBUG 日志確認(rèn)模型請求里是否包含 tool_calls重寫描述加入“必須使用工具回答”等約束結(jié)構(gòu)化輸出解析失敗拋類型轉(zhuǎn)換異常模型返回文本格式不匹配 Java 類型查看實(shí)際返回的 JSON簡化實(shí)體字段統(tǒng)一使用 String逐步增加字段MCP Server 連接失敗npx 未安裝、args 參數(shù)格式錯(cuò)誤、服務(wù)端地址不通在終端手動執(zhí)行npx -y modelcontextprotocol/server-filesystem /tmp/data檢查啟動日志 MCP 部分修正 args 寫法安裝 npx改用可訪問的 HTTP MCP Server多輪對話上下文丟失conversationId傳遞不一致或沒有配置持久化 ChatMemory檢查每次請求是否傳同一個(gè) id查看內(nèi)存存儲的日志用 Redis/數(shù)據(jù)庫實(shí)現(xiàn) ChatMemory統(tǒng)一會話 id 生成規(guī)則本地模型不支持 function callingOllama 拉取的模型版本較老或本身不支持工具調(diào)用查詢模型文檔確認(rèn)是否支持 tools更換支持 function calling 的模型例如qwen2.5系列這些問題是獨(dú)立開發(fā)者在完整跑通鏈路時(shí)最容易遇到的。嚴(yán)格按照排查路徑走大多數(shù)問題會在十分鐘內(nèi)定位。8. 最佳實(shí)踐與工程建議8.1 模型接入層統(tǒng)一路由隔離供應(yīng)商不要把模型供應(yīng)商的 SDK 直接散落在業(yè)務(wù)代碼里。所有模型訪問統(tǒng)一走ChatModel接口模型路由邏輯收斂到一個(gè)服務(wù)中。這樣才能做到“線上用商業(yè)模型、測試用本地模型”而不修改業(yè)務(wù)代碼。8.2 提示詞管理模板化、版本化System prompt 不要散落在 Controller 里。建議用提示詞模板文件配合 Spring 的Resource加載放到系統(tǒng)資源目錄下。提示詞實(shí)際上是需要評審和版本管理的“代碼”它直接影響模型行為質(zhì)量。8.3 工具安全最小權(quán)限原則Tool方法本質(zhì)上是把內(nèi)部能力暴露給外部模型調(diào)用。必須遵守最小權(quán)限原則工具方法只做自己該做的事不要聲明一個(gè)大而全的方法例如“執(zhí)行任意 SQL”。所有涉及數(shù)據(jù)庫、文件、外部 API 的工具都要做參數(shù)校驗(yàn)就像對待用戶輸入一樣。8.4 會話記憶生產(chǎn)環(huán)境不要用默認(rèn)內(nèi)存實(shí)現(xiàn)ChatClient的默認(rèn)記憶是內(nèi)存級的應(yīng)用重啟即丟失。生產(chǎn)環(huán)境應(yīng)該把ChatMemory替換為 Redis 或數(shù)據(jù)庫實(shí)現(xiàn)。會話 ID 必須由后端統(tǒng)一生成不要信任前端傳入的任意 key否則容易出現(xiàn)會話串臺問題。8.5 MCP 生命周期管理MCP stdio 服務(wù)本質(zhì)上是啟動一個(gè)子進(jìn)程它的生命周期需要被關(guān)注。不要在生產(chǎn)環(huán)境用 npx 臨時(shí)拉取 MCP Server盡量構(gòu)建成獨(dú)立服務(wù)用 HTTP 方式接入這樣便于監(jiān)控和擴(kuò)縮容。8.6 Agent 可觀測性Agent 是一個(gè)多步?jīng)Q策系統(tǒng)每一步都可能出錯(cuò)。生產(chǎn)環(huán)境必須記錄用戶問題原文模型是否發(fā)起了工具調(diào)用調(diào)用了哪個(gè)工具、參數(shù)是什么工具返回結(jié)果最終回答內(nèi)容。這些日志鏈路是排查問題的唯一依據(jù)。建議在Tool方法和 Agent 調(diào)用層都加上結(jié)構(gòu)化日志而不是只靠框架默認(rèn)日志。8.7 成本與限流多模型配置帶來成本控制能力的同時(shí)也帶來新的風(fēng)險(xiǎn)工具循環(huán)次數(shù)過多會導(dǎo)致 Token 消耗膨脹。建議給 Agent 調(diào)用設(shè)置超時(shí)時(shí)間、最大工具調(diào)用輪數(shù)并針對不同模型配置不同的限流策略。8.8 版本升級策略Spring AI 版本迭代快API 偶有調(diào)整。升級前先看官方遷移指南并且保留一個(gè)小范圍的兼容層。比如你寫一個(gè)AgentChatService包裝ChatClient未來內(nèi)部 API 變化時(shí)只改這個(gè)類業(yè)務(wù)層不受影響。9. 總結(jié)與后續(xù)學(xué)習(xí)方向Spring AI 2.0 給 Java 生態(tài)帶來的價(jià)值不只是一套可以調(diào)大模型的 Starter而是一整套符合 Spring 編程模型的 AI 應(yīng)用開發(fā)范式。本文把這條鏈路完整拆解了一遍多模型解決了供應(yīng)商鎖定問題Tool讓模型具備調(diào)用業(yè)務(wù)方法的能力MCP 把外部工具生態(tài)標(biāo)準(zhǔn)化Skills 讓能力封裝更貼近業(yè)務(wù)Agent 則把這一切組合成了可交付的智能服務(wù)。建議你按順序完成三個(gè)練習(xí)先跑通多模型切換和結(jié)構(gòu)化輸出再實(shí)現(xiàn)一個(gè)包含兩個(gè)Tool的客服助手最后接入一個(gè)外部 MCP Server例如文件系統(tǒng)或數(shù)據(jù)庫服務(wù)。這三步做完Spring AI 2.0 的主要能力就算真正掌握。接下來值得深入的方向包括RAG 與向量數(shù)據(jù)庫的集成、Agent 與業(yè)務(wù)流程引擎的結(jié)合、基于 MCP Server 暴露公司內(nèi)部服務(wù)給 AI 應(yīng)用、以及多 Agent 協(xié)作模式。每一條都比單純調(diào)大模型接口更有工程價(jià)值也是 Java 工程師在 AI 時(shí)代不可替代的底牌。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
W色综合| 激情综合另类| 色色色综合| 五月色综合| 亚洲三A| 日日干综合| 日韩欧美颜射| 99久久综合| 先锋av性爱成人电影| 激情五月婷色| 少妇水多A片太爽了| 丁香五月成人| 婷婷五月亚洲一本在线丁香| 色婷婷五月天天天天天天天天天| 久久婷婷91| 国产精品久久久爽爽爽麻豆色哟哟 | 丰满少妇乱A片无码| 激情亚洲网| 啪啪啪综合网| 婷婷射图五月天| 天天爽夜夜爽夜爽精品| 色色精品色| 人人草碰| 婷婷丁香五月在线观看91| 久久久8| 色视频五月天| 婷婷视频在线| 思思久久96热在精品国产,| 日熟女| 国产精品美女久久久久AV超清| 色婷久九| 色色色色五月天| 午夜色丁香| 99热6这里只有精品6| 玖玖五月| 久久性操| 色九网| 国产婷婷久久| 久久婷婷色综合老司机| 国产综合丁香五月天| 丰满人妻妇伦又伦精品国产| 双性美人被调教到喷水A片| 五月婷婷九九热| 久久婷婷五月综合色和| 天天爽夜夜爽天天爽夜夜爽| 婷婷丁香激情| 亚洲色色香蕉| 99视频在线| 丁香五月五婷| 橾逼网| 偷拍视频五月天| 婷婷五月亚洲激情| 色五月视频无码播放| 婷婷香香五月| 操99| 台湾综合丁香五月蜜桃| A一级操| 日本综合色色| 五月丁香怕怕综合| 大香蕉婷婷婷| 偷拍九九热| 麻豆AV一区二区三区| 色综合色综合网| 色噜噜狠狠色综合日日| 99国产精品白浆在线观看免费| 久久99久久99精品免视看婷| 婷婷五月在线观看| 久久综合久色欧美综合狠狠| 久婷狼色诱惑在线| 亚洲AV另类| 99国产欧美视频| 婷婷综合伊人| 黄色av高清| 182tv992tv人之初午夜免费观看| 亚洲无码你懂的| A级毛片高清免费不卡播放谢谢谢谢| 婷婷五月色花丁香社区| 久热91精品| 丁香五月婷婷偷拍| 电影爱拉战争免费观看| 久久 视频这里只有精总| 色五月综合网| 久青操| 亚洲综合色婷婷| 直接看的av| 婷婷五月天在线观看| 日韩在线9| Av大香蕉| A片天天| 任你搞在线观看视频| 五月天堂六月丁香亚州中文字幕久久 | 婷婷永久在线| 婷婷五月天视频小说| 天天日天天摸天天| 综合久久99| 久婷婷色| 中文字幕丰满孑伦无码专区| 日韩AV中文字幕在线| 色人久夂| 99re26视频| 久久99激情丁香婷婷小说网| 丁香五月性| 99这里| BBWCUCKOLD精品熟妇| 午夜天天精品视频| 九九热99免费视频| 玖操97| 婷婷五月在线播放| 少妇性BBB搡BBB爽爽爽视頻| 9久久久| www.日本久久videos| 五月激情网五月综合网| 天堂综合久久 | 婷婷99狠狠| 五月丁香综合色婷婷| 欧美一线视频| 深爱丁香激情| 九九婷婷网五月天| 91人人妻人人操| 午夜丁香婷婷| 丁香久月| 色婷婷丁香AV综合| 亚洲精品操一操、噜一噜、摸一摸、爽 | 97综合视频在线| 99久久婷婷国产综合精品电影| caopeng97人人| 色一情一乱一乱一区91Av| 狠狠狠人妻| 高清无码视频网址| 九月丁香婷婷基地| 色亚洲无码| 丁香五月天BBw| 91操片| 少妇被下春药玩弄A片| 九月久久婷婷| 五月 婷婷 成人| 婷婷五月激情丁香| 婷婷涩五月| 激情五月丁香激情综合网 | 国产黄色av| 激情五月天婷婷激情| 五月天开心激情综合网| 六月丁花香啪啪激情欧美| 国产综合色婷婷精品久久| 99.色| 91人妻PORNY九色大屁股| 色色六月| 亚洲色亚洲精品| 丁香五月手机在线| 97久久人人| 五月婷亚洲精品| 成人午夜天| 九九99九九99九九99视频网| 最新va在线播放| j五月香在线| 9有码中文| 婷婷五月深深爱| 开心激情婷婷| 激情综合4月| www.henhenl| 99视频日韩| 亚洲综合婷婷| 欧洲色区| 天天摸日日舔狠狠添婷婷婷| 青青草国产亚洲精品久久| 丁香婷婷色| 色五月婷婷很很操| 麻豆精品| 五月天狠狠色| 日本色图综合| 五月激情婷婷综合| 九月婷婷综合| 五月天激情国产综合婷婷| 五月婷婷色啪| 无码啪啪| 天堂AV三级| 五月丁香精品| 色婷婷成人| 中文字幕视频在线播放| 超碰精品在线| 五月天婷婷基地| 色婷五月| 久热99| sS丁香五月婷婷| 在线播放中文字幕| www色婷婷久久综合久色| 青草五月天| 欧美精品99| 婷婷五月电影| 99久久久国产大片| 欧美性色A片免费免费观看的| 亚洲欧洲99| 婷婷五月天在线观看| 丁香六月激情综合| 精品夜夜澡人妻无码AV| 日日夜夜综合| 婷婷五月天午夜激情影院| 色色无码| 凹凸7777操操操| 色综合色色| 丁香女人五月天| 99热精品在线| 激情五月狠狠| 99精品人人| www.久久久.com| 超碰免费人人| 密着浓厚中出乚交尾GvG935| 人人摸人人| 婷婷五月天综合久久| 婷婷五月激情网| 激情丁香五月天综合| 天天操婷婷| 五月丁激情| 婷婷六月成人| 久操婷婷| 天天爽天天透天天爱| av在线免费播放观看| 婷婷播5月| 天天插天天射天天干| 丁香花五月天激情| 狠狠色狠狠鲁| 97se视频在线| 亚洲亚洲人成综合网络| 欧美色性色好| 久久综合激情五月天| 99操逼| 热日韩欧美| 激情五月丁香综合网站| 九九九九九九综合| 久久99久久99精品免视看婷婷| 内射激情在线| 成年人夜夜喷水| 丁香五月自拍| 99热这里只有精品55| 99热播放| 91seAV| 婷婷五月综激情| 99色最新在线视频| 99久久精品国产色欲| 婷婷网五月天| 色色色色色色网| 色五月天激情| 停停六月 综合| 久久网日本| 性爱电影科技贸易有限公司| 五月丁香久久| 人人爱人人草| 人人做人人看人人摸| 色婷婷综合成人| 色墦五月丁香| 五月六月婷| 那里有AV网址| 色色狼人综合| 我想看国产大学生口爆吞精的视频| 九九久久五月天| 99成人无码| 丁香五月91| 玖玖婷婷免费| 专区无日本视频高清8| 五月婷婷丁香五月婷婷丁香| anquye五月| 99色在线视频| 欧美啪啪9| 超碰只有精品在线| 丁香六月婷婷| 思思久久精品| 激情五月黄色小说| 综合精品啪啪| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 91久女| 婷婷激情综合| 9九色首页| 毛片新网地| 啪啪色激情五月天| 色人久久| 亚洲av成人在线| 91亚洲免费片| 婷婷五月丁香99| 天天日日夜夜| 色五月亚洲| 91婷色| 激情www| 色狠狠六月| 久久性爱视频| 黄网在线播放| 婷婷伊人| 人人草公开操| 色五月xxx| 97AV在线视频| 婷婷五月天激情综合| 99在线小视频| 五月丁香久久综合色| 日本欧美成人片AAAA| 婷婷综合五月| 五月天开心网| 国产精品VIDEOSSEX久久发布| 99日韩网站| 婷婷色五月色妇| 开心婷婷五月天电影院| 五月天影院婷婷在线观看| 色色日韩| 狠狠操天天操天天操| 色就是色婷婷五月亚洲激情| 婷婷免费精品视频| 色婷婷六月激情| 九九精品片一| 伊人婷婷五月| 色色网五月激情| 五月婷综合网| 色色亚洲视频| 五月亭亭狠狠| 色久女| 久久色婷婷| 六月丁香av| 婷婷综合精品| 成人av免费观看| 91Chinese在线| 亚洲九区| 亚洲六月综合激情久久下卡| 99在线播放| 吾爱AV导航| 99免费偷拍视频| 99免费在线视频| 99精品超在线播放| 五月天激情黄色小说在线观看| 九九热这里只有精品5| 天天色天天爽| 婷婷色五月情| 五月丁香婷婷视频| 99热国产这里只有精品| 久久99精品久久只有精品| 丁香五月久久| 六月丁香婷婷爱| 国产三级在线播放| 久热这里只精品| 亚洲操人| 五月婷婷久草在线视频综合| 超碰97人人操| caop视频| 久久婷婷综合国产| 久久亚洲网| 亚洲噜色| 深夜男女福利刺激影院一区完整| 亚洲亚洲人成综合网络| 婷婷性爱综合| 五月亭亭六月色| 久久婷婷五月草视频| 日日色综合| 激情综合五月| 日韩AC在线免费观看| 婷婷五月丁香色播| 日本在线免费中文com.| 激情五月影院| 欧美日韩91| 日韩黄在免| 五月丁香成年黄色| 五月夜丁香| 五月天婷婷在线AN| 色色五月婷| 性爱111111| 99在线免费视频| 色五月婷婷丁香国产在线| 丁香六月天堂| 色999五月色| 97超级碰碰碰久久久| 人人操AV| 婷婷五月丁香六月| 熟女人妻视频| 丁香色影院| 国产精品色色666| 色99欧洲色19| AA片在线观看视频在线播放| 国产白丝在线一区| 婷婷 月 丁香| 99精品偷自拍| 日本三级中国三级99人妇网站| 色五月婷婷婷婷| 五月婷婷无码| 欧美日韩成人高清在线| 九九热这里只有精品31| 久久99网站| 大香蕉七区| 伊人五月人妻精品| 亚洲激情五月天| 五月丁香日逼| 激情综合网激情五月丁香| www.婷婷.com| 99激情在线| 色激情五月| 国产精品人成A片一区二区| 久久新地此| 五月丁香六月欧美| 丰满老熟妇BBBBB搡BBB | 天天草天天爽| 亚洲AV网站| 综合网五月| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 五月色色激情网| 五月香婷婷| 成人啪啪色婷婷久| 看国产探花操逼三级片| 超碰成人黄色网| 色情婷婷| 99热这里只有精品在线| 97热视频| 色五月成人| 操操日韩| 99在线精品在线视频| 天天插天天插| 中文人妻主播久久| 99精品网| a69在线视频| 99综合免费视频| 性爱激情小说AV五月丁香花| 六月色播| 五月婷婷六月丁香玖玖玫瑰91| 69色色视频| 五月天婷婷色播综合在线| 久久综合热17c| 色五月激情网| 国产色色网站网址| 久久精品国产一区二区三区四区| tingting五月天亚洲| 婷婷五月色惰| 香蕉国产2013| 激情小说婷婷| 色五月在线| 99网| 我要射综合| 95精品区一区二| 欧洲激情五月天| 国产又黄又爽又色的免费| 婷婷丁香色五月天久久88| 日日杆天天| 欧美婷婷六月丁香综合色| 丁香五月天激情| 97色色婷婷五月天| 老司机日日夜夜青草| 亚洲成人在线播放| 天天色情站| 婷婷免费无视频| 综合欧美五月婷婷| 日本人人xxx| 操逼国产91| 五月婷婷丁香狠狠撸久久| 色婷婷色丁香色欲av| 无码任你操| 九九99男女视频在线观看| 色五月成人| 日本色图综合| 99ER热精品视频| 天天色天天爱天天爽| 白度黄视频| 色色色网站| 7超碰自拍| 日本天天色| 丁香五月激情综合网激情五月| 人妻激情久久| 婷婷午夜综合| 99er免费在线观看| 激情五月天福利| 久久 婷婷 五月天| 丁香五月第九色| 人人操超碰| 五月天丁香成人| 丁香五月天激情网址| 内射人妻视频国内| 26UUU精品一区二区| 亚洲中文字幕AV| 五月激情综合网| 2025天天操| 99热1| 熟女人妻一区二区三区免费看| 天天干天天日日| 日韩成人无码片| 成人丁香五月| 亚洲激情精品| 婷婷成人网五月天| 精品操逼一区二区| 色五月天婷婷| 操操操Av| 丁香五月成人论坛| 97久人人| 亚洲久久激情| 五月丁香六月情| 丁香五月天在线观看视频| 综合福利网| 亚洲情欲| 五月香蕉婷婷| 亚洲不卡| 激情九九九九| 久久久亚洲精品一区二区三区浴池| 色狠久| 99久久精| www.91在线观看| 日本黄色一级| 色五月六月| 99热无码首页| 97色伦另类图片小说视频| 久久婷婷五月天激情四射| 亚洲第一成人无码A片| 六月色播| 亚洲色99| 激情综合网之激情五月| 五月玖玖| 婷婷丁香黄色| 五月婷婷操操| 色色婷| 五月婷婷丁香俺日污视频| 亚洲激情 久久| 台湾无码A片一区二区| 精品一二三区久久AAA片| 成人午夜无码视频| 色无码| 黄色99视频| 五月丁香综合啪啪| 婷婷五月天激情电影小说| 99无码免费视频| 亚洲天堂爱爱| 久操综合| 韩日AV片| 七七色综合| 熟女人妻视频| 裸体做A爰片毛片A片免费| 九九精品99| 六月丁香五月天| 少妇口诉沐足视频播放器网址| av九九| 七七色综合| 蜜乳av一级av| 日韩一本操| 五月天激情网图片| 97色色色| 五月激情综合网| 五月色网| 婷婷久久综合久| 婷婷丁香激情综合色情| 香蕉人在线香蕉人在线 | 丁香五月开心婷婷| 色永久| 青草激情在线| 噜噜色com| 99热这里只有精品最新网址| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 99热99精品在线观看| 五月天第四色开心色播| 狠狠夜夜五月丁香| 五月天激情在线视频| 婷婷五月天激情四射五月天激情| 热99精品视频在线观看| 久久er免费视频| 天天射夜夜爽| 欧美激情丁香五月天久久婷婷一区| 人人色婷婷五月天| 开心五月丁香综合久久| 五月天婷婷乱| 色深爱五月| 四月婷婷丁香五月| 成人婷婷| 99爱视频| 九九成人电影婷婷| 天堂久久大香蕉| 五月婷婷九九热| 五月婷婷丁香大陆免费| 淫视馆aV二区一区| 亚洲精品乱码久久久久久综合| 97操操操| 狠狠另类视频| 2025年最新亚洲在线欧美| 久久思思精品| 激情五月天在线视频| 丁香五月婷婷视频| 激情综合网五月婷婷| 亚洲色视频| 欧洲色区| 变态另类色图 | 淫视馆aV二区一区| 丁香婷婷人妻综合网| 六月婷婷狠狠做| 五月丁香婷婷三级| 丁香久久五月婷综合| 在线另类| 男人大jjc女人免费视频| 超碰在线国产| 精品热青草| 99啪在线| xxxx五月| 五月天啪啪| 成人av在线电影| 丁香激情五月天| 亚洲中文字幕在线电影| 成年人夜夜喷水| 久久小视频免费| 思思热在线免费视频| 另类视在线| av九九| 中文字幕综合色| 8区视频在线| 激情精品久久| 99热这里只有精品9| 很很干天天干| 超碰人人妻| 97人人射| 婷婷丁香色五月| 色五月综合激情| 无码少妇高潮喷水A片免费| 色吧网综合| 色色日韩网| 激情五月综合网最新| 色五月婷婷基地| 日本一级一级一级一级| 国产午夜精品一区二区| 日韩av干| 91热爆在线| 五月丁香少妇| 五月天综合在线观看| 北京熟妇搡BBBB搡BBBB| 久久视频婷婷视频| www.色婷婷| 色欲AVV| eeuus五月婷| 丁香五月激情五月| 日韩专区五月天婷婷丁香| 亚洲成人无码免费| 中文字幕操比影片| 色综合九九| 日日夜夜狠狠操| 婷婷五月色天| 色婷婷丁香综合中文字幕| 六月婷五月丁香| 99热亚洲精品66| 激情综合五| 97人人爱人人操| 五月天成人在线| 激情五月天小说网| 噜噜操操| 亚洲va欧美va天堂v国产综合| 成人做爰A片免费看视频| www.99热这里精品| 97婷婷五月| 国产激情久久| 五月天婷婷綜合院| 操一操干一干| 超碰无码老师| xxx综合在线| 婷婷色婷婷| 久久综合五月| 伊人啪啪网| 亚洲成人AV电影在线| 久青青久| 99综合视频一体| 99热在线播放| 日韩综合久久| 日韩在线99| 五月丁香婷婷综合网色欲| 亚洲色色色色| 性欧美大战久久久久久久83| 婷婷五月开心中文字幕色| 婷婷综合五月天| www亚洲无码| 五月婷婷开心丁香| 男女激情久久| 毛片毛片毛片毛片| 亲子乱AV-区二区三区| 乱女乱妇熟女熟妇综合网站| 丁香五月性爱| 中文字幕+乱码+中文字幕在线观看| 久久激情网| 久久综合激情五月天| 欧美交换配乱吟粗大25P| 久久婷婷成人视频| 亚洲黄网AV| 色婷五月| 色哟呦av| 日本狠狠网| 久久9RE热视频精品98| 伊人网碰碰| 超碰9| 五月婷婷深深爱| 亚洲国产精品二二三三区| 狠狠色丁香婷婷基地| 国产婷婷色综合AV蜜臀AV| 欧洲激情五月天婷婷| 成人片黄网站色大片免费毛片| va婷婷在线| 97久久综合网| 日韩aaa| 激情五月综合网最新| 99re思思热久久| 2025天天爽天天摸| 久re在线| 天天插综合| 这里只精品| 亚洲天堂久久| 玖玖资源站中文| 日韩精品一区二区亚洲AV观看| 亚洲最大视频| 五月婷婷精品视频| 亚洲网站999| 丁香五月色| 99亚洲色| 操日视频| 国精产品一区一区三区免费视频| 五月丁香龟婷婷| 久久人人九九| 疯狂做受XXXX高潮A片动画| 色婷婷九月| 9l视频自拍九色9l视频自拍九色9l社区 | 色狠狠综合| 天堂在线9| 激情久久久| 婷婷五月天久久久| a在线观看| 五月丁香婷婷伊人日韩| 91碰在线| 人人摸人人干人人做| 九色七七| 性爱激情久久| 天天激情站| 深爱婷婷色| 六月婷久久| 99热久久这里只有精品| 9久久婷婷国产综合精品性色| 色色色色色色色综合| 99热高清在线| 97精品人人A片免费看| 狠狠色噜噜狠狠| 天天干,噜噜色,狠狠色| 激情久久久久久| 丁香九月婷婷色| 99九九久久| 高清免费在线视频| CHINESE熟女老女人HD视频| 亚洲99热| 99爱在线| 另类图片天天影视在线观看| 1024AV视频| 狠狠干综合| 色综合九九| 思思久久精品| 美女激情婷婷| 99热国产精品| 欧美大道不卡| 99久久综合狠狠综合久久| 99操视频| WWW99热| 激情五月天综合| 很很操很很操| 精品视频这里只有精品| www.色九月| AV在线不卡网站| 亚洲成av人影院| 五月天激情国产综合婷婷| 婷婷五月天色播| 亚洲最大五月天成人网| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 777久久综合视频| 激情综合国产| 五月婷中文娱乐综合| 激情综合网婷婷五夜| 99热在线精品观看| 日韩啪啪视频| 能看的av| 婷婷在线播放| 色婷五月天激情| 五月丁香六月香综合激情| 丁香婷婷综合五月天| 丁香婷婷五月天校园春色| 影音先锋毛片网站| 久久婷婷内射| 五月丁香激情综合啪啪| 五月婷婷日| 丁香五月天激情四射网络不好| 久操乱| 日本熟妇乱妇熟色A片蜜桃| 99自拍视频| 婷婷五月综合网| 丁香桃色网| 久操人妻| 97色色色| 亚洲综合五月天| 中文字幕在线日亚洲9| 操91| 五月婷婷激情综合| a久久| 无码人妻少妇色欲AV一区二区| 99综合视频| 欧洲色色| 六月婷婷综合| 亚洲天堂色色| 丁香五月性爱| 国产精品成人AV在线| 特黄三级片| 91超级碰在线| 色色99| 九九色综合| 91丨九色丨熟女高潮| 激情五月婷黄版| 99久久综合网| 在线观看中文字幕| 五月综合激情| 另类专区在线| 97干在线视频| 这里只有精品免费| 嫩BBB槡BBBB搡BBBB| 欧美va在线| 被强行糟蹋的女人A片| 超碰国产在线| 六月成人网| 色综合久| 碰久久精品w| 亚洲性爱电影| 亚洲国产精品成人免费一区久久久在线观看AAAA| 26uuu欧美日韩| 2025最新亚洲激情在线| 五月婷色激情五月| 五月天色五月| 久久婷婷伊人| 丁香五月婷婷啪啪视频| 成人片在线免费看| 国产精品岛国片在线观看免费| 91干网站| 久9久成人精品视频| 色就是色婷婷五月亚洲激情| 深爱激情四射| 色五月亚洲| 久久丁香五月综合六月激情红杏视频| 激情婷婷丁香色情五月天| 五月婷婷五月天亚洲无码| 99热在线看片| 五月丁香婷婷综合| 精品五月花| 丁香五婷| 就要去操亚洲成人精品五月天丁香婷婷| 久热这里只有精品99re,久热这里只有精品7 | 五月丁香综合啪啪| 五月婷丁香亚洲| 亚洲激情综合| 国产精品涩涩涩视频网站| 五月天婷婷丁香人人操91| 好好干Av| 夜夜综合色| 日本丁香五月| 9久9久9久女女女九九九一九| 精品成人久久久久久久_一二三四视| 精品一二三区视频立| 丁香六月婷婷色XXXXX| 婷婷综合色色| 亚洲精品第一国产综合亚AV | 丁香五月电影| 久久激情婷婷| 成人天天爽| 99无码精品| 九九这里只有精品| 97色婷婷在线观看| 五月丁香婷婷伊人| 国产免费AV网站| 色色综合网。| 99色这里| 98色花堂98t.R| 欧美日韩精品人妻狠狠躁免费视频 | 人妻日日日| 97人妻碰碰中文无码久热丝袜| 五月婷六月丁香| 九九热最新| 91xxxx九色| 综合五月天天天天天五月| 91色综合网| 狠狠色狠狠色综合日日91| 五月综合亚洲色| 五月天婷婷基地综合网| 五月天婷婷丁香成人网| 欧美操人| 一级二级色大片| 琪琪色综合网站| 深情六月婷婷综合久久| 97超碰在线免费观看| 伊人大香蕉爱聚| 5月色婷婷| 亚洲黄色影视| 99日本视频| 久久精品亚洲一级牲爱综合| 99人人干| 这里只有精品视频222| 色情五月天丁香社区| 色色五月天 亚洲| 97色伦另类图片小说视频 | 丁香六月激情| 亚洲午夜国产成人电影VA国产欧…| 琪琪理论片| 丁香五月婷婷啪啪啪| 天天操天天曰天天射| 思思热久久爱| 色五月色综合| 麻豆123区| 丁香九月激情| 五月丁香美女| 婷婷五月天丁香花| 色婷婷网| 99热综合网| 9有码中文| 丁香六月久久| www.com.色色| 成人va视频| 免费看片在线观看| 五月天涩涩| 9色资源在线| 米奇影视五月天| 麻豆AV一区二区三区| 99亚洲综合| 丁香五月人妻| 亚洲丁香婷婷五月天综合色| 五月激情视频| 婷丁五月| 99精品偷自拍| 婷婷色无码| 国产精品日本一区二区在线播放| 免费色色色| 丰满老熟妇BBBBB搡BBB| 99久热这里有精品| 在线观看免费人成视频无码| 五月丁香久久激情网| 亚洲乱码日产精品BD在线观看| 婷婷色五月激情| 三级三久久线久久99久目本WW| 超碰av天堂| 夜夜撸日日操| 亚洲无码猫咪| 噜噜视频| 久久婷婷综合网| 久久激情网| 热99精品视频观看| 综合久久激情久久| 婷婷综合六月| 色五月婷婷AV| 91色逼| 综合狠狠伊人| 99热精品在线播放| 天天 日综合| 成人五月天。COM| 狠狠插狠狠操| 五月丁香精品| 色五月婷婷网| 色六月丁香婷婷狠狠干| 婷婷五月天综合久久日美女| 99re热视频这里只精品5| 干一干xxxx| 综合激情五月天| 婷婷丁香六月激情综合| 五月丁香综合久久夜夜| 五月婷婷六月丁香| 久久这里都是精品免费| 午夜天堂一区人妻| 天天干夜夜想| 色欲九区| 8090在线影视少妇| 五月丁香六月婷婷激情视频在线观看免费| 先锋男人91资源| 99视频精品| 美妞av| 丁香五月天婷婷大香蕉| 开心五月婷婷| 久久五月六月| 99在线综合视频| 久久92| 色五月aV| 六月丁香啪| 六月丁香五月婷婷| 天天插AV丝袜中| 婷婷丁香九月| 天天久综合网永久入口18| 国产精品人人妻人人爽| 精品99这里有| 九九热99久久99| 婷婷亚洲天堂| 九色色| 97碰| avh片在线观看| 色婷婷五月天不卡| 99视频精品全部免费看| 综合久久五月| 婷婷久久综合久| 婷婷干五月综合在线播放| 激情综合在线观看| 婷婷五月天 丁香五月天 裸体| 蜜臀av粉嫩av懂色av| 99热热九九| 五月丁香九九| 嫩草AV久久伊人妇女超级A| 婷婷日欧美在线观看| 丁香五月情色| 黄色AAAAAAA| 99精品成人无码A片观看金桔 | 不卡在线超碰| 五月丁香色| 99热这里只有精品最新网址| 国产色色在线| 九9九9无码| 色五月色综合| www色色com| 六月丁香五月婷婷| 先锋av性爱成人电影| 综合视频久久| 99ri视频在线观看| 伊人在线视频| 欧美三级欧美一级| 久久婷婷综合五月趴| 欧美成性色| 97干欧美| 亚洲有码在线视频| 97 天堂| 日日夜夜天天| 中文字幕永久免费| 亚州色色色| 丁香六月激情蜜桃| 在线观看五月婷婷网| 精典久久| 综合激情在线观看| 五月J香蕉婷婷| 丁香五月激情网| 亚州色婷婷| www.婷婷.com| 婷婷五月天国产| 五月丁香六月婷婷在线播放| 99高级会所久久| 亚洲激情亚洲激情 | 江苏少妇性BBB搡BBB爽爽爽| 少妇激情五月天| 91爱啪啪| 亚洲网视屏| 可以免费观看的AV| 开心激情网在线| 99色啊| 丁香五月综合色婷婷| 婷婷五月色| 超碰av天堂| 欧美伊人9| 亚洲另类av| 91人人看| 夜色爱爱亚洲| 亚洲综合色成丁香五月色| 青柠影视免费高清电视剧 | 五月丁香久| 婷婷趴趴| 色婷婷天堂| 大香AV| 狠狠色噜噜狠狠| 91九色精品| 六月婷婷九月丁香| 人人性久久| WWW.五月com| 极品嫩草| 婷婷五月a| HD久久精品视频| 人人叉久| 激情五月天啪啪| 男女免费视频999| 欧洲一区二区| 丁香六月啪| 丁香婷婷性爱| 激情视频婷婷五月花| 亚洲综合99| 99re热精品视频国| 2025最新亚洲激情在线| 色婷婷欧美在线| www,五月丁,com| 五月婷婷综合久久| 丁香五月激情在线| 99激情视频| 色色色99| 五月丁香五月婷婷| 69精品人人人人人人人人人| 99re6在线视频精品免费| 精品一二三区久久AAA片| 久久se 综合网| 一区二区无码视频| 九九九九九九综合| 丁香五月网址| 日本高清久久| 六月丁香婷婷天堂| 天天干天天射色综合| 丰满熟女人妻一区二区三| 国产.亚洲.欧洲视频在线| 婷婷五月色| 色丁香五月婷婷| 68热超碰在线| 大香伊人婷婷影院| 五月婷婷丁香| 色婷婷中文| 91人人澡人人爽人人看| 日韩九区| caopeng97日韩| XX色综合| 97干免费视频| 国产精品久久久久久久久久| 丁香花狠狠婷婷亚洲中文字幕| 青青草网武则天| a在线观看| 五月的婷婷六月丁香| 色婷婷五月中文字幕在线dvd| 9有码中文| 激情综合五月| 色约约视频一区二区三区四区五区| 色色狼人综合| 国熟女视频| 五月天激情久久| 99热这里只有精品9| 婷婷天堂伊人| 97色色综合| 色婷婷六月激情| 天天爱天天做天天| 伊人啪啪网| 色婷婷亚洲综合网站| 日夜操B| 在线色五月婷婷| 欧美色97| 专区无日本视频高清8| 久久码久久无清| 亚洲激情 久久| 色色色综合网| 一级黄色影片| 丁香久月婷| 99热精品综合| 激情五月综合亚洲另类| 92久久精品一区二区| 久色五月天| 另类综合激情| 日韩高清成人| 五月天另类小说久久小说网| 五月婷婷激情久久| 这里只有精彩亚洲视频推荐| 啪啪综合网| 大香蕉在线99热| 思思热久久阴99| 五月天婷婷基地| 亚洲中文字幕在线观看| 大香蕉99热| 久久人妻www| 久久丁香五月| 亚洲XX网| 蜜臀嫩草| 九九热精品视频| 九九综舍久久| 日日狠狠久久偷偷四色综合免费| 婷婷五月天电影区小说区| 久久九九99| 成人亚洲精品| 综合在线色婷婷| 五月天激情网图片| 爱操人妻| 久久这里有精品| 中国女人内射6XXXXX| 国产67194| 日本99色| www天堂99| 色噜噜狠狠色综合日日免费| 久久东京热婷婷五月| 丁香五月桃花在线激情综合| 99色啊| 色婷婷www| 玖玖综合玖玖| 99re这里有精品手机在线| 国产超碰在线| 1024日韩| 蜜桃人妻无码AV天堂三区| 超碰在线资源| 女力报到正好爱上你| 九九久久99| 激情五月婷黄版| 99热最新| 国产99久9在线+|+传媒| 99在线视频在线观看| 丁香六月婷婷综合| 丁香色五月婷婷17C| 色情五月天丁香社区| 色婷婷影| 天天爱综合网| 婷婷五月天综合久久日| 91精品婷婷国产综合久久| 九九婷婷五月天| 亚洲最大成人综合网720P| 久操b网| 五月色综合| 丁香五月色网| 五月丁香综合中文| 日本欧特黄色刺激一区影视久精品无码| 激情婷婷五月色| 熟妇内谢69XXXXXA片| 丁香婷婷免费| 三男玩一女三A片| 成人五月天在线观看| www.五月丁香| 五月婷婷色播视频| 五月丁香啪啪啪啪| 国产成人av在线播放| 婷婷六月激情| 丁香婷婷大香蕉| 色播婷婷五月天| 男女99免费视频| 五月丁香六月激情欧美综合| 九九99九九99九九99视频网| 丁香色综合| 超碰chaompinm| 热99在线精品| 97碰| 色综合色色色| 伦乱美欧| 风流少妇A片一区二区蜜桃| 丁香五月亚洲无码| 婷婷丁香无码专区| 俺去也五月天婷婷| 超级碰碰99| 丁香在线视频| 丁香五月综合婷婷| AAA久久| 欧美在线骚货| 国产黄色在线观看| 操日挥操日日| 成人在线免费网址| 99人妻碰碰碰久久久久视| 天天色天天射天天日| 久久99热这里只频精品6学生| 色婷婷丁香网| 国产婷婷色综合AV蜜臀AV | 五月婷婷六月天| 影音先锋色色色资源色资源色| 五月婷婷在线视频| 综合激情综合啪啪| 97婷婷五月| 九九无码| 色九月婷婷综合| 久久久久9999| 日日狠夜夜狠| 青青草伊人婷婷| 婷婷五月天视频亚洲| 五月婷婷啪啪啪| 八戒青柠影视剧在线观看| 九九亚洲小视频| 99免费青青蜜臀| 欧美人妻一区二区| 婷婷夜夜夜夜| 九九视频在线观看视频在线播放69| 色婷婷激情四射视频| 九九热这里只有精品556| 久久色大香蕉| 色婷婷亚洲五月天| 淫视馆aV二区一区| 久久综合九色综合97婷婷| 日本va欧美va欧美| 玖玖婷婷视频| 激情婷婷| 5月婷婷6月六月丁香| 国产探花一片区| 婷婷丁香色五月| 五月天婷婷乱| 色婷婷五月在线| 97人妻碰碰中文无码久热丝袜| 清色五月天| 六月丁香色色色| 怡红院AV亚洲一区二区三区H | 伊人久久五月天| 成人国产网站在线免费看| 色久影院| 另类国产综合| www.91在线观看| 两性婷婷丁香五月|