精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java智能之Spring AI:五分鐘打造智能聊天模型的利器

開發 前端 人工智能
通過本文的介紹,我們深入了解了Spring AI項目的優勢和特性,以及在實際應用中的快速實戰示例。Spring AI作為一個高度抽象化的人工智能應用程序開發框架,為開發者提供了便捷的模型支持、靈活的功能模塊交換和優化能力。

前言

盡管Python最近成為了編程語言的首選,但是Java在人工智能領域的地位同樣不可撼動,得益于強大的Spring框架。隨著人工智能技術的快速發展,我們正處于一個創新不斷涌現的時代。從智能語音助手到復雜的自然語言處理系統,人工智能已經成為了現代生活和工作中不可或缺的一部分。在這樣的背景下,Spring AI 項目迎來了發展的機遇。盡管該項目汲取了Python項目如LangChain和LlamaIndex的靈感,但Spring AI并不是簡單的移植。該項目的初衷在于推進生成式人工智能應用程序的發展,使其不再局限于Python開發者。

Spring AI 的核心理念是提供高度抽象化的組件,作為開發AI應用程序的基礎。這些抽象化組件具備多種實現,使得開發者能夠以最少的代碼改動便捷地交換和優化功能模塊。

具體而言,Spring AI 提供了支持多種主流模型提供商的功能,包括OpenAI、Microsoft、Amazon、Google和Hugging Face。支持的模型類型涵蓋了從聊天機器人到文本生成、圖像處理、語音識別等多個領域。而其跨模型提供商的可移植API設計,不僅支持同步和流式接口,還提供了針對特定模型功能的靈活選項。

此外,Spring AI 還支持將AI模型輸出映射為POJO,以及與主流矢量數據庫提供商(如Apache Cassandra、Azure Vector Search、MongoDB Atlas等)無縫集成的能力。其功能不僅局限于模型本身,還包括了數據工程中的ETL框架和各種便利的函數調用,使得開發AI應用程序變得更加高效和可靠。

快速實戰

本期實戰是我們的第一篇,旨在通過快速展示Spring AI項目,讓大家了解它的優點和特性。為了方便大家使用,我還將本期的源代碼提交到了倉庫中,并加入了swagger-ui的API調用界面,使得使用起來更加便捷。如果你對此感興趣,歡迎前往查看star。同時,我也會持續維護這個項目,確保它始終保持活躍。

倉庫地址:https://github.com/StudiousXiaoYu/spring-ai-demo

項目生成

當我們開始時,首先需要創建一個項目結構。我們可以前往官方網站,快速生成Spring AI的依賴并創建項目。

圖片圖片

聊天模型

在大型模型中,聊天模型扮演著至關重要的角色。那么,SpringAI是如何對其進行封裝的呢?本期主要著重展示如何有效利用Spring AI的ChatClient,特別是在本示例中應用Spring AI的智能聊天模型。

日志級別

在這個過程中,如果想要查看請求的細節日志,務必將日志級別調整至DEBUG,具體操作如下:

圖片圖片

image

模型配置

當我們使用一個模型時,必須首先在項目中加入相關的依賴,加入依賴后還需要在配置文件中填寫相應的配置信息。

圖片圖片

注入model

那么模型可以自動注入,我們可以直接使用它。在本期演示中,我們將展示三種自定義模型的注入方式,具體如下:

private final ChatClient myChatClientWithSystem;

    private final ChatClient myChatClientWithParam;

    /**
     * 可以選擇自動注入、也可以在方法內自定義,此客戶端無系統文本
     */
    private final ChatClient chatClient;

    public MyController(ChatClient.Builder chatClientBuilder, MyChatClientWithSystem myChatClient, MyChatClientWithParam myChatClientWithParam) {
        this.chatClient = chatClientBuilder.build();
        this.myChatClientWithSystem = myChatClient.client();
        this.myChatClientWithParam = myChatClientWithParam.client();
    }

