日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
国产高清自拍视频| 久久久久久久综合,国产| 国产久久一区二区午夜| 亚洲一区二区av| 欧亚 另类 久| 国产亚洲精品A在线观看下载| 91呆哥人妻| 夜夜嗨一区二区三区直播内容| 色激情综合网站| 欧 美 自 拍 偷 拍| 久久精品一区一起草| 亚洲欧洲国产综合av| 天天操天天射青青草| 美女黄站| 另类图片欧美激情综合| 97超碰磁| 女优大全 - 91n| 四虎精品亚洲| 国产三级中文字幕粉嫩| 国模吧 一区二区三区| 五月天色图影视| 蜜桃臀av在线观看| 四虎影视在线| 久久是精品| 蜜臀视频网站| а√天堂资源官网在线资源| 搡老人老9丨女老熟人| 丁香五月综合| 夜夜操91744565| 久久久九| 91在线秘 男同| ,成人免费啪啪视频| 男女啪啪啪18禁网站| 午夜福利免费福利视频| 水澄无码AV| 自拍视频大全亚洲专媒视频/一区二区三区 | 精品无码一区二区三区| 黄片aaaaa一区| 日本天天吊| 欧美亚洲中文字幕| 先锋色眉乱伦资源| 中文字幕免费看大片| 神马精品视频| 夜夜高潮夜夜爽夜夜爱爱一区| 无码国产Av| 九草九九九| 色噜噜人妻丝袜AV资源| 蜜臀久久久99久久久久 | 亚洲九九爱| 精品四五区| 五月激情综合网| 另类TS人妖一区二区三区| 久热久一区二区三区| 99久久久无码| 97在线观看播放视频| 无码精品蜜桃一区二区三区ww| 熟妇高潮一区二区免费视频| 日欧毛片久久| 女优大全 - 91n| 中日韓欧美高清| 色婷婷av在线观看| 亚洲一区二区久久久久| 日韩在线一区高清在线| 少妇被c 黄 免费观看| 久久久久96| 欧美午夜精品久久久久久3D| 亚洲三级网址久久最新| 婷婷激情一区二区三区俺也去| 99精品欧美一区二区三区桃色| 天天综合-91入口| 亚洲视频二区 | 校园春色亚洲欧洲| 99国产天美| 日韩在线观看中文字幕视频| julia国产在线 | 日日操丁香五月天| 日韩精品国产精品五码一区二区| 中日韩欧美精品无码AⅤ一区二区| 中文幕97| 人妻少妇精品一区二区三区| 综合熟妇一区二区三区| 二区熟妇韩日| 成人黑料社久久| 黄片视频观看| 97网址97| 欧美亚洲国产自久久| 国产h片在线观看视频| 台湾佬大香蕉| 曰韩少妇无码| 性色中出| 婷婷综合五月天| 国产黄片在线免费观看| 天天综合网网欲色| 大逼色网站| 91精品婷婷国产综合久久竹菊| 91啪啪| 亚洲成人性| 亚洲在线| 欧美手机在线综合| 亚拍在线| 欧美亚洲高清不卡| 麻豆激情综合| 97干天天| 伊人操操| 青青伊人加勒比海| 啊啊啊好大好湿| 熟女精品一区二区三区| 日本一级性爱| 在线视频一区二区传媒| 六月婷婷激情| 国产树林里野战在线看| 欧美精品23| 色与欲影视天天看综合网| 久草视频观看视频在线| 亚洲精品一区二区免费在线观看| 亚欧中文字幕在线视频| 丁香五六月啪啪| 被男人吃奶很爽的毛片| 国产精品午夜福利| 午夜久久无码1000合集| 精品一区二区三区18| 精品国产乱码久久久| 蜜桃色院一区久久| 日本午夜久久电影| 成人黄页| 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲欧洲偷拍一区| 色综合久| 性爱精品一区| 亚洲成人免费电影| 亚洲最大91网| 伦理弟一页| 中日992视频| 91精品国产长腿丝袜美女| 好看的久久不射无码影视影院| 欧美传媒一区| 97chaopengongkai| 免费亚洲黄色视频在线观看| 久久99久久99精品免视看婷婷| 久久久久骚| 国模91| 热99re69精品8在线播放| 久久久精品久久| 欧美天天综合| 亚洲天堂热| 97色论| 精品人妻一区二区三区不卡断| 亚洲精品久久久久毛片A片拉屎| 日日日日做夜夜夜夜无码| 在线a v| 久草成人福利导航| 男人的天堂三级| 久久久久人妻二区精品叶可怜| 国产一区二区精品久久99| 内射日韩大臀美女| 国产精品久久久午夜夜伦鲁鲁| 九九久久精品| 黄色一级视| AV天堂国产| 日本一级真人黄色性爱视频| 欧美另类综合久久| 久久久久人妻| 色香蕉影院| 日韩精品影视| a人欧美综合天堂麻豆| 亚洲欧洲另类| 综合色色网| 欧美中字二区| 人人操人人操人人人操| 欧美91丝袜| 婷婷五月激情综合| 欧洲久久一二线| 日韩国产成人自拍视频| 爱妻综合网| 2017人人操,人人摸| 精品国产乱码久久久久久久久久毛片| 三级三级三级日本99| 久久精品国产96精品亚洲拳交| 久草视频制服诱惑| 色999人与兽| 热热色综合网| 香蕉综合网| 搡老熟女老女人老熟妇免费视频| 伊人97色天使| 亚洲综合春色| 91无码中出人妻视频| 国产精品第一页国产大屁股视频免费区| 欧美日本天堂| 啊啊啊97视频| 国产精品无码在线| 日韩99神马视频片| 欧美色图片91| 中文一区二区| 物业黑人 AV一区| 久久久99999久网站| 丝袜视频一区二区在线播放国产中文| 伊人久大| 国产久9| 国产乱伦亚洲色图高清无码| 性暴力欧美猛交在线直播| 日韩国产九九精品一区二区三区毛片| 久久五月天婷婷丁香中文字幕| 91精品黄在线观看| 成年人黄色视频免费| 97视频在线观看网站| 美中韩AV综合网| 日韩人妻一区二区| 丰满欧美放荡少妇在线| 传媒免费一区二区三区| www.伪伪| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 天天在线91| 天天爱天天操| 能在线播放的国产三级| 夜夜爽夜夜操| 91亚洲丝袜熟女| 超碰97久久观看| 亚欧精品久久久久久久久久久| 日韩熟女无码| 亚洲久久久久| 亚洲在钱| 一区二区三区在线日韩影院观看| 黄色大片一区二区密桃丝袜| 欧美日日操| 欧美,日韩,中文,另类| 1区2区3区中文字幕日韩| 九九久久久九九| 宅男91视频在线播放| 五月丁香啪| 91碰碰碰| 免费视频观看60秒| 9久热| 久久久96| 九九九999久久久网站| 在线日韩视频| 黄色网址在线免费观看| 一区二区播放| 免费在线黄片视频| 97在线欧洲| 国产9熟妇视频网站| 日韩国产中文字幕| 久超碰在| 国产AV天美| 久久大香蕉97| 强奸乱伦 亚洲一区| 日日AV加勒比| 4虎在线视频| 国产丝袜美女在线一区| 九九色色| 日本东京热久久久电影| 欧洲亚洲国产综合在线| 国产熟女无套内射| 国产高清吃奶免费视频网站| 亚洲午夜福利视频| 亚洲最新a在线观看| 亚州大图综合色图| 女同女同恋久久级三级| 伊人五月天青青草婷婷| 国产 亚洲 丝袜 制服| 顶级少妇BT天堂| 久久极品伊人| 九九九九88| 超碰久超碰久| 人人摸人人干| 怡红院怡春院| 97精品97久久| 天天视频黄| 淫荡网址| 亚洲无码 国产无码| 久草精品热视| 人人操人人大香蕉| 99re视频在线播放青草| 亚洲AV无线| 久久久草成人网站久久久草成人久久久草久久久 | 日韩久草| 日本中文字幕在线电影| 麻豆天美传媒在线视频天堂| 色欲三区| 亚洲欧美日韩有码| AV九九| 少妇蹲下露出大唇5| 无码乱人伦中文视频| 日韩BBN| 91色久| 国产亚洲女v在线观看| 熟妇人妻丰满久久久久久久无码 | 蜜臀无码视频在线观看| 欧美高潮在线| 狠狠躁AV| 青青国产精品在线| 精品无码一区二区三区| 97爱综合| 人妻精品一区二区全免费| 岛国黄色大片网站| 九九九久久久W精品| 欧美黑人XXXⅩ高潮交| 中文字幕青青草| 久久久五月天| 中国一区二区亚洲人妻| 国产日产精品久久快鸭的功能介绍| 208天天久久九九九| 伊人97色天使| 天天插天天射| 色色激情五月天| 99视频内射三四| 强奸乱伦大香蕉| 欧美人与动性人交a| 91爱网| 久久久久久99AV无码免费网站| 日本一天色道久久久精品视频| 影音先锋少妇| 中文字幕国产| 八戒无码国产午夜福利| 97av,com| www.婷婷五月天| 国产欧美日韩精品中文| 亚洲综合五月天婷婷丁香| 人妻天天操天天爽视频免费| 都市激情人妻一区二区青青操视频| 亚洲欧美一区二区三区在钱蜜桃| 91free福利| 免费少妇一区二区| 加勒比日本在线| 欧美日韩黄片精品在线| 91欧美www| 性性久久| 91艹逼精品| 超91综合网| 亚洲图片欧美在线视频| 国产性久久久| 超碰色男人操熟女| 啊啊啊想要| 国产后入清纯| 亚拍在线| 亚州高清av| 精品网站9999| 欧美精品91| 日日碰狠狠添天天爽超| 极品白嫩美女白浆成人福利在线看| 国产高清自拍视频| 黄色无码高清黄色无码网站| 成人情色综合网| 国产性感在线观看| AV天天在线观看| 偷拍亚洲高清图片| 1区2区3区中文字幕日韩| 天天日日本| 国产一区麻豆免费观看| 老熟妇一区二区三区啪啪| 夜夜人妻爽| 男人的天堂日韩| 美女黄页网站| 成人一二| 夜夜影视四色| 久久综合五月天| 蜜色网色哟哟| 蜜桃精品一区二区三区久在线| 精品一区96| 噜噜噜亚洲精品| 亚洲熟女乱色一区二区三区| 热热色国产一二区AV| 资源在线观一 二| 超碰在线观看av不卡| 亚洲久久久久| 天天影视亚洲| 97精| 强奸熟女一区二区三区| 欧美日韩亚洲一区二区在线观看| 国产一区二区三区,在线观看观看| 中文字幕日韩人妻视频| 绑缚麻绳人妻寝取完整版| 国产无码三级视频在线观看| 91精品伊人久久久大香线蕉91| 亚洲色图尤物视频| 91女优在线观看 | 国产精品视频播放| 欧美中出| 欧美性高潮在线| 色噜噜狠狠色综无码久久| 国产精品一区二区黄片| 啊啊啊啊视频免费| 18禁的网站在线| 天天综合网~91| 狠色婷婷久久一区二区三区_| 视频一区二区三区精品| 精品一区二区亚洲国产| 少妇丝袜在线观看AV| 五月丁香综合| 久久成人东京热人妻| 久热精品色情| 内射中出日韩在线观看视频| 亚洲码专区| av2014 日韩在线中文字幕| 熟女丰满人妻一区| 欧美亚洲美少妇一区二区| 久久久久久亚洲中文| 亚洲一区二区三区播放在线| 亚洲AV永久无码一区仙野| 国产97色在线| 韩国黄色片精品久久久| 日小BB小视频| 欧美性爱第1 页| 99夜夜操| 麻豆黄四叶草网站| 99999久久精| 91网站18禁| 天堂国产AV| 色婷婷久久| 欧美激情视频在线一区| 色色99| 欧美伦乱爱| 国产热av| 色噜噜综合在线| 亚洲成人碰碰| 大香蕉在线视频重口味毛片在线| 欧洲亚洲人人爽爽视频| 欧美片第一页| 韩日精品四区| 欧美在线视频99| 91偷拍欧美亚洲| 神马午夜久久久| 国产精品肉丝自拍| 欲色啪| 日韩精品永久在线观看| 天天日天天干天天摸天天操| 日韩电影中文字幕| 日韩在线欧美精品一区二区| 自拍大香蕉乱插| 国产亚洲中文不卡二区| 国模限制级电影| 欧美精品23| 国产成久久综合片| 一区不卡在线观看av| 综合免费无码中文| 色综和网| 飘花国产午夜精品不卡| 情趣丝袜无码操逼视频| 美国日韩黄色片| 日韩综合97P| 夜色97| 综合欧美激情网| 免费强奸av| 色婷婷电影| 欧美丝袜中文字幕07在线| 人人操人人操人人人操| 92性色国产午夜福利在线661| 亚洲综合第一页| 九九热精品在线| 天天射天天操天天干天天吃2018| 久久人妻| 欧美韩日精品资源| 91处女视频在线观看| 久悠悠av| 国产女人成人精品视频| 国产人伦a片信息免费片| 大香蕉免费3| 日日躁天天躁狠狠躁| 2020中文字幕在线| 熟女熟妇一区二区三区视频| 蜜桃精品一区二区三区久在线| 美女主播色欲91抠b在线播放| 91 在线亚洲| 国产suv精品一区二区四区999 | 亚洲精品九九九九九九| 日韩色女精品| 91色色综合| 日韩国产十八禁| 色大香蕉97N| 天操天操夜操夜月月年年操操| 99在线观看无大码| 俞拍自拍| 天久久久噜噜噜久久国产精品爽爽 | 日本韩欧美在线播放a| 大香蕉丝袜一级片| 国产精品对白内射| 色综合99999| 日韩无码人妻中字久久三区四区| 亚洲一区二区中文字幕| 久草线上视频免费看| 久久久精精精| 黄片视频,下载| www.婷婷| 人妻少妇精品久久久| 在线电影亚洲色图| 亚洲日韩av专区无码| 欧美日韩一区二区三区四区蜜桃| 九九久久99| 日本精品性生活久久久| 欧美极品少妇| 91人妻人人妻| 欧美激情视频在线一区| 人人操肉肉| 国产女同在线观看视频| 伊人色综合欧美| 91网站18在线| 伊人久久大香线综合无码| 999综合色| 日韩成人精品| 午夜精品久久久99热蜜桃的功能特点| 欧美后进式| 草草草视频在线免费看| 色综合加勒比四四季| 亚洲图片欧洲图片aⅴ| 2026国产精品视频| 五月亭亭六月丁香| 韩日巨乳美女免费视频在线观看| 岛国AV一区二区电影| 超碰到97情色| 五月天人妻综合| 91影库| 91黑丝少妇| 高清无码 国产精品| 超碰在线看| 国产熟女无套内射| 国产路线专区| 人妻少妇精品视频一区二区三区| 日本不卡二三区| 日本最新1区2区3区| 91操操| 日本中文字幕不卡视频| 精品无码一二三四区| 色综合久久88色综合久久天天| 少妇大屁屁| 久热久一区二区三区| 国产成人一级av88| 日本人妻最新在线中| 欧美色综合图片| 色哟哟511老熟女| 中文久久96| 黄页大片在线观看| 亚洲国产精品成人无码久久久| 国产夫妻性生活视频| 男人久久精品| 女同性恋一区二区三区精品视频| 欧美极度丰满熟妇hd| 婷婷伊人五月| 国产风韵犹存熟妇三区| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 97AV爱| 日韩中文字幕视频在线观看| 一牛影视成人片免费| av三级电影在线播放| 男人天堂最新手机版在线青青草| 日日日色色色色色| 成人综合网 欧美| 欧美大香蕉97| 欧美人妻色| 97亚洲国产影视| A V少妇特黄三级| 亚欧免费观看视频| 九九碰九九爱97超| 久久精品熟女亚洲AV麻豆软件| 国产99999久久精品| 97久久精品亚洲中六字幕| 日本曲间由美性生活片| 东北女人av| 超碰免费在线| 啪啪视频亚洲第一| 色欲av一区二区三区蜜芽| 久久嫩草| 老熟妇乱轮| 一区二区三区视频| 五月天久久综合网| 欧美亚洲国产91在线| 亚洲欧洲激情卡通另类文学四射小说网站 | 91亚州日韩高清| 激情五月综合| 日韩精品人妻中文字幕有码午| 另类av综合久久| 亭亭在线资源| 蜜臀久久99精品久久久久久无删减| 女人天堂av在线播放| 九九操久久国产免费视频| 久久超碰国产一区二区三区| 亚洲精品精品一区二区| 91黑丝少妇| 欧美嫩性色| 91天射| 天天内射| 97天天日| 操逼视频免费日韩无码| 超碰三级秋霞| 日韩丨制服丨中文|在线| 国产精品久久蜜乳av| 八人操人人摸人人看| 久久激情五月| 欧洲天天在线| 亚洲蜜臀视频精品久久| 张柏芝国产一区在线观看| 370p日韩欧美亚洲精品| 欧洲无码一区二区| 九九九九一级| 精品丝袜无码一区二区三APP| 亚洲精品无码成人久久久99| 五月综合激情网| 好爽免费视频,| 91在线免费精品视频| 国产乱伦一二三区| 亚洲成人精品久久久| 亚洲欧洲无码一区夜| 五月丁香黄色网| 91精品国产综合久久久蜜臀| 天天澡天天爽日日av| 超碰在线人妻中文字幕| 九九热男人天堂| 懂色AV网| 六十路日本| 91亚洲丝袜| 日韩不卡在线一区二区| 啊啊啊啊啊好大好舒服想要| 夜草网站| 久久久久久大| 岛国在线国产| 婷婷五月天成人网| 蜜臀AV午夜精品久| 一道本久久棕合爱| 操逼网站网站| 91草草草| 日韩欧美字幕亚洲一区二区| 加勒比人妻综合| 欧美不卡在线一区二区| xxx亚洲午夜天堂| 欧美亚洲一级在线观看| 欧洲精品区| 久久人人舔人人爽舔人人av片| 天天操女人| 高潮毛片无遮挡高清免费| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 超碰这里有精品| 成人开心网在线视频| 日韩不卡av一二三| 91春色| 天天爽爽爽爽| 午夜男女爽爽爽影院视频| 老师充足的奶水小说| 91成人久久| 欧美激情综合| 日韩综合第八区国产精品| 六月丁香网| 在线看污网站| 国产原创精品| 91操碰| 亚洲欧洲日本精品中文a∨| 日本大香蕉| 我爱大香蕉| 日韩簧片免费看| 国产熟码AV| 99久久综合| 中文字幕jul-617人妻熟女| 天天射日日干| 青青操日韩| 9久综合网| 欧美成人一级免费电影| 99亚洲国产精品色一区二区三区| 亚州Av天美传媒| 国产精品高潮久久AV| 精品久久久久久亚洲| 中日韩久久久| 性久久| 久久综合资源一区二区| 农村妇女精品一二区| 欧美特大AA级黄片| 欧美999| 日本加勒比无码专区| 九九探花视频在线观看| 78精品在线| Av手机版天堂网| 日韩免费a级毛片无码a∨| 婷婷中文字幕| 无码精品久久久天天影视| 亚洲精品久久久久久久蜜桃臀| 欧美色性爱| 国产无码成人无码| 4虎在线观看| 亚洲男人天堂手机版| 躁躁躁日日躁2020| 色香伊人| 中文字幕免费在线观看| 青草园大香蕉| 国产天天看| 麻豆久久久久久久久丝袜 | 亚洲精品一二区| 91日韩网站| 中文字幕99999| 超碰97人妻免费在线| 97爱爱| 91啪啪| 亚洲国产成人精品999| 中文字幕一区二区三区高清| 91色婷婷综合久久中文字幕二区| 婷婷五月天基地| 婷婷三区| 加勒比伊人影院| 欧美亚州色的图| 啊啊啊爽爽| 校园春色亚洲| 秋霞一集毛片观看| 制服乱伦| 欧亚不卡| 亚洲 欧美综合| 精品亚洲国产成人av网站| 丰满人妻一区二区三区免费,| 久偷拍| 97网色| 日韩 欧美 另类 人妻| 做爱A级亚欧| 97WW精品| 亚洲少妇色| 成人精品视频| WWW.操逼.COM| 乱伦av麻豆| 天操天操夜操夜月操月年年操| 蜜桃视频一区二区三区 | 东北熟女91| 亚洲免费人妻在| 91久久堂| 五月天人妻综合| 国产日韩欧美亚洲精品95 | 2019天天干| 午夜精品久久久久久久久久蜜桃| 长长久久免费视频| av橘色网站| 三级特黄60分钟播放| 日本性爱少妇| 激情五月婷婷| 九九九九精品一区| 久综合国内精品自在自线| 人妻激情偷乱视频一区二区三区 | 日韩99999| 92午夜免费福利视频| 日韩中文字幕2020| 国产精品久久久久久无码红治院| AV高清一区| 少妇一区二区三区| 五月天伊人| 色九久| 超碰天天久久79| wwwxxx日本爽| 欧中日成人免费影视| TS人妖另类精品视频系列| 情色日播放AV| 深夜激情| 五月综合色| 亚洲超碰综合网| 久99热| 男人午夜天堂| 伊人AAA| 久久产精品一区二区三区电影| 久久理论字幕视频| 午夜一区二区三区国产| 欧美久久人妻少妇一区二区| 欧美午夜一区二区三区| 欧美午夜视频| 久久婷婷五月天| 亚洲囯产精品女人久久久| 黑人与人妻| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 91欧美美女日韩国产婷婷| 八戒午夜福利理论片| 亚洲天堂少妇| 九九热在线视频| av在线一区二区三区| 亚洲自拍97| 97在线青| 亚洲免费精品一区| 色情综合| 萌白酱自拍视频| 亚洲97成人在线观看| 热久久无毒不卡| 夜夜夜久久| 国产精品久久久久久久AV大片| 校园春色 亚洲| 密臀视频一区二区三区| 久久精品老司| 亚91亚洲网| 激情五月天丁香| 免费簧片在线观看| 国产精品蜜臀久久久久无码AV| 国产日韩在线播放| 啪啪啪综合网| 好吊色一区| 中文字幕视频在线观看一区二区| 丁香五月影院| 人人看欧美性爱| 3d成人精品一区二区| 天天日天天干天天操| 色噜噜狠狠色综无码久久合欧美| 大香网伊人久久综合网eew| 亚洲国产剧情少妇激情| 99re6久热只有精品6在线直播| 四虎影院成年人片| 激情视屏国产乱伦强奸| 一区二区三区亚洲| 尤物网址| 国产精品亚洲一级av第二区| 97视频在线免费| 国产精品色哟哟| 蜜臀av中文字幕| 久婷婷一区| 久久久网一区| 91路www| 亚洲色图第四色| 免费视频观看60秒| 欧美色图亚洲激情| 欧美在线天堂| 日夜精品| 为用户提供免费看黄网址在线观看| 啪啪啪东京| 亚洲囯产精品女人久久久| 婷婷亚洲综合| 综合网色| 91欧美性| 天天日少妇逼AV| 久久熟妇五十路一区| 91老妇女| 亚洲无码国产精品久久| 日韩一级片| 欧美夜夜骑视频| 酒色综合网| 操逼无码一区| 久久草草欧美精品| 日本最新免费韩国1区2区视频播放| 久久女女| 黄色成人网久久久久久| 日本岛国黄色网址| 麻豆视频test| 91N综合网| 白天啪啪晚上啪啪视频| 国产精品女同| 国产丰满熟夫69mpp| 91色欧美| 奇米四色网| 亚洲情色91| 精品一区二区三区四区女| 啊啊啊啊啊好多水| 亚洲另类在线观看| 欧美制服另类丝袜| 中文字幕精品亚洲熟女| 激情婷婷综合久久| 日韩中字av一区| 久久久久女教师免费一区| 思思热在线视频免费| 黄污污污污| 久久久啊啊啊| 久操网线| 中文字幕女同在线| 国产中文大片资源中文字幕| 亚洲A色| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 国产高清成人免费视频| 日韩三级视频一区二区三区| 91高清欧美| 美中日韩无码| 91精品丝袜在线观看| 亚洲av在线免费观看| 求求你操操我| 超碰 另类 欧美| 操操逼视频| 天天淫人人妻日日色| 天天激色| 久久这里是精品| 丁香色色网| 99国内精品| 中文字幕一区 二区三四五 区日 日骚| 四虎免费看黄| 清纯唯美亚洲另类| 国产无马视频| 可以免费观看的av| 双插在线| 99热色这里只有精品| 久久久久久久久久精| 午夜欧美精品久久久| 男人天堂黄片| 亚洲不卡不卡中文字幕不卡| 99少妇内射| 人妻久久一区二区三区| 红杏大香蕉| 国产又长又大又粗的视频| 97免费在线| 日韩福利综合一区| 一本久久精品中文字| 欧美综合传媒| 免费观看成人www精品视频| 人妻81p| 日韩欧美丝袜诱惑| 人妻天天爽夜夜爽2| 91操熟妇| 日韩紧密久久| 国产毛片久久久久久久| 亚欧精品久久久久久久久久久| 97在线亚洲| 婷婷五月影院| 午夜男人的天堂| 亚洲精品乱码久久久久久蜜桃麻豆| 久久久久久久久国产| 午夜精品探花| 俄罗斯一区二区视频在线观看| 久久亚洲天天做| 噜噜在线| 亚洲蜜乳av| 中文字幕免费看大片| 色综91| 成人久久无码www| 五月婷色| 大香蕉手机视频| 色噜噜精品一区二区三| 手机午夜电影神马久久| 欧美亚性天堂| 超碰av在线| 午夜黄色免费在线观看| 国产精品宅男免费| 高精欧美色| 伊人国产AV| 久久日本熟妇熟色高清| 三级色综合| A V视频日本| 思思热er精品视频| 欧美亚洲色图另类国产| 国产真实子伦对白| 国产精品久久久久久久久久久久| 中国特猛少妇色xxx| 欧美黄片欧美黄片xxx| 福利在线黄片| 国内毛片无码一级毛片| 亚州精人品大香蕉| 俺去久久| 国产丝袜美女诱惑| 欧美熟妇精品黑人巨大一二三区| 国产有码一区| 蜜桃一区二区三区| 亚洲影视高清第一页| 亚洲熟女乱色一区二区三区久久久| 国产欧美后入| 国产91专区| 亚洲激情深爱文学小说网站| 国产人妻一区二区三区欧美毛片| 亚洲日本天堂| 蜜屁av| 加勒比海成人视频网| 中文字暮97| 色妺妺在线视频| 另类图片五月| 大香蕉综合久久| 综合视频91| 九热中文字幕| 日韩乱中文 | 久久久久成人网| 超碰97极品9| 天堂69亚洲精品中文字| 婷婷伊人五月| 性爱视频无打码在线观看| 免费中文综合精品| 国产av波波国产精品| 色999人与兽| 97天天在线| 操逼视频国产无套| 清柠毛片| 欧美se亚洲| 中文字幕精品三级久久久| 国产91美女视频| 18禁超污无遮挡无码免费网| 成年男人的天堂| 色欲久久99国产精品久久久久久| 噜噜噜噜久久久精品免费| 26uuu国产成人综合| 久久久久久久久久久999| 网友自拍第1页| 六月婷婷色综合| 91精品少妇搡搡搡| 欧美成人都市人妻| 中文AV制服乱伦| 一区二区三区高清| 亚洲欧美日韩不卡人妻| 成人青青草原伊人| 欧美色91| 亚洲啪啪啪啪视香蕉| 日本久久久久久久久久| 一本一道久久综合久久| 欧美se综合| 韩国三级一线观看久| 亚洲国产精品99久久久| 久久黄色性爱视频| 国产欧美日韩在线不卡第一页| 天天日天天干天天整| 九九九精品| 亚洲人妻色图| 91网18| 日韩78m视频| 乱色老一区二区三区的观看方式| 亚洲综合情色| 97亚洲色图| se吧提供国产乱老熟视频胖女人| 欧美极品美女aaaaaa级黄片| 超碰到97情色| 99re这里只有精品3| 一区二区三区精品久久| 日韩啪啪视频| 女人被添高潮免费视频| 国产乱伦性爱区| 欧美熟妇成人一区二区| 色色毛片| 人人摸人人入| 噜噜噜在线视频| 色爱三区| 成人精品在线观看| 日韩999| 97资源制服丝袜| 欧美爆操91| 深夜操逼网| 久操大香蕉手机视频在线看 | 91在线一起| 欧美激情 日韩精品| 欧亚洲精品有视频| 亚洲精品精品一区二区| 欧美日韩电影成人在线| 躁躁日曰躁2020| 中文字幕久久婷婷丁香五月天| 欧美色爱综合| 色欧美色交综合| 精品二区三四区五电影 | 人妻夜爽夜夜爽| 91快色色色色色| 熟女人妻精品一区二区视频 | 日韩中文字幕人妻视频| 极品色电影院| 欧美少妇一区二区三区| 九月丁香| 2024年最新色情网站在线观看| 十八禁电影伊人网| 久久性爱网站| ,国产乱人伦精品一区二区三区| 日韩丰满熟妇| 在线观看免费视频国产| 夜夜嗨一区二区三区直播内容| 色老汉色| 97精品全部| 亚洲国产综合久久天堂| 国产精品干干干| 中文字幕三四五区| 中文字幕人妻色偷偷久久皮| 在线视频免费播放一区| 女性喷水高潮在线观看| 懂色中文一区二区三区| 91精片| 18禁免费视频| 十八禁成人网站在线观看| 国产性久久久| 久久久久9999| 超碰 av 女人天堂| 大色网久久| 日韩操p| 免费一级欧美片片线观看| 丝袜AV一二三区| 久久这里| 亚洲色图欧美一区二区不卡| www.大香| 夜夜操91744565| 啊啊啊啊嗯嗯在线久久久| 中国AV美女| 超碰亚洲欧美日韩无| 日本亚洲vr欧美不卡高清专区| 日韩 女同 综合| 日韩中文字幕视频| 婷婷五月天成人| 日韩av女优在线免费一区| 视频黄站| 日本免费专区| 91亚洲青青草原精品1区| 在线天堂资源亚洲| hd成人一区二区在线| 亚洲天堂自拍| 一道α片欧美| 91精品伊人久久久大香线蕉91| 亚洲色图激情小说| 国产乱人妻精品入口| 精品女同一区| 黄片无码在线制服| 色妇91| 国产三级中文有码在线视频| 五月天激情网站| 91色婷婷综合久久中文字幕二区| 精品国产乱码久久久久久口爆网站| 欧美激情超碰777| 羞涩视频| 蜜奶av| 亚洲精品久久久久毛片A片拉屎| 日韩乱码av| 翔田千里AV无码秘 三区| 自拍大香蕉乱插| 色噜噜狠狠色综无码久久| 无码操逼网| 本道综合精品| 欧美做爰无码A片视频| 成人三级片一区二区三区视频| 五月丁香影院| 久久成人午夜狠狠| 婷婷中文字幕| 欧美日韩啪啪电影| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 99久久婷婷| 欧美第一页| 台湾一区国产高清在线| 手机av亚洲丝袜美腿日韩第一页二页| 欧美经典一区二区三区| 9久9久| 欧美一区二区情色| 亚洲日韩黑丝| 欧美淫穴| 国产精品无码久久久久2025| 性欧美| 亚洲网污污污污| 国产精品呦一区二区三区| 91欧美色| 超碰97最新人妻| 中文字幕日韩电影人妻| 丰满翘臀美女影院视频| 9118禁| 天天添天天干电影| 欧美色图亚洲激情| 五月丁香啪| 中文字幕一区二区无码成人| 天天日B狠狠操| 国产精品内射婷婷一级二| 色综和网| 色综合潮| 中文字幕 码 自拍 视频 区| 乱伦一二三| 久久精品成人一区二区三区蜜臀| 手机在线看片免费人成视频| 综合伊人网12色| 97欧美日韩精品| 高潮9999外国| 久操av在线| 99999久久久久9国产精品| 六九九九| 防屏蔽在线视频| 五月丁香啪啪网| 国产AV久久久蜜爱影集| 搡老人老9丨女老熟人| 日韩性爱一级片| 密臀在线一区尤物| 亚洲图片91| 91人人| 日本亚洲嫩草影院啪啪| 精品96久久| 91国产丝袜足交精品视频| 色婷婷电影网| 97国产高清视频在线观看| 日亚韩精品视频二区三| 国产91丝袜在线播放蜜月| 天天干人妻视频| 9丨久久九九九| 夜夜国自区| 伊人骚琪琪亚洲天堂网站| 人妻夜爽夜夜爽| 久久精品久| 日韩乱中文| 在线啊v一区| 色五月婷婷色| 九九热超碰|