国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲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
返回資訊列表
日韩欧美加勒比| 一本大道不卡一二三区| 欧美色综合图片| 五月天激情婷婷| 男女猛烈无遮掩视频免费软件| 爱丝福利| 日韩精品人妻中文字幕久久久| 操人无码| 性爱综合一区二区| 久草色在线观看| 人人超碰在线观看黄| 日韩亚洲中文字幕在线| 一个人免费视频观看在线WWW| 91bbb| 日日妻色网| 精品国产人成在线| 国内外毛片在线观看| 中文字幕视频2区| 超碰99在线| 成人免费看吃奶视频网站| av天堂电影网| 亚洲综合嫩| 欧美综合狠| 99在线视频播放| 97色97好| 中日韩久久人妻一区二区| 五月天激情小说| 亚洲色图亚洲无码强奸乱伦| 91爆操视频| 国产欧美成人第一页在线观看 | 黄色污污污污污污网站| 中文字幕一区av| 另类小说五月天| 日本 欧美 国产一区| 伊人五月天激情| av强奸乱轮| 国产日韩手机视频在线| 日韩激情毛片一级久久久| 欧美人人曰人人操人人射射| 国产精品福利视频播放| 人妻中文字幕精品无码| 国产日韩欧美中文在线播放| 七月婷婷综合| 精品无码一区二区三区| 久久亚洲AV无码专区国产精品| 乱伦熟女专区| 亚洲精品天堂久久A∨51成人漫 | 9热9热综合网| 97资源站久久| 亚洲天堂男人天堂网| 欧美翘臀视频网站一区二区三区| 超碰97网站| 啊啊啊好多水| 日韩无码三级影院| 色爱三区| 色精品极品| 800zy一区二区| 亚洲大色堂| 欧美超碰人妻97| 亚洲性综合11| 蜜臀久久99精品久久久电影| ji熟女.com| 成人激情无码在线视频| 久久精品性| www.狠狠操| 人妻AV在线| 丁香六月天| 大香蕉99热| 国产偷人妻精品一区二区在线| 夜夜国自区| 91综合色噜噜| 大香蕉久| 天无日色综合| 99热日| 国产400孕妇孕交群| 国产精品无码久久久久2028| 国模一区二区三区| 97视频在线视频| 麻豆成人影音在线| 激情国产乱伦Av| 天天综合,91综合永久| 91久久久老司机| 午夜精品久久99蜜桃的功能章节| 久久九九国产精品| 午夜激情床戏激情| 99热在线只有精品| 欧美日韩97| 99色视频| 密臀视频一区二区三区| 三男一女不戴套的A片| 亚洲少妇喷视频看| 欧美劲爆第一页| 久久98| 久久精品国产97欧美精品亚洲 | 动漫av中文| 无码操逼视频一下| 大香蕉99热| 69av一区二区三区| 中文字幕88av在线| 伊人专区一区二区三区| 久久超碰免费的| 国产精品麻豆成人av| 麻豆av一区二区三区| 婷婷超| 91撸色网 玖玖网 欧美| 亚洲五月丁香花狠狠干一区二区三区 | 97亚洲欧美日韩| 加勒比av中文| 日本久久久久久久久久| 在线观看av区| 亚洲中文字幕久久无码精品| 一区二区三区视频国产免费| 射丝袜高跟鞋99| 欧美亚洲激情一二三| 一区二区三区美女超清| 久久久久久亚洲精品中文字幕人妻| 色与欲影视天天看综合网| 欧美日韩国产三级黄色| 成人片视频| 免费观看国产不卡av| 一区 欧美 日韩 麻豆| 国产精品午夜AV完会免费| 红杏大香蕉| 亚洲狠| 97碰| 欧美天堂日韩三级国产传媒| 国产91丝袜 在线播放| 天天肏美女| 免费无码国产精品v片在线观看| 亚洲综合射| 人妻熟女字幕一区二区| 亚洲阿v天堂无码z2018| 91 偷| 亚洲狼狼干综合1| 成人三一级一片aaa| 性生活性生大爱77AV国产| 久久人人爽爽爽人久久久| 九九久久一区二区伦理| 亚洲牲交| 爱丝福利| 91电影色诱| 色婷婷激情| 国产日韩区| 亚州综| 日韩一级二级三级免费看完整版国语版| 五月丁香激情综合网| 人妻无一区二区三区| 久久精品人妻一区二区三区| 不卡在线一区,精品一区二区三区中| 精品成人无码| 日本加勒比无码专区| 人妻酒店出差被中出免费在线播放| 久久丁香五月天| 成人av在线播放| 欧美在线亚洲| 人妻素股| 日本A级视频| 亚洲激情av| 日韩卡一卡二卡三在线| 日韩欧无码一区二区三区免费不卡| 啊啊啊啊啊好舒服视频| 欧美在线啊啊啊 | 国产精品天美传媒| 91精品久久综合熟女| 亚洲A曰本VA欧美VA视频| 91N综合网| 色妇91| 99re这里只有精品3| 激情综合五月| 欧美久久伊人| 亚洲欧洲日韩天堂av| 亚洲综合91| 国产97/欧美| 伊人玖玖网| 国产视频三区四区| 人妻天堂综合网| 五月天丁香婷婷综合网站| 欧美成年人性爱视频免费观看| 中文字幕无码不卡啪啪| 91美女色视频亚洲| 超碰精品| 97久久精品亚洲中六字幕| 99这里有精品视频| 色色色欧美| 日本高清_区二区三区| 2024年最新色情网站在线观看| 9久久久久久| 99热99re6国产在线播放| 99re95| 久久的网站啊啊啊啊啊| 色妺妺在线视频| 婷婷丁香成人| 日本网色| 欧美疯狂做爰xxxx| 亚洲av影院在线观看| 2018天天干在线视频| 国产视频人人网| 夜夜欢天天干| 97干97色| 天天激清| 天天做天天爱| 久久一区二区三区四区五区| 欧美 亚洲 第一页| 天天伊人| 91免费看一区二区三区 | 久久久久久中文字幕中文字幕最新| 婷婷亚洲天堂| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 色色色欧美| 久久精品中文字幕观看| 国产探花精品在线| 精品视频免费在线一区| 久草视频在线视频在线视频在线观看 | av国产无码| 欧美人妻一区| 国产一区在线免费播放| 婷婷亚洲色| 久操不卡视频| www.久久爱| 久久综合婷婷| 中文字幕一区 二区三四五 区日 日骚| 无码高清专| 夜夜影视四色| 啊视频在线| 激情六月婷婷| 欧美制服另类丝袜| 好爽,再快点啊哈嗯嗯嗯嗯| 炮色五月| 一级黄碟在线观看| 亚州高清色综合| 日韩无码AB| 情侣操 逼视频99| 美女裸体麻豆天美蜜桃91| 亚洲自拍欧美国产首页网曝 | 欧美另类精品xxxx| 人妻日日干| 中国国国产一级特黄毛片| 欧美专区日本专区| 国产日韩欧美三级片| 艹比视频国产精品| 91久久久久久| 日本久操视频| 天堂国产AV| 久久久久密臀视频| 成人夜夜| 91中文字幕| 久久精品 六十路 熟女 欧美| 八戒无码国产午夜福利| 一级特级aaaa毛片免费观看| 亚洲欧美精品福利在线| 91视频国品一二三区| 黄色污污污污污污网站| 久久久久久久久久久97| 人妻人妻天天碰| 青青久久久| 2017,超碰| 久久久蜜桃臀无码视频| 男人的天堂午夜av| 麻豆国产96在线| 丁香五月综合| 操穴国产| 精品视频久久区| 精品人妻少妇| 免费AV中文网在线观看| 国产精品69人妻无码久久久| 欧美日韩性爱视屏免费看了| 啊啊啊好爽快点啊啊啊嗯嗯| 国产综合久久久鬼色| www.av不卡中文字幕| 青草伊人网| 国产午夜在线观看| 人妻人人做人人澡人人爽欧美一区| www.色综合| 久久精精区一区二区一蜜桃一区二区| 久久超碰免费的| 久久久久久久久国产| 欧美日韩制服| 99久久精品欧美国产| 亚洲aV性爱| 久久黄黄| 97一区二压| julia国产在线| 小说区 图片区色 综合区| 亚洲精品xxx| 国产精品久久久久无码AV会牛| 好吊色在线观看| 人人噜夜夜操| 校园春色亚洲色图| 日本狂喷奶水在线播放212| 91黑人无码激情在线| 热久久91婷婷| 美女上床网站| 女欧美一区二三区| 午夜色婷婷| 粘花网06av视频| 亚洲中文字幕一区| 五月天人妻综合| 大香蕉免费中文| 91搞逼视频| 久草毛片电影怡| 免费作爱一级视频| 欧美九九九| 熟妇人妻精品一区二区视频色欲| 亚洲无线码一区国产欧美国| 97超碰久久色| 久久精品国产亚洲AV嘿嘿| 日本欧美m v精品网站加| 艹比视频国产精品| 亚洲中文字幕av | 91女优在线观看| 岛国1区2区3区在线观看| 黄网站黄视频网站进入口| 蜜乳Av成人片网站| 中出20p| 精品一区二区啪啪啪| 久久国产熟女影院| 欧美激情区| 18禁美女裸体无遮挡啪啪| 男人天堂久久日韩| 亚洲国产一级精品毛一级精品看免费视频 | 亚洲高清在线| 97超碰中文字幕| 26UUU欧美日本| 午夜丁香婷婷| 99热国产精品| 亚洲国产欧美一区二区潘金莲 | 精品一区二区人妖| 男人的天堂 在线一区| 欧美熟妇亚洲版| 九九热在线精品视频| 人人操人人插人www| 中文在线视频| 翔田千里Av在线| 97se综合网| 天天看少妇| 久久久999国产| 色久桃花影院在线观看| 9超碰免费| 国产精品久久蜜乳av| 九九探花视频在线观看| 精品少妇人妻| 国产久久av| 精品乱子一区二区三区99| 92一区二区| 欧美色色色| 欧美色图小说综合| 精品在线观看视频在线| 天天综合网1| 国产精品不卡高清在线观看| 色嘟嘟人妻天堂网| 精品黄色电影| 国产亚洲人妻综合日韩 久久| 国产精品69久久久久久久 | 人妻少妇久久久| 婷婷九月丁香| 在线国产一区二区av| 亚洲欧美性生活| 国产1024在线播放| 久久久久久久久久久久久9999| 人人妻人人爽一区二区三区| 狠狠色婷婷7777久| 亚洲影视高清三级-草1024榴社区入口-品爱AV| 欧洲成人性爱视频| 中文在线视频| 中国东北熟女老太婆内谢| 天天看高清麻豆| 天天操天天射天天日| 97久久精品亚洲中六字幕| 欧美精品宗合| 美腿丝袜高跟网免费视频免费视频| 偷拍精品一区二区三区| 91人妻人人妻| 亚洲天天做日日做天天谢日日| 亚洲第一页欧美| 日本性感人妻91| 人人摸人人干| 五十路六十路素人熟女| 人妻在线大香蕉| 欧美一级国产一级| 青青伊人久久| 久久精视频美日韩在线视频| 91操熟女视频| 校园春色制服丝袜中文字亚洲| 蜜臀久久99精品久久久久久| 曰韩欧美国产传媒麻豆第一区| 97天天操| 日韩中文字幕熟妇人妻| 色婷婷六月丁香七月婷婷| 青女在线| 亚洲AV秘 精品久久老牛影视| 香蕉免费一区二区三区不读| 3D污黄视频在线观看| 国产自产22区| 天天日天天色| 国产精品人妻无码久久久互動交流| 高清不卡视频| 人妻一区二区三区视频| 黄色高清久久无码依人| 欧美精品成人在线播放| 性色高清..……| 久久伊人五月天| 亚洲欧美天堂| 四虎国产成人精品免费一女五男| 天天综合网日韩7799| 亚洲人人夜夜澡人人爽| 99免费在线视频| 亚洲国产综合视频| 精品亚州18| 亚洲av综合色区无码一| 亚洲天堂另类| 激情图片伦理国产一区二区日韩| 国产精品无码久久久久2025| 欧美啪啪啪91| 日韩av熟女一区二区三区成人| 激情 欧美 亚洲 小说| 97色妞| 探花激情视频| 少妇久久久| 欧美另类自拍 | 日韩中文字幕精品一区在线| 亚洲图片欧美另类综合免费视频大大香| 国产精品青草综合久久| 91久久青青草原精品| 亚洲国产剧情少妇激情| 人人操人人摸人 | 秋霞一集毛片观看| 少妇久久久免费| 婷婷色婷婷| 国内精品嫩模A∨私拍小视频| 久久九精品| 狠狠干狠狠色| 国产97亚洲| 色色综合97| 婷婷综合五月| 2024年最新色情网站在线观看| 久久久专区| 天天爽天天操| 欧美一级久久久久久久大片动画| 九九热精品| 国产午夜福利视频在线| 激情五月天视频| 精品久久久av无码免费| 四虎免费视频| 日本一区99| 日韩欧美经典在线观看| 特色a在线上| 国产欧美黑人丰满在线| 欧美极品女人的天堂| 成人亚欧免费视频| 超碰在线一区二区三区| 97热视频在线观看| 日韩成人午夜精品久久高潮| 国产精品久久久鸭无码的功能| A 天堂| 夜夜嗨一区| 亚洲av热热色| 一区二区偷拍拍视频| 福利视频一区二区微拍| 放黄片放3级黄片没穿衣服| 欧美成人国产精品| 校园春色综合色| 97干在线| 蜜乳Av成人片网站| 99无码狠狠久久| 欧美性第1页| 97精品综合久久网| 天堂av2019| 一级啊性爱在线视频| 综合伊人激情| 熟女人妻一区二区三区免费看| 秋霞鲁丝午夜无码一区二区三| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 久久男人精品| 日本成熟少妇A∨网站| JuliaAnnXXX888| yy少妇精品久久| 校园春色欧美色图| 丰满人妻一区二区三区免费,| 亚洲五码一区二区三区| 影音先锋少妇| 久久久新亚洲AV| 蜜臀久久99精品久久久久电影| 神马久久啊啊| 日日干夜夜操视频h| 国产精品色色| 亚洲最大无码中文字幕网站| 污污汅18禁网站在线永久免费观看| 啊啊啊在线观看| 97色操| 粉嫩av一区二区三区四季| 欧美97在线观看| 你操综合| 青草视频在线看看看看看看看看看| 黄色片大香蕉| 久久九九视频九九视频| 天天草夜夜草高潮片| 人人摸人人入| 亚洲欧美色图片| 加勒比海人人操超碰在线| 骚货 中文字幕 av| 91艹| 91N综合网在线| 国产九区| 大鸡巴久久久| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日韩人妻大香蕉| 日韩性爱视频免费在线| 久久精视频美日韩在线视频| 韩国成人精品久久久免费看| 2017人人操,人人摸| 久久久国产av美女私房| 亚洲欧洲av影音| 久久αⅴ| 午夜精品久久久久久久久久久久久 | 91亚洲影视| 精品人妻久久久| 97国产精选| 黑白配性爱AV成| 欧美亚洲清纯| 日日玩天天干| 四虎免费在线播放| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 色路综合| 欧日韩一二三f区| 国产嫩草精品A88AV| 亚洲双插| 少妇三p| 老女人综合| 久热热| 蜜臀久久99精品久久久| 中文字幕三四区| 97超碰欧美| 成人精品在线免费视频| 亚洲人妻中文在线视频| 成人免费毛片| 日本免费一级AAA大片器| 岛国在线免费视频| 欧美强奸乱能| 黄片免费看黄片免费看| 久久久久9| 五月天婷婷欧美三区| 亚 欧 美 综合| 操死我干死我| 欧美A√综合网| 亚洲综合贴图91 | 亚洲色色探花| 国产精品成人无码av| 欧美色婷婷| 精品久久久久,69国产成人精| 欧美有码亚洲中文字幕一区二区三区四区| 丝袜喷水在线| 欧洲精品一区二区三区| 少妇久久久免费| 99999亚洲另类| 美女久久久| 天天射天天操天天干天天吃2018 | 免费亚洲国产精品久久一区| 1000午夜黄色| 日本黄色精品| 蜜臀久久99精品久久久久久-DVD原版全| 成人小说另类在线| 无码WWW免费视频网站| 久草免费在线一区二区| 长长久久88视频| 欧美综合加勒比在线| 国产精品丝袜久久亚洲不卡| 精品久操| 丰满人妻区一区二区三| 国产AV色黄看到爽| 全球成人中文在线| 少妇无码太爽| 亚洲一本色码中文字幕| 加勒比av网| 97免费在线观看| 老司机天天操| 五月丁香激情综合网| 亚洲中文制服诱惑| 天天舔天天日天天射| 色九九久九九| 亚洲在线网站| 操屄不卡视频| 日韩在线AB| 欧美日韩人妻婷婷一区| 亚洲不雅视频1区二区| 岛国免费视频在线| 插欧洲美女欧美精品| 亚洲情色第一页| 色偷偷色偷偷欧美日韩| 99999久久精| 看免费一级在线播放毛片| 国产无套粉嫩白浆在| 久久国色天香香蕉| 国产热av| 国产精品直播在线观看直播| 亚洲美女自拍偷拍视频| 精品人妻一区二区三区-国产| 99精品高潮| 伊人网高清| 日韩久久.一级黄色片| 丁香五月天激情综合| 欧美久久婷婷| 97干在线视频| 免费公开人人操| 女人爽到高潮久久久| 精品九九九九九九九九九| 久热这里只有精品9| 黄色激情电影在线观看| 男人夜色天堂ss| 欧美熟女妇同| 78久久| 国产精品激情久久久久久久| 蜜臀精品1区2区| 91插B网站| 亚洲av综合伊人久久| 91狠狠综合久久久久久| 男人天堂综合| 91综合网| 欧洲熟妇xxXx欧美老妇裸体| 美女淫穴| 精品日韩| 日韩av不卡在线观看| 欧洲中文字幕| 97免费视频在线| 国产精品无码av| 999久久久久久久精| 偷拍导航视频网站| 99re公开精品免费视频| 亚洲精品一二三四区| K8久久久久| 黄片国产精品一区二区| 北条麻妃99精品青青久久| 亚洲色综网| 性色生活片久久毛片婬片免费放女人一级毛片 | 人人摸人人摸人人干| 天天摸夜夜摸| 射综合网| 亚洲AV无码乱码在线观看性色| 97超碰资源网| 午夜舔阴达高潮视频免费看| 99色热| 亚洲AV不卡在线观看| wwwxxx日本爽| 亚州综合电影| 九九九热| 色优久久| 天天综合91入口| 日韩一级特黄av毛片| 久久亚洲熟妇在线视频| 操逼网站网站| 婷婷五月天成人| 国产九九九九九九| 国产免a费看黄片在线| 91艹逼精品| 国产捆绑一区| 97久久久久久久精| 亚洲丝袜少妇在线| 自拍鲍鱼一区在线高清观看免费| 亚洲熟妇综合久久久久久| а√天堂资源官网在线资源| 成年女人一区| 欧美亚洲丝袜人妻制服中文99| 乱老女人一区二区视频| 色综合1991| 中国国国产一级特黄毛片| 人人搡人人肉久久精品| 少妇被c 黄 免费观看| 亚洲性综合9| 鸥美中出| 亚洲 日本 一 二 三| 久久九九精品一区二区| 天天色黄色影院天天操| 91N综合在线| 久久性生大片免费观看性| 色噜噜国产在线| 玖草在线视频| 毛片视频白嫩| 国产精品久久久| 亚州精人品大香蕉| 又大又大又大又粗爽高潮观看| 亚洲天堂区| 久久久久久九九九九| 好吊妞转入那个网| 加勒比中文av| 亚洲 欧美 中文 日韩超碰| 久久超碰日韩精品| 97视频观看| 性夜影院爽黄A爽免费动漫| 99精品丰满人妻无| 视频国产成人精品日本亚洲18| 天堂av2019| a亚洲欧美色欲| 欧美美女在线高潮999| 黄人人操人人操| 夜草欧美| 日韩欧美中文| 中日韩久久久免费看| 亚洲中文字幕av| 欧美亚洲手机在线| 怡红院视频在线| 精品无码一区二区三区| 欧美日本天堂| 国产第25页在线观看| 超碰在线成人电影| 五月丁香激情综合网| 日韩小电影| 丰满少妇人妻久久久久久| 被男人吃奶很爽的毛片| 二三四区精品| 国产精品午夜高潮呻吟久久av| 中文字幕青青草| 国产精品一区人妻精品阁在线| av三级电影在线播放| 欧美|91色综合| www.99色| 亚洲性猛| 久久伊人大香蕉| 夜色91| 久久伊人青青草| 在线观看岛国有码| 久久精品国产97欧美精品亚洲| 这里只有精品视频| 国产精品久久久啊| 中文字幕超碰CAO| 日韩av影片在线观看| 深夜国产福利| 玖玖蜜臀资源网| 神马久久久久久伦理片| 国产一区二区在线看| 精品少妇后入一区二区三区四区人妻巨乳 | 欧美国产日韩高清在线| 起碰97| 人人搡人人肉久久精品| 色综合色欲色综合色综合色综合| 久久久久久九九九九九| 亚洲综合精品国产一区| 九九草| 欧洲乱码视频| 日本精品成人无码| 97超碰欧美| 亚洲综合射| 亚洲成人在线播放| 亚洲无码国产探花在线观看| 韩国毛片一区二区三区| 调教熟妇 久久久久久| www.久久制服糖| 丰满熟女人妻一区二区三五十一路| 国产精品久久久鸭无码的功能| 91少妇人妻| 欧美日韩亚洲天堂网| 久久性视频| 久久永久无码人妻视频| 伊人四虎综合| 在线黄页看毛片| 欧美18老人禁| 97人人色| 中文字幕55555| 久久婷色| 超清福利精品视频在线| 色路综合| 高跟伊人julia ann| 欧美色五月| 国产日韩区| 老熟妇91| 国产人妻精品一区二区三区秋霞 | 国内三级自拍小视频在线观看| 深夜福利黄片| 免费男人的天堂| 欧美一二三区四五区| 久久激情综合| 日韩精品国产一区二区| 青青草中文字幕| 91男人天堂网| 蜜臀少妇一区二区| 日本熟妇人妻中出视频| 日本久久女同性恋视频| 精品二区久久| 欧美日韩婷婷中文| 成年女人一区| 色综合网1| 国产成年女人免费视频播放a| 天天干夜夜鈤| 极品内射| 97天天搞在线| 国产一区二区三区精品观看啪| 日韩无码精品综合久久| 四虎影视欧美| 少妇久久久免费| 熟女中出视频| 日本久久久久久久久| 小情侣高清国产在线视频| 日韩精品人妻| 精品美女少妇一区二区| 亚州熟妇精品| 美女淫穴| 深夜操逼网| 亚洲成av人片色午夜乱码| 一级片在线观看高清无码| 在线亚洲欧美| 东京热毛片调教| 69人妻精品丰满熟女区| 啊啊啊啊啊啊在线看| 中文激情网| 天天日B夜夜干B时时操B| 国产精品99精品视频网站| 九九九九久久久久| 国产嫩草精品A88AV| 亚洲天堂电影网| 香蕉久久精品| 玖玖视频在线资源一区二区三区| 国产在线精品偷| 欧美精品99久久久**| 久久草草亚洲蜜桃臀| 亚洲自拍97| 91精品久久久久| 亚洲精品国产熟女久久久| 福利天堂| 综合久欧洲| 免费农村成人少妇人妻Aa一区二区视频| 九九性视频| 天天看,天天做| 亚洲古典另类欧美在线| 新久久AV| 国产三级资源在线观看| 秋霞午夜成人福利片片| 精品传媒在线一区| 久久久久白虎| 无马一区二区| 欧洲亚洲人妻无码高清久久三区四区| 国产精品在线一区二区| 精品中文日韩字幕视频| 国产肏屁眼视频| 亚码激情| 亚洲综合97中文网| 开心五月婷婷| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 亚卅熟女乱色| 色青青久久影视| 午夜国产成人福利视频| 欧美日本国产日韩激情视频| h无码动漫在线观看| 天天躁日日躁xxxxx| aa片毛片| 日本一道在线播放高清| 91综合色| 视频国产成人精品日本亚洲18| 91成人18| 黄片www视频免费| dy888午夜老子影视达达兔| 麻豆久久精品亚洲精品88| 99re这里只有精品9| 婷婷综合伊人一区| 精品福利| 肥臀熟女一区二区三区视频| 九七超碰人人乐| 国产午夜精品一区二区三区牛牛| 91老司机精品| 五月情色天| 男人在线天堂| 亚洲一区二区在线观看91| 日本人妻丰满熟妇久久久久久| 性夜影院爽黄A爽免费动漫| 日本中文字幕不卡视频| 中国AV美女| 女欧美一区二三区| 久综合国内精品自在自线| aaa亚无码专区| 色y情视频免费看| 日韩国产不卡在线视频| 秋霞影音一区二区三区| 国产精品视频白浆免费| 日本九九九九| 韩日精品四区| 爱干爱射网啊啊啊| 精品免费国产二区三区| 91久久久久久久| 久久一二三四五六七八九区| 亚洲色图A| 欧美一级A一级a爱片久久| 乱抡国产91| 精品人体无圣光凹凸| 日韩国产欧美伦理在线| 亚洲九月丁香| 色人久久| 久久久工口| laoshunv91| 久久久久久中文| 后入式免费视频| 国产精品久久久久久久无码AV| 强奸乱伦亚洲第一页| 亚洲一卡2卡3卡4卡乱码网站| 99热自拍| 在线女人91| 久久99精品九九久久久婷婷| 91在线丝袜| 青青草毛片| 国产午夜福利电影免费在线观看| 亚洲欧洲精品视频发布| 日本污ww视频网站| 久久久工口| 蜜屁Av| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 97内射偷拍| 欧美天堂亚洲电影院一区在线播放| 麻豆色99999| 精品人妻一区二区三区日产| 欧美探花网| 日本精品第一视频在'| 中文字幕在线24| 亚州人妻| 青女偷拍网| 亚洲欧美日韩制服另类| 中文字幕亚韩| 久久五月份| 99色婷婷中文字幕乱色| 干B| 97久久久久| 欧美片第一页| 精品一区二区人妖| 亚洲 欧美都市激情| 久久久久久亚洲精品中文字幕人妻| 91性高| 亚州综| 26uuu欧美日韩| 97在线视频观看| 国产美女91视频| 怡春院久久| 国产传媒午夜理伦精品| 欧美精品999| 美女的肌被草喷水视频| 国产97av| 国产亚洲日韩欧| 99婷婷| 久久超碰98| 999999精品| 伦伦成年午夜免费视频| 东京热激情视频一二三区| 亚州中文字幕超碰97| 蜜臀久久99精品久久久久久-DVD| 欧美国产精品| 97超碰69| 久久久成人免费av电影| 成人五级久久| 亚洲操逼网| 国产视频第2页| 97干在线| 国产超碰| 亚洲久久久| 超清福利精品视频在线| 伊人久大| 亚洲影视高清第一页| 熟妇熟女一区二区三区| 中出20p| 免费看美国人人爽,人人操| 日韩欧美加勒比| 亚洲国内精品成人不卡| 十八禁视频网站| 中文字幕在线免费观看2| 加勒比伊人影院| 国产欧美岛国精品一区| 3级毛片一二| 大香蕉免费中文| 91免费看一区二区三区 | 婷婷五月天基地| 男人天堂2030| 亚洲图片欧美91N| 日韩人妻有码免费视频| 亚洲欧美清纯| 乱操乱伦AV| 96超碰网| 国产精品人妻无码久久久老鸭窝| 精品高清av中文字幕| 欧美大香蕉同搞| 热九九精品| 蜜色网色哟哟| 四虎视频在线观看| 麻豆色约约| 人妻色偷色噜| 女人喷水视频在线观看| 激情网五月天| 熟女欧美日韩综合婷婷| 亚欧美无遮挡| 秋霞Av理论一级在线| 乱伦a片视频| 日本久久网| 亚洲国成人情色好看电影| 日韩人人精品| 精品人妻一二三| ..日韩av毛片精品久久久| 97碰在线视频| 国产污视频麻豆传媒一区二区| 色香91| 免费在线看黄片av| 欧美成人性爱视频免费观看 | 941超碰| 97亚洲综合影院| 加勒比久久综合网高清| 麻豆天美久久91| 国产99999久久精品| 日韩欧美加勒比| 91伊人久| 亚洲精品一区中文字幕乱码| 天操老女人| 人妻丝袜日本| 黄片色区软件| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 国产熟女| juliaann欧美丝袜办公室| 亚洲一区二区三区中文字幕| 韩日精品四区| 日韩不卡一二三四| 久操97| 被体育老师抱着c到高潮| 日韩av三四区| 97神马久久| 乳欲人妻办公室奶水| 超碰超碰95| 曰本道人妻久久久在线不卡色视频 | 97色诱| 97资源亚洲| 亚洲AV无线| 欧洲中文字幕| 蜜臀99精品国产高清在线观看| 神马久久久久久伦理片| 欧美少妇大量自拍视频在线观看| 夜夜嗨一区二区三区三州加勒比| 情趣丝袜无码操逼视频| 五月丁香婷婷综合网| AV色五月天| 亚洲黄色视频在线观看视频| 无码又爽又硬又激情免费视频| 国产第11页| 国产欧美在线观看免费观看| www99热| 日韩av情韩国爱禁区av一区二区| 国产无吗在线播放| AV天天在线观看| 亚洲精品 欧美97色色| 欧美精品日韩久久久九| 18一区二区三区| 国产日本顶级一区二区三区| 日韩一级成人毛片免费观看| 91天美传媒精品| 久久久精品| 久久人妻视频网| 中文字幕欧洲有码| 激情国产乱伦Av| 美国久久一二三四| 亚洲中文字幕在线视频一区二区| 91欧美| 91天美免费| 欧美成人午夜免费福利785| 麻豆国产成人精品| 在线有码中文字幕| 亚洲综合另类欧美久久久| 丰满人妻一区二区三区免费 | A级国产欧美激情在线| 欧美综合骚| 国产精品诱惑| 国产农村妇女一区二区| 欧美性爱一区二区三区| 国产女人成人精品视频| 亚洲日韩黑丝| 久干9操| 啊啊啊要高潮了| 在线无码视频| 91 丝袜在线观看| 久久精品日韩| 97 九色| 日本免费一级AAA大片器| 九九热超碰97亚洲最新香蕉 | 亚洲视频一二区| 伊人五月天婷婷| 亚洲激情 欧美色图| 东京热一区二区中文字幕| 69精品在线| 97香蕉网| 国产极品999| 男女啪啪啪18禁网站| 香蕉一区二区三区在线视频| 欧美色视| 一二三啪啪专区| av毛片aaaaa免费看| 久久人人爽爽爽人久久久| 中国AAAAAA黄色片| 伊人97色天使| 国产精品久久久久久久AV大片| 97 国产一区| 黄色人人| 国产精品久久久九九九| 手机在线视频国内精品| 美女丝袜激情小说| 在线无码网站| 蜜臀av中文字幕| 强奸乱伦αv片| 亚洲区限制级 99| 成年人性爱日韩| 嗯嗯啊啊啊啊轻点视频| 精品性爱一区二区| 四虎免费在线播放| 婷婷五月天激情小说| 五十路三区在线| 九九色综合| 欧差乱伦二三| 天天α片| 波多野结衣先锋影音| 日韩特一级久久| 色婷婷av在线观看| 国产高清自拍视频| 色欲人妻一区二区在线| 一线黄色免费性爱片| 欧美综合传媒| 综合婷婷| 立川理惠被中出无码| 啊啊啊不要啊啊受不了了视频在线 | 亚洲欧美日韩二区视频| 操老熟女AV| 99只有精品| 思思久热在线精品66| 国产天天骚| 在线一道啪| 日韩电影免费网站麻豆视频| 亚洲AO在线| 亚洲久草AV色图| 欧美日韩国产在线| 日本中文熟女视频| 久久久成人精品| 五月天社区| 国产福利视频精品视频| 免费亚洲国产精品久久一区| 99性视频| 韩国三级一线观看久| 啊啊啊在线观看免费视频| 乱伦AVxx| 中出欧美| 无码视频一区二区| 波多野结衣一级视频| 人妻久久| 78综合网| 色乱二区| 久久神马| 亚洲色图自拍| 亚洲 欧美都市激情| 8x福利精品第一福利视频导航| 亚洲在钱| 大鸡巴久久久| 色情乱伦AV| 久久久涩| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 午夜九九| 亚洲精品色| 久久一区二区三区入口| 国产粉嫩蜜臀av一区二区三区 | 免费精品福利在线观看| 四虎国产精品永久在线囯在线| 久久久成人精品| 性欧美另类高清| jizzjizz欧美| 亚洲在线a| 物业黑人 AV一区| 中文字幕一区 二区三四五 区日 日骚|