好的,讓我來解釋一下這三種情況:

  1. chatClient:這是默認的自動注入的ChatClient,不需要任何條件。
  2. myChatClientWithParam:這是一個注入系統文本并帶有參數的ChatClient。
  3. myChatClientWithSystem:這是一個注入帶有系統文本的ChatClient。

好的,第一種情況不需要處理,我們只需要通過配置類簡單配置下面兩種ChatClient。

@Configuration
class Config {

    @Bean
    MyChatClientWithSystem myChatClientWithSystem(ChatClient.Builder builder) {
        MyChatClientWithSystem build = MyChatClientWithSystem.builder()
                .client(builder.defaultSystem("你是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社區充滿熱情。身兼掘金優秀作者、騰訊云內容共創官、阿里云專家博主、華為云云享專家等多重身份。")
                .build()).build();
        return build;
    }

    @Bean
    MyChatClientWithParam myChatClientWithParam(ChatClient.Builder builder) {
        MyChatClientWithParam build = MyChatClientWithParam.builder()
                .client(builder.defaultSystem("你是{user}。")
                        .build()).build();
        return build;
    }
}

簡單文本回答

首先,讓我們先來討論一些簡單的問答。

@GetMapping("/ai")
    String generationByText(String userInput) {
        return this.chatClient.prompt()
            .user(userInput)
            .call()
            .content();
    }

在這段簡練代碼中,已經實現了各種封裝和交互,為了更好地演示,我們來展示一下:

圖片圖片

封裝回答實體對象

大家都知道Java是一種面向對象的編程語言,因此在加入人工智能技術時,為了滿足業務需求,將對象納入其中是不可或缺的。那么,如何讓人工智能的回答能夠被Spring框架自動封裝到對象中呢?讓我們來探討一下:

定義一個對象記錄類:一個記錄類(Record Class)的定義,名為 ActorFilms。用于封裝相關字段記錄類自動實現了 toString()、equals()、hashCode() 和 getter 方法,使得對象的字符串表示、相等性比較和哈希計算變得簡單。你可以直接使用 actorFilms.toString()、actorFilms.equals(anotherActorFilms) 和 actorFilms.hashCode()。

public record ActorFilms(String actor, List<String> movies) {
}
@GetMapping("/ai-Entity")
    ActorFilms generationByEntity() {
        ActorFilms actorFilms = chatClient.prompt()
                .user("Generate the filmography for a random actor.")
                .call()
                .entity(ActorFilms.class);
        return actorFilms;
    }

可以看到,只需簡單地將entity設置為ActorFilms。接下來,我們需要檢查返回的對象是否符合預期。

圖片圖片

