色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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无码AV吞精久久久久| 亚洲天堂久久久久久粉红视频| 少妇毛片久久| 午夜黄色免费在线观看| 男人的天堂 在线一区| 日日做夜狠狠爱欧美黑人| 亚洲欧美精品福利在线| ji熟女.com| 91欧美情色| 久久精品国产99国产精品亚洲| 日韩无码黄色片| 婷婷午夜清品久久久久久久性色视频观| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | AV乱伦专区| 鸥美极品| 国产精品乱码久久久久久| 91婷婷伊人狠人| 久精品无码av一区二免费国产在线观看 | 久久鲁夜| 夜夜操av亚洲一区二区| 国产蜜臀精品一区免费尤物| www色婷婷| 色婷婷激一区二区三区| 亚洲综合91| 亚洲丨在线| 男人天堂网手机版婷婷| 97视频在线观看高清资源| 五月婷婷激情综合| 欧洲色| 91天堂色男人的天堂| 免费a级毛片av无码久久精品中文字幕| 精品一二三区四视频| 99自拍B亚洲 | 国精综合一二三区影视| 精品久久久久黄少妇| 91neishe| 麻豆区99999| 殴美,日韩国产伦精品| 亚洲最大无码中文字幕网站| 人妻少妇久久久| 国产农村一一级特黄毛片| 精品亚洲成人免费在线| 美日韩男女操屄视频| 超清中文乱码字幕| 香伊人在线| 九九九精品成人免费视频小说| 国产精品一区二区密臀| 国产精品久久久亚洲第一牛牛_在线观看| 日韩 女同 综合| 神马久久69| 激情视频一二三| 色拍偷亚洲| 九热超碰| 美女网站91| 亚州五月| 97欧美超碰| 熟女探花啪啪| 操逼片国产| 手机在线中文字幕国产| 日本精品不卡一二三区| 日本三级韩三级99久久| 久久久999网站| 超碰精品| 夜夜影视四色| 99视频自拍| 92福利社视频| 麻豆AV96熟妇人妻| 97精品视频在线播放| 久久久久九九九九九| 大色网久久| 999国产精品999久久久久久| 中文字幕一区二区三区50路| 九月丁香婷婷色| 丁香五六月啪啪| 日韩美女操b| 午夜一区| 东北女人| 综合少妇网| 欧美一级在线观看成人| 强奸乱伦大香蕉网| 99在线观看| 亚洲欧美中日韩| 伊人精品国产| 日本精品中文字幕视频| 丁香六月激情综合| 二对二中文字幕。| 四方色播| a片在线播放| 在线精品福利免费播放| 91亚洲影院综合| av天堂加勒比| 手机在线播放国产福利| 伊人一区二区三区| 一级毛片电影免费看| 激情熟女12P| 99性爱视频| 97精品国产精品免费观看| 躁躁躁日日躁2020| 欧美顶级黄片AAAAA在线免费看| 久久国产精品一级二级三级| 狠狠干2020| 啪啪性爱免费视频| 伊人影院在线理论播放| 人妻精品一区二区三区| 国产成人精品无码久久| 超碰人妻久久人妻中文97| 噜噜噜亚洲精| 国产美女高潮叫床视频| 97频视在线| 性爱网站一区二区| 白丝1区2区3区| 欧美97网| 欧美很很操视频| 98福利在线视频| 可免费观看的av毛片中日美韩| 97大色网| 九九九九AV| 可以在线观看AV的网站| 成人热久久精品| 午夜一区| 欧美极品少妇交| 欧美色爱综合| 三级三级三级日本99| 后入式福利| 欧美色性爱| 精品视频97| 国产精品96| 婷婷综合网| 99热国产精品| 91人妻Pr| 亚洲国产熟妇综合色专区| 91干熟女| 九九AV| 五月综合久久| 99热在线播放| 国产精品久久发布| 亚洲日韩人妻中文字幕一区| 91九九九小逼| 国产精品999zyz| www.男人天堂| 99操逼| 久久久极品| 国产亚洲人妻综合日韩 久久| 91精品人妻一品二品三品| 九九aV| 99re99在线视频| 中文字幕jul-617人妻熟女| 欧美综合天堂| 九九热超碰97亚洲最新香蕉 | 亚洲.欧美.丝袜.中文.综合| 日韩性爱啪啪视频| 插入粉嫩少妇视频| 麻豆精品久久久久久久| 亚洲欧美日韩免费电影| 九九这里只有精品| 九九久久久久久爱| 亚洲色 国产 欧美 日韩| 久久99精品国产| 欧洲亚洲国产综合在线| 久久的网站啊啊啊啊啊| 国产 亚洲 丝袜 制服| 99热在线只有精品| 精品无码一二三四区| 国产91会所女技师在线观看| 蜜臀AV一区二区三区| 久久熟女人| 久操网线| 好爽免费视频| 公司1区2区3区精产精| 麻豆一区二区AV天美| 91久久久久久| 国产成人欧美一区二区三区的国产| 精品乱码在线观看| 69人妻人人揉人人躁人人精品| 极品综合| 强被迫伦姧在线观看无码网站| 道久久五香丁月婷婷激情综合| 国产精品视频精品一二| 成人免费福利在线观看| 国产 日韩,欧美 自拍| 色香在线| 大香蕉伊人亚洲| 亚洲无码免费看| 亚洲欧美色图片| 青草一区二区| 天天干天天插| 久久免费9| 欧美色997| 天天干人人干天天日97| 超碰97亚洲| 综合91网| 女人天堂AV五区在线| 中国乱伦一区二区| 欧美激情视频在线一区| 欧美色97| 懂色影视久久| 色九九综合AV| 99热国产精品| 大香蕉青青9| 成人无码专区精品视频| 日本天天人人狠狠在线日美女 | 一区二区乱码福利| 久久久免费高清中文视频| 级品肉射| 黄片www.| 亚洲无码久久久久久久| 99精品久久久久久久婷婷| 国产中出内射一区二区| 操逼无码操逼| 婷婷综合伊人一区| 国产97视频| 老熟女综合网| 91四海无码日韩欧美| 超碰97久久国| av橘色网站| 亚洲性感丝袜诱惑在线观看| 精品无码人妻一区二区免费蜜桃| 欧洲精品一二三在线| 国产精品高潮久久AV| 高清不卡视频| 国产二区三区粉嫩在线| 精品乱码在线观看| 午夜经典| 最新制服中文第一页| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 久99| 人妻日日干| 日韩亚洲精品一区二区| 抽插无码高清一区| 久草婷婷| caorenqi shipin| 日韩在线视频1234| 怡红院视频在线| 久久大香蕉手机高清| 99国产天美| 在线情色电影 91大 | 懂色av中文字幕| 久操| 欧美日韩久久精品爱爱| 欧美,亚洲,日韩,v,天堂,手机在线观看| 97视频www| 啊啊啊啊,啊啊好多水| 亚洲天天影视综合网| 国产av高清版| 欧美老妇女内射网址| yy少妇精品久久| 秋霞福利网| 日本97久久| 91N综合网在线| 99精品综合久久久久五月天| 日韩97P| 亚洲中文字幕在线视频一区二区| 熟妇的味道HD中文字幕| 91Chinese在线| 另类图片五月| 97综合在线| 91中文字幕在线观看| 国产精品扒开腿做爽爽爽视频| 视频一区二区免费在线| 强免费黄色网址| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 9丨久久九九九| 中文字幕三四区| 最新岛国大片| 青青国产精品在线| 超碰在97| 亚洲日韩视频二区| 91九色网| 精人妻无码一区二区三区伊人直播| 91精品导航| 老熟女乱子伦中文字幕一区二区| 999日韩中文精品观看视频。| 亚洲综合20p| 日语五十路和六十路亚洲国产精品| 亚洲乱色熟女一区| 大香蕉伊利av| 夜夜高潮夜夜爽夜夜爱爱一区| 国产成人在线观看网址| 丁香六月综合激情| 人人妻天天做天天爽| 91精品人| 97超碰jingpin| 人人澡人人弄| www国产无码| 国产日韩欧美三级片| 久久偷拍人| 欧美色999| 天天射影院| WWW啪啪的com| 加勒比在线视频| 少妇高潮九九九九九九九| 日本熟女不卡视频| 国产一区二区三区中文字幕| 丝袜美腿91| 亚洲AV秘 精品久久老牛影视| 欧美亚洲玖玖玖| 亚春色色| 六十路日本| 中文乱码99| 五月天AV资源| 日本在线播放不卡一区| Julia Annxxxxx| 国产精品美女在线一区| 2019天天操天天爽天天拍| 九九九九热| 厕所偷拍在线| av2014 日韩在线中文字幕| 无码精品一区二区三区潘金莲| 亚洲乱色视频一区、二区在线| 啊啊嗯嗯好爽| 91在线美女| 国产成人精品亚洲日本| 国产麻豆一区二三区| 成人5码视频| 国产中午字一暮区| 丁香激情五月| 日本一级真人黄色性爱视频| 国产白嫩精品久久| 久久亚洲AV无码专区国产精品| 亚洲凸凹超碰成人| 欧美亚洲日本激情在线| 啊啊啊啊网站| 加勒比日本在线| 国产欧美精选自拍一区| 综合大香蕉美。| 偷窥自拍亚洲天堂网爆| 台湾佬中文娱乐网久久久久久久久久com | 国产精品久久天天干| 色呦呦、国产精品| 91无码人妻精品一区二区三区蜜桃| 日韩精品熟妇| 亚洲成人免费中文字幕| 激情文学小说一区二区 | 国产一区二区三区不卡手机在线| 亚洲AV成人精品网站在AV| 自拍欧美| 麻豆国产96在线| 亚洲97综| 日韩精品影视| 炮色五月| **一级毛片国产| 97精品网| 色综合超碰超| 精品人妻伦一二三区久久| 一级乱伦网站| 欧美白嫩在线放| 精品区国产区一区二区三区| 思思热一热婷婷热一热| 国产女人成人精品视频| 精品一区二区三区18| av天堂影视中文在字幕在线中文 | 午夜AV人气不卡| 精品少妇一区二区三区| 久久久久密臀视频| 99国产精品人妻人伦| 国产精品宅男免费| 性爱网站一区二区| 综合大香蕉美。| 精品免费1| 色综合婷婷| 国产家庭乱伦表演| 国产精品噜噜噜日日日| 九九九九九九免费视频| 嗯嗯啊啊用力视频免费| 91黑人无码激情在线| 极品白嫩美女白浆成人福利在线看| 亚洲色性| 精人妻无码一区二区三区伊人直播| 热久久91婷婷| 色九九九九久| 99国产人成精品| 国产福利影视| 韩日色费| 欧美热图99| 伊人嫩草| 熟女熟妇伦久久影院毛片一区二区| 人妻出轨一区二区三区| 综合色图区| 97在线精品| 久久久免费的精品| 亚洲 欧美 日韩 国产一区二区 | 欧美在线天堂| 鸥美中出| 午夜操一操| 伊人网高清| 欧美性高潮在线| 超碰在线在公开超碰在线在公开| 丰满精品人妻少妇久久字幕| 超碰97玖玖爱| 1区2区3区中文字幕日韩| 激情综合97| 91麻豆天美国产欧美| 丁香五月偷拍| 久久亚洲影院一区二区| 超碰资源亚洲97| 一区二区娱乐网站| 色爱综合网| AAAAAAAAA黄片| 一本一道vs波多野结衣| 国产极品精品美女视频| 玖玖资源综合在线视频| 91强热人妻| 日韩女模中文造逼| 26uuu欧美| 婷婷五月色| 国产剧情一区在线观看| 国产天天骚| 内射日韩大臀美女| 精品国产乱码久久久兰草影视| 狠综合网| 国产精品丝袜久久亚洲不卡| 99国产精品自在自在| 久久久少妇诱惑精品视频| 欧美九一精品久久久熟妇| 四虎精品永久在线观看| 92久久| 美女诱惑久久| 芊芊操逼视频无码| 六月丁香啪啪| 久久这里只精品99re66图| 亚洲国产亚洲天堂| 国产成人精品网站| 免费精品无码一级毛片牛牛影视 | 欧美极品性爱天天射| 国产欧美精选激情视频| av资源在线播放天堂| 富二代亚洲精品99| 国产AV线| 超碰日韩人妻| www九九热| 亚洲宗合电影| 五月天婷婷社区| 91n处女在线观看| 日韩强奸av| 不卡啪啪视频| 日日夜夜国产综合| 992大香蕉| 国产色综合亚洲色综合吹潮| 亚洲成人在线播放| 99re在线视频国产| 日韩操啪| 亚洲人妻一区二区三区| 国产成人精品午夜福利| 亚洲欧洲自拍图片专区满春格| 天天色播| 亚洲色欧| 亚洲午夜福利视频| 亚洲性感丝袜诱惑在线观看| 精品日韩人妻精品一二三区| 91在线页| 综合第一页| 色娱乐色呦呦夜夜夜夜av| 玖玖爱伊人玖玖爱| 欧美亚洲色图另类国产| 大香蕉天天看妹子| 蜜臀无码视频在线观看| 日韩女优在线| 777超碰| 九九黄色网| 懂色AV网| 欧美成人精品A片免费一区99| 欧美色图在线视频少妇| 你想操日本小逼吗| 久久久久久久六六 | 亚洲午夜AV| 亚洲在线综合| 日韩成人电影AV| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 亚洲熟女中文字幕在线| 夜夜嗨一区二区三区三州加勒比| 欧美色图色综合| 九九久久玖玖| 91人妻丝袜无码| 人妻天天爽天天爽三区| 区一二区日韩亚洲乱码av电影| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 婷婷五月天综合网| 久久啊啊| 国产一区二区三区不卡手机在线| 国产婷婷综合在线观看| 亚洲国产精品久久久男人的天堂| 狠狠色狠狠色狠狠五月| 国产熟女自拍| 色婷婷亚洲婷婷| 久久69| 精品国产污一区二区三区| 中文字幕日韩精品久久| 香蕉免费一区二区三区不读| 久久性爱城| 色噜噜狠狠色综无码久久合欧美| 欧美九九爱| 99e久久国产精品| 欧美综合 站| 激情丁香婷婷| 亚洲av性爱电影| 久久香蕉超碰97国产精品| 囯产操逼片| 九热中文字幕| 久久精9| 狠狠操狠狠插| 亚洲AV噜噜狠狠网址蜜桃动漫| 青娱乐福利99| 97er欧美性| 热九九精品| 国产欧美在线观看免费观看| 欧美亚州色的图| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 干干干天天| 亚洲熟女av中文字幕| 97香蕉人人乳| Julia在线播放亚洲久久| 国产一区二区成人av在线播放| 精品久久久不卡一区二区| 九月丁香| 婷婷午夜成人色中色| 色欧美综合| 九九九九97| 欧美乱色| 五月婷婷色| 日韩久久.一级黄色片| 亚洲天堂资源在线| 老司机午夜精品福利视频一区二区| AV 少妇 人妻 偷拍| 99精品视频在线观看免费| 综合网 欧美| 国产精品69久久久久孕妇欧美 | 综合久久9| 国产成人啪一区二区| wwe 天天干.com| 99熟女| 日韩 欧美 另类 人妻| 蜜臀99久久| 欧美大的香蕉有线电视视频| 91N综合网在线| 欧美在线啊啊啊| 啊啊啊啊嗯嗯嗯用力好爽| 国产av美女被艹的乱叫| 伊人精品久久网站| 看免费一级在线播放毛片| 日韩图色| 天天噜| 性高潮久久久久久久久久久| www.acm成人黄色毛片| 婷婷香蕉欧美在线一区二区三区| 九七毛片九九毛片 | 色97欧美| 久久精品一区一起草| 伊人久久蜜月| 男人把坤坤插入女人的下体| 亚洲涩涩| 久久久久久少妇| 日韩欧亚中文在线| 美女黑人91神马| 中文字幕十五区| 国内操逼视频二区| 美女毛片999| 97视频620| 青青草字幕AV| 日韩亚洲精品一区二区| 日韩无码极品| 黄片免费日韩| 国产黄色视频久久| 黑人美精品 A片| 亚洲人妻在线一区| 日本在线激情一区二区三区| 国产97视频| 欧亚免费视频| 国产原创精品| 综合欧美亚洲| 免费看毛片操穴| 欧美瑟综合| 强奸乱伦中文字幕AV| 美女高潮视频91| 婷婷激情五月天小说网| 色妇91| 婷婷在线视频在线观看| 亚洲s在线观看| 综合网天天| 国产欧美日韩在线观看麻豆传媒公司 | 人人干人人操人人..com| 日韩中文字幕2020| 蜜乳Av成人片网站| 大香蕉琪琪日本女优不卡| 日逼逼免费看| 2020中文字幕在线| 亚洲天堂久久| 天天综合97| 久久9 9 9精品| 无码高清操逼| 97精品国产手机| 最近2019中文字幕国语免费版| 色拍偷亚洲| 韩国一级做A片免费的| 九九五月天| 久操大香蕉手机视频在线看 | 久久久国产精品亚洲精品| 国产不卡免费在线视频| 夜夜国自区| 91啪啪| 999久久久免费精品国产牛牛| 亚洲欧美日韩有码| 欧美性爱三区二区| 精品国产乱码久久久| 男人的天堂啪啪啪啪啪蜜桃不卡| 国产白丝精品在线观看| 超碰1024久久| 国产福利第一视频| 国产精品自拍视频| 神马久久网| 亚洲女毛多水多21P| 精…码一二三区| 75大香蕉| 人妻少妇av在线观看| 天天肏天天干| 亚av顶级裸体一区二区三区四区五区| 99爱爱| 色综合一本| 亚洲少妇激情一区二区三区| 欧美视频中文字幕区| 亚欧操逼片在线观看| 中文字幕91综合| 国语国产操逼伊人AV网| 97久久国产精品| 国产高清1234区| 黄色小视频日本txt| 亚洲综合在线第一页| 日本男人插女人的逼黄色| 97综合在线| 国产福利电影| 亚洲图片91| 97欧美日韩中文| 欧美天天插| 无码视频黄色网战| 嫩草美女久久| 国产精品久久久久婷婷二区次| 99热免费精品| 天天日天天操心| 蜜乳AV一区二区三区四| 欧美极品美女aaaaaa级黄片| 国产一区二区精品久久久不卡蜜臀| 啊啊啊用力在线观看| 日韩性爱网址| 一起草日韩| 久久性爱视频99| 美女9118禁| 久艹99| 神马久久久久久久久久久久| 丝袜六区| 久热久| 国产av美女被艹的乱叫| 51久久夜色精品国产麻豆| 九九九九AV| 欧美少妇高潮视频| 国产精品在线一区二区| 二对二中文字幕。| 蜜臀亚洲中文| 欧美天天插| 午夜免费视频1000| 日本岛国黄色网址| 成人三级片无码| 色欲蜜臀AV| 亚洲一区二区三区中文字幕| 日韩美女久久一区二区三区| 成人网址在线观看| 蜜臀AV网站| 国产成人免费观看在线视频| 一级特黄aaa大片在线观看成人一级片在线观看 | 好一吊区二区| 天天操天天7| 久久精品视频一区三区小泽玛利亚| 91亚州欧美| 麻豆婷婷成人一二三| 午夜福利久久久噜久噜久久综合 | 综合欧美日韩在线观看| 欧美日韩香蕉| 欧美麻豆成人同性GⅤ在线| 精品国产人成在线| 亚洲成人久久一区二区| 中日韩欧美精品无码AⅤ一区二区| 国产成人一级av88| 高清无码 国产精品| 欧美日韩性爱无码| 5月婷婷6月六月丁香| 国产大学生高潮在线播放| 色婷网| 91人妻爽爽人人做人人澡| 国产 日韩 欧美 人妻 熟女 中文| 超碰免费在线| 久热伊人99re| 午夜欧美神马久久久久| 欧美91丝袜| 婷婷精品国产欧美精品亚洲人人爽| 97天天在线| 综合少妇网| 婷婷综合伊人一区| 精品无码一区二区三区| 强奸国产在线| 亚洲av无码成人精品国产| 五月天色图影视| 国产精品制服丝袜中文字幕日韩一区二区三区| 嗯……啊…嗯嗯…啊…好舒服| 麻豆精品A片免费观看| 久久九操在线观看| 0755午夜福利视频| 日本成a人v网站在线观看| 69少妇一区二区| 把腿张开老子CAO烂你| 六月婷婷色综合| www鬼畜国产男人的天堂| 欧州激情视频在线一区二区| 毛片麻豆91糖心精品毛情片| 大香蕉中文201| 天天干天天操天天操夜夜操天天操 | 夜夜爽夜夜高潮夜夜爽| 国产精品久久久久久亚洲色欲| 2019久久久久久久久福利| 动漫爆乳3D奶水一区在线观看| 色97| 国产第二页| 91麻豆天美传媒在线| a一区二区三区乱码在线| 偷看洗澡一二三区美女| 蜜臀精品1区2区| 玖玖爱综合网| 张柏芝国产一区在线观看| 老熟妇一区二区三区…| 91视频国品一二三区| 黄呦呦在线| 久艹免费| 亚洲欧洲精品视频发布| 91ise欧美| 美女网站黄页| 亚洲AV麻豆Aⅴ无码电影一| 女人午夜视频777| 口爆欧美91| 久久9久久| 亚州一区二区成人片免费| 91美女中出| 欧美日韩天堂| 久久狠狠色噜噜狠狠狠狠97| 91人妻Pr| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 欧美性爱一区二区三区四区| 亚洲 欧美 第一页 | 欧美日韩亚洲天堂| 国产强奸超碰AV| 久久天天躁日日躁狠狠躁| 哑洲在线| 国模艳艳啪啪一区| 青青草中文字幕| 中国一区二区亚洲人妻| 日韩在线人妻网站| 国产久久久久久| 欧美一级做a爰片免费视频| 久久久久久九九九九-美女久久久久久久-成人AV| 91蜜桃传媒精品久久久一区二区| 亚洲欧洲综合成人av一区| 91久久精品国产| 中文字幕乱妇免费视频| www国产天美久久久| 超碰中文字幕人妻草一区| 亚洲自拍偷拍视频在线| 日本 欧美 亚中文字幕| 亚洲色婷婷综合久久一区二区三区| 欧美亚洲| 日韩欧美偷拍美女视频| 激情抓乳插进去啪啪啪日韩| 啊好大好舒服| 久久久97| 一区二区久久天天干狠狠| 少妇精品久久| 99热免费| 91 欧美| 蜜臀久久99精品久久综合| 精品免费囯产一区二区三区| 精品超碰国产| 一二三四区电影| 亚洲精品三| 91丝袜人妻| 天天爽夜夜操| 久久久久久久性爱| 国产高清1234区| 久久精品国产Aⅴ| 小草精彩毛片| 岛国黄片网站| 五十路熟女工口 | www.色婷婷| 亚洲国产精品无石码久久| 六九九九| 久久夜夜| 欧美 综合| 黄色激情电影在线观看| 91欧美另类| 乱伦日本色图AⅤ| 后入人妻无码| 天天看综合网| 思思热在线视频在线| 青青草色情网站视频| 国产精品国产自产高清AV| 久久综合久色欧美综合狠狠 | 欧美天堂在线| 九九热九九热| 日韩精品在线观看观看| 天美麻豆黄色录像| 综合激情五月丁香| 91福利网在线观看| 欧洲精品久久| 婷婷五月天av| 蜜臀久久99精品久久久久久-DVD原版全| 日韩99神马视频播放片在线播放| 超碰在线欧美性爱激情| 日韩不卡网操逼中文字幕日韩| 精品在线观看视频在线| 久久99国产精品| 二对二中文字幕。| av婷婷色婷婷色六月| 亚洲情欲| 亚洲日韩熟女人妻高清在线| 偷窥自拍亚洲天堂网爆| 一级乱伦网站| 插入粉嫩少妇视频| caopeng97| 欧美少妇性爱网站| 啊啊啊免费| 久久久久78| 涩五月婷婷| 久综合国内精品自在自线| 人妻喷水| 狠狠搞 亚洲91| 国产小u女在线观看| 狠狠操使劲操| 久操视频在线| 97色色国产视频| 久久五月综合| 在线看的av| 国产精品九九九| 精品一区二区久久| 刺激性视频黄页| 久久精品美女一区| 粉嫩av久久一区二区三区| 综合少妇网| 欧美综合网1| 国产夜夜艹| 日韩av乱伦| 凹凸久久人人| 国产无马在线| 97免费视频在线| 亚洲在钱| 伊人精品视频| 亚洲AV资源| 中文字幕第二页| 国产熟女一区二区丰满| 98色网| 噜噜噜无码AV一级一级久久影院| 精品国产乱码| 欧洲特黄毛片免费看欧洲毛片| 欧美96交| 日韩三级性| 精品999日本| 久草资源在线视频官方总站日韩丝袜美腿 | 99久久e免费热视| 亚洲国产成人7777| 啊啊啊啊啊啊在线观看| 色欧美在线| 综合性视频99| 国产乱子伦一区二区三区免看| 久久婷婷在线观看视频| 另类小说五月天| 日本一级黄色电影| 国产精品熟女丝袜一区二区| 无码av永久免费专区网站| 亚洲无无码αⅴ每日更新| 亚洲欧美一区二区网址| 中文字幕99999| 精品人妻一区二区免费看| 精品超碰色| 亚洲不卡一| 97综合久第一页| 高清孕妇孕交 交| 中文字幕人妻丝袜乱一区三区| 亚洲se电影| 一摸二插三插| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | a亚洲欧美色欲| 亚洲欧美一区二区网址| 男女啪啪网站免费视频| 人人操欧美风骚| 男人的天堂 在线一区| 午夜美女福利视频| 国产又粗又大硬免费色网视频| 国产美女高潮| 午夜人人操| 在线播放免费av福利片| 精品国产一区二区三区四区在线看| 人人看人人插| 久久东京伊人一本到鬼色| 久久毛卡| 91婷婷| 91蜜臀熟女| 人妻插插人妻人| 欧美少妇性乱| 黄色av播放免不| 日本一二三免费久久| 中国少妇啪啪视频| 日本欧美中文字幕| 国产一区二区三区白丝| 乱伦av麻豆| av在线资源| 天堂九九九九九九九九九| 有码免费观看| 亚洲国产丝袜在线观看| 国产熟码AV| 久久 精品| 日韩高清黄片| 韩国一级做A片免费的| 五月婷婷激情综合| 亚洲人妻熟妇三十三区| 国产精品3| 91人人操| 欧美日韩亚洲一区二区在线观看| 丰满人妻一区二区三区大胸懂色| 国产 日韩 欧美 人妻 熟女 中文| 天天干2019| 亚洲精品97中文字幕| 夜夜欧美| 国产精品亚洲天堂网址| 日韩一级免费性爱| 爆乳免费黄网站| 精品妇操一区二区三区| suv精产一二三区| 伊人操你| 久久丁香五月婷婷| 欧美三级免费伊人| 蜜臀99久久精品| 精品人妻中文字幕高清| 在线综合色| 美女诱惑1区2区| 精品无码产区一区二| 久久精品国产亚洲5555| 国产偷拍自拍在线视频| 蜜臀AV一区二区三区激情综合| 2017超碰| 天天看夜夜看日日干| 无码少妇精品一区二区60岁老人| 日本一二区免费| 91久久久久| 26UUU欧美激情一区二区| 亚洲宅男天堂| 男人天堂 天天射| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 老司机香蕉| 久久黄色性爱视频| 嗯嗯嗯嗯啊啊啊好紧好大| 精品制服美女中文一区二区三区| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 欧美国产日韩高清在线| a亚洲欧美色欲| 91GD.COM| 色偷综合| 国产第12页| 97超碰69| 本道综合精品| 探花一区在线| 北条麻妃性愛视频| 国产综合色精品在线观看| 九九99精品| 国产熟女高潮一区二区三区| 亚洲精品性爱片| 日本九九久久99播| 校园春色综合网| 啊啊啊啊嗯嗯嗯用力好爽| 色97综合中文字幕| 岛国黄| 国产精品视频播放| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| 欧美国产日韩高清在线| 懂色影视久久| 日本高清_区二区三区| 精品96久久| 天天躁日日躁成人字幕aⅴ| 91网站18在线观看| 日日骚中文字幕| 丁香五月AV| 伦理第一页| 五月丁香六月| 日韩一级二级三级| 色激情五月天| 97色综合中文网| 色色色综合网| 五月天伊人网| 精品久久視頻在线| 人妻久久一区二区三区 | 欧中日成人免费影视| 精品蜜乳AV免费观看| 天天肏美女| 立川理惠被中出无码| 天天看片天天爽| 欧美性爱日韩高清| 91欧美美女日韩国产婷婷| 一个色导综合| 日本精品免费一区二区三区四区| 国产无码精品高清| 欧美日韩青操| 欧美劲爆视频一区二区| 欧洲色综合| 日韩啪啪啪啪啪| 91老女人| 91殴美大片| 操逼逼中文字幕| 亚洲AV色图一区| 99亚洲天堂| 亲子敌伦对白在线播放| 欧美狠狠弄| 无码精品人妻一区二区三区妖精| 97天天插| a久久| 日本黄大片在线观看视频| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 成人小说视频在线精品欧美| 久久久久元码视频| 日本午夜精品理论片A级APP发布| 欧美亚洲系列| 中文字幕av久久爽Av| 亚洲中文国际强奸字幕 | 日韩美女高潮喷水视频| 嫩草影院性色| 狠狠爱夜夜| 麻豆福利视频导航| 欧美久久伊人| 啊啊啊啊网站| 欧色性第一页| 午夜婷婷| 午夜a成v人电影| 少妇蹲下买菜露大唇0| 69超碰综合| 福利操逼| 91欧美网| 天堂伊人久久| 亚洲综合色网| 国产视频一区二区三区在线免费观看| 亚洲极品| 精品射1999| 3p国产欧美99热| 岛国免费视频在线| 干b网| 亚洲色9| 99热久| 99re公开精品免费视频| 麻豆AV一区二区天美传媒| 国产60区。| 婷婷尹人大香蕉免费| 国产欧美精选激情视频| 在线不欧美| 一本色道久久综合熟妇| 1024亚洲中文字幕久在线看片你懂的| 久久久久久久亚洲Av无码| 国产400孕妇孕交群| 99蜜月精品久久| 欧美在线伊人色| 九月婷婷| 久久‘黄片视频| 日本人妻中文字幕精品| 97日韩超碰超碰中文字幕| 好舒服视频| 精彩国产视频播放1区2区| www.超碰在线| 综合操逼| 国产亚洲深夜激情| 黑人综合网| 青青草依人大香蕉| 少妇精品久久久| 人人污日韩一区二区| 欧美久热| 日韩中文字幕二区| 岛国毛片手机在线观看| 久久亚洲中文字幕视频| 91天堂| 97 国产精品| 国产一区二区精品在线视频| 天堂国产AV| 午夜福利久久久噜久噜久久综合 | 久久国色天香香蕉| 青青草色插素人| 精品91摸| 性站| 婷婷久久综合| 再深点灬舒服灬太大了好硬好爽| 亚洲中文字幕久久人妻| 亚洲 小说 欧美 激情 另类| 久久国产乱子伦精品免费女,网站| 中出91视频| 亚洲熟妇AV日韩熟妇在线| 麻豆天美在线喷水AV| 99re99视频在线免费观看| 久久成年精品| 久久视网78| 青青草精品| 九热大香蕉| 美女啪欧美一区| 10000部十八禁看电影| 欧美日韩淫加| 熟女中出视频| 四虎视频在线观看| 加勒比综合九九99视频在线播放| 国产久久一区二区三区野外在线| 天天综合在线4| 国产精品九9| 夜夜夜久久| 欧美一区二区传媒| 亚洲蜜臀懂色| 亚州综合图片| 欧美人人天天网| 成人天天爽| 呻吟 欧美 日本 中出| 99999这里都精品| 天天性射网| 欧美丝袜中文字幕07在线| 超碰人妻久久| 天天上日日上日韩精品| 国产中文字幕在线点播| 久久riav中文精品| 国产超碰人人爽人人做| 欧美做爰无码A片视频| 思思99热| 亚洲宗合电影| 亚洲熟女乱色一区二区三区久久久 | 五月丁香六月激情综合| 亚洲影视综合网| 97亚洲资源| 日本高清加勒比| 欧美激情 一区| 久久夜夜| 日逼视频日本| 人人色人人操在线| 久久大香蕉手机高清| 97露脸精品丝袜| 天天在线91| 试看60秒 爽| 日日噜噜夜夜狠狠视频无| 亚洲AV永久无码一区仙野| 男人的天堂2010| 麻豆 亚洲 97| 大逼色网站| 久久国产熟女影院| 亚洲av淫乱| 花野真衣| 日韩精品怡红院| 超碰97男女| 国产亚洲精品久久久久小| 亚洲综合一区二区| 久久一二区四| 男人天堂最新手机版在线青青草| 国产综合久久久麻桃个| 久久五月天婷婷丁香中文字幕| 精品少妇一区二区三区在线视频|