日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
色妇91| av九九| 97欧美精品综合| 亚洲一区日韩精品| 欧美九九九| xxxx网站亚洲精品| 精品国产91内射久久| 欧美日日人人天天| 亚洲自拍另类丝袜综合| 日本 色 导航| 欧美宗合网| 国桃视频产巨乳精品一区二区在线| 免费无码国产精品v片在线观看| 激情婷婷丁香| 色哟哟-国产专区| 国产美女高潮叫床视频| 亚洲va有码在线天堂| 高清孕妇孕交| 黄色工厂这里只有精品| 久久亚洲国产成人| 亚洲日韩一区电影| 超碰在97| 激情六月天| 欧美色www亚洲国产阿娇要播| 丁香五月综合| 日夜尻逼网| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 亚洲欧美骚| 亚洲欧美日韩国产丝袜自拍中文| 在线 亚洲 网爆 自拍| 日本加勒比无码专区一二三| 青青草原狼av| 亚洲中文字幕乱码无码一区二区| 人妻天天爽夜夜爽精品2| 婷婷久久五月| 91在线美女| 校园春色制服丝袜中文字亚洲 | 999综合色| 夜夜嗨av午夜成人| 红桃视频高潮| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 亚洲丝袜色图| 欧美色图91p| 亚洲妇色| 久久久男人的天堂| 青青草原av| 久久原创中文| 蜜屁av| 欧美日韩97在线| 精品久久九| 精品久久艹| 老鸭窝日丰县女人| 人妻激情视频| 九九九九热| 97精品免费视频网站| 操逼操2| а√天堂资源官网在线资源| 色哟哟国产精品免费网址| 五月天激情小说| 后X久久| 啊啊啊不要好疼视频| 精品久久在线区一区| 91人人看| 国产乱码精品久久久久久 | 亚洲欧美天堂| 天天干人妇| 啪一啪免费视频| 亚洲日韩XXX| 青娱乐国产精品| 久操com| 国产精品制服丝袜清纯唯美| 国产伦精品一区二区三区在线观| 91人妻视频在线| 天美传媒AV国产在线| wuyechaopeng| 亚洲无码偷拍| 99热啪啪| 九区国产| 久久久新亚洲AV| 人人操人人插 - 百度 - 百度| 久久精品国产亚洲妲己影视| 福利在线黄片| 蜜臀AV成人精品蜜臀| 久久华人网| 人妻丝袜一区二区三区在线| 福利社区午夜一区二区| 色999五月色| 台欧久久精品视频| 日韩91网站| 精品人妻1区| 天天搞在线综合网| 国产久久一区二区午夜| 成人无码电影在线观看网| m欧洲一级午老| 加勒比av网| 91这里只有精品| av日韩国产一区二区| 亚洲男人bt天堂| 日韩精品资源| 九色 人妻 大香蕉| 精品女同一区二区三区| se吧提供91精品国产91久久久久久 | 天天干1区2区在线| 亚洲成人精品在线一区| 久久xx| 国产第二页| 国语av狠狠色丁香婷婷综合激情| 国产激情在线观看| 福利大香蕉| 国产丝袜欧美在线视频| 骚货| 欧美亚洲自拍另类人妻| 91 手机在线播放 绯色| 综合五月天| 96久久精品一二三区色欲| 日本中文字幕高跟| 男插女青青影院| 九九久久九九久久| 免费国产视频| 理论久久婷婷网8| 亚洲欧美色图片| 日本高清免费一本视频在线观看| 密乳AV免费观看| 人人弄人人摸| 日本久久超碰| 国产女人91精品嗷嗷嗷嗷| 国产深喉视频一区二区| 中文字幕日本久久| 日韩综合第八区国产精品| 亚洲欧洲日韩天堂av| 亚码激情| 夜夜嗨视频| 天天草天天干天天日| 77国产精品| 日本欧美韩国国产在线| 91丝袜在线视频| 被男人添B超爽视频| 久久久久久久亚洲Av无码| 青草伊人网| 美女写真| 火箭成精品视频884必出精品| 黄片在线免费在线观看| 日韩精品亚洲一二三| 亚洲中文字母在线播放| 91精品人妻| 激情网五月天| 久久久一区二区三区三州| 欧美暴力猛交| 日本福利二区视频| 欧美色图91p| 久久精品国产亚洲AV成人直播| 亚洲成人无码影院| 久久精品一区二区三区蜜桃臀| 日韩精品人妻一| 天天射夜夜| 欧美日韩国产色图在线| 日韩15p| 五月久久HDAV| 国产一区二区三区导航| av爱爱爱| 亚洲欧美日韩不卡人妻| 自拍亚洲综合| 精品91摸| 人人操人人狠狠操| 一级性爱视频免费观看| 不卡在线观看视频| 精品人妻1237| 国产自产自拍| 国产精品在线一区二区| 啊啊啊慢点| 99久久e免费热视| 精品无码产区一区二| 亚洲欧美成人在线| 精品久久久久久中文| 五月天精品| 99青草| 黄色一级视| 极品销魂美女一区二区| 日韩有码回春沙龙第一页| 一区二区三区网站日日骚| 91天天| 91美女视频在线| 国产精品久久伊人| 国产精品盗摄 偷窥盗摄| 中文无线日韩一区| 日韩人妻网站| 91亚洲影院综合| 99热久| 国产美女mm131爽爽爽爽| 欧美 亚洲 在线| 欧美大色交| 天天摸夜夜摸| 久久久久久大| 大香蕉97久久| 久久香蕉网| 中国一区二区亚洲人妻| 色网在线视频观看免费| 99re免费视频精品全部| AAAA欧美日韩| 久久久9999| 久久日韩肥臀| www.男人的天堂| 精品久久久久久中文| 欧美另类丝袜熟女| 大香久久| 亚洲性刺激| 亚洲涩图欧美| 欧美国产操逼| 色777999综合| 熟妇无码视频三区| 中文字幕av一区二区三区人妻少妇| 97er欧美性| 加勒比AV网| 欧美97在线观看| 青青草自拍视频在线播放| 大香蕉五月天| 亚洲AV无码久久久国产精品| 久久久久久久久久久久黄色 | 亚洲日韩AV视色| 在线性黄高清免费视频| 中欧人妻丝袜中文字幕| 久久久国产av美女私房| 日韩特级毛片免费观看全集| 色悠久| 欧美色另类| 欧亚日韩一区在线| 狠狠婷婷亚洲中文综合久久| 国产自制av蜜乳| 男人天堂网址 | 先锋激情∨在线视频播放| 囯产精品久久久久久久久久梁医生| 欧美另类色图片| 欧美九九九| 色激情综合网站| 亚洲欧美色图片| 九九九九九九九九九国产精品 | 中文幕97| 干美女人妻| 国产日韩中文字幕欧美| 国产精品另类| 97超碰超碰| 国产精品麻豆免费视频| 人人操人人摸人| 玖玖资源综合在线视频| 综合激情五月天| 久久久久久久久久久久久久久性生活视频 | 91黑人无码激情在线| 超碰91在线| 精品人人| 中出后入| 五月天婷婷在线看| 天天干人妇| 亚州情色j区| 欧美国产有色电影| 极品肉射| 思思在线免费视频| 亭亭丁香激情| 三四中文字幕| 成人无码影片视频在线| 91狠狠综合久久久久久| 白嫩妹子国产骚| 中文字幕在线免费观看 | 开心六月色| 国产免费小视频| 亚洲国产精品久久久久久久久久| 曰韩欧美国产传媒麻豆第一区| 亚洲综合成人网| 密臀AV在线| 大香焦A片| 丝袜综合| 五月大香蕉| 懂色综合久久久| 一本色道久久天天射天天干| 国产精品久久久久久久免牛肉蒲团| 视频一区二区三区精品| 美女黄页| 亚洲瓯美色图| 国产黄a三级三级三级av在线看 | 99热在线播放| 欧美97视频| 国产三级片在线观看| 一级毛片久久久久久久女人18| 91精品久久久久久77777| 久久久久久久久久久久久久久乱码 | 国产精品麻豆成人av| 丁香啪啪| 天天综合网亚洲综合网| 久久91精品国产9丨久久分亭| 天天舔天天| 天天在线91| 日韩精品一区二区日韩| 欧美在线大香蕉| 男人女人18禁片免费看网站| 国产视频一区二区在线观看| 九九九色| 国产懂色精品国产av| 九九RE视频在线精品| 91精产一区二区三区| 精品无码欧美三级| 婷婷久草一区二区三区| 外国免费性情大片| 四月丁香婷婷| 国产成人无码a| juliaann丝袜大战黑鬼| 国产亚洲日韩欧| 99r九九| 91中文字幕| 欧美乱色| 爱妃国产亚洲视频中文字幕| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 九九av| 人人插人人摸人人| 啊啊啊啊啊舒服| 亚洲一区二区中文字幕| 偷拍欧美亚洲| www.狠狠操| 啪啪啪亚欧美视频| 秋霞男人网| 日韩综合无码色欲vv| 97超碰超欧美。| 日本污ww视频网站| 96麻豆精品一区二区三区| 2001天天操| 香伊人在线| 天天干1区2区在线| 中文字幕av色| 日韩亚洲国产视频| 亚洲深夜福利| 综合天天网| 国产综合操逼高清| 国产91影院| 精品人妻一区二区三区视频| 五月婷婷丁香| 草草影院日本第一页| 91国精产品| 狠狠操狠狠插| 欧美日产国产在线成人第一区| 美女丝袜激情小说| 亚洲情色1区| 精品一区二区综合熟妇| 欧美人体性爱互联网第一页婷婷日本| AV男人天堂网| 久草色悠悠在线视频| 亚洲国产精品无码AV在线| 偷拍导航视频网站| 久射吧| 中文字幕视频一区视频二区| 亚洲性爱无码乱伦av| 国内一区二区免费| 国产又粗又长又大的视频| 中文字日本乱码| 婷婷五月花| 操逼片国产| 大香蕉欧美| 狠狠操狠狠燥| 青青草乱入乱欲视频在线观看| 天天摸天天舔天天操| 五月激情小说| 思思热免费视频观看| A级在线视频| 国产9熟妇视频网站| 久久、1234| 色综合91| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 精品国产www久久| 精品人妻视频入口| 婷婷五月天激情四射| 亚洲啪啪啪啪视香蕉| 中美日韩毛片| 97 亚洲 日韩 欧美 在线| 亚洲各类熟们中文字幕| 久久性爱网站| 欧美系列在线一区二区| 亚洲国产成人福利在线观看| 日韩一级性爱无码| 久久国产AⅤ| 久久精品国产Aⅴ| 亚洲综合色图欧美| 亚洲久久天堂| 中文字幕青青草| 极品一区二区三区免费| asc国产精品| 日产成人久久| 色原狠狠天天天| 本道在线| 色777999综合| 少妇色欲综合网2| 丰满熟女人妻一区二区三五十一路| 欧美大香蕉97| 天天舔天天日天天射| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 国产乱伦性爱区| 久草精品国产99| 很很操在线| 极品销魂美女一区二区| 午夜男女爽爽爽影院视频| 欧州一区二区三区四区| 久综合国内精品自在自线| 五月天婷婷在线看| 无码最新| 婷婷丁香五月激情啪啪| 熟妇在线视频一区二区| 青青操少妇| 欧美日韩婷婷中文| 欧美图片校园春色| 熟妇综合一区二区三区| 欧美在线永久天堂| 日本日逼高清| 午夜高清成人在线视频| 久久极品伊人| 欧美色自拍| 久久久久深夜无码| 精品熟女呻吟久久91| 国产精品久久久啊| 亚州AV无码国产精品| 欧美一级A片在线看视频性色| 亚洲色啪| 久久 亚洲 日韩 人妻| 久噜噜| 少妇熟女视频一区二区三区| 国产白丝精品在线观看| 无码丰满熟妇一区二区浪潮AV| 综合久久六月久久婷婷| 丁香五月天社区| 成人色女网| 中文字幕91综合| 夜夜操狠狠操| 日韩国产成人自拍视频| 天天爽夜夜欢视| 无毛精品| 国产偷人伦激情在线观看| 伊人网综合在线视频| 国产在线精品偷| 精品久久久久黄少妇| 超碰97在线中文| 日本一级真人黄色性爱视频| 郑州宾馆老熟女露脸啪啪| 五月天婷婷小说| 黄色高清久久无码依人| 色色九区| 亚洲精品无码少妇久久| 国产精品欧美激在线| 97久久久久久久久久| 偷拍偷窥与盗摄视频专区| 人人妻人人狠人人| 91N综合在线| 欧美性爱超碰97| 思思热久久成人| 性感女人网页在线观看视频| 麻豆尤物视频网| 天堂中文资源在线bt| 色爱综合网欧美| 一区二区影视| 99久久婷婷国产综合精品草原| 色九九九九| 91色色网站| 色色色热| se..亚洲欧美| 亚洲成人网站在线观看| 91男女| 激情抓乳插进去啪啪啪日韩| 五十路熟女工口| 99久久久无码国产精品性啊聊| 婷婷综合久久| 亚洲黄色电影| 69人妻精品一区二区绯色| 特级特黄一级毛片免费| 欧美72网页| 国产家庭乱伦表演| 男女激情中文字幕| 最新日日夜夜天天干干| 欧美熟妇人体| A一区片| 看黑丝美女操逼青青网站| 蜜臀一区二区三区在线| 久久这里精品国产99丫e6| 青草成人免费视频一com| 亚洲精品男人的天堂| 91美女视频直播| 免费操逼91| 婷婷五月天激情网| 日产精品久久久一区二区| 婷婷丁香久久| 亚州综合色| 99re6久热只有精品6在线直播 | 豆1无夜无码| 青娱乐亚洲自拍| 加勒比综合a∨| 96久久精品一二三区色欲| 天天操熟妇| 久久综合激情| 天天92av| 懂色AV中文| 人人摸.人人色| 亚洲欧美在线综合| 97操碰| 春色综合网| 欧美亚洲第1页| 午夜精品久久久久久久久久蜜桃| jiujiujiujingpin| 国产在线视视频有精品| www亚洲欧美| 97色论| 无套内射人妻在线播放| 熟妇人妻丰满久久久久久久无码| 超碰激情808| 国产精品美女在线一区| av网站在线看| 一区二区三区蜜桃成人撸久久东京热| 网友自拍第1页| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 日韩精品中文字幕一| 91天天综合在线观看| 91视频国品一二三区| 岛国激情视频在线观看| 国产精品另类一区大香蕉| 久久婷婷国产一区二区色| 一级片在线观看高清无码| 久欲AV| 99999精品视频| 99久久久er直播网址| 大香蕉淫人网| 无码操逼天堂| 久久9 9 9精品| 亚洲精品成人激情在线| 老司机深夜18禁污污网站| 高清无码学生妹高潮| 青青草视频久久久久| 天天躁日日躁XXXXYY| 午夜舔阴达高潮视频免费看| 五十路熟女在线不卡观看一区二区| 懂色综合久久久| 国产偷拍自拍在线视频| 亚洲 中文字幕 精品| henhen91| 国产一区二区在线看| 欧美狠狠弄| 超碰97起碰| 亚洲精品日韩国产欧美| 台湾成人无码AV| 黑人免费福利视频| 久久啊啊| 亚洲情色五月天| 97久久久久久久久久| 嗯嗯,好大,好爽,好骚| 99热网站| 99自拍视频| 92午夜免费福利视频| 九九视频黄色片| 91综合网站| 日本大香蕉综合网红本杳社区| 久久精品中文| 曰韩香蕉97| 日韩操呦呦影院在线观看| 67194无码不卡| 久热69九色熟妇97| 午夜呻吟欧美| www.一本大99| 第45页一区二区| 久久的网站啊啊啊啊啊| 怡红院怡春院| 91jk色拍| 性色av一区二区| 亚洲综合图色在线| 成人A片男人的天堂| 欧美强奸乱| 人妻系列无码专区中文有码| 六月婷激情福利天堂69| 狠狠狠狠狠| 日韩啪啪啪啪啪| 日韩美脚一区二区网站| 欧美精品人妻视频| 亚洲……91| 欧美香蕉视xxx| 99啪啪视频| 天天天乱色综合全| 十八禁一区二区无码观看| 欧美性爱一区二区三区四区| 美女黄码视频午夜| 亚洲精品黑丝| 美女91在线| 亚洲欧洲激情卡通另类文学四射小说网站 | 91网九色蝌蚪操熟女| 久久精品国产亚洲妲己影视| 超碰97人人cao| 国产精品久久久久久久AV大片| av最新免费中文字幕| 91社区拍啪人妻| 综合国产影视三级| 五月丁香激情综合| 欧美96在线|欧| 久久精品区| 久久超碰日韩精品| 日本成人在线不卡一区二区三区| jizz啪啪| 日韩乱伦影音先锋| 亚洲 91 在线| 久久仑合| 欧美日日人人天天| 欧美欧美啪啪视频| 人人看欧美性爱| 久久99亚洲精品久久99果| 玖玖久久久| jizz啪啪| 97精品在线视频| 日本韩高清无砖码22o| 天美精品原创av片国产| 无码国产Av| 国产免费久久久久| 日韩黄色电影网站| 五月天春色激情网| 午夜福利一区二区三区四区五区色婷婷| 久欲AV| 男人女人18禁片免费看网站| 日本欧美亚洲高清在线看| 神马久久久久眼| 亚洲视频二区 | 婷婷丁香人妻 | 国产精品 亚洲情色| 免费97视频| 97国产精品久久久久| 欧洲久久一二线| 色就色综合| 精品人人| 亚洲校园激情| 99视频这有这里有精品| 猛交交| 青草视频人妻在线观看| 自拍偷拍第26| 91碰碰碰| 99这里只有精品| 妇女性内射冈站HDWWWCOM| 精品一区二区成人动漫| 激情人妻另类| 亚洲男人久久综合天堂| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 激情综合网五月婷婷五月天| 九九热免费国产视频婷婷伊人五月 | 丝袜AV一区二区三区| 岛国片在线视频网站| 女人的久久久| 亚洲Av诱惑| 天美麻花大全视频| 亚洲天堂日本| 一区二区三区四区免费视频| 精品少妇一区二区三区| 黄色AV免费| 男人的天堂.com| 97精品视频| 97超碰色五月| 啊啊啊爽爽| 东北黄色电影| 乱欲视频| 99久久无色码| 乱伦一二三区| 欧美se亚洲| 99久久久无码精品国产人| 黄色高清久久无码依人| 日韩无码a片| 天天影视射综合网| 好色综合| 艳尻美人妻| 国产精品麻豆成人av| 精品国产国产AV| 免费啪啪av| 2019亚洲男人天堂| 韩国黄色片精品久久久| 日韩有码专区| 啊啊啊啊啊在线视频| 亚洲一区二区三区播放在线| 久久久久幕乱码| 91视频国品一二三区| 粉嫩av平台| 少妇一区二区三区在线观看| 东北丰满熟女国产一区| 亚洲日本天堂| 综合久久中文字幕综合日韩精品| 超碰欧美97| 97内射偷拍| 美国aaaaa一级黄片| 99热精品在线观看| 欧美老妇综合网| 操逼大黄片| 蜜桃天美传媒AV一区二区三区| A久久| 日韩久射综合| 国产精品网站www| 精品国产无码中文| 一本大道青青| 亚洲国产一区二区三区在线| 久久这里只精品免费福利| 欧美美女在线高潮999| 色网在线视频观看免费| 超碰 欧美| 亚洲aV无码成人在线观看| 欧美78P| 爱啪精品一区| 91精品黄在线观看| 综合网亚洲| 伊人午夜福利视频| 欧美性,色九九| 丁香五月天堂网| 亚洲**2021在线观看| 日韩欧美中文字亚洲慕| 欧美熟妇乱码在线一区| 五月天玖玖资源站| 国产乱码精品久久久久久| 久久一级无码精品毛片6| 日韩干B| 狠狠操夜夜| 欧美精品一区二区少妇免费A片| 久久久成人精品| 26uuu性| 欧美日韩另类激情图片| 综合91网| 精彩视频日韩| 日本熟女中文字幕一区| 亚洲 在线| 国产精品久久久久久久免牛肉蒲团| 91色艳| 免费日韩黄片| 丰满人妻一区二区三区四区| 成人熟女区| 亚洲aV性爱| 国产精品久久久久久久AV大片| 少妇久久久久| 97在线观看免费| 日本一天色道久久久精品视频| 五月天婷婷基地| 操我无码| 日本三级A片网站com| av网站在线看| 香蕉综合网| 九久久九九久视频| 大屁股熟女一区二区三区| 亚洲中文一区二区三区| 激情av| 国产精品极品美女视频| 最新岛国大片| 亚洲成人性| 天堂69亚洲精品中文字| 综合影院永久入口国产| 精品一区二区三区麻豆| 国产精品午夜福利视频| 91大神电影天堂| 人妻精品综合中文字幕在线| 99亚洲精品| 综合色播| 一区二区娱乐网站| 五月丁香六月婷综合成人综合| av绯色| 国产AV色黄看到爽| 波多野结衣被操50分钟免费视频 | 无码操逼视频一下| 欧美一区二区三区不卡高清视频| 91色综合| 亚洲成人激情小说视频| 白丝AV| 97久久超碰| 99久久精品欧美国产| 日韩熟女无码| 日韩色欲久久一二三四区| 18禁免费视频| 中国探花熟女| 色色婷婷五月| 欧美一二三区四五区| 中文字幕视频2区| 伊人久久艹| 99视频精品| 五月天春色激情网| 一及黄久一点| 欧美日韩精品久久| 大香蕉伊然在亚洲91| 蜜臀AV一区二区三区| 九九热精品视频六| 91老熟女视频| 92性色国产午夜福利在线661 | 五月丁香综合啪啪| 秋霞视频一区二区 | 亚洲图片 91| 宗合情欲网| 久久久久久免费电影| 好涩综合| 欧 美 自 拍 偷 拍| 亚洲午夜福利在线影院| 男人的天堂2010| 亚洲精品天天影视综合网 | .精品人妻一区二区三| 亚洲av综合伊人久久| 国产欧美岛国精品一区| 中文字幕一区日韩精| 亚洲AV无码天美传媒一区| 免费人人搞97| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 丰满人妻一区二区三区四| 女人妻一区| 国产精品色约约| 猛猛干| 一区二区三区黄色片a| 欧美性生活综合| 精品国产99| 精品中文日韩字幕视频| 欧美性91| www.久久最新地址| 嗯嗯嗯嗯啊啊啊好紧好大| 青青草玖玖爱| 日韩免费三级黄片电影| 欧美午夜精品久久久久久超碰| 大香蕉碰碰| 久久人妇| 伦理第一页| 18禁美女裸体无遮挡啪啪| 精品人妻伦一二三区久久| 少妇同性| 在线中文字幕视频| 日韩情色视频| 97天天| 人妻嗯啊啊在线播放| 久久久少妇诱惑精品视频| 欧美成人9797| 婷婷激情四射| 91美女在线精品视频| 免费簧片在线观看| 97网址97| 九一亚洲国产免费| 精品成人av一区二区三区在线| 四虎视频在线观看| 中文久久久| 亚洲人妻中文在线视频| 另类小色呦| 人妻精品一区二区全免费| 超碰美女97| 99re在线观看| 欧美人妻熟女在线| 色色色色日本| 射欧美综合| 新亚洲无码| 国产欧美美女免费观看视频| 亚州精品人妻一二三区| 天天做日日做| 91性生活久久久| 国产精品人妻无码久久久互動交流 | 亚洲色91| 最新欧洲欧美日本激情网站| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 伊人视频| 免费亚洲黄色视频在线观看 | 天堂亚洲欧美| 新版天堂中文资源8在线| 97精品久久久久中文字幕| 一级黄色性爱A级片| 97精品视频网站| 日韩精品一区二区高清| 欧洲Au麻豆| 黄片免费日韩| 精品久久久久9999| 精品一级毛片在线观看| 国产精品大香蕉| 99色热| www.色五月| 欧美性爱一区二区三区| 啪啪综合网| 上特色A在线| 神马视频久久久久久| 亚洲综合首页| 亚洲熟女国产综合另类| www久久国产精品| 天天综合网久久ww| 日韩欧洲操屄视频| 欧美高清在线| 国产福利第一视频| 可免费观看的av毛片中日美韩| 久久社区一区二区三区| 正宗无毛一线天嫩逼| 久久婷婷色综合一区二区三区| 亚洲精品久久久久毛片A片拉屎| 操操操操操操| 国语国产操逼伊人AV网| 嗯嗯不要视频| 少妇国产不卡| 一区二区三区四区色图| 2024年最新色情网站在线观看| 91国产美女丝袜足交精品视频 | 91五十路| 超碰夫妻97| 美国一区二区免费视频| 激情小说亚洲色图| 亚洲欧美性生活| 97国产成人精品免费视频| 情侣操 逼视频99| 99热这里| 亚欧美综合| 日韩三四五区| 久草视频分类在线| 农村女一级毛卡片| 亚洲情色综合网| 欧美视频在线第3页| 日韩人成网站在线播放| 91在线免费精品视频| 久久一本大香蕉| 国语av最新自产拍在线观看| 91中出在线| 淫妻综合网| 日本一区二区成人在线| 91综合在线| 99re6国产精品99re在线| 老子午夜伦不卡影院| 青青草公开在线免费不卡视频| 伊人国产视频| 色婷婷影院| 免费观看国产不卡av| 欧美熟妇精品黑人巨大91| 久久少妇人妻| 精品久久久九九九孕妇| 亚洲国产精品无码AV在线| 久久超碰网| JuliaAnnXXX888| 超碰9 7女人| 青青草久久一区网| 中文字幕精品一区二区精品| 国产色精品午夜大片| 免费啪啪av| 97爱综合| 欧美日韩小说| 成熟熟女国产精品一区二区| 久偷拍| 大香蕉欧美伊| 婷婷激情啪啪| 欧美特黄视频网站| 天天日天天射天天干| 中文字幕在在线观看网站| 天天爽夜夜操| 艹精品| 91久久久久久久久18| 51一区二区三区| 欧美人妻一区二区| 超碰69| 欧美亚洲成人在线一区二区三区| 免费看美国人人爽,人人操| 欧美1727免费观看视频| 香蕉久久AⅤ...| 大黄片做爱的大的| 伦激情人妻另类人妻| 97爱| 高清无码久操视频| 国产 日韩 欧美一区| 欧美九一精品久久久熟妇| 色哟哟1区2区| 99热国产精品| 久久9精品网站| 人妻五十路在线| 在线情色电影 91大| 亚洲淫乱骚妇AV| 婷婷香网站| 激情四射婷婷四五月天| 麻豆区99999| 在线播放成人网站| 性爱综合网| 夜夜操狠狠操| 国产美女高潮叫床视频| 国产 日韩 另类 视频一区爱| 亚洲日韩在线a不卡99精品| 亚洲成人激情小说视频| 欧美成人一级麻豆| 在线日韩精品一区二区三区| 国产强奸无码乱伦| 久9re热视频这里只有精品| 午夜AV人气不卡| 免费家庭乱伦视频| 国产三级中文有码在线视频| 免费综合亚洲中文| 另类图片五月天| 久久婷婷在线观看视频| 久操黄色视频| 欧美91精彩| 天堂网亚洲区手机版| 蜜臀99久| 天天操天天射天天日| 激情小说成人日本无码一| 啪啪一区| 99色婷婷中文字幕乱色| 青青操视频在线| 凹凸精品熟女在线观看| 国产精品香蕉| 日本无码1| 日韩美一区| 国产欧美日韩臀| 美女黄页网站| 国产成人无码a| 色综合色综合网| 欧美日韩国产电影| 精品久久久一本一道| 国产在线综合网| 国产亚洲精品玖玖玖在线观看| 91人妻人人妻| 成人草草视频| a片在线播放| 婷色五月| 超碰天天操| 亚洲人天堂| 91狼人| 97五月天| 欧美系列在线一区二区| 色色热| 红杏大香蕉| 日韩天天本| www国产无码| 人人射人人操人人摸| 亚欧高清在线| 国产免费一区在线观看| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 宅男91视频在线播放| 91精品又粗又猛又爽| 亚洲无992tv| 五月天激情综合网| 天天操人人操骚逼网站| 人人爱人人乐人人操| 日韩免费性爱视频在线观看| 精彩国产视频播放1区2区| 欧美欧美少妇| 成人免费福利在线观看| 亚洲综合99999| 久热这里| 在线观看免费视频国产| 国产一区二区三区不卡手机在线| 亚洲精品国产熟女久久久| 成人自拍三级在线观看| 内射中出日韩在线观看视频| 精品视频久久区| 三级日韩一区二区三区| 日韩99神马视频播放片在线播放| 校园春色第一页| 日本性爱网址| 操淫穴亚洲五月丁香| 日韩熟女三十乱伦| 人妻加勒比东京热| 亚洲欧美黄| 99精品久久久久久久婷婷蜜桃| 黑人综合色| 欧美日韩国产高清在线一二三区| 蜜桃臀 后入 一区 二区 三区 在线| 天天操天天舔| 男人的天堂2010| 78m成人视线| 啪啪91| 超碰色大香蕉| 欧美特大黄一级片片免费| 久久 久久国内精品亚洲 | 欧美瑟综合| 欧美日韩香蕉| 久久成人午夜狠狠| aⅴ日韩成人电影av在线免费看av大全| 男人的天堂久久狠| 成人AV在线电影| 久久久久久久综合,国产| 亚洲成人无码影院| 久久华人网| 色5月婷婷| 蜜臀99久久精品久久久久久| 亚洲精品中文字幕一区在线视频| 亚州九九九精品视频| 人人天天干干| 欧美 亚洲| 嗯啊不要啊在线| 啊啊啊想要| 国模无码人体一区二区三| 97欧美精品综合| 日韩免费一级性爱视频| 一区| 亚洲欧洲无码bt精品合集| 玖玖爱综合| 青娱乐福利99| 躁躁日曰躁2020| 亚洲 一区二区 自拍| 欧美日韩亚洲少妇寂寞影院正在播放 | 一本大道青青| 亚洲黑丝在线| 国产AAAAAABBBBB| 麻豆黄四叶草网站| 十八禁av无码免费网站APP| 久久久久921| 久久98| 操操吧亚洲乱伦视频| 91痴汉| 五月天社区| 欧美日韩性爱电影在线| 亚洲日韩熟女人妻高清在线| 先锋激情∨在线视频播放| 全国男人天堂网| 偷拍超碰| 色婷婷五月综合激情中文字幕| 91伊人| 国产白丝在线| 黄色AV影视| 中国东北熟女老太婆内谢| 久久男人| 亚洲色图 图片| 97九色人妻| 国产免a费看黄片在线| 国产99999| 少妇色综合| 91超碰人人| 中文字幕日本久久| 亚洲h片在线免费观看| 人人搡人人肉久久精品| 1024日韩| 日本www操操操| 东京热一区二区中文字幕| 欧美极品少妇| 色天使大香蕉| 久热大香蕉| 人妻无一区二区三区| 97神马久久| 国产天天噜一噜久久久| 国产精品乱码久久久久久久久久久久| 草莓精品视频| 亚洲免费成人在线高清无码视频| 天天色综合影视网| 精品乱码久久久久| 麻豆天美久久91| 99热伊人| 久久久亚洲高清不打码| 亚洲人妻中文在线视频| 欧美91丝袜| 青青草吊丝| 欧美性爱97超碰| 中出91| 成人性爱全视频观看| 嗯啊抽插大香蕉网页| 国产成人99久久亚洲综合| 97亚洲中文| 就去色综合| 东北女人性交| 一本大道青青| 97丝袜亚洲在线播放| 女人的天堂大香蕉网| 九九热精品| 在线人人人人人人精品超| 天堂中文日本在线观看| 人妻一区视频| 岛国1区2区3区在线观看| 国产精品美女视频诱惑| 91亚洲色图| 青青草公开在线免费不卡视频| 97在线播放 | 男女啪啪网站免费视频| 中日韓欧美高清| 农村少妇久久久久久久| 亚洲 日本 不卡| 伦理第一页| 在线电影亚洲色图| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 麻豆伊人网| 乱伦日本色图AⅤ| 精品国产91av一区二区三区 | 欧美性爱91| 一级性爱啪啪视频| 青青伊人这里只有精品| 9999久久久|