久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

Spring AI 2.0實(shí)戰(zhàn):Java開(kāi)發(fā)者快速構(gòu)建多模型Agent應(yīng)用 從 2024 年開(kāi)始AI 應(yīng)用開(kāi)發(fā)幾乎成了 Python 開(kāi)發(fā)者專屬賽道LangChain、LlamaIndex 各種框架層出不窮。Java 開(kāi)發(fā)者想在自己的 Spring Boot 項(xiàng)目里接一個(gè)大模型要么寫裸 HTTP 請(qǐng)求調(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——完整串起來(lái)講一遍。不是單純介紹概念而是從一個(gè)小型實(shí)戰(zhàn)項(xiàng)目出發(fā)把每一步的配置、代碼、踩坑點(diǎn)全部鋪開(kāi)。如果你是一個(gè) Java 工程師正在糾結(jié)怎么在公司項(xiàng)目里落地 AI 能力這篇文章可以直接當(dāng)參考手冊(cè)用。先說(shuō)結(jié)論Spring AI 2.0 真正解決的問(wèn)題是把“和大模型打交道”這件事變成了符合 Spring 編程模型的普通后端開(kāi)發(fā)。它不追求把 LangChain 那套 Python 生態(tài)搬過(guò)來(lái)而是用 Spring 自己的依賴注入、自動(dòng)配置、約定優(yōu)于配置把多模型切換、工具調(diào)用、協(xié)議接入、Agent 編排統(tǒng)一成一個(gè)標(biāo)準(zhǔn)范式。讀完這篇文章你能獨(dú)立搭出一個(gè)支持多模型切換、能調(diào)用自定義工具、能通過(guò) MCP 接入外部服務(wù)、帶記憶和會(huì)話的客服 Agent 原型。1. 這篇文章真正要解決的問(wèn)題很多 Java 開(kāi)發(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è)級(jí) AI 應(yīng)用開(kāi)發(fā)中必須面對(duì)的問(wèn)題同一個(gè)業(yè)務(wù)要支持多家模型供應(yīng)商比如線上用 GPT-4o本地開(kāi)發(fā)用 Ollama 里的開(kāi)源模型怎么做到切換模型而不改業(yè)務(wù)代碼模型返回的是 JSON 文本怎么穩(wěn)定地映射成 Java 對(duì)象而不是靠正則硬解析大模型不知道你的訂單數(shù)據(jù)、用戶數(shù)據(jù)怎么安全地讓它調(diào)用你已有的 Service 方法外部工具生態(tài)已經(jīng)約定了統(tǒng)一接入?yún)f(xié)議比如數(shù)據(jù)庫(kù) MCP Server、文件系統(tǒng) MCP ServerSpring 項(xiàng)目怎么接入最省事一個(gè)智能客服 Agent 需要有角色設(shè)定、工具列表、會(huì)話記憶、多輪上下文這些怎么工程化管理這些問(wèn)題的答案就是 Spring AI 2.0 的核心抽象體系。它跟 Python 的 LangChain 解決的問(wèn)題高度重合但實(shí)現(xiàn)思路完全是 Java 式的自動(dòng)配置、Bean 管理、類型安全、Starter 依賴。從實(shí)用角度看這篇文章適合四類讀者還沒(méi)接觸過(guò) 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 對(duì) LLM 的抽象核心就是ChatModel接口。不管底層是 OpenAI、Anthropic、通義千問(wèn)、DeepSeek 還是 Ollama 里的本地模型對(duì)上層業(yè)務(wù)代碼來(lái)說(shuō)暴露出來(lái)的都是同一個(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、工具注冊(cè)、結(jié)構(gòu)化輸出。這是最常用的對(duì)象。EmbeddingModel負(fù)責(zé)把文本轉(zhuǎn)成向量用于 RAG、語(yǔ)義搜索等場(chǎng)景。StructuredOutputConverter將模型輸出解析為指定 Java 類型。2.2 Tools讓大模型調(diào)用你的函數(shù)大模型本身不持有你的業(yè)務(wù)數(shù)據(jù)它只能“說(shuō)出”一個(gè)新的 JSON 結(jié)構(gòu)表達(dá)“我想調(diào)用某個(gè)函數(shù)”。Tools 就是把這層機(jī)制封裝成了 Spring 風(fēng)格的工具方法。在 Spring AI 中只需要在方法上標(biāo)記Tool注解框架自動(dòng)完成“模型生成函數(shù)調(diào)用參數(shù) → 框架反射調(diào)用方法 → 把結(jié)果回傳給模型 → 模型基于結(jié)果繼續(xù)生成”的循環(huán)。這里真正容易踩坑的地方在于模型是否真的會(huì)調(diào)用你的 Tool取決于你寫的description是否足夠清晰。描述寫得含糊模型就會(huì)跳過(guò)函數(shù)調(diào)用直接憑幻覺(jué)回答。2.3 MCP模型上下文協(xié)議MCPModel Context Protocol是 Anthropic 在 2024 年底提出的開(kāi)放協(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 對(duì) MCP 的支持是完整的可以作為 MCP Client連接現(xiàn)成的 MCP Server比如文件系統(tǒng)、數(shù)據(jù)庫(kù)、藍(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)用、跨語(yǔ)言的工具發(fā)現(xiàn)與傳輸標(biāo)準(zhǔn)。MCP Server 在遠(yuǎn)端提供的工具最終會(huì)被 Spring AI 包裝成本地 Tool 參與模型對(duì)話。2.4 Skills更貼近業(yè)務(wù)的 Agent 能力封裝如果說(shuō) 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è)“訂單查詢技能”可以包含“按訂單號(hào)查狀態(tài)”“按手機(jī)號(hào)查訂單列表”“查詢物流軌跡”三個(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 解決的是“怎么連接、傳什么格式”的問(wèn)題比如你用 npx 啟動(dòng)一個(gè) filesystem MCP Server客戶端連上它就能列出可用的工具列表。Skill 解決的是“以什么方式參與 Agent 編排”的問(wèn)題它更像是一個(gè)高層的業(yè)務(wù)抽象背后既可以封裝本地 Tools也可以封裝對(duì) 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ū)動(dòng)和推薦配置。兩者不在同一個(gè)抽象層。2.6 Agent用對(duì)話能力編排一切Agent 不是一個(gè)新框架而是ChatModel Tools Skills 記憶 多輪編排的組合產(chǎn)物。在 Spring AI 2.0 中一個(gè) Agent 的編程模型非常簡(jiǎn)單準(zhǔn)備好一個(gè)ChatClient給它配置系統(tǒng)角色、工具列表和會(huì)話記憶剩下的循環(huán)推理全部交給框架。Agent 內(nèi)部會(huì)反復(fù)執(zhí)行“模型生成 → 決定是否調(diào)用工具 → 拿到結(jié)果 → 繼續(xù)生成”的流程直到它能給出最終回答。不過(guò)簡(jiǎn)單不代表沒(méi)有難點(diǎn)。真正考驗(yàn)工程能力的是 Agent 的安全邊界、工具權(quán)限、會(huì)話存儲(chǔ)、失敗降級(jí)這些外圍問(wèn)題。后面會(huì)專門用一整節(jié)說(shuō)清楚。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 對(duì) JDK 21 的完整官方支持。構(gòu)建工具用 Maven 或 Gradle 都可以。本文示例以 Maven 為主因?yàn)閲?guó)內(nèi) Java 項(xiàng)目里 Maven 還是絕對(duì)主流。版本方面Spring AI 的版本更新速度比較快不建議把具體版本號(hào)寫死在文章里。正確做法在pom.xml里通過(guò)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í)的具體小版本號(hào)即可。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。本文的示例會(huì)先做 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)地址。本地開(kāi)發(fā)優(yōu)先推薦 Ollama 方式下載 Ollama再拉一個(gè)支持 function calling 的模型比如qwen2.5系列。這樣即使沒(méi)有公網(wǎng) API Key也可以完成 Tools 和 Agent 的全流程測(cè)試。這里補(bǔ)充一個(gè)重要約定任何 API Key 都不要硬編碼到application.yml里更不要提交到 Git 倉(cāng)庫(kù)。用環(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 的自動(dòng)配置會(huì)為每個(gè)已引入的模型 Starter 創(chuàng)建對(duì)應(yīng)的ChatModelBean比如引入spring-ai-openai會(huì)自動(dòng)創(chuàng)建OpenAiChatModel引入spring-ai-ollama會(huì)自動(dòng)創(chuàng)建OllamaChatModel。但問(wèn)題來(lái)了如果項(xiàng)目里同時(shí)有多個(gè)ChatModelBean注入ChatClient.Builder時(shí) Spring 會(huì)由于類型不唯一而報(bào)錯(cuò)。解決辦法就是顯式聲明一個(gè)多模型路由服務(wù)用 Map 按名稱保存所有模型。這個(gè)設(shè)計(jì)本質(zhì)上是“多模型策略模式”后續(xù)切換模型時(shí)業(yè)務(wù)層只面向ChatModel接口編程選誰(shuí)用誰(shuí)由配置或路由邏輯決定。這是 Spring AI 多模型落地最實(shí)用的架構(gòu)。4.2 第二步搞定結(jié)構(gòu)化輸出大模型返回的是自然語(yǔ)言但業(yè)務(wù)系統(tǒng)需要的是FlightReservation、UserInfo這樣的 Java 對(duì)象。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描述要寫到“模型一聽(tīng)就懂”的程度。然后用ChatClient.Builder.defaultTools()把工具傳進(jìn)去。驗(yàn)證這一步是否成功最直接的辦法是問(wèn)一個(gè)必須靠工具才能回答的問(wèn)題比如“北京今天天氣怎么樣”。如果模型準(zhǔn)確返回了天氣說(shuō)明函數(shù)調(diào)用鏈路已經(jīng)通了。4.4 第四步接入 MCP引入 MCP Client 依賴在配置里聲明要連的 stdio MCP ServerSpring AI 會(huì)自動(dòng)把這個(gè)服務(wù)器提供的工具合并到模型對(duì)話中。如果公司內(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 方法再通過(guò)構(gòu)造器注入到ChatClient。這里的一個(gè)工程建議每個(gè) Skill 類都寫清楚Description讓 Agent 知道這個(gè)技能在什么場(chǎng)景下使用。Agent 判斷“該不該用這個(gè)技能”依賴的就是這個(gè)描述。4.6 第六步用 Agent 編排落地把系統(tǒng)角色、工具列表、Skills、會(huì)話記憶整合到一個(gè)ChatClientBean 里對(duì)外暴露一個(gè)chat(userMessage, conversationId)方法。這個(gè) Bean 就是你的客服 Agent。會(huì)話記憶的實(shí)現(xiàn)方式依賴于ChatClient的id(conversationId)參數(shù)框架會(huì)把同一 id 的多輪對(duì)話保存到ChatMemory。生產(chǎn)環(huán)境應(yīng)該替換成 Redis 或數(shù)據(jù)庫(kù)存儲(chǔ)避免單機(jī)內(nèi)存丟失?,F(xiàn)在整條鏈路就通了。下面用可運(yùn)行代碼過(guò)一遍。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 模塊的版本號(hào)避免手動(dòng)逐個(gè)對(duì)齊版本。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ù)組不同版本對(duì)分隔符的處理略有差異。如果啟動(dòng)時(shí) MCP Server 沒(méi)有連上第一優(yōu)先排查的就是這個(gè)參數(shù)里的逗號(hào)分隔是否正確以及本機(jī)是否安裝并可以使用 npx。5.3 多模型調(diào)用用具體的ChatModel實(shí)現(xiàn)類型做構(gòu)造器注入這樣不會(huì)被多 Bean 問(wèn)題干擾// 文件路徑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 保持簡(jiǎn)潔// 文件路徑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í)一旦格式不匹配會(huì)直接拋出類型轉(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(你是航班信息解析助手。請(qǐng)從用戶文本中抽取航班編號(hào)、出發(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級(jí); } return city 多云22℃東北風(fēng)1級(jí); } Tool(description 根據(jù)城市名稱查詢未來(lái)三天天氣預(yù)報(bào)需要傳入城市和天數(shù)) public String getForecast(String city, int days) { return city 未來(lái) days 天晴轉(zhuǎn)多云最低18℃最高27℃; } }注意Tool的描述寫清楚“需要傳入什么參數(shù)”這直接影響模型生成參數(shù)的成功率。5.6 MCP 客戶端接入前面已經(jīng)在application.yml里配置了 filesystem 這個(gè) stdio 服務(wù)。當(dāng) Spring AI 檢測(cè)到 MCP Client 依賴時(shí)會(huì)自動(dòng)連接該服務(wù)并把它暴露出的工具合并到工具注冊(cè)表。如果不想使用 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è)重要過(guò)程MCP 工具是“動(dòng)態(tài)發(fā)現(xiàn)”的。你在代碼里看不到 filesystem 工具的 Java 類但它會(huì)在運(yùn)行期被注冊(cè)成一個(gè)ToolCallback。排查 MCP 工具是否生效看啟動(dòng)日志里是否打印了 MCP 工具調(diào)用的注冊(cè)信息即可。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ù)訂單號(hào)查詢訂單狀態(tài)和物流信息訂單號(hào)為數(shù)字字符串) public String queryOrderStatus(String orderId) { if (orderId null || !orderId.matches(\\d{6,})) { return 訂單號(hào)格式不正確; } // 實(shí)際項(xiàng)目里注入 OrderRepository 查詢數(shù)據(jù)庫(kù) return 訂單 orderId 狀態(tài)已發(fā)貨預(yù)計(jì) 3 天內(nèi)送達(dá); } Tool(description 根據(jù)用戶手機(jī)號(hào)查詢最近三個(gè)月訂單列表) public String listRecentOrders(String mobile) { if (mobile null || !mobile.matches(1\\d{10})) { return 手機(jī)號(hào)格式不正確; } 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è)智能客服回答要簡(jiǎn)潔、準(zhǔn)確、友好。當(dāng)用戶詢問(wèn)天氣時(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ì)量的重要來(lái)源。模型有概率忽略模糊指令但你把指令寫進(jìn)系統(tǒng)提示詞輔助工具描述清晰成功率會(huì)大幅提高。再提供一個(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 能力封裝、多輪會(huì)話記憶的 Agent 原型已經(jīng)完整落地。下面看看怎么驗(yàn)證它。6. 運(yùn)行結(jié)果與效果驗(yàn)證啟動(dòng)項(xiàng)目mvn spring-boot:run如果本地Ollama已經(jīng)拉取了qwen2.5:7b啟動(dòng)日志里會(huì)同時(shí)出現(xiàn) OpenAI 和 Ollama 的模型初始化信息。MCP Client 啟動(dòng)時(shí)會(huì)嘗試執(zhí)行npx -y modelcontextprotocol/server-filesystem /tmp/data日志里會(huì)出現(xiàn) MCP Server connected 之類的記錄。依次驗(yàn)證幾個(gè)核心能力基礎(chǔ)對(duì)話curl http://localhost:8080/api/agent/chat?message你好conversationIdtest-001預(yù)期輸出一句問(wèn)候語(yǔ)說(shuō)明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)動(dòng)curl http://localhost:8080/api/agent/chat?message北京今天天氣怎么樣conversationIdtest-001如果模型沒(méi)有調(diào)工具可能只會(huì)回答“我無(wú)法獲取實(shí)時(shí)天氣”。如果正確調(diào)用了WeatherTools.getWeatherByCity會(huì)返回“北京晴25℃”等相關(guān)信息。多輪會(huì)話驗(yàn)證curl http://localhost:8080/api/agent/chat?message我的手機(jī)號(hào)是13800138000幫我查一下最近訂單conversationIdtest-001 curl http://localhost:8080/api/agent/chat?message再看看第一單的物流conversationIdtest-001第二次提問(wèn)依賴第一次的上下文。如果返回結(jié)果包含第一單的訂單號(hào)或狀態(tài)說(shuō)明會(huì)話記憶已生效。判斷 Agent 是否正常不能只看是否返回結(jié)果還要看它是不是在正確的步驟調(diào)用了正確的工具。建議在本地開(kāi)發(fā)時(shí)打開(kāi) Spring AI 的調(diào)試日志logging: level: org.springframework.ai: DEBUG這樣可以在控制臺(tái)看到完整的工具調(diào)用鏈模型請(qǐng)求 → 工具調(diào)用 → 工具返回 → 模型最終回答。如果失敗優(yōu)先看這幾個(gè)位置啟動(dòng)階段MCP Server 是否連接成功Ollama 服務(wù)是否可用調(diào)用階段模型返回是否超時(shí)工具階段Tool方法是否有日志返回內(nèi)容是否被模型正確消費(fèi)。7. 常見(jiàn)問(wèn)題與排查思路問(wèn)題現(xiàn)象可能原因排查方式解決方案啟動(dòng)報(bào)錯(cuò)說(shuō)存在多個(gè) ChatModel Bean同時(shí)引入了多個(gè)模型 Starter自動(dòng)配置創(chuàng)建了多個(gè)同類型 Bean查看啟動(dòng)日志中 Bean 創(chuàng)建記錄用Qualifier或顯式配置指定使用的模型或封裝多模型路由服務(wù)請(qǐng)求時(shí)模型長(zhǎng)時(shí)間無(wú)響應(yīng)模型 API Key 無(wú)效、網(wǎng)絡(luò)不通、本地 Ollama 沒(méi)有啟動(dòng)先 curl 模型供應(yīng)商接口查看 Ollama 是否在 11434 端口監(jiān)聽(tīng)修正 API Key / base-url啟動(dòng) Ollama 并確認(rèn)模型已拉取工具沒(méi)有被調(diào)用模型直接瞎回答Tool的描述不夠清晰或 system prompt 沒(méi)有強(qiáng)制要求檢查工具描述打開(kāi) DEBUG 日志確認(rèn)模型請(qǐng)求里是否包含 tool_calls重寫描述加入“必須使用工具回答”等約束結(jié)構(gòu)化輸出解析失敗拋類型轉(zhuǎn)換異常模型返回文本格式不匹配 Java 類型查看實(shí)際返回的 JSON簡(jiǎn)化實(shí)體字段統(tǒng)一使用 String逐步增加字段MCP Server 連接失敗npx 未安裝、args 參數(shù)格式錯(cuò)誤、服務(wù)端地址不通在終端手動(dòng)執(zhí)行npx -y modelcontextprotocol/server-filesystem /tmp/data檢查啟動(dòng)日志 MCP 部分修正 args 寫法安裝 npx改用可訪問(wèn)的 HTTP MCP Server多輪對(duì)話上下文丟失conversationId傳遞不一致或沒(méi)有配置持久化 ChatMemory檢查每次請(qǐng)求是否傳同一個(gè) id查看內(nèi)存存儲(chǔ)的日志用 Redis/數(shù)據(jù)庫(kù)實(shí)現(xiàn) ChatMemory統(tǒng)一會(huì)話 id 生成規(guī)則本地模型不支持 function callingOllama 拉取的模型版本較老或本身不支持工具調(diào)用查詢模型文檔確認(rèn)是否支持 tools更換支持 function calling 的模型例如qwen2.5系列這些問(wèn)題是獨(dú)立開(kāi)發(fā)者在完整跑通鏈路時(shí)最容易遇到的。嚴(yán)格按照排查路徑走大多數(shù)問(wèn)題會(huì)在十分鐘內(nèi)定位。8. 最佳實(shí)踐與工程建議8.1 模型接入層統(tǒng)一路由隔離供應(yīng)商不要把模型供應(yīng)商的 SDK 直接散落在業(yè)務(wù)代碼里。所有模型訪問(wèn)統(tǒng)一走ChatModel接口模型路由邏輯收斂到一個(gè)服務(wù)中。這樣才能做到“線上用商業(yè)模型、測(cè)試用本地模型”而不修改業(yè)務(wù)代碼。8.2 提示詞管理模板化、版本化System prompt 不要散落在 Controller 里。建議用提示詞模板文件配合 Spring 的Resource加載放到系統(tǒng)資源目錄下。提示詞實(shí)際上是需要評(píng)審和版本管理的“代碼”它直接影響模型行為質(zhì)量。8.3 工具安全最小權(quán)限原則Tool方法本質(zhì)上是把內(nèi)部能力暴露給外部模型調(diào)用。必須遵守最小權(quán)限原則工具方法只做自己該做的事不要聲明一個(gè)大而全的方法例如“執(zhí)行任意 SQL”。所有涉及數(shù)據(jù)庫(kù)、文件、外部 API 的工具都要做參數(shù)校驗(yàn)就像對(duì)待用戶輸入一樣。8.4 會(huì)話記憶生產(chǎn)環(huán)境不要用默認(rèn)內(nèi)存實(shí)現(xiàn)ChatClient的默認(rèn)記憶是內(nèi)存級(jí)的應(yīng)用重啟即丟失。生產(chǎn)環(huán)境應(yīng)該把ChatMemory替換為 Redis 或數(shù)據(jù)庫(kù)實(shí)現(xiàn)。會(huì)話 ID 必須由后端統(tǒng)一生成不要信任前端傳入的任意 key否則容易出現(xiàn)會(huì)話串臺(tái)問(wèn)題。8.5 MCP 生命周期管理MCP stdio 服務(wù)本質(zhì)上是啟動(dòng)一個(gè)子進(jìn)程它的生命周期需要被關(guān)注。不要在生產(chǎn)環(huán)境用 npx 臨時(shí)拉取 MCP Server盡量構(gòu)建成獨(dú)立服務(wù)用 HTTP 方式接入這樣便于監(jiān)控和擴(kuò)縮容。8.6 Agent 可觀測(cè)性Agent 是一個(gè)多步?jīng)Q策系統(tǒng)每一步都可能出錯(cuò)。生產(chǎn)環(huán)境必須記錄用戶問(wèn)題原文模型是否發(fā)起了工具調(diào)用調(diào)用了哪個(gè)工具、參數(shù)是什么工具返回結(jié)果最終回答內(nèi)容。這些日志鏈路是排查問(wèn)題的唯一依據(jù)。建議在Tool方法和 Agent 調(diào)用層都加上結(jié)構(gòu)化日志而不是只靠框架默認(rèn)日志。8.7 成本與限流多模型配置帶來(lái)成本控制能力的同時(shí)也帶來(lái)新的風(fēng)險(xiǎn)工具循環(huán)次數(shù)過(guò)多會(huì)導(dǎo)致 Token 消耗膨脹。建議給 Agent 調(diào)用設(shè)置超時(shí)時(shí)間、最大工具調(diào)用輪數(shù)并針對(duì)不同模型配置不同的限流策略。8.8 版本升級(jí)策略Spring AI 版本迭代快API 偶有調(diào)整。升級(jí)前先看官方遷移指南并且保留一個(gè)小范圍的兼容層。比如你寫一個(gè)AgentChatService包裝ChatClient未來(lái)內(nèi)部 API 變化時(shí)只改這個(gè)類業(yè)務(wù)層不受影響。9. 總結(jié)與后續(xù)學(xué)習(xí)方向Spring AI 2.0 給 Java 生態(tài)帶來(lái)的價(jià)值不只是一套可以調(diào)大模型的 Starter而是一整套符合 Spring 編程模型的 AI 應(yīng)用開(kāi)發(fā)范式。本文把這條鏈路完整拆解了一遍多模型解決了供應(yīng)商鎖定問(wèn)題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ù)庫(kù)服務(wù)。這三步做完Spring AI 2.0 的主要能力就算真正掌握。接下來(lái)值得深入的方向包括RAG 與向量數(shù)據(jù)庫(kù)的集成、Agent 與業(yè)務(wù)流程引擎的結(jié)合、基于 MCP Server 暴露公司內(nèi)部服務(wù)給 AI 應(yīng)用、以及多 Agent 協(xié)作模式。每一條都比單純調(diào)大模型接口更有工程價(jià)值也是 Java 工程師在 AI 時(shí)代不可替代的底牌。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产成人啪一区二区| 国产日本熟女顶级一区二区三区视频 | 色一区二区三区综合| 婷婷色婷婷| 91色久| 丁香九月激情| 精品四五区| 欧美一品道| 精品无码久久久久久久杏吧| 亚洲无码国产探花在线观看| 91少妇高潮| 久久久久久69国产一区二区| 在线观看中文av字幕| 国产AV人人夜夜澡人人爽麻豆| 久久精品操| 色婷婷电影| 6080YYY午夜理论片在线观看| 91色宗合| 久久午夜色播影院免费高清| 蜜臀99精品国产高清在线观看| 精品无码久久久久| 九九九九九九九九九九九九九九九女| 少妇蜜汁| 亚洲男人的天堂AV| 亚洲揄拍网| 高清不卡一二三区视频......| 伊人AAA| 婷婷丁香久久| 中文字幕 码 自拍 视频 区| 人妻激情另类| 久久99手机免费视频| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 午夜操一操| 手机在线播放国产福利| 亚洲乱色熟女一区| 国产精品久久久久中文字幕| 久久精品国产亚洲AV片多多| 翔田千里av一区二区三区| 岛国精品视频在线观看| 久久久久久国产精品| 日本在线一二| 香港成人一级视频在线青青草| 116美女午夜| 极品内射| 婷婷色香伊人| 3028国产精品| 国产精品乱人伊人网| 99久久9| 老熟女91视频| 秋霞午夜成人福利片片| 东京热av男人的天堂| 中出789在线视频| 国产熟女高潮一区二区三区| 99re免费| 五月丁香影院| 国产视频97| 久久产精品一区二区三区电影| 99色热| 黄色成人网久久久久久| 色综合网1| 亚洲欧洲小说图片视频| 亚洲交换| 欧洲一级性爱视频在线观看| 色九九九| 中国操逼无码| 久久伊人在线五区| 91在线精品一区二区三区| 国产黑白丝在线| 少妇 综合| 久久久久久久久久久久欧美日| 人妻日日干| AV乱伦专区| 91一区二匹| 无码av永久免费专区网站| 啊啊啊爽爽| 欧美精品亚洲精品日韩传电影| 美女露胸露尿口| 婷婷在线视频| 激情五月婷婷| 欧美一级三级| 噜噜噜狠狠色综合| 男人的天堂VA在线| 乱伦一二三| 亚洲高清综合网| 夜夜夜夜久久久久| 91女日逼| 日韩猛交| TS人妖另类精品视频系列| 青娱乐亚洲自拍| 韩国成人精品久久久免费看| 超碰国产精品久| 日韩Va亚洲va欧美Ⅴa久久| 成年人三级黄色片视频| 日本人妻一区二区| 人人操人人精品影片| 免费自拍三级综合| 国产白领连续中出在线播放| 日韩人妻 中文字幕| 综合激情97 | 天天摸夜夜添无码小视频| 欧美性爱另类综合| 日韩成人人妻网站| 99精品久久久久久久婷婷| 久久欧美1卡2卡3| 清纯唯美第一页| 人人操人人93| 大香蕉之青青草原| 精品免费一区二区三区在线亚洲人成| 亚洲熟女av日韩熟女| 日韩无码操逼片| 无码一区免费在线不卡| 在线a亚洲视频播放在线| 国产精品久久久久久久久久久久久久吹 | 精品妇女一区二区三区| 人妻少妇精品一区二区三区| 五月婷婷丁香六月| 天天操女人| 狼人综合婷婷激情四射| 91影视亚洲| 91bbbbbb| 我要去看2个日本美女.com曹逼| 高清无码学生妹高潮| 久草电影网| 狠狠入| 91中出| 99爱视频| 日日干日日摸| 亚洲 国产 精品一区| 亚洲 日本 国产 综合| 久久人人爽爽人人爽人人片αV| 亚洲国产一级精品毛一级精品看免费视频| 日本一级性爱| 香蕉久久精品| 爱做久久久久久| 亚洲丝袜少妇在线| 亚洲AV无码秘 蜜桃臀国精产品| 久久久久久久9| 69一区二区三区 | 超碰人人妻| 99热最新网址| 超碰97在线中文| 亚州综合色| 色与欲影视天天看综合网| 欧美亚洲天天| 东北女人高潮视频| 色欧美天天| 九草九九九| 乱伦3P视频| 欧美日韩97在线| 天天天天天天天天天天干美女 | 久久国产视频专区一二三| 青青色在线观看| 国产又粗又长又大的视频| 欧美精品99久久久**| 丝袜美腿校园春色| 亚洲AV无码国产精品久久久久 | 天天综合网站| 欧美成人四级在线播放| 五月丁香久久| 激情视频网址| 精品国产嫩穴视频| 变态乱伦伪娘灌肠一区二区| 天天伊人| 日本黄色裸日本黄色裸体 | 免费精品无码一级毛片牛牛影视 | 精品久久久久瑟瑟| 久久99午夜精品一区人妻| 97se亚洲综合自| 久久久久久久久久久久久久9999| 亚洲一曲日韩精品| 欧美人妻制服| 国产精品夜夜夜| 91国产精品熟女| 国产大陆天天艹| 天天拍夜夜| 欧美少妇高潮久久91| 五月丁香啪啪网| 91被操| 中文字幕第二页| 亚洲国产综合久久久性感熟妇| 国产一区在线观看无码AV| 亚洲高清自拍| 久肏视频字幕| 色婷婷淫色网| 日本欧美色| 亚洲 欧美 天天| 东亚亚洲无码高清| 亚洲囯产精品女人久久久| 久久久久久久| 99rre在线精品99re8| 午夜欧美神马久久久久| 国产欧美一区二区| 婷婷五月天激情小说| 乱伦Av网| 蜜乳性色无码专日粉嫩骚逼AV| 三男一女不戴套的A片| 久草看看看| 一区超碰一区| 精品九九淫乱男| 夜夜嗷嗷一区二区| 欧美九九99久久精品| 色啪网| 操逼日韩无码 | 欧美精品1区2区3区| www.yeyecao| 国产后入| 中文字幕一区二区在线日韩精品| 精品中文字幕第一页| 国产精品又黄又猛又粗| 性色AV蜜色av色欲av| 超碰91在线| 97资源站日韩| 啪啪视频免费在线观看| 视频国产欧美在线播放| 黄色香蕉视频网站一区| 综合激情二| 亚洲伊人成综合成人网| 毛片一区二区| 偷拍亚洲熟女视频播放| 99re国产精品视频| 无码乱人伦中文视频| 亚欧成人中文字幕一区| 色999五月色| 九九热超碰| 激情五月综合网| 五月婷婷丁香六月| 97色欧州| 欧美亚洲特P| 精品传媒在线一区| 国产久久成人| 色婷五月天| 青娱乐av在线| 国产夫妻性生活视频| 男同专区一区二区三区在线| 日韩一区二区精彩视频| 免费看黄视频亚洲网站| 婷婷五月天成人| 婷婷三区| 超碰视97中文| 人人操欧美风骚| heyZO天然素人无码AⅤ专区| 9 9精品一区二区三区| 91爱综合| 国产精品午夜精品| 岛国爱情动作片在国产AV无码专区亚洲AV漫画 | 欧美一级二级三级| 人妻中文字幕精品无码| 久久99热这里只频精品6学生| 美女诱惑1区2区| 97久久久精品| www欧美91| 99久久久无码国产精品性啊聊| 思思热久久成人| 婷婷丁香六月| 老女人碰碰在线碰碰视频| K8久久久久| 国产操伦| 久久久婷婷| 99超碰网| 国产精品熟女九色九色蜜臀| 国产11页| 女人18精品一区二区三区| 亚洲一区二区在线观看91| 成人七区| 色噜噜人妻丝袜AV资源| 欧美双插| 六月丁香婷| 成人精品一区二区三区| 97日韩| 美女黄频a美女大全免费皮| 天天摸天天插天天日| 偷拍亚洲视频一区二区三区四区| 91影库| 欧美不卡在线美女| 大香蕉性欧美| 久久久精品国产亚洲AV无码| 亚洲一区二区 麻豆传媒| 亚洲有码视频二区| 桃色五月天| 欧美亚州色的图| 超碰欧美| 久久精品欧美一区蜜桃| 成人三级片一区二区三区视频| 久久黄色视频一区二区三区| 伊人青青一区成人视频在线观看区 | 91老熟女| 综合色图区| 黑人性暴力毛片| 制度丝袜99| 男人天堂日日夜夜| 99这里只有精品国产| 超碰调教97| 91人妻人人澡人人爽人人精品| 91精品无码人妻系列| 九九九九九九成人| 欧美性爱1080p| 老熟女熟妇| 亚洲精品国语在线播放| 69人妻人人揉人人躁人人精品| 91欧| 顶级少妇BT天堂| 中文操逼字幕| 欧美亚洲丝袜美女电影| 国产精品麻豆免费视频| 欧美性爱一区二区三区四区| 乱伦av.com| 伊人少妇久久久| 很很热性爱视频| 97chaopenrihan| 另类在线| 日本人妻中文字幕精品| 东京热不卡视频| 亚乱色| 国产精品粉嫩福利在线| 99精品在线观看| 玖玖综合网| 国产四虎在线| 一级黄色性爱A级片| 影音资源男人日韩| 丁香五月综合| 亚洲av成人精品一区| 亚洲熟妇乱女区二区三区| A片A5445444| 欧美亚州色的图| 欧美劲爆视频一区二区| 欧美影院一区二区三区| 天堂伊人久久| 日本 欧美 亚中文字幕| 一区AV| 中文字幕在线2| 久久‘黄片视频| henhen91| 亚洲诱惑天堂 | 国产67194| 2021国产成人精品久久| 中文字幕欧美日本乱码一线二线| 大香蕉丝袜一级片| 91精品国产日韩欧美综合| 91亚洲丝袜熟女| 超AV色女| 无码少妇精品一区二区60岁老人| 91人妻人人澡人人爽人人精品| 欧美婷婷久久| 亚洲图片 91| 国产一区在线观看无码AV | 久久综合九九| 综合久久六月久久婷婷| 久久午夜鲁丝片| 97人人爱人人乐| 久久夜色一区二区| 国产女人成人精品视频| 情趣丝袜无码操逼视频| 超碰地址久久| 青青青草伊人精品| 东京热熟女亚洲视频网站| 六月色婷婷| 风流老熟女一区二区三区l| 三上悠亚在线毛片91| 日韩特一级久久| av大香蕉网站| 日韩精品一区二区三区四虎影视| 黄色区免费观看中文字幕| 97色碰| 亚洲日精品| 亚洲综合性网址| 青青草九九九九九| 韩日精品四区| 五月色网| 亚洲精品亚洲人成人网| 亚洲欧美中文日韩视频中国语 | 久日91在线| 天天干2019| 久久久一区二区三区四曲免费听 | 久湿久久 | 精品久久无码午夜福利| 97超碰站| 色欧美综合| 欧美 亚洲精品首页| 色综合20p| 做爱福利视频一区二区| 国产综合久久久鬼色| 亚洲色吧网| 日本大片日本一区二区免费高清| 天天爽夜夜操| 日韩高潮一区| 中文字幕日产av人| 色婷婷在线视频精品导航| 曰韩欧美国产传媒麻豆第一区| 伊人婷婷五月天| 国产精品久久伊人| 日本久久99| 欧美激情综合| 97国产超湿| 嗯嗯啊啊啊好舒服| 四虎国产成人精品免费一女五男| 亚洲精品国产av天美传媒| 啊啊好多水| 丁香婷婷激情五月天无毒不卡| 蜜臀人妻少妇久久在线观看| 乱久久久| 蜜区区视频79 | 国产精品久久伊人| 98一区二区精品| 日本一区二区三区欧美日韩中文字幕| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产成人自拍视频在线| 九九综合色| 人妻久热在线| 欧美性综合| 久艹视频在线| 碰碰97| 日本操逼视频不卡直接放| 国产精品美女在线一区| 亚洲一区日韩| 伊人大香蕉在线| 四虎在线播放| 色综合加勒比| 午夜120视频在线观看| 激情专区综合| 男女91| 久久久免费高清中文视频| 超碰碰97资源站| 被男人吃奶很爽的毛片| 激情五月天视频| 蜜桃在线观看一区二区三区| 欧美综合自拍亚洲综合图| 嗯嗯啊啊啊好爽| 久久东京伊人一本到鬼色| 亚洲国产无码精品首页久久久| 91超碰人人| 玖玖草久草99蜜月一区二区三区| 亚洲女人91| 日本日逼高清| 亚洲色图久久成人| 91精品少妇搡搡搡| 操人人| 大香蕉综合网| 欧美最大综合网| 老熟女网站| 日本网色| 夜夜爽爽夜夜精品视频| 亚洲啪啪视频免费| 国产人妻精品久久久一区二区三区| 乱久久久| 欧美性爱第一页久久| 99无码视频| 97草草| 日韩综合成人免费视频| 精品女人999| 精品少妇一区二区| 啪啪免费| 不卡一区视频| 国产乱色国产精品免费视| 日韩一级二级| 九热中文字幕| 开心五月深爱五月| 国产又粗又长的视频| 久草国产在线视频| 男人的天堂日本东京热| 日韩国产欧美伦理在线| 夜草欧美| 欧美性爱91| 欧洲乱码视频| 亚洲 日本 国产 综合| 日韩99999色| 国产一级高清免费观看| 国模限制级电影| 久久久久久久久一区二区三区| 丰满人妻av一区二区三区| 91丝袜在线视频| 亚洲欧洲综合成人av一区| 91色综合激情| 久久久久久久伊人精品| 丝袜美女诱惑 91 视频| 中文字幕一区二区在线日韩精品| 中文字幕-区二区三区四区视频中国| 97精品国产| 中文字幕艹艹| 欧美激情性久久久久久| 嗯嗯嗯啊啊啊干死我吧| 欧美专区日本专区| 毛片99-全集电影手机免费观看完整-B029AV| 中文字幕中文字幕一区二区| 人妻五十路在线| 啪啪免费| 密臀在线视频| www.97在线| 桃花色综合影院| 男人的天堂色偷偷青青草视频婷婷网| 在线观看免费视频国产| 久久精品一区二区三区蜜桃臀| 成人免费福利在线观看| 久操免费电影| 日韩国产品视频中文字| 宅男影院久久久,99| 久久人人爽av亚洲精品天堂桃色| 日韩视频啪啪| 香蕉人欧美综合| 色好看av| 久久久久国产一区二| 欧美综合色图网| 日韩在线视频1234| 人人操人人操人人人操| 91在线丝袜| 丝袜美腿诱惑亚洲欧美视频在线观看 | 国内偷自视频区视频综合| 欧美日韩人妻少妇 一区二区三区| 精品区国产区一区二区三区| av黄图片在线观看| 欧美综合色综合| 啊啊啊啊嗯嗯嗯用力好爽 | 日本久久女同性恋视频| 97超碰总站| 婷婷综合视频| 欧美少妇性爱网站| 91 欧美| 韩日自拍| 75大香蕉| 亚洲91极品| 久久精品国产亚洲AV嘿嘿| 麻豆色99999| 日韩精品9999| 大香蕉男女超碰精品在线| 国产性爱在线视频一区二区| 亚洲综合首页| www久久精品| 麻豆天美传媒在线视频天堂| 成人av免费观看| 欧美性爱免费短视频| 97久久国产精品女不卡| 精品一区二区久久| 女人一区| www.操| 26uuu国产| av最新免费中文字幕| 凹凸精品熟女在线观看| 人人妻天天做天天爽| 亚洲综合影视| 97香焦色区| 99这里有精品| 激情久久久| 亚洲综合精品国产一区| 精品无码久久久久久国产浪潮| 九九九九免费| 天堂性色| 少妇高潮一区二区三区在线| 天天天堂影视日韩亚洲91| 日韩成人色图| Blackedraw视频一区二区| 首页亚洲国产高跟丝袜诱惑视频| 欧亚性爱在线视频| A级片日韩欧美国产欧美视频精选观看| 中文字幕日韩情色| 呻吟 欧美 日本 中出| 欧美在线55555| 91色黑人少妇| 亚洲av热热色| 欧美久久婷婷| 传媒免费一区二区三区| 99蜜桃臀亚洲成人在线观看| 91九九九逼| 91九九九小逼| 91爱看| 人妻 制服 日韩 中文 在线| 北京美女一区二区| 亚洲老司机123专区| 久久99精品九九久久久婷婷| 九九国产热| 欧美色图 人妻| 色呦色呦色精品| 蜜桃狠狠色伊人亚洲综合 | 天堂av最新电影网| 97视频播放| 色欧美综合| 亚洲美女AV无码| 久久精品人人做人人看| 亚洲欧美自拍偷拍| 国产中文字幕曰本毛片| 色色色色电影网| 黑丝内射一区二区三区| av亚洲天堂资源网站| 天天日天天屌天天操| 激情久久日韩精品中文字幕麻豆| 骚货操死你| 国产久久久久久| 国产精品4p在线观看| 丁香六月激情| 激情综合网激情五月天| 嗯嗯嗯啊啊啊操的我好爽| 久久最新视频免费观看| 97视频在线视频| 亚洲欧美在线丝袜| 岛国A V在线免费看| a级成人毛片免费视频高清| 久久婷婷视频| 久久超碰、| 东北操逼| 欧美精品宗合| 久久肏大逼| 96精品在线| 超碰无码五月97| 熟妇熟女一区二区三区| 91在线超高颜值国产| 色狠狠色| 日夜久久久九九九久| 日韩射图| 人人操人人摸人人看人人插| 五月丁香激情综合网| 亚洲综合888| 91久久国产精品| 影音先锋少妇| 午夜免费视频1000| 9997se| 成人av毛片在线观看| 操比国产| 欧美78| 视频不卡中文字幕| 很很热性爱视频| 成人综合网 欧美| 欧中美三级一区二区三区| 免费观看性欧美一级| 色婷五月天| 偷拍片久久| 一道α片欧美| 艳美熟妇先锋一二三区| 久操免费视频| 手机在线视频国内精品| 午夜天堂精品久久| 加勒比综合网| 五月天激情婷婷| 亚欧美综合| 强奸国产在线| 久久久久久久久久久999| 亚洲图片欧美色图| 91 刺激在线| 91痴汉| 久久久久久精品免费看A级| 和协无码影院| 白丝av| 亚洲另类综合欧美| 超碰久超碰久| 日本污ww视频网站| 欧美图片色五月天| 亚洲精品美女久久久久久久久| 91 亚洲情侣偷拍 久久| 国产大陆天天艹| 狠插 制服 自拍| 成人一道本免费视频| 天天淫人人妻日日色| 性色综合网| 免费观看欧美日韩操逼视频| 久久岛国| 人人喜人人妻| 一级做受视频免费是看美女| 无码一区二区三区四区五区六区七区八区九区十区视频 | 亚洲性感丝袜诱惑在线观看| 95自拍视频在线观看| 国产亚洲色婷婷99精品91| 黄色香蕉视频网站一区| 亚洲成人精品久久久| 伊人网青青| 天堂伊人久久| 亚洲黄网在哪免费看| 久久中文字幕人妻熟av女蜜柚| 999岛国大片| 亚洲国产日韩精品久久久| 一二三四免费视频| 麻豆国产精品午夜视频| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 日本一区不卡| 天天综和| 全免费a敌肛交毛片免费| 91模特在线观看| 激情一区二区三区在线观看| 亚洲 无码 偷拍| 久久久久亚洲一区女同性恋中文字幕| 国产AV激情无码久久无码| 人妻色情天天操| 懂色AV一区二区三区| 国产无码三级视频在线观看| 久久一二三四五六七八九区区| 免费在线观看国内色片网站网址| 精品在线78| 久久一二区四| 超碰成人国产| 91狠狠| 人妻熟女一区二区| 中文字幕啊啊啊在线观看视频| 亚洲欧美国产va在线播放频| 精品人妻一二三四区视频| 丝袜大香蕉| 懂色中文一区二区三区| 91在线一起| 好淫网一二三视区| aaaa少妇高潮大片| 97超碰碰| 啊啊啊啊,啊啊好多水| 又黄又爽在线观看视频| www.大香| 中文字幕国产在线天堂| 蜜臀久久99'精品久久久| 精品 码产区一区二-1080P高清在线www-B029AV | 日韩在线观看中文字幕视频| 秋霞一集毛片观看| 亚洲女优有码无码高清| 蜜臀久久久国产| 91黑丝在线播放| 日本熟女中文字幕一区| 中文字幕三四区| 99最新日韩偷拍视频| 色女99一级片在线观看| 91操人视频| 亚洲人妻中文高清| 亚洲国产精品无码AV久久久| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 国产超碰人人操| 日韩欧美成人午夜福利| 高潮精品| 欧美综合亚洲综合| 我爱操| 人妻丝袜肏逼| 玖玖爱一区在线| 丰满少妇人妻久久久久久| 婷婷五月综合在线| 久久精品国产72国产精品福利| 小视频国产| 亚洲人妻在线精品| 亚州一区二区| 天天操妹子| 成人草草视频| 亚洲图片欧美另类综合免费视频大大香| 中文乱码99| 久久发布国产伦子伦精品| 天天做天天爽| 性爱动态120秒| 亚洲人妻av| 午夜免费福利视频一区| 日韩黄色一区二区三区| 日本性爱网址| 免费A V在线播放| 欧美aaaaaaa| AAAAAAAAA黄片| 亚洲无码免费看| 乱伦1色页| 成人aⅴ一区二区三区| 国产精品美女久久久久AⅤ国产馆| 国内毛片欧美香蕉精品| 日韩免费a级毛片无码a∨| 久久精品人妻一区| JIZZJIZZ亚洲女人被躁| 啪啪性爱免费视频| 中字幕人妻一区二区三区| 亚洲AV成人精品网站在AV| 日本一区二区亚洲综合| 国产又猛又粗又爽又黄| 国产毛片久久久久久久| 国产精品亚洲一级av第二区| 久久久国产亚洲精品系列| 国产亚洲精品美女久久久m| 亚洲乱码国产乱码精网站| 日本欧美国内在线| 校园春色制服丝袜中文字亚洲| 国产欧美美女免费观看视频| 久久嫩草国产成人一区| 女人的天堂大香蕉网| 伦理日韩国产久久| 日韩精品一区二区人人人| 91啪啪| 欧美亚洲第一页| 国产精品一区二区 尿失禁| 欧美一级A片在线看视频性色| 综合色色网| 色综合98| 国桃视频产巨乳精品一区二区在线| 97操综合| 青青草福利视频| 在线有码中文字幕| 丰满人妻大屁一区二区| 小草精彩毛片| 狠狠爱夜夜干| 91操熟女| 成人免费福利网站国产| 伊色综合天堂色97| 青青青艹在线视频| 亚洲性天堂| 日本免费一级AAA大片器 | 国产国产亚洲一二三久久| 国产精品96| 国产精品久久久久中文字幕| 伊人网av| 亚洲综合色在线| 亚洲不卡三级手机播放| 欧美性爱十八禁| 中文字幕一二三区| 精品少妇一区二区| 国产毛片在线| 一品道视频一区二区三区| 999 久久久| 麻豆三极片| 超碰成人免费| 天天摸天天舔天天操| 国产久久久久久| 秋霞欧美性爰视频| 干B| 天天干人人看综合| 91久操| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 翔田千里av一区二区三区| 91嫩草欧美| 精品少妇999| 国产精品久久久三级无码| 青青草日本中文字幕| 欧美高清第一页| 国产热RE99久久6国产精品首| 日夜干射色啊| 人人爱人人乐人人操| 激情五月综合| 亚洲脚交| 亚洲欧综合另类无码一区| 天天干天天日天天射黄色大片 | 韩国三级理论在线| 操死我了嗯嗯嗯| 国产不良强奸视频免费看| 熟女人妻av在线资源,黄色的资源| 久久久国产护士丝袜美腿一| 3028国产精品| 日韩欧亚中文在线| 三级AV入口| 99九九久久| 午夜福利国产欧美日韩夜夜| 婷婷情色综合网| 大香蕉综合网| 97人妻色| 97超碰精品| 口爆综合网| 伦理第一页| 99无码| 夜夜躁狠狠躁日日躁av| 丁香久久| 久9精品| 91色女| 思思热在线视频在线| 中文字幕乱码人妻一区二区三区,99精品 | 久久精品黄色| 天天干天天日天天射黄色| 97超碰久久| 欧美亚洲激情小说| 肏逼视频日本| 久久亚洲天天做| 亚洲欧洲日韩天堂av| 黑人与人妻| 白嫩国模丰满一二三区| 亚洲国产97在线精品一区| 国产成人+综合亚洲+天堂| 国产成人五月天丁香花| 天天色综合图片| 男人天堂电影院| 性色高清在线| 噜噜噜在线视频| 噜噜噜噜天天狠狠| 日本精品一区三区| 日韩av无码网站| 大香网伊人久久综合网eew| 中日亚韩免费视频| 青青草导航在线视频| 99国产人成精品| 日韩欧洲操屄视频| 欧美亚洲宗合色性图| 天天躁日日躁XXXXYY| 国产成人五月天丁香花| 婷婷五月天久久精品视频一区二区三区| 欧美日韩另类在线播放| 超碰97导航| 欧美熟妇视频| 日韩欧美国产一区二区三区四区 | 91色情黑丝搞鸡在线观看一区二区三区三州| 91色香| 亚洲AV不卡在线观看尤物| 国产精品久久伊人| 亚洲超碰97| 九九九九精品一区| 水澄无码AV| 国产啊v在线免费播放| 一二三四区操操Av| 青青草黑寡妇男人天堂| 亚洲日韩成人性爱视频| 精品一级毛片在线观看| 骚逼自拍99| 麻豆视频test| 亚洲成熟国产精品美女| 大象AV在线| 久草线上视频免费看| 人妻日日夜夜精品| 免费看久久久性性| 一中国女人毛片水真多| 天天综合站| 精品亚洲俞拍视频一区| 久久久A∨| 国产极品美女高潮无套在线观看 | 99综合自拍| 人妻久久久| 日本激情免费大片| 成人av性爱电影在线观看| 国产嫩草精品A88AV| 嗯嗯啊好大| 麻豆精品久久久久久久| 国产一级αv免费看片| 伊人五月天婷婷| 蜜臀久久久99久久久久 | 久久鲁干| 亚洲精品无码成人久久久99| 极品国产内射| 久夜操| 久热99999| 国产精品天干天干综合网麻豆 | 午夜超爽| 自拍偷拍 日韩欧美| 欧美啪啪色吧在线| 九久久精| 91久久国产精品| 欧美偷偷网| 天天操美美| 伊人操操| 天天摸天天碰天天添青青| 成人情色一区二区| 九九热精品| 天天躁日日躁AAAXX| 看一级特黄a大一片| 在线A日本| 国产一区二区三三视频| 欧美一区二区三区互相| 成全动漫视频观看免费下载| 2017大香蕉| 久久精品人妻一区| 亚洲图片欧美| 激情综合网亚洲| 久草加勒比一区在线| 色97干| 啊啊啊爽爽| 91精片| 男人的天堂 在线一区| 亚洲学生妹高清av| 99久久国产精品免费高潮| 亚洲欧美日韩偷拍色图| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚洲AV成人无码一二三久久| 女人与公拘交酡2020视频| 很很操在线| aaa亚无码专区| se吧提供91精品国产91久久久久久 | 成 人片 黄色大片| 懂色天天爱天天日天天射天天澡| 欧美性生活免费网| 欧美色性爱| 久久 国产精品 一区| 久久午夜伦| 啊啊啊啊啊操我视频| 97超碰逼| 任我爽在线视频免费观看| 久9爱精品| 欧美精品宗合| 精品国产一区二区三区在线播出| 国产成人手机视频激情| 午夜黄色免费在线观看| 婷婷五月天成人| 国产13区| 97在线资源| 俞拍久久国应视频| 激情五月综合开心五月| 狠狠色噜噜狠狠狠狠狠色综合久久 | 欧美人妻久久精品二区三区 | 99最新日韩偷拍视频| 欧美精品庄| 无码免费在线观看黄色片| 欧美日韩性爱操大逼| 99热这里| 中文字幕78| 久久精品电影在线| 日韩三A大片在线观看| 日韩不卡a级视频专区| 极品色社| 激情黄色五月天| 无码人妻精品酒店| a天堂视频| 97视频在线免费看| 亚州Av天美传媒| 国产精品久久久啊| 人妻中文字幕日韩电影| 久久久久久亚洲精品中文字幕人妻| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 青青国产在线拍揄自揄拍| 不卡六六在线91| 少妇熟女1区2区3区| 国产精品无码论坛| 一道本东京热加勒比一区二区三区| 蜜桃狠狠色伊人亚洲综合| 中文字幕一区二区视频在线观看 | 玖玖超碰熟| 成人小说另类在线| 五月婷婷性爱| 青青伊人久久| 日本一级特级毛片视频| 日韩av不卡在线观看| 欧美大香蕉97| 久久久偷拍| 国产精品自在自拍视频| 超碰 另类 欧美| 欧美色图20p| 伊人久久艹| 久湿久久| 偷拍亚洲熟女视频播放| 熟女啪啪视频| 欧美日韩中文字幕不卡| 性在久久久久久| 日韩精品熟妇| 久久久久国产精品久久久| 一区二区三区机械有限公司| 国产精品久久久久久久免牛肉蒲团| 97在线视频观看| 99这里有精品| 久久久女人| 91丨熟女丨丰满熟女| 色天堂综合| 日本淫乱女一区二区三区视频| 色五月婷婷色| 性高潮久久久久久久久久久| 亚洲国产精品无码AV在线| 大香蕉色网| 综合影院永久入口国产| 97操97色| 麻豆久久精品亚洲精品88| 95人妻爽爽人人做人人澡| 色天天野狼综合社区| 99热只有这里有精品| 欧美成人国产精品| 乳欲人妻办公室奶水| 蜜桃久久久久久久久久久久| 内射小黄片| 欧美精品偷拍| 成人无遮挡毛片免费看| 欧美 亚洲 大香| 一级成人性爱| 欧美熟女妇同| 一级毛片久久久久久久女人18| 熟妇艹鸡八| 日日夜夜精品| 亚洲日本天堂| a在线视频免费观看| 极品人妻少妇综合| 五月丁香啪啪啪| 诱惑网综合| av在线浏览| 国产操逼视频在线观看| 色香在线| 日韩人成网站在线播放| 我爱操| 日韩啪啪啪啪啪| 亚洲av噜噜噜噜噜噜| 日韩av熟女一区二区三区成人| 欧洲黄色网| 日韩精品电影| 一区在线观看中文字幕| 老鸭窝成人免费毛片视频| 亚洲精品久| 黄色视频60分钟| 精品久久久一本一道| 日韩AV电影网站| 成人精品久久久午夜福利| 2026国产精品视频| 欧美性爱另类综合| 日本成人在线不卡一区二区三区| 强歼乱伦资源网| www色色com| 中文字幕欧美丝袜07资源| 亚洲一区二区三区麻豆传媒| 福利操逼| 人妻激情视频| 国产自产91区13区| 一级特级aaaa毛片免费观看| 凹凸 69堂 在线播放| av婷婷色网| 国产欧美日韩精品中文| 天堂男人网| 国产视频大全| 五月天婷婷成人网| 色综合天天| 丝袜AV一区二区三区| 国产肏屁眼视频| www久久99| 日韩激情毛片一级久久久| 天堂av最新电影网| 精品人妻夜夜草| 中国探花熟女| 欧美不卡在线一区二区| 夜夜操夜夜高潮夜夜爽国产精品区| 在线观看一卡二卡| 色噜噜精品一区二区三| 神马久久午夜| 天天日熟妇| 情色av电影| 丁香啪啪| 啪啪免费| 18禁看网站一区| 国产sv美女内射| 91爱欧美| 成人无码专区精品视频| 五月色网| 97精品熟女少妇一区| 一区二区三| 国产精品69久久久久孕妇欧美| 亚洲熟女综合| 啊啊啊好爽快点啊啊啊嗯嗯| 老司机深夜影院18未满| 亚洲啪啪视频免费| 久久岛国| 97超碰伊人| 啊啊啊不要嗯嗯在线观看| 国产夫妻一区二区| 婷婷综合五月天| 亚洲美女自拍偷拍视频| 老熟女乱伦一区| 精品视频一区二区| 色欲久久99国产精品久久久久久| 九热超碰| 97在线观看免费视频l| 色婷婷综合久久久久中文一区二区| 99热综合| 色5月婷婷| 国产伦乱91| 国产剧情AV不卡在线观看| 福利社区午夜一区二区| 亚洲欧美色图小说| 在线日韩日本亚洲国产| 无码78| 黄页av| 久操免费观看| 亚洲三级。日韩三级| 亚洲第二页| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 欧美色性爱| 约操熟妇| 国产精品久久久久久久黄无码 | 久久久9 9 9精品| 99热国产| 亚洲美腿丝袜香蕉影视欧美成人| 亚洲综合色在线| 超碰社区97| 加勒比色99999| 高精欧美色| 日日摸天天爽夜夜欢| 亚洲色91| 狠狠久久手机视频精品| 亚欧高清| 啪啪AV导航| 大伊香蕉在线视频免费| 综合久久婷婷| 97久久资源| 国产综合久久久鬼色| 亚洲人久久久网| 久久后入制服|