久久亚洲成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
返回資訊列表
亚洲欧美国产中文字幕| 能直接看AV的网站| 污污汅18禁网站在线永久免费观看| 午夜偷拍久久熟女| 另类综合另类| 久久99草| 亚洲资源站| 超碰在线人妻中文字幕| 国产丰满少妇久久久精品影院| AA级电影三区| 日韩中文字幕在线视频观看| 久久是精品| 男人的天堂VA| 人妻aa| 国产超碰在线| 国产成人网| 国产精品自拍xxxx| 国产二区三区免费视频| 国产家庭乱伦表演| 日韩成人免费电影| 国产不卡中文字幕免费avi| 日韩91网| 99久久久er直播网址| 99超碰色| 亚洲脚交| 99自拍视频在线| 精品亚洲俞拍视频一区| 熟妇女伦乱视频| 亚洲天堂人妻熟妇视频| 激情图片伦理国产一区二区日韩| 超碰人妻97| 黄在线| 日韩性色b| 制服中出中文人人精品| 天美精品原创av片国产| 91色婷婷综合久久中文字幕二区| 极品粉嫩少妇视频| 欧美天天综合网| 狠狠激情综合狠狠操中文字幕| 色老汉色| 99re免费| 男人天堂久久精品| 九月伊人中文字幕| www.激情| 人伦四五区| 亚洲第一精品在线视频| 麻豆人妻少妇在线免费观看| 亚洲日韩国产精品| 插入综合网| 蜜区区视频79| 婷婷AV一区二区三区| 欧美日韩青操| 超碰在线观看av不卡| 嗯啊啊啊轻点视频 | 八戒午夜福利理论片| 夜夜爽爽爽| 欧美性五月| 国产免a费看黄片在线| 免费农村成人少妇人妻Aa一区二区视频| 久久蜜桃一区二区| 日本午夜精品理论片A级APP发布| 欧美日韩青操| 欧美精品一区二区少妇免费A片| 99久久久无码| 麻豆久久精品亚洲精品88| 操美女高潮抽搐白浆| 91欧美另类| 五月丁香六月综合缴清无码| 蜜桃精品一区二区三区ww | 国产强奸乱伦xd| 亚洲 中文 女同| …亚洲黄色厕厕女女在线播…| 久久欧美性爱视频| 亚洲精品蜜桃久久久| 日韩av一级黄片| 校园春色宗合网| 熟女乱伦A| 中文字幕日韩精品一区二区三区| 日韩极品无码B| 亚洲少妇激情视频| www.91理论| 97干综合网| 午夜黄色免费在线观看| 亚洲欧美在线丝袜| 免費人妻夜夜爽天天爽爽一区| 加勒比伊人| 在线视频一区二区传媒| 国产亚洲性生活视频播放| 国产天天骚| 91丨国产丨白浆秘 洗澡动漫| 人妻天天操天天爽视频免费| 欧美大波激情xxxx| 91爱看| 久久久久久精品免费看A级| 色香91| 国产精品视频白浆免费| 97视频在线看| 伊人精品视频| 顶级丝袜熟女一区二区三区| 人人澡人人澡人人| 97免费在线视频在线观看| 欧美精品久久久久久久丰满| 夜夜青青无码影院| 97超碰jingpin| 精品国产Av无码久久久伦古装| 人妻精品综合中文字幕在线| 高清国产成人无码| 999九九九九国产动| 婷婷五月天激情小说| 丝袜AV一区二区三区| 91 手机在线播放 绯色| 亚洲成a人片在线观看中文!!!| 精品久操| 九九热九九热| 免费一级性爱久久| 欧美黑人168页欧美黑人167| 好吊妞转入那个网| 色在线亚洲视频www| 9久9久9久9久视频网站| 草b在线| 日韩亚洲国产视频| 亚洲有码视频二区| 97bbn| 国产亚洲综合欧美一区| 欧差乱伦二三| 亚洲女人毛茸茸91| 九九热五区| 亚洲成熟国产精品美女| 亚洲在线a| 亚洲综合九| 人妻久久久久久| 国产精品懂色tv影视免费观看| 91丝袜在线视频| 亚洲国男人的天堂| 围产精品一区二区三区视频播放| 三四中文字幕| 67914在线兔费成人视频| 玖色AV| 波多野结衣一级视频| 国产久9| 密臀在线免费观看| 东京日日夜夜| 操逼视频亚洲| 日本操逼视频免费| 狠狠色五月亚洲91| 天天天天做夜夜夜夜做| 欧美九9 9 9| 国产精品区在线12p| 东京热,男人的天堂| 欧美一区二区日韩传媒搭讪精品| 97色碰| 天天操天天射天天日| 999999精品| 国产精品乱码久久久、久久| 2025亚洲男人天堂| 另类小说五月天| 91午夜无码| 91丝袜在线观看| 曰本特级特黄特色黄色A级网站高清在线免费看 | 亚洲高清少妇| 一区二区三区男女操逼黄色小电影| 国产精品岛国片在线观看| 欧美高清无码免费视频高清版| 久久国产精品视频| 亚av顶级裸体一区二区三区四区五区 | 国产精品福利视频| 青青草华人在线欧美在线| 97欧美精品综合| AV大香蕉| 久久香蕉网| 约操熟妇| 中文字幕五月婷婷免费| 东北女人无套内谢视频| 亚洲成人ab| 亚洲文学偷乱拍啪啪啪啪| 九九夜精品九九在线| 天天干天天干天天| 丁香婷婷九月| 亚洲成A∨人影院在线欢看| 成人无遮挡毛片免费看| 日韩无码三级影院| 亚洲,日韩,欧美,成人播放| 亚洲色图欧洲| 欧洲精品二区| 超碰97COm中文| 欧亚韩国999| 亚洲吊色| 日本欧美色| 射丝袜高跟鞋99| 亚洲另类综合欧美| 啊…啊…操我用力操我| 五月综合激情| 91在线页| 91丝袜美女| 久久极品伊人| 99色综合| 天美国产三级传媒| 九九热男人天堂| 青青草九九九九九| 亚洲精品久久久久久久久豆丁网| 日本有码久久| 欧美性爱97超碰| 久久久久无码| 天天干一区二区| 欧美制服网站美腿丝袜| 国产精品情侣啪啪| 亚洲丝袜天堂| 97视频620| 欧美色图 人妻| 中文幕97| 欧美日韩亚洲国产中文永久天天看| 91爱欧美| 欧美草草高清日韩视频| 日韩九九九| 国产精品诱惑| 日韩成人高清一区二区| 天天激情综合站| 双插性欧美一二三区| 日本免费人成视频播放120秒| 精品毛片av一区二区| 中文字幕亚洲永久精品| 牛黄色久午久| 狠狠操天天干| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 神马久久久久久久久久久久| 亚洲图片在线| 韩日欧亚a级| 亚洲国产综合图区中文字幕| 久久久精品中文字幕爱豆| 国产精品亚洲高清在线| 人妻熟女av国产网站| 五月天大香蕉| 亚洲美欧999| www.91欧美| 人妻大香蕉| 91色狼| 翔田千里无码中出中文字幕| 精品一区二区成人动漫| 欧美图片偷拍| 99精品伊人| 久热99999| 99精品九九九九九九| 亚洲男人天堂AV| 91综合色噜噜| 在线国产一区二区av| 成人五月香网在线| 久久久专区| 91高清欧美| 亚洲欧美日韩免费观看| 日本色色色色色视频| www.婷婷| a片亚洲一本通视频| 欧美热图99| 国产亚洲精品一区二区三区| 久久精视频美日韩在线视频| 97久久久久久久精| 国产青青综合伊人| 亚洲男人综合| 久久婷婷亚洲| 亚洲青青草| 欧美+日产+中文| 国产中文大片资源中文字幕| 久久久久成人蜜桃精品| 日韩丝袜高跟制服在线观看| 99热在线播放| 日韩av在线播放不卡| 9久久9综合| 影音资源男人日韩| 亚洲国产精品无码AV久久久| julia高潮后不停追击中出| 啊啊啊好舒服好爽啊啊啊视频| 自拍第一页| 91人精品妻入口| 成人午夜无码视频| 999 久久久| 丰满人妻aA一区二区三区| 久久99午夜精品一区人妻| 青青青国产| 欧美,日韩,中文,另类| 欧美成人A√在线一区二区| 国产无马av| 久久久久亚洲精品| 天天综合网在线观看| 在线视频免费播放一区| 91麻豆天美传媒HD| 啊啊啊啊操死我| 国产 丝袜 欧美中文 另类| 不卡码视频| 97资源久久| 一区二区三区视频在线观看免费| av东京热男人的天堂| 国产色产精品在线观看| 色婷婷综合视频| 激情五月天校园春色网| 不卡av在线中文字幕| 亚洲 欧美 中文 日韩超碰 | 色汉综合| 高清无码网址| 国产2.3.4区| 久久成人午夜精品影院 | 久久一二三四五六七八九区区| 99热在线播放| 中文字幕高清20页视频| 亚洲日韩成人性爱视频| 日本网色| 丁香九月激情| 综合网久久| 99www.bibizy香蕉资源国产一区二区三区高清| 欧美日韩精品久久久久东北老熟妇| 亚洲欧美日韩免费电影| AV污污污污| 国产AV人人 夜夜人人澡| 天天日天天干天天操| 久久婷婷色| 一级免费精品| 静品嫩模一区二区| 日韩精品系列| 人、人、摸,人、人、草| 搞中出视频在线观看| 黄色成人网久久久久久| 亚洲中文字幕乱码无码一区二区| 九月伊人中文字幕| 色激情五月天| 天天天肏屄肏屄肏屄欧美欧美| 日韩精品在线观看网站| 96精品一区| 黄色性爱网网| 97超碰影音| 人妻熟女av国产网站| 欧美激情亚洲情色| 屁屁影院一区二区三区国产| 午夜操操操| 欧美特大黄一级片片免费| 熟女露脸激情自拍视频| 九九碰九九爱97超碰| 欧美激情在线观看视频| 日本免费中文一区二区三区四区| 欧美性色网| 欧美成人9797| 99久久无码| 中文字幕丝袜人妻| 国产精品久久aV| 伊人网在线观看| 欧美,日韩综合久久| 青青伊人这里只有精品| 天堂中文资源在线bt| 99热国产| 亚洲乱码国产乱码精网站| 碰超人人在线一区二区三区| 亚洲日韩国产欧美综合v| 午夜久久久| 亚洲AV成人在线| 亚洲色阁| 美腿丝袜高跟网免费视频免费视频| 欧美日韩另类在线播放| 大但人体久久久久| 色99在线| 精品无码久久久久久久杏吧| 成人日韩中文字幕| 亚洲操逼无码| 亚洲AV无码乱码| 超碰国产情侣自拍网| 日韩激情毛片一级久久久| 国产99999久久精品| 三级片网站在线播放| 偷拍视频青青草在线视频| 98一区二区精品| 超碰无码加勒比| 黄色av播放免不| 久热超碰| 欧美日韩色综合网| 欧美肥臀在线| 国产精品制服丝袜中文字幕日韩一区二区三区| 久久精品福利影院| 狠狠爱夜夜| 嗯阿好爽好紧| 亚洲综合中文字幕有码| 啊啊啊啊好疼| 欧美78| 去干网最新版| 中国AAAAAA黄色片| 黑人粗大V S日韩女优视频| 99亚洲精品| 久久av无码| 热久久无毒不卡| 私色综合网| 日韩精品人妻一| 上床啊啊啊| 91骚妇| 免费一级欧美片片线观看| 中文字幕国产在线天堂| 最新9久久久9免费视频| 精彩视频日韩| 日本中文字幕在线视频| 成人av在线播放| 99少妇内射| 97久久精品国产| 亚欧韩av| 亚洲第一狼人丝袜美女另类| 天天久久| 插B在线观看| 国产农村妇女精品一二区| 日本女人操逼| 99re公开精品免费视频| 3PAV乱伦视频| 97久久超碰亚洲| 国产精品第二页| 青青国产精品在线| 欧美专利1区2区3区4区5区免费| 93人人操人人| 青娱乐福利99| 色97欧美| 欧美 亚洲 综合 制服 另类| 欧美老熟另类| 玖玖婷婷五月天| 人人么人人操| 欧美碰碰综合色| 色情婷婷久久五月天| 大香蕉 222| 91黑丝在线播放| 精品性爱一二三区| 国产黄色在线播放观看| 淫荡网址| 国产精品久久| 嗯嗯不要 视频| 加勒比综合a∨| 亚洲精品国产精品乱码不卡| 97爱欧美| 久久9 9 9精品| 婷婷大香蕉| 天堂8在线新版官网| 黄色片,com| 综合久久久久久久久91| 亚洲综合影院| 91亚洲欧美| 午夜经典| 亚洲精品97久久中文字幕| 98福利在线视频| 青青操在线亚洲视频观看欧美在线 | 久久久久九九九| 久久这里只精品免费福利| 老熟女网站| 亚州性色| 日韩97在线| 99re99在线视频| 亚洲人人夜夜澡人人爽| 久久久神马影院| 蜜桃久久久久久久久久久久| 精品美女在线视频| 丝袜综合| 精品美女少妇一区二区三区| 亚洲的天堂网| 一本一道vs波多野结衣| 九久9热| 色性综合| 亚洲中文字幕有码视频一区二区三区| 殴美,日韩国产伦精品| 婷婷五月天av| 丁香五月AV| 99色色网| 亚洲综合网电影91| 青青草视频爽一爽| 激情图片亚洲色图| 好看的91视频| 国产女人9999| 亚洲熟女少妇免费视频| 热G综合热G中文| 国产91 丝袜在线播放 | 亚洲欧美国产va在线播放频| 在线视频 亚洲精品| 免费看黄片现成| 无码 黑人一区二区三区| 亚洲一区二区三区不卡国产欧美| 国产亚洲日韩在线三区黑人| 欧美v亚洲v日韩v最新在线二区| 亚洲中文字母在线播放| 亚洲操逼网| 激情丁香婷婷| 国产suv精品一区二区四区999| 蜜臀AV一区二区三区激情综合| 在线天堂999| 国产乱码精品久久久久久| 麻豆精品三区视频| 麻豆色99999| 最新制服中文第一页| 91色拍| 在线无码视频| 亚洲最大网站av| 男人的天堂2010| 极品粉嫩一区二区| 校园春色综合香蕉| 男人天堂新| 成人免费性爱视视| A V视频日本| 国产伦精品一区二区三区在线观| 亚洲天堂区| 91欧美成人色站| 天天天堂影视日韩亚洲91| 四虎精品永久在线观看| 国产精品96| 国产亚洲性生活视频播放| 婷婷中文网| 射 色综合| baiduhicn.com。| 国产搭汕a级片| 老司机午夜精品视频| 曰韩操B| 成人片在线播放| 天色综合网| 九九热午夜欧亚国产视频| 另类欧美色| 天天色,天天干,天天干| 婷婷五月天小说| 97 视频在线| 综合亚洲网| 欧美一二三级精品在线| 日韩一级欧美一级在线观看| 人妻夜夜爽天天爽麻豆三区网站 | 国产传媒美日韩av| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 青青操网| 在线观看黄色电话| 超碰性爱97| 天天在线91| 秋霞操逼片| 女人高潮抽搐喷水视频网站| 综合网欧| 99草精| 操逼国产免费| 亚洲天堂东京热| 欧美日日人人天天| 日本操逼视频不卡直接放| 97人人干| 久久久久久少妇| 欧美综合国产精品久久丁香| 1024人妻| 99热日| 黄骗免费网站| 国产热RE99久久6国产精品首| 69综合网| 亚洲日韩美女丝袜美腿人妻视频| 91在线无码精品秘 软件| 大香蕉色网| 日本媚薬中文字幕在线| 亚洲最新中文字幕免费| 麻豆AV一区二区| 国产又粗又长又大的视频| 三级色综合| 91女网站| 超碰2017| 久久久婷| 国产美女高潮视频| 日韩激情中文字幕有码| 男人天堂综合| AV一起草在线| 91大神电影天堂| 夜夜欢天天干| 五月婷婷丁香六月| 亚洲精品97久久中文字幕| 四虎国产精品永久地址入口| 加勒比AV网| 亚洲欧美日韩中文播放| 天天干天天干天天| 丰满少妇精品一区二区| 日韩人成网站在线播放| 加勒比海成人视频网| 亚洲综合第一页| 天天综合亚在线| 三级色影综合网| 久久激情网| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 国产自偷自拍一区| 熟女91网| 国产精品视频精品一二| 日韩色图 一区二区| 欧美性爱中文字幕无线码| 天天插夜夜爽| 四虎国产精品永久地址入口| 高清肉丝中文无码| 91社区拍啪人妻| 91黑丝操| 蜜桃无码AV一区二区| 精品乱码在线观看| 亚洲色图欧美视频| 日本五区不卡| 色爱国产| 日韩一级二级三级| 嗯嗯啊在线视频| 亚洲无 码A片在线观看麻豆| 800zy一区二区| 综合欧美亚洲| 七久久久| 久久草草亚洲蜜桃臀| 中文有码第五页| 97国产精品| 亚洲码和欧洲精品激情系列| 内射夫妻三片| 久久伊人青青草| 国产99久久99热这里只有精品15| 97国产综合欧美| 十八禁啪啦拍视频无遮挡| 亚洲国产天堂| 精品人妻一区二区三区-国产| 亚洲中文字幕熟女| 日韩视频小说在线观看| 网页导航五月天免费一二三区| 97视频在线观看网站| 婷婷久久久| 3PAV乱伦视频| 青娱乐手机日韩在线视频| 性爱1区| 97在线视频观看| 极品内射| 91人妻Pr| 超碰97人妻| 国产精品密臀网在线观看| 欧美顶级黄色大片免费| 综合一区二区影视| 开心激情站| 无遮挡男女激烈动态图| 久久一二三四五六七八九区区| 国产精品自在自拍视频| 国语少妇精| 亚洲精品骚逼| 2024人人操人人摸| 91视频综合| 强上我不卡卡| 在线观看日韩av不卡| AV中亚| 久久亚州高清| 婬女免费一二三区A片| 久久老女人| 中文久久96| 日韩人妻少妇 一区二区三区| 欧美黄色手机在线观看| 久久9免费视频| 国产怡红院| 久久久麻豆精品| 操国产逼| 9久9久9久9久视频网站| 大香蕉十区| 蜜乳av首页| 亚洲精品一二牛牛| 夜夜嗨一区| 男人的天堂欧美| 亚洲成av人片色午夜乱码| 国产精品国产亚洲区艳妇糸列| 精品9999| 欧美香蕉视xxx| 色婷婷五月综合激情中文字幕| 国产成人超碰在线| 亚洲精品乱码久久久久久蜜桃麻豆| 国产久久久9999| 熟女突然公开看18禁影片| 国产强奸AV在线| 大香蕉一人| 欧美性爱一区二区三区四区| 五月天激情国产综合婷婷婷| 欧美日本中字另类在线| 国产午夜精品在线观看| 亚欧操逼片在线观看 | 97色欧洲| 天堂伊人久久| 在线 亚洲 网爆 自拍| 丁香六月婷婷综合| 激情视屏国产乱伦强奸| 亚洲日本激情| 欧美日韩在线小说 | 亚洲黄片免费在线播放| 大鸡巴久久| 果冻传媒A片一二三区| 丝袜综合色图| 女色视频社区| 人妻久久久| 黄色视频特级毛片| 中文字幕乱码人妻二区三区| 国产精品美女视频诱惑| 无码二级三级| 天天性射网| 日本孕妇孕交| 亚洲一本色码中文字幕| 日韩一级二级在线| 午夜精品一区二区三区三上悠亚| 高清成年美女黄网站免费大全| 热99这里有精品综合久久| 亚洲色图日韩丝袜制服一区二区五月在线| 亚州欧美总和| 日本精品免费一区二区三区四区| 久久久亚洲精品电影免费看| 夜夜嗨一区二区| 97久久超碰| 91精品国产高清久久久久久,亚洲成人 | AV天天在线观看| 久久曰曰| 91色婷婷综合久久中文字幕二区| 操逼逼福利视频| 国内毛片国产欧美拍| 91精品无码久久久久久久 | 熟女精品va中文字幕| 久热影视| 天天操夜夜操狠很操| 欧美高清18A片| 久久精品国产Aⅴ| 国产女同在线观看视频| 呦呦一区| 综合久久97| 草草电影院| 2024年最新色情网站在线观看| 午夜操一操| 97精| 国产精品视频内谢女人| 精品视频在线观看精品| 丁香婷婷五月| 国产无码三级视频在线观看| 综合国产影视三级| 欧美的性爱网站免费| 伊人精品久久网站| 久久无码成人| 日本熟女中文字幕一区| 无码精品一区二区三区潘金莲| 国产乱伦亚洲| 国产AV精久久| 日本理论在线| 久久99综合| 人夜夜精品网站香蕉嫩草| 丝袜夫妻自拍| 超碰 另类 欧美 | 人人搞人人插人人操| 婷婷操视频| 欧美人人操人人插| av天堂精品久久| 亚洲精品中文字幕一区在线视频| 国产麻豆一级精品视频| 久久久久久久人妻| 精品久久青青草| 亚洲精品男人的天堂| 黄色大片一区二区密桃丝袜| 99999精品成人| 久久久专区| 超碰97资源网亚洲| 国产精品一区二区三区免费视频| 十八禁啪啪视频| 国产在线强奸视频| 欧美精品自慰系列寂寞少妇 | 亚洲玖玖爱| 熟女人妻一区二区三区免费看| 91天天综合网| 激情无码日韩| 秋霞视频一区二区| 亚洲美乱| 日本中文字幕一区| 99AV| 国产真乱mangent| 国产综合网站在线播放| 久久人妻精品| 亚洲永久永久永久永久一级一级一级精品 | 天堂精品一区| 五十路熟女人妻一区二区在线观看| 久久久久久久强迫| 中文字幕aⅴ在线视频| 97啪啪| 97久久精品国产| 黄站在线免费观看| 探花精品 一区二区| 乱伦图一区| 亚洲少妇色| 青木玲在线不卡| 国产999精品久久久| 欧洲亚洲少妇| 99亚洲国产精品色一区二区三区| 人人操人人大香蕉| 九久9热| 97 国产精品| 91啦人妻| 深夜激情无码| 78p欧美| 一本大道久| 操婢日韩| 大香蕉啪啪啪| 日韩人妻丝袜美腿中文| 啊啊啊啊啊啊啊啊视频| 欧美日本中字另类在线| 国产黄a三级三级三级av在线看 | 久久97超碰| 國產尤物AV尤物在線觀看| 久久黄黄| 国产高清在线自在拍69| 伊人网免费视频| 五月婷婷久久综合| 蜜臀亚洲综合一二三四区| 91国模| 欧美日本国产日韩激情视频| 夜夜高潮夜夜爽高清视频一| 亚洲色图欧美色图综合| 一级片在线观看高清无码| 激情六月婷婷| 亭亭在线资源| 中文字幕日韩精品久久| 天天爽天天操| 97操综合| 三级激情网站| 国产黄a三级三级三级av在线看| 天天操天天日天天干| 色吧 综合| A久久| 91AV国产精品| 狠狠色狠狠色狠狠五月| 高树玛利亚无码流出| 久久精品超碰| 久久艹逼视频| 亚洲图片 激情小说| 男女日B国产| 大胆91| 午夜啊啊| 亚洲最大AV网| 亚洲一区二区 麻豆传媒| 亚洲激情在线| 亚洲乱码尤物193YW| 欧美日韩222| 亚洲男人天堂AV| 97婷婷色| 蜜桃臀av一区二区| 久久久久成人亚洲国产| 欧美亚洲厕所精品偷拍91 | 亚洲一区二区在线观看91| 丁香久久| 巨乳特殊服务按摩| 337p大胆噜噜噜噜噜91Av| 久男人久久| 欧美区亚洲区偷拍区| 欧美日韩人人精品| 3PAV乱伦视频| 久久久久国产亚洲一区欧美色图日韩 | 国产专区路线| 97超碰站| 神马久久久久眼| 欧美日本成人一区二区| 99少妇精品视频| 日本一二区不卡| 爽爽淫人网| 亚洲色91| 青青青操| 在线不欧美| 乱日视频| 成人免费性爱视视| 日韩精品高清资源在线| 无码高清操逼| 男女激情中文字幕| 免费一级性爱久久| 欧美 亚洲 综合 制服 另类| 欧美黑人精品在线播放| 欧美熟女丝袜| 天天色综合天天操| 日本三级精品| 69超碰综合| 神马久久久久久| 国产性刺激| 国产精品久久久久久久AV大片 | 无码高清操逼网址| AV在线资源| 日韩无码黄色片| 成人一级二级| 日本一级一级一级一级| 欧美亚洲今日在线| 肉丝网站91| 久久亚州精品成人Av无| 99re热| 成人性爱电影一区二区| 中文字幕1区2区| 日韩高潮一区| 插入逼91| 18禁久极品美女久久哦哟呀!| 亚洲精品国产熟女久久久久久| 日韩特一级久久| 狠狠综合| 欧美成年人性爱视频免费观看| 91天堂视频| 亚洲最新a在线观看| 日韩欧美麻豆| 亚洲老熟妇xxx| 99亚洲精品| 97超碰超欧美。| 色色五月丁香| 天天日天天干天天操| 中文字幕日韩人妻视频一区二区三区交换夫妻| 91c色| 一二三区精品视频| 人妻精品综合中文字幕在线 | 丰满人妻一区二区中文| 97人人干人人操| 秋霞Av理论一级在线| 老熟妇综合| 亚洲乱熟女一区二区三区大香蕉| 亚洲色阁| 色综合20p| 91操碰| 日本精品一级二级三级| 97热视频在线观看| 婷婷五月色| 天天干天天燥| 97久久超碰亚洲| 91精品人妻一区二区三区蜜桃臀| 欧美亚洲尤物久久| 亚洲欧美黄| 91欧美另类| 日韩精品一二三四| 青娱乐欧美激情一区二区| 清纯唯美综合| 操b网站亚洲无码| 婷婷五月影院| 26uuu欧美日韩| 久久久久久久久9| 青苹果影院男人的天堂| 免费A V在线播放| 97国产精品视频| 91国精产品| 久久人人妻| 18禁网站在线播放| 91亚洲欧洲| 色悠久久久av| 97色冈| 黄色免费网页无码| 成·人免费午夜在线观看| 久久精品高清无码一区| 搡老女人老妇女老妇老熟女怎么读| 97人妻免费中文字幕| 日韩福利电影网| 妇女乱色二区| 性性久久| 日本有码久久| 蜜桃无码AV一区二区| AV麻豆免费一区| 亚洲人久久久久日| 青青三级视频| 日本日日色视频| 性爱视频久久| 嫖老熟女A片一二三区| 日本潮催一卡操| 9Ⅰ超碰| 亚洲熟妇综合久久久久久| 91撸色网 玖玖网 欧美| 亚洲五月丁香花狠狠干一区二区三区| 久久亚洲AV无码专区国产精品| 老女人综合网| 人人妻人人爽| 欧美日韩亚洲国产中文永久天天看| 国产精品网站免费| 97视频观看| 99精品在线| www…国产操逼| 影视综合无码少妇| 亚洲性爱成人| 日韩97P| 东京太热男人的天堂久久久| 中文字幕视频免费| 狠狠夜色午夜久久综合在线| 91久久久久久久久久久| 婷婷五月天社区| 熟女被操视频网址| 国产乱人伦AVA麻豆软件.| 一级岛国大片| 亚洲伊人久久综合97| 欧美劲爆第一页| 国语精品av| 日本不卡免费二区| 欧美日韩97在线| 骚人妻少妇视频| 伊人aaa| yy少妇精品久久| AV在线资源| 日日骚 av| 天堂精品小草| 91在线限制级| 欧美香蕉视xxx| 丝袜制服字幕在线| 日韩一区二区熟女| 欧美三级不卡| 无码人妻一区二区一牛影视| 日韩久久三区| 久久精品人体AV| 欧美日韩成人| 精品久久一区二区三区四区五区| www九九热| 成人日韩欧美| 色5月婷婷| 五月婷在线| 五月婷婷色| 日韩国语字幕| 久久久久中出| 日本女厕偷拍| 一牛一区二区三区久久| 老熟妇综合| 一区二区三区成人| 超碰98综合网| 97伦乱| 欧美色图片欧美色图| 精品人妻一区二区蜜桃视频| 2019男人的天堂| 亚洲色图欧美色18直播在线| 亚洲欧洲日韩中文字幕一区| 亚洲丝袜少妇在线| 九色黄站| 91人精品妻入口| 夜夜草我| 国产精品久久久久久无码红治院| 国产白嫩漂亮KTV在线| 天堂中文日本在线观看| 曰韩av中文字幕专区| 9999久久久久| 啊啊啊啊啊在线观看网址 | 97电影院超碰| 99热精品青草在线| 精品久久九| 亚洲97网站| 啪啪啪亚欧美视频| www亚洲欧美| 久久精品国产亚洲AV清纯| 91在线视频国产网站| 日韩欧美大片免费高清啪啪| 无码高清少妇久久| 极品美女福利在线观看| 日本岛国黄色网址| 久久久久久亚洲精品中文字幕人妻| 嗯嗯啊啊用力视频免费| 欧美综合网1| 91精品在线播放| 农村女一级毛卡片| 一级黄色视频网| 在线国产一区二区av| 吻戏激情性巴克| 中 文字幕一区二区三四 五 区日 日 骚 | 精品日韩人妻精品一二三区| 自拍偷拍 高清无码| 午夜大香蕉| 2025亚洲男人天堂| 欧美日韩97在线| 超碰97欧美| www..com操老师| 色九九九九久| 国产丰满熟夫69mpp| 亚洲九九视频| 影音先锋每日最新资源在线观看 | 91久久国产综合精品| 九九九久| 亚欧高清| 综合欧美日本三级| 国产无遮挡| 白嫩妹子国产骚| 亚洲av噜噜噜噜噜噜| 成人网站 免费观看| 国产欧美精品日韩区二区麻豆天美| 美日韩一二三区| 人妻精品一区二区三区| 中国一级操逼视频| 91人妻爽爽人人做人人澡| 国产精品欧美激在线| 久久久久久久久久久久97| 无码久久亚洲高清,| 欧美中出1| 在线视频一区二区传媒| 超碰97日韩| 激情无码日韩| 视频二区美腿丝袜制服人妻欧美 | 熟女网站最新| 欧美日韩资源| av天堂手机版追回 | 丝袜色综合| 欧州一区二区三区四区| 超碰人人超在线观看| 中日韩久久人妻一区二区| 欧美一区二区| 激情网色| 欧美爆操91| 综合少妇网| 欧美大香蕉同搞| 亚洲色综合| 久久久成人精品| 乱伦熟女专区| 五月色综合| 亚洲高清男人天堂| 亚洲日韩在线a不卡99精品| 色色婷| 婷婷激情五月综合| 久久五十路熟女人妻| 日本一区二区三区欧美日韩中文字幕| 激情久久日韩精品中文字幕麻豆| 欧美性爱第一页久久| 婷婷五月影院| 夜夜国自区| jk白丝没脱就开始啪啪| 啊好大好舒服| 九九九九久久久久| 在线啊v一区| 日韩大香蕉精品在线视频| 国产精品不卡av免费在线观看| 麻豆国产免费影片| 四虎在线免费视频| 99久久精品无码一区二区毛片免费| 九九久久九九久久| 男人的天堂日韩| 国产精品人妻熟女aⅴ| 97内射偷拍| 97干97色| 长长久久免费视频| 91黑丝操| 欧美人与性动交a美精品| 久久亚洲人妻| 91操操操操| 日韩97超碰中文字幕| 精彩久久中文| 操逼啊啊啊91| 夜夜 中文视频rt| 亚洲密乳AV| 熟女欧美日韩综合婷婷| 9999久久久| 欧美日韩99| 欧美男人的天堂| av凤凰久久久| 日韩人妻丝袜美腿中文| 免费一级a毛片久久久久久鸭绿欲| 久久9 9 9精品| 亚洲日韩美女丝袜美腿人妻视频| www.色操逼| 日韩熟女视频二区| 日韩丰满熟妇| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 秋霞成人做爱| 玖玖爱一区在线| 呦呦影院| 中出789在线视频| 尤物黄色在线观看网站| 天天夜夜久久| 2018天天干在线视频| 丝袜美腿射精91| 欧美少妇性爱网站| AV男人天堂网| 久久久 国产精品| 偷拍导航视频网站| 色婷婷丁香五月| 国产传媒一区二区三区| 欧美日韩国产传媒在线精品| 操逼操逼操| 少妇毛片久久| 老外又粗又长一晚做五次| 极品后入免费视频| www.99中文字幕| 九九亚洲色在线观看| 亚洲无码久久久久久久| 国产97在线播放| 夜夜爽33333| 国产又黄又爽| 亚洲情色在线| 久久久久久久国产a∨| 肉丝中文无码高清| 2010男人的天堂| 天天射天天操天天干天天吃2018 | 亚洲综合影片| 人人操人人搞人人草| 精品乱码在线观看| 五月婷视频|