亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
色九久| 97丝袜亚洲在线播放| 99热导航| 午夜性刺激视频免费观看| 91快色色色色色| 日韩欧亚太美不卡| 色图综合网| 色五月激情综合网| 欧美性五月| 黄色大片免费在线| 亚洲精品欧美专业| 久久只有精品| 婷婷色在线| 色老汉色| 一级性爱视频免费观看 | 亚洲中文字幕熟女| 亚洲91极品| 麻豆天美在线喷水AV| 在线日韩日本亚洲国产| 亚洲AV无码| 欧美综合网站999| 亚洲人妻中文高清| 91色五月俺来也| 变态综合色| 91粉嫩萝控精品福利网站_精品影音先锋国 | 久九色| 欧美国产日韩高清在线| 玖玖综合视频| 精品少妇一区二区三区在线视频| 熟妇一区,二区,三区。| 自拍鲍鱼一区在线高清观看免费| 熟女91网站| 激情第四色| 91热热色| 欧亚第一综合网| 婷婷超| 啊啊啊好湿国产一二| 亚洲精品99999| 99久视频| 91黑丝在线| 亚洲色性情三级| 91被操| 伊人伊人LD| 国产av又色又爽又黄| 我中文字幕6区 | www…国产操逼| 嗯嗯啊啊日韩精品| 亚洲乱伦图片视频| 少好三P| 加勒比在线视频一区二区三区 | 亚洲综合一| 1024人妻熟女一区二区三区| 久久久精品久久| 十八禁啪啦拍视频无遮挡| 好湿好紧视频| 国内91熟女人妻丝袜天天精品视频在线| 欧美天天干| 亚洲激情网| 热99这里有精品综合久久 | 97精品久久久久中文字幕| 在线观看亚洲成人精品| 精品久久9| 337p大胆噜噜噜噜噜91Av| 亚洲欧洲综合| 欧美夜色| 综合网色| 热无码中文亚洲H一道本一区二区| 久久999久| 青椒国产97在线熟女| 国产精品动态一区二区三区四四| 97色五月天完| 国产亚洲精品美女久久久m| 亚洲男人在线观看天堂| 夜夜騷av、一區二區| 免费中文在线| 97视频在线| 久久一本大香蕉 | 国产精品丝袜久久亚洲不卡| 天天操狠狠日夜夜干超碰撸com视频在线观看| 青娱乐999| 99热99re6国产在线播放| 91狠婷| 免费精品人妻一区二区三| 91bbbbbb| 久久人妻无码毛片A片麻豆| 嗯嗯啊在线视频| 99热99在线播放激情| 91亚州| 99热线麻豆| 九九九九日本| 国产日韩精品一区二区三区| 亚洲成人综合在线| 伊人色综合网电影| 日本欧美亚洲高清在线看| av激情亚洲五月天| 99rre在线精品99re8| 久久久久久久国产| 三级片大波波| 无码99| 这里只有精品视频在线| 欧美十八禁网站| 欧美传媒| 精品91| 午夜精品久久久99热蜜桃的功能特点| 好爽免费视频,| 澳门成人网站久国产日韩| 亚洲欧美精品福利在线| 9l视频自拍9l九色成人| 日本 欧美 国产一区| 国产女人和拘做爰视频| 免费少妇一区二区| 国产精品露脸在线观看| 综合久久久久久久久91| 2021国产成人精品久久| 久久伊人影院| 诱惑网综合| 亚洲男人天堂网站| 美女啊啊啊啊啊| 美欧色综合| 国产熟女高潮一区二区三区| 97精品在线| 欧美97视频| 色天堂综合| 狠综合网| 国产精品午夜福利视频| 亚洲,欧美,综合网| 亚洲在线观看| 99操逼| 日韩一卡二卡三卡| 欧美写真视频一区| 97国产超碰| 久久九色| Av手机版天堂网| 狠狠久久手机视频精品| 6080YYY午夜理论片在线观看| 亚洲日韩国产精品| 欧美精品成人一区二区在线观看| a级免费在线观看| w w w.久久精品| 麻豆国产97在线| 18禁无码永久免费无限制| 国产一区二区免费福利片| 久久性爱视频99| se01国产在线视频| www.超碰| 人人爱夜夜爱| 天美传媒av一区二区| 日韩综合97P| 免费97视频| 四季av一区二区凹凸精品小说| 91亚洲黄色网| 高清无码久操视频| 秋霞曰韩R级| 日本岛国黄色网址| 日本不卡高清免v欧美日韩在线观看| 欧美人妻二区三区| 韩日精品福利视频一区不卡在线免| 丝袜美腿射精91| 亚洲蜜臀精品视频久久| 久96热在线观看视频| 收看日本人日bb| 欧美精品99久久久**| 囯产乱伦一区二区三女| 91色综| 超碰碰97| 欧亚 另类 久| 国产精品直播在线观看直播| 盗摄女人妻在线| 欧美日韩99| 高清不卡视频| 天天干夜夜肏| 九九九久久久| 日本女优在线视频福利| 蜜臀AV一区二区三区激情综合| 二级久久网| 女同性恋中文字幕| 黄片免费日韩| 国产自偷自拍一区| 午夜欧美J进J出白浆流出久久久 | 欧美成人精品欧美一级乱黄一区二…| 操逼免费视频无码国产| 婷婷伊人綜合中文字幕| 热的中文 热的有码 热的国产| 精品无人区麻豆乱码1区2区图片 | 中文字幕乱碼在线| 亚洲,欧美,综合网| 欧洲欧美视频一区二区| 日韩熟妇二区| 天天操熟妇| 香蕉国产精品麻豆亚洲欧美日韩| 中文字幕成人理论在线| 久久久久人妻二区精品叶可怜| 欧美性夜| 精品无码产区一区二| 美欧老女人97| 99re视频这里只有精品| 亚洲日韩美国人妻| 熟妇视频一区二区三区在线观看| 哑洲在线| 看一级特黄a大一片| 天天综合91在线| 91久久久久久久| 国产h小视频在线观看免费| 人人摸人人叼| 一区二区国产视频在线观看| av毛片aaaaa免费看| 99久久9| 欧美色综合图片| 内射夫妻三片| 精品久久久无码| 羞答答AV中文字| 人人贴人人摸| 成人天天看站长推荐| 亚州综| 玖玖爱免费观看视频| 国产日韩精品一区二区三区| 亚洲一二三四区| 蜜乳av首页| 成人一区二区三区四区| 一本精品日本在线视频精品| 国产乱婷婷精品二区三区| 久久αⅴ| 爱射综合| 老女人综合网| 妇女视频网站| 日本人妻伦在线中文字幕| 久久五月份| 欧美人妻制服| 蜜桃成人1区2区3区| 色天天野狼综合社区| 日本午夜操逼| 欧美日韩人妻少妇 一区二区三区| 久久国产在线一区二区| 天操天操夜操夜月操月年年操| 日韩性色| 亚洲综合97中文网| 国产又黄又爽| 校园春色欧美色图| 欧美精品日韩久久久九| 91老熟女老女人国产老太| 天天干天天舔| 伊人久久大香线综合无码| 国产精品4p在线观看| 久久综合中文国产| 国产欧美精选自拍一区| 日日摸日日碰| 天天色综亚洲91污| 强乱老妇中文字幕| 天天干,夜夜爽| 丝袜美腿亚洲| 爱啪精品一区| 国产精品久久久久久久毛片1| 好看的久久不射无码影视影院| 日韩美女啪啪一区| 国产国产亚洲一二三久久| 欧美视频在线视频免费va| 精品国产99999| 91黑丝在线播放| 91在线免费精品视频| 美女久久久久久久| 国语精品内射在线观看| 久草电影网| 97超碰碰碰| 91香蕉视频在线观看免费| 九九九影院| 国产精品三级视频网站| 精品国产乱子伦一区二区三区,精品一| 色色色热| 国产成人无码a| 九九热午夜欧亚国产视频| 大香蕉综合在线| 日韩电影在线观看网址| 欧美亚洲高清不卡| 九九伊人网| A片大香蕉在线| Aa东京男人的天堂| 九九热视频在线观看| 91网九色蝌蚪操熟女| 骚女高跟AV在线| 午夜丁香| 亚洲图片婷婷五月天| 日韩丨制服丨中文|在线| 日本色色色| 国产精品福利资源在线尤物| 久久久专区| 五月天色色网站| 欧洲性爱无码区| 国产后入内射| 清纯唯美激情四射| 99视频在线| 欧美一二三级精品在线| 国产精品9999| 欧美少妇高潮视频| 日日黄色三级网站| 中文字幕五区| 91快色色色色色| 综合97| 加勒比色综合| 欧美熟女激情| 天天流夜夜操| 久久精品店| 欧美呦呦性爱| 操一操摸一摸| 天天综合官网| 一本一道久久综合久久| 97视频620| 亚洲麻豆精品二区三区| 国产成人+综合亚洲+天堂| 激情 欧美 亚洲 小说| 中国91AV| 黑白配性爱AV成| 男人天堂日日夜夜| 78久久久| 欧洲免费一区二| 亚洲欧美经典一区二区| 全球成人中文在线| 亚洲精品无码成人久久久99| 国产精品懂色tv影视免费观看| 久久精品国产97欧美精品亚洲 | 激情黄色片在线观看| 夜夜春夜夜操| 日韩青久久| 熟女高潮合集-永久久久-成人AV| 少妇六月天| 精品国产一区二区三区av在线资源| 久久精品国产亚洲AV片多多| 亚州免费啪啪视频| 国产一级内射无挡观看| 性色AV网站| 色综91| 日本在线伊人啪啪| yazhououmeizongya| 亚洲美女黄色| 久久久久斤小| 日日干夜夜干| 色五月AV| 91n处女在线观看| 熟女久久| 精品黑人一区二区| 欧美欧美少妇| 有码免费观看| 91香蕉视频在线观看免费| 日韩精品第3页| 三级特黄60分钟播放| 97视频在线视频| 在线v中文字幕一区二区三区| 激情内射| 免费观看有码高清视频| 黄色视频高清无码网站| 97这里只精品| 一区二区娱乐网站| 五十路一区无码| 岛国小电影| 人人贴人人摸| 粉嫩久久久极品| 婷婷综合| 丝袜人妻av一区二区| 青青草五月天| 十八禁啪啦拍视频无遮挡| 香蕉视频精品亚洲一区二区三区在线播| 国产精品小视频一区二区三区| 亚洲AV无码乱码| 搡老女人老91妇女熟女| 91丨九色丨国产打屁股| 狠狠操,使劲操| 亚州综合图片| 99色在线| 五月婷网站| 久热这里| 欧美亚洲AN| 欧美三级中文字幕hd| 不卡视频一区蜜桃视频 | 麻豆精品.欧美精品.日韩精品.| 天天看少妇| 操逼免费视频无码国产| 亚洲天天自拍| 日韩99神马视频播放| 美女一区二区国产精品| 欧美色就是色| q2午夜理论片夜色av| 夜夜爽爽爽| www亚洲免费| 96超碰网| 亚州 综合 色图| 婷婷五月天激情网| 人人 操人人 操人人| 亚洲蜜臀精品视频久久| 91在线限制级| 五月丁香激情综合网| 国产精品探花色| 一本久久久精品| 91亚洲影院综合| 天天日天天色| 国产操操日韩三级黄| 91人人操| 少妇高潮喷水无套久久久久久| 亚洲 图片 综合91| 久精品无码av一区二免费国产在线观看| 久久久新亚洲AV| 亚洲亚洲亚洲天堂天堂| 亚洲一本色码中文字幕| 欧美在线官网| 激情综合五月| h无码动漫在线观看| 亚洲欧美成人网站AAA| 大香交| 亚洲大色堂| 爱爱动态120秒| 一区三区啪啪| 日韩性爱免费视频在线网站| 天天夜躁日日躁狠狠2002| 啊啊啊骚| 欧洲性人爱视频| 妇女视频网站| 91九九九馒头| 日韩无码嘿咻黑热久| 国产成人精品亚洲日本| 一类av片在线看| 欧美色宗合| 亚洲狠狠入| 99re在线精品78| 亚洲国产剧情少妇激情| 一道本久久棕合爱| 超碰在线国产| 亚洲精品日韩国产欧美| 国产精品久久久无码AV网站| 强奸乱伦大香蕉| a片 xxxx受爽视频| 欧美啪啪色吧在线| 外国免费性情大片| 精品97久久| 91在线丝袜| 亚洲十八禁止| 操久久久久| 殴洲老熟女| 久久熟妇五十路一区| 欧美.亚洲.另类.丝袜.制服.诱惑| 国产精选三级在线观看| 在线观看日韩av不卡| 国产精品自拍xxxx| 天天摸夜夜添无码小视频| 人人做天天爱| 亚洲图片激情综合另类| 国产精品久久久久无码A√| 日本性感人妻91| 人妻少妇久久中文字幕一区二区 麻豆| 三级色影综合网| 亚91网| 婷婷人妻激情| 蜜臀99久久国产| 亚洲综合在线91| 97精品全部| 成人三级片一区二区三区视频| 人人操人人操人妻人| 亚洲男人天堂手机版| 超碰在线日韩一区| 久久二| 国产乱子伦久久精品综合一区二区三| 久久黄人人爽视频| 精品国产Av无码久久久伦古装| 东京热毛片177b2viP| 1240青青草一区二区三区视频天爱 | 手机在线播放国产福利| AAAAAAAAA黄片| 国产精品久久久久久久毛片1| 亚洲啪啪视频一区二区| 插欧洲美女欧美精品| www.色操逼| 激情婷婷五月天| 亚洲色图超碰在线| 欧美美女在线高潮999| 97看操| a片亚洲一本通视频| 搡老女人老91妇女熟女| 精品人妻久久久久一区二区三区| 欧美色涩| 人妻丰满熟妇一区二区三| 国语国产操逼伊人AV网| 久久综合激情| 亚洲免费精品一区| 欧美大片一区二区三区| 精品少妇一区二区| 天天看天天日| 人人操人人摸人人看人人干| 色爱综合网| 无码99| 欧美日动态视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久久是精品| 九九九一二三| 国产丝袜美女在线一区| 日韩激情啪啪| 天天操女人| 久啪| 久久一区二区蜜桃| 伊人丁香五月婷婷| 717影院理论午夜伦八戒| 精品视频久久久久九九九九9999| 超碰99热中文字幕| 91亚洲黄色网| 久久中文字幕一区不卡| 色丁香久久| 人妻天天爽夜夜爽精品2| 天天激色| 亚州综合网| 啪啪资源网| av中文字幕在线熟女| 亚洲少妇激情视频| 亚洲熟女av中文字幕| 国产成人自拍视频视频| 激情综合亚洲| 欧美日本天堂| 蜜桃久久一区二区| 亚洲情色中文字幕一区| 久久久久久久久久久人妻| 久久久久斤小| 台湾一区国产高清在线| 日韩av乱伦| 老熟妇综合| 一区二区影视| 日本五十路熟女一区二区| 超碰79人人乐| 一本色道久久综合亚洲二区三区| 最新av网站在线观看| 99亚洲天堂| 欧美青青视频| 无遮挡又黄又刺激的视频| 丁香婷婷啪啪| 国产精品国产| 成人免费毛片| 久久这里都是精品| 大粗鳼巴久久久久| 玖玖爱免费观看视频| 美日韩一卡二卡三卡免费人妻精品| 天天日骚逼熟女| 嫩草在线视频| 亚洲不卡不卡中文字幕不卡 | 国产精品探花视频| 97色论| 成人怡红院| 性爱av在线免费观看| 国产25页| 无码精品久久| 高清不卡一二三区视频......| 日韩三级av片| 久久美女福利是上海美女| 久久香蕉超碰97国产精品 | 国产夫妻一区二区| 免费视频一二三区| 婷婷色综合| 久久女女| 多乙久久久久久| 香港日本韩国人妇99www.wccm20| 色波多| 亚州色图第三区| 亚洲黄色电影| 亚洲综合婷婷| 蜜臀va69| 天天躁日日躁AAA片李宗瑞| 麻豆精品三区视频| 色色色色日本| 国桃视频产巨乳精品一区二区在线| 九九精品无码专区免费| 天天综合有色网| 日韩福利电影网| 后X久久| 中文字幕制服诱惑| 亚洲男人天堂Av| 久久岛国| av天天在线观看| 91色香| 嗯嗯啊中文字幕| 999精品女人| 夜夜爽33333| 免费视频一二三区| 欧美三级不卡| 久久大黄片| 亚洲人在线| 在线观看亚洲成人精品| 69人妻精品丰满熟女区| 日韩性爱视频在线免费观看| 天天影视射综合网| 嫩草一区二区在线观看| 俺也射| 丁香六月啪| 午夜啊啊| 国产亚洲 中文欧美久久| 国产精品久久久| 亚洲色欲一区二区三区| 99在线免费公开视频| 91AV天堂| 久久久精品国产亚洲AV无码| 好涩综合| 美女在线H91| 久久精品国内Av熟女高清| 媚薬在线视频麻豆| 亚洲偷拍自拍在线视频| 久久久久国色αv免费观看| www.色婷婷| 老熟女乱伦片| 免费啊啊啊| 大地资源在线观看中文第二页| 啊啊啊啊嗯嗯在线久久久| 夜夜一区二区| 日韩欧洲操屄视频| 日韩中文9| 狠狠色综合网| 九九九精品成人免费视频小说| 欧美A√综合网| 亚洲精品a人片在线观看视| 五月天久久人妻| 99热色这里只有精品| 欧美日韩黄片精品在线| 久久久成人免费av电影| 国产欧美伊人| 波多野结衣被操50分钟免费视频| 国产精品久久久午夜夜伦鲁鲁| 亚洲 综合 欧美| 青青免费在线视频一区 | 久久蜜桃综合网| 久久AV无码网址| 日韩小电影| 中文幕97| 天天射影院| 伊人丁香五月婷婷| av影院十区| 亚熟在线| 成片免费播放| 国产精品白丝在线播放| 亚州精品人妻一二三区| 色女综合| 色情五月综合婷婷| 家庭乱伦国产精品| 深夜激情| 天美欧美国产| 久久草草欧美精品| 黄色网址在线免费观看| 欧美精品三区| 夜夜高潮夜夜爽国产伦精品| 亚洲日韩青青草色月| 国产精品国产拍高清AV| 黄视频免费| 国产成人五月天丁香花| 丝袜av一区二区三区| 黄污污污污| 人人摸人人添人人操| 午夜超碰| 天天综合网视频91| 麻豆伊人网| 97精品国产97久久久久久| 啪啪资源网| 91欧洲国产成人久久精品网站| 亚洲素人综合| 国产 大胆 对白| 久久国色天香香蕉| 69精品人人人人| 免费簧片在线观看| 久久久精品91八戒| 91网站18| 久久大香蕉97| 精彩久久中文| 伊人久久大香线综合无码| 五月天综合网| 高清在线偷拍自拍视频| 久操网视频| 国产精品国产亚洲区艳妇糸列| 国产精品97视频| 男人天堂网手机版婷婷| a人欧美综合天堂麻豆| 欧美精品另类人妖xxxx| 99久久9| 爆操无码| 午夜无码精品免费看性色| 国产 亚洲 一二三四| 男人午夜天堂| 国产精品视频在线观看| 国产激情在线| 97久久超碰亚洲| 色香综合天天影视综合 | 亚州国产成人精品女人久久| 成人A片男人的天堂| 91女人的网站| 校园春色之综合网| 人人人人人人少妇| 亚洲综合五月天| 国产亚洲国产超碰| 人人做人人妻人人夜视频| 青青久久手机线视频| 国产精品 久久久精品一牛| 国产精品成人AV片免费看网站| 亚洲资源站| 亚欧美综合网| 午夜在线播放| 91精品人妻| 操熟女91| 91综合站| 在线亚洲欧美| 久久精品国产Aⅴ| 午夜操一操| 七月丁香婷婷| 91在线视频国产网站| 久久久96| 国产强奸乱伦欧美| av一区二区三区不卡| 欧美极品美女aaaaaa级黄片| 亚洲乱码精品一区二区| A级片日韩欧美国产欧美视频精选观看| 黄片免费日韩| 91人精品妻入口| 丁香九月 婷婷| 91午夜无码| 九色在线熟女国产黑人| 午夜欧美女人操逼| 欧美视频在线视频免费va| 爱我干综合| 一区二区 韩日AV| 伊人久久青青草| 春色校园综合网| 男人 天堂 日 亚洲| 日韩精品作爱导航| 日本天天干天天日一区| 蜜臀99久久精品久久久久久| 91爱剪切久久| 男女啪啪网站免费视频| 日韩欧美午夜一区二区| 亚洲国产精品无码AV在线| 8050午夜少妇无码| 99色视频| 欧美熟女激情| 97丝袜亚洲在线播放| 国内成人圈中文字幕无码视频| 新91视频.cmp| 97在线免费观看视频| 少妇厨房愉情理伦片bd在线观看| 国产精品爽爽v| 爽 好舒服 无码刺激久久| 99在线精品视频| 久久综合日韩亚洲欧美| 欧美猛交黑寡妇中文字幕| 中文一区二区| 神马午夜久久| 国产在线强奸视频| 女人被添高潮免费视频| 久久免费中文字幕在线观看| 91天美传媒在线观看| 安微少妇操BBB| 欧美天天| 精品亚洲黄色片 国产精品导航一区二区 | 久热久一区二区三区| 日韩精品怡红院| 国产精品伦理| 98人妻精品一区二区色欲| 综合久久六月久久婷婷| 日韩精品99999| 97干天天| 欧美精品激情| 日本一区视频在线观看| 在线国产探花| 97色色色综合网站| 亚洲双插| 日本性交操一区二区不卡系列| 自拍大香蕉乱插| 97人肏| 搡老女人老91妇女熟女| 一区二区高清视频| 日本操逼视频导航| 欧美 亚洲 综合 制服| 午夜后入| 久操视频在线观看| 精品区国产区一区二区三区| 蜜桃传媒一区二区亚洲| 久久久性少妇| 岛国在线国产| 丁香五月激情综合| 老女人碰碰在线碰碰视频| 人人妻人人爽一区二区三区| 91丨豆花丨熟女| 激情综合五月天| 亚洲综合69| 亚洲国产精品无码AV久久| 思思性爱| 蜜桃视频一区二区三区在线观看| 国产9熟妇视频网站| 国产精品网址| 97视频观看| 人妻少妇无码| www.久久最新地址| 久久久久久久久久久人妻| 天堂av最新电影网| 91深夜夜| 亚洲不卡不卡中文字幕不卡 | 天天看天天在线精品| 伊人影院在线理论播放| 插插综合网天天影视网| 日本十八禁免费看污网站| 超碰亚洲欧美日韩无| yazhououmeizongya| 亚洲欧美自拍偷拍| 综合日韩激情另类图片| 97干在线视频| 日韩性爱网址| 免费亚洲国产精品久久一区| www.色吧5.com| 欧美成人9797| 91热热色| 无码抄逼网| 女人的天堂大香蕉网| 久久成年片色大黄全免费网站| 五月婷婷六月天| 午夜视频久久久| 久久精品店| 久久草视频污视频| 天天躁日日躁成人字幕aⅴ| 九九热免费国产视频婷婷伊人 | 在线播放一级无码视频| 97激情97激情| 麻豆久久精品亚洲精品88| 欧洲色| 我要色综合网站| 在线看免费无码AV天堂的| 色妇91| 中文字幕乱在线伦视频中文字幕乱码在线 | 久久中日麻豆| 男女激烈网站最新| 欧美激情片一区二区| 精品免费视频国产一区| 欧美九九爱| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 国产精品久久成人免费| 97国产伦理| 国产女人操逼视频| 91精品免费| 国产浮力影院第1页| 欧美日韩天堂| 色噜噜精品一区二区三| 日韩欧美天天爽爽爽天天爽爽| 人人操人人插人人摸人人干| 热久日综合| 免费的很黄很污的全部视频| 91天美传媒在线观看| 乱伦一区二区三区‘| 黄色不卡视频| 狠狠操夜夜| 丰满丝袜少妇AV| 黄色片大香蕉| 亚洲成人在线乱码色午夜| 五月天激情小说| 亚洲影视综合| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 精品国产91久久久久久一区黄无| 92性色国产午夜福利在线661| 抽插爽| 欧美性爱第一区| 久湿久久 | 欧美姓爱综合网| julia高潮后不停追击中出| 外国91| 91在线免费观看处女| 国产精品午夜福利亚洲综合网| 丝袜无码a片| AV不卡在线| 97精品一区| 国产 日韩 欧美 人妻 熟女 中文| 偷拍 亚洲 欧美| 嗯嗯嗯啊啊啊操的我好爽| 国产视频一区二区三区在线免费观看 | 超碰人人操97碰| 人妻无码视频一区二区三区久久| 在线国产探花| 97在线视频免费观看| 天天综合影院91| 国产亚洲中文不卡二区| 国产中文字幕在线| 少妇一线天久久久久久| 狠狠久久手机视频精品| 久久99精品九九久久久婷婷| 日本午夜精品理论片A级APP发布| 久久尹人大香焦视| 欧美狠狠鲁| 亚洲av影院在线观看| 亚洲欧美97| 国产又大又粗又长视频在线| 久久久久国产精品喷潮免费观看臀| 亚洲中文字幕av| 久久9久9久99久9久9| 久操网址| 麻豆AV一区二区天美传媒| 色婷婷在线视频精品导航| 中文字幕精品一区二区精| 婷婷国产精品一区二区| 欧美色图亚洲特色| 男男H黄动漫啪啪无遮挡网站| 亚洲风情在线观看| 欧美成人综合| 99热在线播放| 久久五十路熟女人妻| 九九九九亚洲| 精品十三区| 午夜天堂啪啪| 国产日韩手机视频在线| 亚洲天堂一二| 欧美 日韩 国产传媒| 爽 好舒服 无码刺激久久| A 天堂| 色五月AV在线| 九一屌逼| 日韩性爱高清免费视频| A片大香蕉在线| 97ai亚洲| 狠狠夜色午夜久久综合在线| 超碰精品在线| 91精品久久久久五月天精品| 欧美精品庄| 性欧美精| 肉丝网站91| 婷婷久久五月| 手机在线A片| 99re免费| 久久一二三四五六七八九区| 久久九七| 色噜噜狠狠色综无码久久合欧美| 欧美性爱第一区| 97超碰日韩| 天堂精品| 97日视频| 高清不卡视频| 99热综合| 操逼片中文| a片偷拍视频| 性色综合网| 97爱啪| 国产熟妇一区二区| 麻豆2区1区天美| 乱色视频中文字幕| 操操操日本的逼| 乱伦一二三| 熟妇色99| 青青草在线视频美女| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 蜜臀AV一区二区三区激情综合| 欧美一级A片在线看视频性色| 丁香九月 婷婷| 极品国产内射| 麻豆成人影音在线| 91天美免费| 97久久天天综合色天天综合色电影| 综合网欧| 亚州成人a∨| 日韩在线76| 99ri视频| 欧美刺激色黄片免费看| 黄色区免费观看中文字幕| 性饥渴少妇av无码毛片| 91老熟女| 我要色综合网| 欧美 亚洲精品首页| 嗯~啊~轻一点 视频| 天美传媒av在线| 啊啊啊好大好湿| 青青草白白色| 欧美色图私拍91| 青青爽| 最新AVzaixian| 久久精品小视频| 婷色五月| 九九亚洲视频| 色九区| 日本片日本片祼观看网站在线看中文版网页在线看 | 凹凸久久人人| 久草国产在线视频| 国产毛片在线| 成人七区| 综合免费无码中文| 高清无码 国产精品| 国产AV毛片| 草草网站影院白丝内射| 天堂无码精品国产久| 乱伦图一区| 亚洲毛片一级带毛片基地| 色嗨嗨在线| 一级特级aaaa毛片免费观看| 日逼国产| 在线视频日韩欧美国产| 韩国一级婬片A片AAAAA| 五月色网| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 日本在线激情一区二区三区 | 久久五月天婷婷丁香中文字幕| 人人看人人爰人人操| 国产自产自拍| 久久精品国产96精品亚洲拳交| 女同性恋久久| 人妻中文在线| 麻豆2区1区天美| 日本裸体久久色噜噜| 男人干美女| 亚州日韩97| 呻吟 欧美 日本 中出| 超碰97人人乐| 97在线视频网站| 呦呦一区| 久热在线精品免费观看| 3P乱轮视频| 日本肉体xxxx裸交| 狠狠久久亚洲欧美专区| 欧美少妇一区二区三区| 91处女视频在线观看| 秋霞鲁丝午夜无码一区二区三| 欧美手机在线综合| 亚洲成成熟女人综合一区二区| 亚洲加勒比| 国产精品亚洲无码| 国产精品成人福利在线| 日韩免费性爱视频在线观看| 屌逼麻豆| 99re在线观看| 97超碰免费生活| 男人的天堂VA| 一级婬片120分钟试看| AV污污污污| 性爱动态120秒| 久久久∴| 91制服丝袜| 欧美片第一页| 秋霞蝌科网日本一区| 一区二区三区四区色图| 嫩草伊人久久精品| 9久9久9久9久视频网站| 日本成人在线不卡一区二区三区| 国产在线强奸视频| 国产精品秘 福利姬在线观看| 女人天堂AV五区在线| 素颜老阿姨乱情色| 日本在线999| 黄片qw| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 欧美白嫩在线放| 九九五月天| 亚洲 小说 欧美 激情 另类| 秋霞曰韩R级| 欧美亚洲性爱一区二区| 屁股久久久久久久久| 91亚洲人| 国产精品69人妻无码久久久| 嗯嗯嗯好爽| 亚洲男人的天堂网| 亚洲情欲| 黄色性爱网网| 欧美熟妇精品黑人巨大一二三区| 超碰偷拍| 国产精品视频自拍在线| 日本片日本片祼观看网站在线看中文版网页在线看 | 久久性爱视频免费看| 思思热免费视频观看| 久草精品国产蜜臀| 男人的天堂com| 污污汅18禁网站在线永久免费观看| 大香樵伊人网| 蜜臀久久精品久久久久视频| 亚洲无992tv| 亚洲日本韩国在线| 97色涩| 国产精品九九九| 免费人成?大片在线播放| 久插综合| 91九九| 99超级碰免费视频| 中文字幕在线2| 伊人一级免费黄片| 开心五月激情网| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 久久99久久99精品天美传媒棢·纸:. | 香蕉国产精品麻豆亚洲欧美日韩| 99操视频| 国产精品九九| 人妻献身系列第54部| 天美国产精品| 亚洲精品国产拍免费91在线| 淫荡少妇免费| 精品乱子一区二区三区99| 久久久久久久九九九九| 午夜福利成人免费视频| 亚洲天堂人人妻| 日语五十路和六十路亚洲国产精品| 激情AV| 怡红院亚洲怡春院av| 国产日韩欧美中文在线播放| 99久久无色码| 老熟女综合| 一区二区三区机械有限公司| 97精品97久久| 午夜一级免费毛片| 欧美亚洲第1页| 东京热毛片177b2viP| 久久99精品视频| 俺也射| 成人 日本A片无码8888| 久久国模av| 久久中文字幕一区不卡| 久久免费中文字幕在线观看| 天堂性色| 岛国黄色短视频| 伊人97色天使| 97干97色| 日本一区三级韩国| 欧美色网络| 天天插天天干| 久久中文字幕人妻熟av女蜜柚| 国产浮力影院第1页| 人妻丝袜肏逼| 欧美αv.com| 熟妇一区二区三区| 囯产精品久久久久久久久久梁医生 | 99精品成人免费看| 国产一区二区三区久久精品太古里| 亚洲国产成人精品久久久国产成人一区二区| 日韩成人网址| 高清无码91| 中文激情网| 欧美综合天堂| 91操人视频| 加勒比99999| 五月综合激情网| 国产精品诱惑| 亚洲午夜免费狠狠干| 97色色色| 搡老女人老妇女老妇老熟女怎么读| 久久久999| 亚洲AV免费在线观看| 日本操逼aaaaa| 裸模AV女优| 亚洲国产欧美另类自拍| 一区二区国产视频在线观看| 欧美日本中字另类在线| 青青操视频在线| 久久精品国产亚洲AV成人直播| 黑人综合色| 色色五月丁香| 天美传媒AV在线播放| 男人的天堂激情| 国产精品视频91久久| 久久久久亚洲精品| 操高情无码| 蜜桃传媒视频第一区入口在线看| 精品-91人妻子系列| 97超碰色情| 国产精品制服丝袜中文字幕日韩一区二区三区 | 人人看人人摸人人色| 精品人妻一区二区蜜桃视频 | 亚洲色图欧美色图日韩色图| 99国内熟女露脸视频| 国产综合操逼高清| 亚洲a色| 91女神在线视频| 嗯啊视频免费在线观看| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 丝袜无码a片| 日韩在线观看字幕精品| 欧美亚洲清纯| 久久午夜伦|