日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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
返回資訊列表
无码9区| 亚洲淫乱骚妇AV| 五月天色综合| 天天做天天爱天天爽AV| 性交一区二区在线播放| 97国产精品一区| 国产无码久久高清| 人人人人插| 欧美99热| 亚洲精品骚逼| 国产精品另类一区大香蕉| 超碰美国| 欧美精品成人在线播放| 欧洲色| 欧亚洲精品有视频| 亚洲精品1区| 日骚逼视频| 射综合网| 亚洲成人久久一区二区| 久久久9视频| 中文一区在线日| 欧美草草高清日韩视频| 91丨九色丨国产丨人妻在线| 九九无码| 成熟熟女国产精品一区二区| 91欧美经典| 中文字幕精品一区欧美| 9 9精品一区二区三区| 国产福利夜| 欧美熟妇精品黑人巨大91| 少妇厨房愉情理伦片bd在线观看| 91操碰| 97爱b| 色哟哟av| 久操网无码在线| 黄污污污污| 麻豆国产成人精品| 亚洲一区二区在线观看91| 色就色综合| 91蜜臀熟女| 亚洲激情欧美色图| 国产成人无码啪| 日韩熟女无码| 91干熟女| 97中文字幕一区| 亚洲日韩视频二区| 九月丁香婷婷| 96麻豆精品一区二区三区| 国产精品免费日韩| 久久久久网站-538在线视频-欧美永久乱码 | 精品十八在线观看| 国产97色在线| 亚洲aV性爱| 青青伊人加勒比海| 用力操死我| 91久久堂| 国产欧美在线观看免费观看| 100啪啪视频大全| 亚洲欧美国产日本一区二区三区| 久艹伊人精品综合在线| 校园春色综合网| 色婷婷电影网| 91亚.色| 免费国产电影一区二区| 丰满人妻-区二区三区免费| 一二视频神马久久传媒| 多毛小伙内射老太婆| 操碰97| 久久久国产护士丝袜美腿一| 懂色AV蜜臀无码精品APP| 精品美女少妇一区二区三区| 伊人网青青| 韩国轻伦国内自拍一区| 成人毛片免费| 天天日日日射| 家庭乱伦性爱av| 久久不卡一区二区 | 国产中文字幕曰本毛片| 情色五月天就去干| a级理论午夜日本| 99久在线精品99re8a| 日韩操p| 春色校园综合网| 亚洲啪啪综合?v一区综合精品区| 亚洲最大91网| 深夜福利黄片| 欧洲精品一区二区三区| 超碰在线香蕉| 青青操在线亚洲视频观看欧美在线 | 天天上日日上日韩精品| 麻豆av一区二区三区| 99色网| 久久最新免费视频23| 97在线看| m欧洲一级午老| 青娱乐老司机视频| 欧美亚洲激情一二三| 国产aⅴ无码片毛片一级网站| 国产欧美后入| 色色五月天激情| 奶水 人妻 哺乳 在线| 久久综合婷婷| 成人精品在线免费视频| 精品无吗久久| 欧美经典一区二区三区| 久久网亚洲| 婷婷久久大香蕉| 97超碰中文在线| 啊啊啊用力在线观看| 欧美不卡五十路| 国产久久久9999| 尤物视频视频官网| 国产精彩女在线观看视频| 首页中文字幕中文字幕免费| 97美日韩视频| 330Dv国产女人终合视频极品人与兽 | 操死我了啊啊啊| 91人妻Pr| 亚洲欧美人妻| 天天综合香 ld视频| 亚洲精品人妻在线| 97亚洲中文| 美腿色图| 97人妻免费中文字幕| 国产精品嫩草久久久久| 国产性爱在线视频一区二区| 四虎在线观看网站| 密桃99999| heyZO天然素人无码AⅤ专区| 综合性视频99| 国产欧美日韩在线观看麻豆传媒公司| 亚洲开心网| 欧美性区| 久草五月| 亚洲精品乱码线路中文字幕| 夜夜国自区| 九九久久九九久久| 国产精品久久99日日| 色综合20p| 色婷婷久久| 亚洲国产精品无石码久久 | 五月激情小说| 久久性爱精品一区| 亚洲欧美校园| 东京热精品97综合网| 色999五月色| 一区二区高清视频| 91AV入口| 亚洲双插| 精品久久九| 狠狠狠狠狠狠| 天堂69亚洲精品中文字| 精久久久| 国厂麻豆77q4| 丰满翘臀美女影院视频| 亚欧高清在线| 在线观看亚洲成人精品| 欧美激情专区| 密臀在线一区尤物| 色九月婷婷| 97精品在线| 免费强奸av| 一二三区精品视频| 超碰碰小说97| 中文字幕十五区| 国产原创自拍| 人妻熟女av国产网站| 伊人黄色片| 91丝袜| 加勒比海成人视频网| 台欧久久精品视频| 国产在线76页| 高清一区AV无码| 99爱爱| 色天堂综合| 日本福利二区视频| 天天做日日做天天欢。| 超碰97国产欧美| 久久亚码| 久久久久久亚洲精品中文字幕人妻| 天天做日日爱夜夜爽| 91丨人妻丨国产丨丝袜| 欧美亚州综合网图片| 精品无码人妻一区二区免费蜜桃| 国产精品熟女AV中文字幕在线播放| 91站街按摩店老熟女熟女| 2019久久久久久久久福利| 超碰成人人人爽人人爽| 亚洲三级。日韩三级| 97久久天天综合色天天综合色电影| 大香蕉免| 九九热免费国产视频婷婷伊人五月| 涩五月婷婷| 婷婷丁香五月天亚洲天堂网| 国产91av在线播放| 精品一区二区三区国产| 一区二区三区免费视频入口| 亚洲人成在线放东京热| 男女无套 免费网站| 欧美+日产+中文| 易易A毛视频| 精品国产乱码久久久影院| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 麻豆AV一区二区| 99这里有精品| 狠狠躁AV| 少妇69中文| 蜜桃中文字日产乱幕4区| 麻豆天美久久91| 97国产色综合| 亚洲图片欧美制度| 欧美亚洲AN| 色激情五月天| 97精品国产97久久久| 神马久久久久眼| 九久9热| 很黄很污的免费网站| 天天摸天天插天天日| 色婷婷激一区二区三区| 精品人妻一二三| 性爱视频久久| 超碰69| 91精品人妻电影| 亚洲男人天堂手机版| 欲香欲色综合天天伊人| 精品人妻视频一区二区在线播放 | 亚洲91色| 草草草草视频| 蜜乳成人AV| 乱伦a片视频| 少妇干B| 91操人| 黄片无码在线制服| 99ri在线视频| 熟女丰满人妻一区| 少妇三P| 97日视频| 蜜桃臀一区二区aV| 夫妻日逼| 九九精品99| 日本一区二区不卡精品| 欧美日韩成人在线| 午夜成人福利影视| 日本二区不卡| av天堂电影网| 色婷婷五月天| 日韩无码精品综合久久| 亚洲国内精品成人不卡| 97久久资源| 国产欧美日韩臀 | 性久久久| 久久高清欧美国产| 亚州伊人色综台| 青久操| 天操天操夜操夜月月年年操操| 亚洲无码日韩电影| 久久久久久网址| 十八禁的黄污污免费网站| 乱老女人一区二区视频| 青青草视频导航官网| 九九亚洲色在线观看| 九九热三级片| 狠日操| 五月丁香激情综合| 97日视频| 天天久久| 久久精品国产亚洲AV高级北京| 大香蕉丝袜一级片| 97色涩| 国产丝袜啪啪| 95自拍视频在线观看| 99色在线视频| 国产视频第2页| 无码人妻精品酒店| 欧美日韩999| 91挑色欧美| 老熟妇91| 欧美成人一区二区三区在线播放| 欧美在线伊人色| 素人伊尹大香蕉免费下载视频| 操逼无码操逼| 97视频观看| 无码男人天堂| 成人五月天丁香激情综合| 伊人五月天激情| 中文字幕第页| 精品美女人人干| a片 xxxx受爽视频| 欧美性后入| 欧美不卡二区| 搡老熟女老女人老熟妇免费视频| 天天日天天色| 成人欧美日超碰| 搡老女人老91妇女老熟女| 黄片色区软件| 欧美狠狠弄| 日本媚薬中文字幕在线| 干干干天天| 久久久亚洲精品电影免费看| 嗯嗯,好大,好爽,好骚 | 先锋激情∨在线视频播放| www.超碰| 欧美热图99| 亚洲 一区二区 自拍| 亚洲第一页欧美| 国产成人五月天丁香花| 亚洲精品乱码久久久久久蜜桃麻豆| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 91网亚洲| 中文字幕 码 自拍 视频 区| 色偷偷超碰亚洲| 亚洲av国产av综合av卡| 青娱乐亚洲热| 一区二区三区四区理论片| 99无码狠狠久久| 婷婷五月天社区| 97欧美色| 欧美精品23| 欧美日韩国产中文精品字幕自在自线, | 美女黄色一级A视频| 日韩欧美蜜桃精品久久中文字幕久久| 伊人久久综合影院| 一区二区 电影 亚洲| 日韩十八禁| 亚洲综合婷婷| 欧美极品色| 日本一级婬片试看三分钟| 懂色AV一区二区三区| 欧美色九九| 强奸乱亚洲| 97天天插| 蜜臀少妇一区二区| 欧美日韩国产色五月综合在线| 淫荡熟女乱伦网| 啊啊啊快操我视频| 东北丰满熟女国产一区| 亚州欧美综合| 欧美激情中文字幕另类小说| 欧美韩日精品99综合| 国产高清成人传媒影视| 亚洲文学偷乱拍啪啪啪啪 | 九九自拍伦理| 国产精品网站免费 | 中文字幕乱在线伦视频中文字幕乱码在线 | 人妻色偷色噜| 97在线观看免费视频l| 又粗又长又爽在线观看| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 91av一区二区在线观看| 91爰爱欧美| 欧美一区二区三区另类精品| 碰超人人在线一区二区三区| 亚洲精品啪视频| 欧美亚洲美少妇一区二区| 成人aⅴ一区二区三区| 一本色道久久综合亚洲二区三区| 日韩欧美大片免费高清啪啪| 欧美激情片一区二区| 做爱A级亚欧| 欧美,亚洲,日韩,v,天堂,手机在线观看| 久久免费精品视频免一| 一本大道久| 色老汉玖玖爱| 亚洲黄色| 91草草草| 日韩黄色电影网站| 一级做a爰片性色毛片久久| 96AV久久久| 国产白嫩漂亮KTV在线| 青青草中出视频 | 精品亚州18| 天天做日日爱夜夜爽| 国产精品久久久久9999小说| 亚洲精品国产AV天美传媒| 亚洲AV无码秘 蜜桃臀国精产品| 99热导航| 九九热精品在线| 亚洲婷婷综合网| 亚洲少妇喷视频看| 91操熟女| 久久久久亚洲精品| www色色com| 国产极品粉嫩馒头一线天av| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 精品成人动漫一区二区| 亚州综合色| 91爰爱欧美| 曰韩av中文字幕专区| 搡老女人老熟女91| 男生女生啊啊啊啊| 五月丁香综合| 99久国产精品午夜性色福利| 天天欧美| a片亚洲一本通视频| 激情五月天网站| 一级日本牲交大片好爽在线看| 最新av在线| 长长久久免费视频| 亚洲天堂AV在线播放| 九久9精品| 久草色悠悠在线视频| 操美女高潮抽搐白浆| 天天干天天操天天操夜夜操天天操 | 欧美日韩色综合网| 色逼综合| 久久99深爱久久99精品| 亚洲国产一区二区三区在线| 成人网址在线观看| 亚州一区二区成人片免费| 91n.欧美| 美女黄码视频午夜| 69精品人人人人| 很很热性爱视频| 18禁在线视频| 91一区二匹| 天天干1区2区在线| 蜜臀亚洲中文| 日韩人妻资源网| 自拍偷拍2025在线观看| 岛国片在线播放| 超碰97丝袜| 少妇精品久久久八区九区| 天天爽天天干| 小情侣高清国产在线视频| 无码137片内射在线影院| 日韩中文字幕宗合在线| 性生活久久久久久久久久| 亚洲综合春色| 久久乐| 国产精品婬乱一级毛片彝族| 亚欧免费| 亚洲色图欧美色图另类图片| 熟女人妻精品一区二区视频| 97久操| 欧美日本不卡| 舔舔啊| 欧美熟女丝袜| 好看的久久不射无码影视影院| 天天干2019| 97人人操人人干| 成年人性爱日韩| 日韩国产欧美伦理在线| 性爱Av免费| 大香蕉乱级| 乱欲视频| 天天肏视频| 欧美性爱一区二区三区| 日韩久射综合| 全国男人天堂网| 日韩av电影网站| 人妻人人澡人人爽人人| 日本99一区二区| 91色综合激情| 97爱爱影院| 操b网站亚洲无码| 日韩欧亚太美不卡| 色性欧美| 欧美色五月| A久久| 99热超碰| 综合网欧美在线| B049AV在线播放| 中文精品少妇天堂| 国产人妖的免费的视频| 99热99在线播放激情| 屁股久久久久久久| 日韩性爱啪啪视频| 亚洲av无码国产精品字幕| 操逼无码操逼| 大香蕉www.超碰| 人人 操人人 操人人| 国产精品无码久久久久2025| 欧美成熟性爱精品| 天天操夜夜嗨| 国产 三级自拍| 亚洲欧美日韩综合在线尤物| 欧美激情五月天| 欧美成人9797| 国产性感在线观看| 狠狠躁天天躁日日躁97| AV天黑人| 亚州男人天堂| 国产黄色在线播放观看| 国产欧美一级在线观看| 日韩精品在线观看网站| 99性爱| 91女神在线视频| 97资源免费视频| 国产女主播视频在线观看| 超碰97极品9| 欧美天天弄| 亚洲欧洲日韩天堂av| 97欧美性爱| 操一区| 男人的天堂在线2| 日韩精品电影| 亚洲人妻爽爽爽| 国产午夜在线观看| 天天视频黄网站| 精品国产一区二区三区av在线资源| 中文字幕 一区二区 亚洲无码| 夜夜久久| 女人香蕉久久毛毛片精品| 人人操人人摸人人骑| 黄色AAAAAAAAAAA大片| 熟女视频久久| 日日干夜夜操视频h| 校园春色欧美| 91白虎| 在线播放成人高清免费视频 | 日本色色网| 超碰午夜在线| 久久九九热| 国语精品av| 亚洲日韩国产精品| 国产日韩在线播放av| 精品久久99| 欧美激情欧美精品| 天天欧美97| 精品日韩人妻精品一二三区| 柠檬AV导航| 在线中文字幕极品av| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 综合五月婷婷亚洲一区| 精品一区二区三区蜜桃臀赵总 | 久操影视| 尤物av网站免费在线播放| 加勒比久久综合网高清| 欧美日韩理论一区| 欧美色91| 中文字幕乱在线伦视频中文字幕乱码在线 | 综合熟妇一区二区三区| 欧美Aⅴ| 人妻激情偷乱视频一区二区三区| 欧美精品久久| 性天堂| 久久老子无码午夜伦不卡| 亚洲无套久久嗯嗯| 亚洲激情欧美色图 | 国产 亚洲 丝袜 制服| 青青草密桃在线播放| 超碰97人人乐| 天天激情干| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 熟妇最新先锋一二三区| 精品视频一区二区| 操逼操逼逼操操逼91| 综合婷婷| 国产又大又粗又长视频| 久久久久久电影| 有码免费观看| 国产深夜福利| 成人情色一区二区| 理论久久婷婷网8| 久久久久久久国产视频| 久日91在线| 人人模人人看| 丁香五月影院| 久久久久久久久9| 日韩精品黄片免费观看| 蜜臀久久在线视频| 97网色| 激情四射五月天| 日日噜噜夜夜久久亚洲一区二区| 一本色道无码DVD中文字幕| 精品国产精品一区二区| 91劲爆| 无码操逼网| 蜜桃色院一区久久| 国产视频一区二区三区在线免费观看| 青青草在线成人视频| 欧美日韩亚洲天堂| 色婷婷在线视频| 东京热毛片调教| 欧美一级A片在线看视频性色| 九九综合网| 精品一区二区三区国产| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 大香蕉免费中文| 国产999精品久久久| 91麻豆va国产精品| 超碰九九| 99精品无码| 美女天天干| 超碰人人在线| 国产黑白丝在线| 久操精品网| 大香蕉懂9| 精品国产乱码久久久久久影片| 精品久| 激情四射婷婷四五月天| 久久国产逼| 黄日韩| 天堂中文资源在线bt| 操屄日韩| 午夜成人爽爽爽爽A片李冰冰| 熟妇熟女亚洲天堂网| 亚洲91在线| www.色婷婷.com| 少妇人妻精品| 日韩亚洲中文有码视频| 青青伊人这里只有精品| 综合久久中文字幕综合日韩精品| 欧美日韩小说| 一二三啪啪专区| 18禁在线视频| 不卡一区视频| 99热这里只有精品8| 精品999999| 夜夜人妻爽| 操比国产| 亚洲影视综合| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 殴美大黄片| 久艹99| 亚洲精品视频二区| 国产日韩无码一区二区三区久久区| 是还免费视频1727我| 一区在线观看中文字幕| av2014 日韩在线中文字幕| 国产精品女同| 欧美日韩操逼动图| 中文字幕一区二区三区50路| 国产中文福利| 日韩性爱高清免费视频| 黄片视频观看| 天天情欲宗合网| 亚殴在线| 温婉少妇玩3p| 欧美色图综合| 青青三级视频| renqi久久久久久久久久久久| 中文字幕,人妻,日韩| 大香交| 狠狠操一区二区| 日本在线播放不卡一区| 很很操在线| 欧美桃色网| 97一区二区蜜臀| 亚洲欧美国产日本一区二区三区| 亚洲国产精品无码AV久久| 亭亭在线资源| 九九精品美女高溯喷水| 黄网站黄视频网站进入口 | 天天综合色图| 久久久久久久久久久久久9999| 中文字幕成人理论在线| 电家庭影院午夜69久久夜色精品国产69乱 | 日韩欧美传媒一区国产| 午夜福利在线合集| 91久精品| 性做久久久久久免费观看软件| WWW.操逼.COM| 亚洲第二页| 狠狠亚洲| 97亚洲综合电影| 人人干人人搞人人摸| 人妻少妇久久中文字幕一区二区 麻豆 | 欧美在线综合| 欧美午夜色妇色鬼| 精品色色| 手机在线人成免费视频| 成人性爱免费播放| 欧美日韩小说| 日本国产二线女色| 国产丝袜美腿美女麻豆| 国产精品久久久鸭无码的功能| 91看黄片| 人妻91少妇| 天天日骚逼熟女| 东北女人| 日韩伦理视频| 亚洲麻豆精品二区三区| 亚洲aV性爱| 黄片com.| 亚洲男人久久综合天堂| 国产精品久久久久婷婷二区次| 91女优在线观看| 和协影院中文字幕三区| 在线 亚洲 网爆 自拍| 强免费黄色网址| 韩国黄片aaaa| 久久黄片国产一区二区| 亲子敌伦对白在线播放| 国产精品一区二区三区在线| 亚洲成人在线资源| 碰人碰碰人人开房人肉| 婷婷五月天无码 | 亚洲 综合 第一页| 欧美少妇性乱| 素人美腿视频网站| 青青草好吊色| 哈哈操电影| 亚洲精品97p| 亚洲色图第四色| 精品二999| 激情综合网一盗摄| 久操在97| 一牛一区二区三区久久| 国产乱弄免费在线视频。| 亚洲蜜乳av| 乱抡国产91| 精品九九九九九九| 国产精品一区二区后入| 欧美情色贴图| 夜精品久无码| 大香蕉之青青草原| 精品久久久久久久久久久久| 91蜜桃婷婷狠狠久久综合9色| 综合一区中亚洲国产成人综合精品 | 婷婷香蕉| 99热在线播放| 天天日天天插| 五月天丁香| 日韩欧美女优电影| 精品一区二区3区| 国产欧美日韩在线观看麻豆传媒公司 | 日韩AV电影网站| 亚洲色吧网| 久久久久国产亚洲一区欧美色图日韩| 欧美亚洲性爱一区二区| 老师充足的奶水小说| 中文字幕亚洲欧美在线不卡| 四虎国产成人精品免费一女五男| 91成人国产综合久久精品蜜月| 99激情视频| 国产四虎在线| 亚洲精品天天影视综合网 | 久啪| 久久精品一区二区三区蜜桃臀| 91亚洲狠狠色| 精品999一区二区| 视频不卡中文字幕| 国产人妖的免费的视频| 乱论91| 99久久久| 厕所偷拍在线| 色av中文字幕| 国产后入清纯| 十八禁黄色| 97超碰超碰| 99在线免费公开视频| 操逼操逼视频操逼| 亚洲二区精品在线观看| 久99视频| 成人贴图日韩欧美| 亚洲情色在线| 欧美暴力猛交| 4虎在线视频| 欧美日韩狠狠爱| 在线视频亚洲无码| 亚洲无吗在线视频| 欧美操人| 日韩av熟女一区二区三区成人| 97超碰亚洲| 国产91丝袜 在线播放| 免费操逼91| 亚洲va有码在线天堂| 五月丁香影院| 日韩人妻少妇中文字幕| 九一精品牛牛一区二区| 欧美第一页| 欧美亚洲中文| 97欧美性爱| 麻豆av一区二区三区| 人妻激情在线视频| aa片毛片| 97国产高清视频在线观看| 亚洲色图激情小说| 97色97好| 天天天肏屄肏屄肏屄欧美欧美| 国产v亚洲v日韩v欧美v片另类| 操逼1区| 婷婷综合| 精品无码一区二区人妻久久蜜桃| 男人天堂毛片| 十八禁视频一区二区| 亚洲成人久久美女| 中文字幕一区 二区三四五 区日 日骚| 殴洲老熟女| 91宗合网| 一区二区三区精品视频| 亚洲男人天堂网久久| 日韩三级av片| 老熟妇一区二区三区…| 日本不卡高清免v欧美日韩在线观看| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 色色亚洲| 99re在线视频国产| 蜜臀AV秘一区翔田千里| 99热综合| 曰本道人妻久久久在线不卡色视频| 国产女大学生AV| 五月丁香六月婷综合成人综合| 超碰97色色| 91色交| 中文字幕在线日亚洲9| 加勒比伊人综合| 狠狠操,使劲操| 男人的天堂2010| 性感美女啊啊啊在线| 国产家庭乱伦表演| 亚洲男人天堂Av| 91狠狠狠| 97在线观看免费视频| 丁香五月天啪啪| 韩国国产欧美情侣视频在线| 91久久久亚洲| 99无码| 91高清日| 国产在线视视频有精品| 熟女高潮合集-永久久久-成人AV| 无码137片内射在线影院| 红杏大香蕉| 中文字幕人乱码中文字的预防方法| 大象AV在线| 野狼激情网| 亚洲人妻色图| 亚洲欧洲网站免费观看| 免费亚洲国产精品久久一区| 免费日韩黄片| 久久国产精品一级二级三级| 丰满人妻-区二区三区| 色婷婷亚洲婷婷| 九九九九一区| 天天天天天天天天天天干美女| 日韩一级二级在线| 人妻色偷色噜| 91九久| 国产精品扒开腿做爽爽爽视频| 亚洲中文字幕网| 熟妇无码视频三区| 天天干天天狼在线视频| 国产精彩女在线观看视频| 国产精品久久久久久久AV大片| 亚洲天堂另类小说男人| av影片在线观看不卡| 鲁鲁色综合网| 蜜臀99久久国产| 99熟女| 精品九九九九九九| 欧美综合自拍成人自拍第二十页| 国产99999| 男人天堂2012| 精品人妻一二三| 日韩伦理视频| 丰满美女一级毛片在线播放| 宗合情欲网| 一区二区三| 精品少妇后入一区二区三区四区人妻巨乳 | 中文字幕日韩人妻视频一区二区三区 | 亚洲高清男人天堂| 视频分类 国内精品| 青青草AV色| 六月丁香久久| 91色狼| 精品国产乱码久久久久久久久1 | 亚欧国产无码精品在线| 久久精品国产97欧美精品亚洲 | 啊啊啊啊啊啊啊国| 91性高朝久久久久久久久| 亚洲欧美性生活| 亚洲无无码αⅴ每日更新| 人人妻人人色| 日韩乱伦影音先锋| 少妇熟女视频一二三区| 久久婷婷色| 午夜欧美精品久久久| 精品国产嫩穴视频| 97超碰碰| 330Dv国产女人终合视频极品人与兽| 青娱乐亚洲自拍| 大香交| 天天干美少妇一区| 亚洲欧洲成人在线电影| 天天夜夜久久| 久久久国产亚洲精品系列| 少妇人妻在线| 亚洲综合色男人网| 99e久久国产精品| 亚洲综合骚逼| 性爱视频久久| 欧美色宗合| 久久、1234| 国产精点久久久成人| 97Ai亚洲| 超碰天天久久79| 在线中文字幕极品av| julia ann久久| 丁香五月天激情网站| 欧美丝袜中文字幕07在线| 超碰国产情侣自拍网| 天天色,天天干,天天干| 欧美日韩亚洲少妇寂寞影院正在播放| 红杏大香蕉| 男人天堂黄片| 成人青青草原伊人| 一区二区三区日韩欧美| 粉嫩在线一区二区懂色| 日日骚中文字幕| 无码男人天堂| 嗯啊不要在线| 亚洲中文日韩欧美大香蕉视频| 国产搭汕a级片| 欧美72网页| 伊人网av| av在线免费一区二区| 女人久久久| 啊啊啊啊啊啊啊啊啊啊在线观看| 天天做天天爱| 欧美精品一区二区少妇免费A片| 成人青青草原伊人| 九九九九九九成人| 九九热免费视频| 黑人操一区二区| 超碰成人人人爽人人爽| 91超碰在线观看| 国产农村妇女精品一二区| 五月丁香激情综合| AV一区观看| 欧美碰碰综合色| 97在线观看免费视频l| 一本道综合色图| 国产精品久久天天干| 亚洲一区二区av| 欧美Aⅴ| 超碰天天去日穴| 丁香婷婷激情五月天无毒不卡 | 97碰碰色| 亚洲熟女乱综合一区二区三区| 性色一线| 中文字幕日本久久| 园内精品自拍视频在线播放| 九九九精品美女| 欧美激色| 欧美韩国你懂得在线| 中文字幕精品一区二区精品| 精品一二三区久久AAA片| 亚洲黄色视频在线观看视频| 青青草好吊色| 日韩专区久久久| 人人超碰在线观看黄| 久久久久久久久久久97| 久久HD| 国产h片在线观看视频| 校园春色综合网| 精品少妇一区二区| 91 亚洲情侣偷拍 久久| 日韩伦理久 久久 清纯| 久久久麻豆精品| 免费av高清无码| 亚洲无码电影久久久| 日韩精品午夜操呦呦不卡影院| 国产妇女精品视频青青草| 久久国产视频专区一二三| 婷婷色色网| 午夜国产成人福利视频| 丰满少妇乱子伦精品无| 色激情五月天| 乱伦日本色图AⅤ| 91成人高清在线观看| 麻豆国产视频精品观看| 极品美女嘿咻| 久久久精品中文字幕麻豆| 青青草成人视频在线观看二区 | 九九热精品视频六| 四虎精品一区| 后X久久| 大香蕉五月天| 五月丁香色综合| 无码黑人精品一区二区三区三| 欧美18 在线观看| sewuyueav| 亚洲欧美综合图片| 久草电影网| 大香交| 久久熟妇五十路一区| 男人的天堂啪啪啪啪啪蜜桃不卡| 五月丁香狠狠爱| 91Chinese在线| www…国产操逼| 国产大学生高潮在线播放| 日韩人妻一二三区视频| 久久产精品一区二区三区电影| 亚洲国产丝袜熟女av| 久久精品99| 另类老少妇| 精品丰满熟妇人妻一区| 999久久芭蕾| 亚洲日韩乱码中文无码蜜桃臀网站 | 久色网| 婷婷色综合| 色丁香五月婷婷| www四虎| 91人妻视频| 久久综合女优| 天堂网 主播 亚洲| 九九热午夜欧亚国产视频| 精品国产乱码久久久久久免费| 久久久青青草| 日韩少妇无码| 99亚洲国产精品色一区二区三区| 久久久久亚洲熟妇熟女| 91东京热男人的天堂| 奇米狠999| 日本理论在线| 亚洲色吧网| 亚洲成人一二三区| 精品视频专区| 啊啊啊啊啊舒服| 欧美热图99| 国内伊人久久久久久网站视频| 天美精品原创av片国产| 久久国产在线一区二区| 秋霞久久亚洲精品成人| 欧美久久伊人| 99色热| 精品国产一区二区久久| 97在线观视频免费观看| 久操| 97亚洲在线| 中文字幕一区二区日韩网| 91久久免费视频互動交流| 熟女五十路一区二区三| 亚洲一区二区三区四区视频| 婷婷五月色| 综合 青草 伊久久 影院 综合| 熟妇亚洲一区二区三区| 91 亚洲情侣偷拍 久久| 九九九成人| 久久成年片色大黄全免费网站| 亚洲囯产精品女人久久久| 国产在线精品偷| 欧美久久九九| 人妻人久久精品中文字幕| 国产精品免费视频人成| 久久久9999| 欧美日韩另类在线播放| 大屁股xxxxx| 亚洲男人天堂网久久| 夜夜操中文字幕| 91 丝袜在线播放| 懂色中文一区二区三区| 日本综合久久| 鸥美插入视频| 极品美女嘿咻| 国产强奸91| 天天做日日做天天欢。| 在线观看十八禁| 天堂精品| 91在线视频国产网站| 国语av最新自产拍在线观看| 麻豆久久视频在线地址| 亚洲成人妻日韩在线| 96精品久久| 国产日韩欧美亚洲精品95 | 91夜色chaopeng| 国产精品另类一区大香蕉| 日韩电影在线观看网址| 91干熟女| 亚洲青色欧美| 综合色图亚洲欧美| 九九九久千久久激情蜜桃在线看 | 国产欧美日产一区二区三区 - 国产欧美日 | 日韩99神马视频片| 这里只有精品久久| 高潮毛片无遮挡高清免费| 亚洲精品三区在线观看| 夜夜操2028| 日韩色图 一区二区| 亚洲成人精品在线一区| 99热精品在线播放| 中文字幕78| 欧美国产精品久久九九| 国产精品熟女乱伦| 肥臀熟女福利视频一区二区| 亚洲日韩黑丝| 欧美精品久久久久久久丰满| 99只有精品| 婷婷五月天色网| 一本一道波多野毛片中文在线| 99热99在线| 亚洲影院小综合| 亚洲国产精品成人久久蜜臀| 中文字幕jul-617人妻熟女| 精品久久九| 密臀在线一区尤物| www.色婷婷色综合| 超碰在线97国产| 另类图片欧美激情综合| 国产成人亚洲精品自产在线| 久久超碰98| 极品销魂美女一区二区| 伊人AAA| 色婷婷A V一二三四区麻豆综合| 思思热免费在线视频| 欧美色图中文字幕| 九九久久玖玖| 免费观看的黄色的网站| 欧美专区在线| 骚熟女AV网| 熟女六十路| 久久久成人精品| 国产女人极品高潮毛片| 欧美亚洲国内自拍| 中文字幕在线免费观看 | 超碰亚洲欧美日韩无| 91老司机视频| 大香蕉啪啪啪| 夜夜操一区二区| 国产午夜福利电影免费在线观看| 日韩国产品视频中文字| 九九九九国产| 亚洲图片 91| …亚洲黄色厕厕女女在线播…| 在线国产探花| 四虎影视国产精品| 国产伦精品一区二区三区在线观| 国产超碰97| 亚洲国产激情国产av| 国产精品视频在线播放| 青青免费在线视频一区| 色999偷自拍拍| 强奸乱伦AV网址| 午夜福利区| 亚洲中文字幕久久人妻| 啊啊啊快操我视频| 亚洲国产欧美一区二区潘金莲| 三级网站超变态精品| AV一区观看| 加勒比伊人综合| 午夜福利免费精品视频| 国产精品乱码久久久久久| a男人的天堂久久一级A毛片| 国产午夜福利电影免费在线观看 | av在线浏览| 97香蕉网| 成人精品视频一区二区| 久操91视频| 欧美国产一区二区三区麻豆传媒 | 狼狼色丁香久久婷婷综合五月| 日日夜夜青青草母狗| 中文字幕亚洲永久精品| 屁股久久久久久久久| 成人性爱全视频观看| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 97在线视频免费看| 激情视频网址| 久久精品黄色| 欧美高清性猛交| 人妻 丝袜美腿 中文字幕| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 久久精品高清无码一区| 成人a级高清视频在线观看| 人人澡人人弄| 成人性爱高清视频免费看| 中文字幕一区二区三区人妻不卡| 91neishe| 老外又粗又长一晚做五次| 桃色六月天|