當用戶輸入信息后,系統返回一個實體類型的回答。這種實體類型的回答之所以能夠被封裝,是因為在發送信息時,系統不僅僅發送了用戶輸入的文本,還在其后添加了額外的信息。Generate the filmography for a random actor.\r\nYour response should be in JSON format.\r\nDo not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.\r\nDo not include markdown code blocks in your response.\r\nRemove the ```json markdown from the output.\r\nHere is the JSON Schema instance your output must adhere to:\r\n```{\r\n \"$schema\" : \"https://json-schema.org/draft/2020-12/schema\",\r\n \"type\" : \"object\",\r\n \"properties\" : {\r\n \"actor\" : {\r\n \"type\" : \"string\"\r\n },\r\n \"movies\" : {\r\n \"type\" : \"array\",\r\n \"items\" : {\r\n \"type\" : \"string\"\r\n }\r\n }\r\n }\r\n}```\r\n因此,當后續返回的數據為大型模型時,例如{"actor": "Emily Blunt", "movies": ["Edge of Tomorrow", "A Quiet Place", "The Devil Wears Prada", "Sicario", "Mary Poppins Returns"]},這樣一來Spring就可以幫我將其自動封裝起來了。

封裝回答列表實體對象

當我們需要返回一個列表而不是一個對象時,可以輕松地利用Spring AI的封裝功能來實現。讓我們來看看如何操作:

@GetMapping("/ai-EntityList")
    List<ActorFilms> generationByEntityList() {
        List<ActorFilms> actorFilms = chatClient.prompt()
                .user("Generate the filmography of 5 movies for Tom Hanks and Bill Murray.")
                .call()
                .entity(new ParameterizedTypeReference<List<ActorFilms>>() {
                });
        return actorFilms;
    }

直接使用ParameterizedTypeReference對象即可。為了讓Spring能夠自動封裝返回結果,發送信息時也包含了返回格式信息作為提示。現在我們來查看演示的結果。

圖片圖片

流式回答

在前面展示的示例中,大型模型一次性完成回答并將其全部輸出給用戶。然而,前端無法實現打字機效果,因此我們決定采用流式回答的方式來進行演示。

@GetMapping("/ai-streamWithParam")
    Flux<String> generationByStreamWithParam() {
        var converter = new BeanOutputConverter<>(new ParameterizedTypeReference<List<ActorFilms>>() {
        });

        Flux<String> flux = this.chatClient.prompt()
                .user(u -> u.text("""
                            Generate the filmography for a random actor.
                            {format}
                          """)
                        .param("format", converter.getFormat()))
                .stream()
                .content();

        String content = flux.collectList().block().stream().collect(Collectors.joining());

        List<ActorFilms> actorFilms = converter.convert(content);
        log.info("actorFilms: {}", actorFilms);
        return flux;
    }

為了演示用戶信息中的參數傳遞,我對流式回答進行了一個阻塞操作。如果不需要的話,可以將其刪除。另外,由于我需要封裝一個列表對象,所以進行了阻塞操作。實際上,這與上面提到的一樣,即在問答中直接定義了大模型返回的格式。好的,我們來看一下返回結果。

圖片圖片

帶有系統信息的client

這次我們將演示客戶端的配置。在對話中,我們知道有三種身份標識:system、user、assistant。至今,我們尚未展示系統身份標識,但之前我們已經定義了系統形式的客戶端。因此,這次我們將直接使用它:

@GetMapping("/ai-withSystemClient")
    Map<String, String> generationByTextWithSystemClient(String message) {
        return Map.of("completion", myChatClientWithSystem.prompt().user(message).call().content());
    }

這段代碼非常簡單,只需使用ChatClient即可。用戶輸入后,會返回一個Map類型的回答,其中key為"completion",對應的value為回答內容。讓我們一起來看一下結果吧。

圖片圖片

可以看出,實際上他已經將我的system信息包含在內了。

帶有參數信息的client

當您需要演示帶有參數的情況時,您可以考慮以下方法:在用戶輸入后,返回一個Map類型的回答,其中包含鍵值對,鍵為"completion",值為相應的回答。在實際業務場景中,參數是不可避免的,因此這種演示方式可以更好地展示人工智能的適用性。讓我們繼續探討這一點:

@GetMapping("/ai-withParamClient")
    Map<String, String> generationByTextWithParamClient(String message, String user) {
        return Map.of("completion", myChatClientWithParam.prompt().system(sp ->sp.param("user",user)).user(message).call().content());
    }

這里也是很簡單的一句話,所以我們看下效果:

圖片圖片

如果您對回答感到困惑,我們可以查看后臺傳輸日志,以了解傳輸的參數詳情。

圖片圖片

可以注意到,實際上我們已經成功將參數設置完成。

聊天歷史

在最后一個主要的業務場景中,每個人都會有自己的聊天記錄。我們不能一直進行無狀態的對話,這樣會顯得很不智能。因此,必須要有聊天記錄的功能。雖然Spring AI尚未完全確定如何封裝這部分功能,但已經提供了一個簡單的對象類供我們調用。讓我們來看一下:

@GetMapping("/ai-chatMemory")
    String generationByChatMemory(HttpServletRequest request, String userInput) {
        String sessionId = request.getSession().getId();
        chatMemory.add(sessionId, new UserMessage(userInput));
        String content = this.chatClient.prompt()
                .advisors(new MessageChatMemoryAdvisor(chatMemory))
                .user(userInput)
                .call()
                .content();
        chatMemory.add(sessionId, new AssistantMessage(content));
        return content;
    }

實際上,在這種情況下,我們需要自行創建并維護一個聊天歷史對象。因此,每次進行聊天前和聊天后,我們都應該將所需的信息添加到該對象中,然后直接使用它。讓我們來看一下這種做法的效果:

圖片圖片

圖片圖片

可以看到,實際上在這里已經將歷史記錄一并呈現了出來。

總結

通過本文的介紹,我們深入了解了Spring AI項目的優勢和特性,以及在實際應用中的快速實戰示例。Spring AI作為一個高度抽象化的人工智能應用程序開發框架,為開發者提供了便捷的模型支持、靈活的功能模塊交換和優化能力。它不僅能將AI模型輸出映射為POJO,還能與主流矢量數據庫提供商無縫集成,從而顯著提升開發AI應用程序的效率和可靠性。

與Python相比,Java在企業級應用和大型系統中具有顯著優勢。Java語言的靜態類型和嚴格的編譯時檢查使得代碼更加健壯和易于維護,尤其適合需要高度可靠性和長期支持的項目。同時,Java生態系統的成熟度和廣泛應用確保了開發者可以輕松找到豐富的庫和工具支持,加速開發周期并降低項目風險。

責任編輯:武曉燕 來源: 靈墨AI探索室
相關推薦

2025-08-27 09:06:27

2025-02-25 07:49:36

智能體數據庫DeepSeek

2022-12-16 09:55:50

網絡架構OSI

2025-05-09 08:19:13

2015-08-06 17:17:33

swoole聊天室

2023-07-31 11:37:05

經營分析模型

2025-05-26 10:25:00

防御性編程開發編程

2009-11-16 10:53:30

Oracle Hint

2025-03-13 06:22:59

2024-12-11 07:00:00

面向對象代碼

2020-06-16 08:47:53

磁盤

2023-08-06 07:00:59

Openstack網絡

2023-07-31 08:55:15

AI技術網絡暴力

2024-06-25 12:25:12

LangChain路由鏈

2023-07-16 18:46:30

2021-03-11 19:13:04

NFT合約智能

2024-06-19 10:41:06

2021-02-11 08:08:09

Spring Boot配置架構

2024-01-26 10:19:00

AI模型

2021-06-07 09:51:22

原型模式序列化
點贊
收藏

51CTO技術棧公眾號

精品国产一区二区三区四区| 婷婷在线免费观看| 日韩欧美一区二区三区免费看| 欧美男女性生活在线直播观看| 日韩一二区视频| 亚洲自拍偷拍另类| 国产午夜一区| 91精品国产综合久久小美女| 久艹视频在线免费观看| 亚洲欧美激情在线观看| 久久久久久黄| 亚洲人午夜色婷婷| 国模大尺度视频| 日韩电影网站| 国产精品乱人伦一区二区| 99久久免费国| 九九热国产视频| 成人3d精品动漫精品一二三| 欧美体内she精视频| 亚洲 国产 日韩 综合一区| 无码人妻熟妇av又粗又大| 亚洲国产精品综合久久久 | 亚洲AV无码成人片在线观看| 麻豆成人精品| 中文字幕精品久久| 久久人妻少妇嫩草av无码专区| 国产精品第一| 亚洲色图一区二区三区| 91久久偷偷做嫩草影院| 国产精品第六页| 欧美独立站高清久久| 欧美精品久久99久久在免费线| 亚洲国产精品久久久久婷蜜芽| 青青草视频免费在线观看| 精品午夜一区二区三区在线观看| 国产mv免费观看入口亚洲| 亚洲精品午夜久久久久久久| 欧美91视频| 亚洲精品电影网在线观看| 四虎永久在线精品无码视频| 免费在线国产视频| 国产日韩欧美精品综合| 国产一区视频在线| 日韩欧美国产另类| 日韩专区一卡二卡| 欧美精品制服第一页| 蜜桃av免费在线观看| 视频在线亚洲| 欧美一个色资源| 国产xxxxx在线观看| 国产一二在线播放| 国产精品二三区| 国产日韩欧美一区二区| 亚洲av无码一区二区乱子伦| 天堂一区二区在线免费观看| 久久精品国产2020观看福利| 国产草草浮力影院| 欧美在线导航| 日韩va亚洲va欧洲va国产| 拔插拔插华人永久免费| 1区2区3区在线| 国产精品久久久久影院| 国语精品中文字幕| 五月天婷婷在线播放| 91丨九色porny丨蝌蚪| 欧美性xxxx69| 国产黄色在线| 亚洲美女免费视频| 日韩中文字幕av在线| 亚洲精品字幕在线| 蓝色福利精品导航| 亚洲自拍小视频免费观看| 7799精品视频天天看| 日韩极品在线观看| 国产在线视频欧美| 亚洲免费成人网| 99re热视频精品| 国产精品欧美久久| 日韩a在线观看| www.亚洲免费av| 91丨九色丨国产| 午夜av免费观看| 国产91精品露脸国语对白| 精品久久蜜桃| 色三级在线观看| 国产日韩欧美精品在线| 日韩 欧美 自拍| 日韩免费啪啪| 国产精品丝袜一区| 国产乱人伦精品一区二区三区| 国产传媒在线观看| 欧美中文一区二区三区| 能看的毛片网站| 国产精品一站二站| 欧美日韩国产色站一区二区三区| 伊人久久久久久久久| 综合干狼人综合首页| 亚洲美女黄色片| 娇小11一12╳yⅹ╳毛片| 日韩视频在线一区二区三区 | 久久亚洲精品成人| av黄色免费在线观看| 欧美电影免费| 97视频在线免费观看| 一本色道久久综合熟妇| 91在线看国产| 欧美h视频在线| 国产精品二线| 国产精品美女久久久久高潮| 国产精品久久久久9999爆乳| 日本久久一区| 亚洲图片制服诱惑| 国产黄a三级三级| 99在线精品免费视频九九视 | 国产精品麻豆久久久| 欧美 日韩 国产在线观看| 色综合视频一区二区三区日韩| 亚洲精品国产美女| 青青草国产在线观看| 日本免费在线视频不卡一不卡二| 国产精品毛片a∨一区二区三区|国| av首页在线观看| 99久久精品国产麻豆演员表| 四虎影院一区二区| а√在线天堂官网| 日韩欧美国产午夜精品| 最新黄色av网址| 黄色成人在线网址| 成人黄色在线观看| 丁香婷婷在线| 亚洲精品你懂的| 少妇一晚三次一区二区三区| 91国产一区| 一个人www欧美| 欧美一区二区三区久久久| 972aa.com艺术欧美| 视频一区三区| 成人av免费电影网站| 亚洲精品美女久久久| 午夜影院黄色片| 狠狠色丁香久久综合频道| 国产精品无码专区在线观看| 精品国产va久久久久久久| 99久久精品国产网站| 国产v片免费观看| 福利一区二区三区视频在线观看| 国产亚洲欧洲高清| 久久久国产精品人人片| 国产一二精品视频| 蜜桃日韩视频| 欧美性suv| 欧美不卡一区二区三区| 久久精品欧美一区二区| 高清国产午夜精品久久久久久| 丝袜美腿玉足3d专区一区| 视频在线这里都是精品| 欧美在线一区二区三区| 性高潮久久久久久| 国产精品av久久久久久麻豆网| 99三级在线| 老司机午夜在线视频| 日韩欧美综合在线视频| 人妻精品久久久久中文字幕69| 欧美一区二区三区久久精品茉莉花| 欧美最顶级的aⅴ艳星| 成年人视频在线免费观看| 欧美日韩不卡视频| 国产高清在线免费观看| 毛片av中文字幕一区二区| 中文字幕av久久| 国产精品久久久久久久久久齐齐| 亚洲第一视频在线观看| 欧美三级午夜理伦| 国产日产精品一区| 无码aⅴ精品一区二区三区浪潮| 国产va免费精品观看精品视频 | 国产精品无码人妻一区二区在线| 国产成年精品| 97国产一区二区精品久久呦| 精品毛片在线观看| 一区在线观看视频| 一路向西2在线观看| 久久99蜜桃| 91麻豆桃色免费看| 精产国品自在线www| 欧美mv日韩mv国产网站| 一级一片免费看| 久久亚洲精精品中文字幕早川悠里 | 精品无码一区二区三区| 韩国欧美国产1区| 黄色一级视频片| 国产精品久久久久久久久妇女| 国产精品麻豆va在线播放| 国产永久免费高清在线观看| 欧美绝品在线观看成人午夜影视| 日产欧产va高清| 国产精品网曝门| 亚洲图片 自拍偷拍| 国产欧美日韩综合一区在线播放 | 亚洲在线观看视频网站| 亚洲精品日产| 亚洲精品综合精品自拍| 男人午夜免费视频| 91偷拍与自偷拍精品| 久久久久人妻精品一区三寸| 亚洲老女人视频免费| 日本精品免费观看| √天堂8在线网| 亚洲丝袜一区在线| 国产91免费看| 欧美精品乱码久久久久久| 国产伦精品一区二区三区视频网站| 亚洲女人的天堂| 天天干天天舔天天操| 不卡的看片网站| 亚洲国产综合av| 免费看日韩精品| wwwxxx黄色片| 色综合天天爱| 欧美在线一二三区| 91久久青草| 欧美丰满少妇xxxxx| 69久久夜色| 日韩视频在线你懂得| 亚洲一区二区色| 在线免费观看视频一区| 久久99精品波多结衣一区| 亚洲一区精品在线| 日韩va亚洲va欧美va清高| 国产精品免费久久久久| 天天操天天舔天天射| 久久久99久久| brazzers精品成人一区| 狠狠狠色丁香婷婷综合激情| 国产不卡一区二区视频| 成人区精品一区二区婷婷| 91精品视频大全| 51漫画成人app入口| 欧美激情综合色综合啪啪五月| av电影免费在线观看| 日韩中文字幕国产| 在线观看av黄网站永久| 精品国产一区二区三区四区四| 国产精品久久久久久在线| 欧美片网站yy| 亚洲欧美在线观看视频| 国产精品欧美极品| 四虎影视一区二区| 亚洲图片欧美激情| 玖玖爱在线观看| 国产成人精品免费网站| 手机在线播放av| 成人av高清在线| 男男做爰猛烈叫床爽爽小说| 久久成人综合网| 欧美 丝袜 自拍 制服 另类| 一本久道久久综合狠狠爱| 成年人视频观看| 天堂久久久久va久久久久| 黄色片在线免费| 麻豆国产精品视频| 久久精品久久99| 日韩 欧美一区二区三区| 亚洲天堂网一区| 9国产精品视频| 特级西西444| 伊人久久大香线蕉av超碰演员| 国产综合中文字幕| 久久成人精品| 国产超级av在线| 黄色另类av| 今天免费高清在线观看国语| 亚洲美女黄网| 国产福利一区视频| 午夜在线一区| 欧美日韩一区二区三区69堂| 国产成人在线免费观看| 给我免费观看片在线电影的| 国产成人午夜精品影院观看视频| 亚洲精品乱码久久| 成人99免费视频| 日本一区二区免费视频| 91网站视频在线观看| 久久久久麻豆v国产精华液好用吗| 国产精品影视在线| 一区二区三区少妇| 中文字幕一区二区三区在线不卡 | 久久久久久国产精品无码| 国产a精品视频| 日本人dh亚洲人ⅹxx| 久久精品国产99| 欧美夫妇交换xxx| 成人av在线资源网| 乱码一区二区三区| 欧美国产日韩亚洲一区| 国产亚洲自拍av| 欧美日韩一区二区三区免费看| 亚洲女人18毛片水真多| 色一情一乱一区二区| 午夜在线小视频| 国内伊人久久久久久网站视频| 日韩制服诱惑| 成人黄色在线播放| 中文字幕亚洲影视| 日韩精品久久一区二区| 蜜臀久久99精品久久久画质超高清| 中国免费黄色片| 亚洲青青青在线视频| 高潮毛片又色又爽免费| 精品久久国产字幕高潮| 天天插天天干天天操| 久久久精品久久| 在线不卡日本v二区707| 国产成人午夜视频网址| 欧美91在线|欧美| 激情视频在线观看一区二区三区| 亚洲有吗中文字幕| 黄页网站大全在线观看| 狠狠色丁香久久婷婷综合丁香| 自拍偷拍视频亚洲| 中文字幕在线不卡一区二区三区| h色网站在线观看| 欧美在线一区二区三区| 国产情侣在线播放| 精品女同一区二区| 青草久久伊人| 日韩一区二区福利| 国产蜜臀在线| 亚洲一区二区在线播放| 色综合天天爱| 国产精品国产亚洲精品看不卡| 国产福利91精品一区| 免费看特级毛片| 欧美日本韩国一区二区三区视频| 超碰免费97在线观看| 欧美成人精品激情在线观看| 欧美一区二区三区婷婷| 国产精品swag| 亚洲性图久久| 午夜宅男在线视频| 成人高清免费观看| 亚洲一级黄色录像| 日本道免费精品一区二区三区| 亚洲三级黄色片| 欧美成人精品在线| 久久gogo国模啪啪裸体| 福利在线小视频| 国产精品99久久久久久有的能看| 91九色丨porny丨极品女神| 色综合中文综合网| 国产免费av在线| 国内精品小视频在线观看| 久久人人爽人人爽人人片av不| 一级日韩一区在线观看| 狠狠色狠狠色综合| 国产精品20p| 欧美图区在线视频| 黄色网页在线看| 99国产高清| 亚洲国产高清视频| 亚洲精品免费一区亚洲精品免费精品一区 | 翡翠波斯猫1977年美国| 亚洲人成久久| 一级性生活毛片| 亚洲丶国产丶欧美一区二区三区| 色欲av永久无码精品无码蜜桃| 97成人精品区在线播放| 精品国产网站| 日本在线观看a| 国产精品久久久久久亚洲毛片 | 亚洲精品美女免费| 亚洲成人看片| 精品一区二区日本| 老牛国产精品一区的观看方式| 99久久99久久精品免费看小说.| 91精品国产一区二区| 国产免费拔擦拔擦8x高清在线人| 天天综合狠狠精品| 久久久夜精品| 在线观看av中文字幕| 欧美午夜免费电影| 18视频在线观看网站| 亚洲va久久久噜噜噜| 91久久夜色精品国产九色| 不许穿内裤随时挨c调教h苏绵| 亚洲免费在线视频一区 二区| 蜜桃视频污在线观看| 欧美黄色小视频| 国产欧美亚洲精品a| 潘金莲一级淫片aaaaaaa| 日本高清无吗v一区| 久久米奇亚洲| 热re99久久精品国产66热| 亚洲精品成人影院| 日本一二三区在线| 亚洲黄色在线视频| 国内av一区二区三区| 国产精品国产精品国产专区蜜臀ah | 婷婷综合电影| 久久久久久久久久久福利|