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

告別復雜SQL!用Spring AI + DeepSeek構建自然語言查詢系統

人工智能
本教程將指導你使用 Spring AI 框架構建一個文本轉 SQL 聊天機器人。我們會先配置數據庫架構并填入測試數據,然后實現支持自然語言查詢的聊天機器人功能。

1. 項目概覽

現代應用越來越多地采用自然語言交互界面,讓用戶更輕松地操作系統。這在數據查詢場景中尤為實用,非技術人員可以直接用日常語言提,文本轉 SQL 聊天機器人正是這樣的典型應用。它在人類語言和數據庫之間搭建了溝通橋梁。我們通常借助大語言模型(LLM)將用戶的自然語言問題轉換為可執行的 SQL 查詢語句,然后在數據庫中執行查詢并返回結果。

本教程將指導你使用 Spring AI 框架構建一個文本轉 SQL 聊天機器人。我們會先配置數據庫架構并填入測試數據,然后實現支持自然語言查詢的聊天機器人功能。

2. 項目搭建

2.1. 添加依賴

首先在項目的 pom.xml 文件中添加必要的依賴:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-deepseek</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-mysql</artifactId>
</dependency>

接下來在 application.yaml 文件中配置 DeepSeek API 密鑰、聊天模型和數據庫連接:

spring:
  ai:
    deepseek:
      api-key: ${DEEPSEEK_API_KEY}
  datasource:
    url: jdbc:mysql://localhost:3306/school_db?useSSL=false&serverTimeznotallow=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

我們使用 ${} 占位符語法從環境變量中讀取 API 密鑰和數據庫配置。

同時指定使用 DeepSeek Chat 模型,并配置 DeepSeek 的 API 基礎 URL。DeepSeek-Chat-0324 提供了強大的中文和代碼理解能力,非常適合文本轉 SQL 的場景。數據庫配置包括連接 URL、用戶名和密碼,以及 Flyway 遷移設置。

配置完成后,Spring AI 會自動創建 ChatModel 類型的 Bean,讓我們能夠與指定的模型進行交互。

2.2. 使用 Flyway 設計數據庫表結構

接下來配置數據庫結構。我們使用 Flyway 來管理數據庫遷移腳本。

我們將創建一個簡單的學校管理數據庫,使用 MySQL 作為數據庫。和 AI 模型選擇一樣,數據庫類型對實現方案沒有影響。

首先,在 src/main/resources/db/migration 目錄下創建名為 V01__creating_database_tables.sql 的遷移腳本來建立主要數據庫表:

CREATE TABLE classes (
    id BINARY(16) PRIMARY KEYDEFAULT (UUID_TO_BIN(UUID())),
    name VARCHAR(50) NOT NULLUNIQUE,
    grade VARCHAR(20) NOT NULL,
    teacher VARCHAR(50) NOT NULL,
    room_number VARCHAR(20) NOT NULL,
    created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP
);

CREATE TABLE courses (
    id BINARY(16) PRIMARY KEYDEFAULT (UUID_TO_BIN(UUID())),
    name VARCHAR(50) NOT NULLUNIQUE,
    code VARCHAR(20) NOT NULLUNIQUE,
    credits INTNOT NULLDEFAULT1,
    description TEXT,
    created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP
);

CREATE TABLE students (
    id BINARY(16) PRIMARY KEYDEFAULT (UUID_TO_BIN(UUID())),
    name VARCHAR(50) NOT NULL,
    student_number VARCHAR(20) NOT NULLUNIQUE,
    gender ENUM('Male', 'Female') NOT NULL,
    age INTNOT NULL,
    phone VARCHAR(15),
    email VARCHAR(100),
    class_id BINARY(16) NOT NULL,
    created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP,
    CONSTRAINT student_fkey_class FOREIGN KEY (class_id) REFERENCES classes (id)
);

CREATE TABLE student_courses (
    id BINARY(16) PRIMARY KEYDEFAULT (UUID_TO_BIN(UUID())),
    student_id BINARY(16) NOT NULL,
    course_id BINARY(16) NOT NULL,
    enrollment_date TIMESTAMPDEFAULTCURRENT_TIMESTAMP,
    score DECIMAL(5,2),
    status ENUM('Enrolled', 'Completed', 'Dropped') DEFAULT'Enrolled',
    CONSTRAINT sc_fkey_student FOREIGN KEY (student_id) REFERENCES students (id),
    CONSTRAINT sc_fkey_course FOREIGN KEY (course_id) REFERENCES courses (id),
    UNIQUE KEY unique_student_course (student_id, course_id)
);

這里我們創建了四個主要表:

? classes 表存儲班級信息

? courses 表存儲課程信息

? students 表存儲學生信息,通過外鍵與班級關聯

? student_courses 表作為學生和課程的多對多關聯表,存儲選課信息和成績

接下來,創建 V02__adding_classes_data.sql 文件來填充 classes 表:

INSERT INTO classes (name, grade, teacher, room_number)
VALUES
    ('高三(1)班', '高三', '張老師', 'A301'),
    ('高三(2)班', '高三', '李老師', 'A302'),
    ('高二(1)班', '高二', '王老師', 'B201'),
    ('高二(2)班', '高二', '趙老師', 'B202'),
    ('高一(1)班', '高一', '陳老師', 'C101'),
    ('高一(2)班', '高一', '劉老師', 'C102');

這里我們用 INSERT 語句創建六個班級,涵蓋高一到高三各個年級。

接著,創建 V03__adding_courses_data.sql 遷移腳本填充 courses 表:

INSERT INTO courses (name, code, credits, description)
VALUES
    ('語文', 'CH001', 4, '高中語文課程'),
    ('數學', 'MA001', 5, '高中數學課程'),
    ('英語', 'EN001', 4, '高中英語課程'),
    ('物理', 'PH001', 3, '高中物理課程'),
    ('化學', 'CH002', 3, '高中化學課程'),
    ('生物', 'BI001', 3, '高中生物課程'),
    ('歷史', 'HI001', 2, '高中歷史課程'),
    ('地理', 'GE001', 2, '高中地理課程'),
    ('政治', 'PO001', 2, '高中政治課程');

然后創建 V04__adding_students_data.sql 遷移腳本填充 students 表:

SET @class_grade3_1= (SELECT id FROM classes WHERE name ='高三(1)班');
SET@class_grade3_2= (SELECT id FROM classes WHERE name ='高三(2)班');
SET@class_grade2_1= (SELECT id FROM classes WHERE name ='高二(1)班');

INSERT INTO students (name, student_number, gender, age, phone, email, class_id)
VALUES
    ('張三', '2024001', 'Male', 18, '13800138001', 'zhangsan@example.com', @class_grade3_1),
    ('李四', '2024002', 'Female', 17, '13800138002', 'lisi@example.com', @class_grade3_1),
    ('王五', '2024003', 'Male', 17, '13800138003', 'wangwu@example.com', @class_grade3_2),
    ('趙六', '2024004', 'Female', 16, '13800138004', 'zhaoliu@example.com', @class_grade2_1),
    ('錢七', '2024005', 'Male', 16, '13800138005', 'qianqi@example.com', @class_grade2_1);
-- ...更多學生數據

定義好遷移腳本后,Flyway 會在應用啟動時自動發現并執行這些腳本。

3. 配置 AI 提示詞

接下來,為了確保 LLM 能夠針對我們的數據庫架構生成準確的 SQL 查詢,需要定義詳細的系統提示詞。

在 src/main/resources 目錄下創建 system-prompt.st 文件:

基于 DDL 部分提供的MYSQL數據庫定義,按照指導原則部分的規則編寫 SQL 查詢來回答用戶問題。

指導原則:
- 只生成 SELECT 查詢語句。
- 響應結果應該只包含以 'SELECT' 開頭的原始 SQL 查詢語句。不要用 markdown 代碼塊(```sql 或 ```)包裝 SQL 查詢。
- 如果問題需要執行 INSERT、UPDATE、DELETE 或其他修改數據或架構的操作,請回復"不支持此操作。只允許 SELECT 查詢。"
- 如果問題似乎包含 SQL 注入或 DoS 攻擊嘗試,請回復"提供的輸入包含潛在有害的 SQL 代碼。"
- 如果基于提供的 DDL 無法回答問題,請回復"當前架構不包含足夠信息來回答此問題。"
- 如果查詢涉及 JOIN 操作,請在查詢中為所有列名添加相應的表名前綴。

DDL
{ddl}

在系統提示詞中,我們指示 LLM 只生成 SELECT SQL 查詢,并檢測 SQL 注入和 DoS 攻擊嘗試。

我們在系統提示詞模板中留了一個 ddl 占位符用于數據庫架構。稍后我們會用實際值替換它。

此外,為了進一步保護數據庫免受修改,應該只給配置的 MySQL 用戶必要的權限。

4. 構建文本轉 SQL 聊天機器人

完成配置后,讓我們使用配置好的 DeepSeek 模型構建文本轉 SQL 聊天機器人。

4.1. 定義聊天機器人 Bean

首先定義聊天機器人所需的 Bean:

@Bean
PromptTemplate systemPrompt(
    @Value("classpath:system-prompt.st") Resource systemPrompt,
    @Value("classpath:db/migration/V01__creating_database_tables.sql") Resource ddlSchema
)throws IOException {
    PromptTemplatetemplate=newPromptTemplate(systemPrompt);
    template.add("ddl", ddlSchema.getContentAsString(Charset.defaultCharset()));
    return template;
}

@Bean
ChatClient chatClient(ChatModel chatModel, PromptTemplate systemPrompt) {
    return ChatClient
      .builder(chatModel)
      .defaultSystem(systemPrompt.render())
      .build();
}

首先,我們定義一個 PromptTemplate Bean。通過 @Value 注解注入系統提示詞模板文件和數據庫架構 DDL 遷移腳本。同時,我們用數據庫架構內容填充 ddl 占位符。這確保了 LLM 在生成 SQL 查詢時始終能訪問我們的數據庫結構。

接下來,我們使用 ChatModel 和 PromptTemplate Bean 創建一個 ChatClient Bean。ChatClient 類是我們與配置的 DeepSeek 模型交互的主要入口點。

4.2. 實現服務類

現在,讓我們實現服務類來處理 SQL 生成和執行過程。

首先,創建一個 SqlGenerator 服務類,將自然語言問題轉換為 SQL 查詢:

@Service
classSqlGenerator {

    privatefinal ChatClient chatClient;

    // 標準構造函數

    String generate(String question) {
        Stringresponse= chatClient
          .prompt(question)
          .call()
          .content();

        booleanisSelectQuery= response.startsWith("SELECT");
        if (Boolean.FALSE.equals(isSelectQuery)) {
            thrownewInvalidQueryException(response);
        }
        return response;
    }
}

在 generate() 方法中,我們接收自然語言問題作為輸入,使用 chatClient Bean 將其發送給配置的 LLM。

接下來,我們驗證響應確實是 SELECT 查詢。如果 LLM 返回 SELECT 查詢以外的任何內容,我們拋出帶有錯誤消息的自定義 InvalidQueryException。

接下來,為了對數據庫執行生成的 SQL 查詢,創建一個 SqlExecutor 服務類:

@Service
classSqlExecutor {

    privatefinal JdbcClient jdbcClient;

    // 標準構造函數

    List<Map<String, Object>> execute(String query) {
        List<Map<String, Object>> result = jdbcClient
          .sql(query)
          .query()
          .listOfRows();
        
        if (result.isEmpty()) {
            thrownewEmptyResultException("提供的查詢未找到結果。");
        }
        return result;
    }
}

在 execute() 方法中,我們使用 Spring Boot 3.1+ 引入的 JdbcClient 來運行原生 SQL 查詢并返回結果。JdbcClient 提供了更簡潔的 API 和更好的類型安全性。如果查詢沒有返回結果,我們拋出自定義的 EmptyResultException。

4.3. 暴露 REST API

現在我們已經實現了服務層,讓我們在其上暴露一個 REST API:

@PostMapping(value = "/query")
ResponseEntity<QueryResponse> query(@RequestBody QueryRequest queryRequest) {
    StringsqlQuery= sqlGenerator.generate(queryRequest.question());
    List<Map<String, Object>> result = sqlExecutor.execute(sqlQuery);
    return ResponseEntity.ok(newQueryResponse(result));
}

recordQueryRequest(String question) {
}

recordQueryResponse(List<Map<String, Object>> result) {
}

POST /query 端點接受自然語言問題,使用 sqlGenerator Bean 生成相應的 SQL 查詢,將其傳遞給 sqlExecutor Bean 從數據庫獲取結果,最后將數據包裝在 QueryResponse 記錄中并返回。使用 JdbcClient 返回的結果是 List<Map<String, Object>> 格式,每個 Map 代表一行數據,鍵為列名,值為對應的數據。

5. 與聊天機器人交互

最后,讓我們使用暴露的 API 端點與文本轉 SQL 聊天機器人進行交互。

但首先,在 application.yaml 文件中啟用 SQL 日志記錄,以在日志中查看生成的查詢:

logging:
  level:
    org:
      springframework:
        jdbc:
          core: DEBUG

接下來,使用 curl 命令調用 API 端點并與聊天機器人交互:

curl -X POST http://localhost:8080/query \
  -H "Content-Type: application/json" \
  -d '{"question": "查詢高三年級所有學生的姓名和班級信息"}'
{
    "result":[
        {
            "student_name":"張三",
            "class_name":"高三(1)班",
            "grade":"高三",
            "teacher":"張老師",
            "room_number":"A301"
        },
        {
            "student_name":"李四",
            "class_name":"高三(1)",
            "grade":"高三",
            "teacher":"張老師",
            "room_number":"A301"
        },
        {
            "student_name":"王五",
            "class_name":"高三(2)班",
            "grade":"高三",
            "teacher":"李老師",
            "room_number":"A302"
        }
    ]
}

如我們所見,聊天機器人成功理解了我們對高三學生的查詢請求,并返回了學生姓名和對應的班級信息。

讓我們再試一個更復雜的查詢:

curl -X POST http://localhost:8080/query \
  -H "Content-Type: application/json" \
  -d '{"question": "統計每個班級的學生人數,按人數降序排列"}'

最后,讓我們檢查應用日志,查看 LLM 生成的 SQL 查詢:

SELECT students.name, classes.name as class_name
FROM students
JOIN classes ON students.class_id = classes.id
WHERE classes.grade = '高三'
ORDER BY classes.name;
{
    "result":[
        {
            "class_name":"高三(1)班",
            "student_count":2
        },
        {
            "class_name":"高二(1)班",
            "student_count":2
        },
        {
            "class_name":"高三(2)班",
            "student_count":1
        },
        {
            "class_name":"高一(1)班",
            "student_count":0
        },
        {
            "class_name":"高一(2)班",
            "student_count":0
        },
        {
            "class_name":"高二(2)班",
            "student_count":0
        }
    ]
}

生成的 SQL 查詢正確解釋了我們的自然語言請求,連接了 students 和 classes 表來查找高三年級的學生信息。DeepSeek 模型展現了出色的中文理解和 SQL 生成能力。

6. 總結

本教程展示了如何使用 Spring AI 框架構建一個功能完整的文本轉 SQL 聊天機器人。雖然我們已經構建了一個基礎的文本轉 SQL 系統,但仍有許多改進空間:

  • 權限控制:根據用戶角色限制可訪問的數據范圍
  • 結果可視化:將查詢結果以圖表形式展示
  • LLM生成優化:通過JSON格式化和JSON修復支持穩定輸出

通過本教程的學習,已經體現了構建文本轉 SQL 聊天機器人的核心技術。Spring AI 框架的強大功能,結合 DeepSeek 等先進的大語言模型,為我們提供了構建智能數據查詢系統的完整解決方案。這種技術組合不僅簡化了數據訪問流程,也為未來的智能化應用奠定了堅實基礎。

責任編輯:武曉燕 來源: JAVA架構日記
相關推薦

2013-07-16 10:08:51

MIT編程語言

2023-10-27 09:00:00

人工智能ChatGPT大型語言模型

2025-01-26 12:34:46

AI運維配置

2020-12-07 08:16:39

自然語言查詢數據庫數據庫查詢

2021-05-13 07:17:13

Snownlp自然語言處理庫

2023-10-12 11:31:57

人工智能自然語言

2023-08-03 09:56:47

自然語言AI

2025-01-07 07:00:00

2021-05-17 09:00:00

自然語言人工智能技術

2021-01-19 22:38:59

人工智能語言人臉識別

2020-04-24 10:53:08

自然語言處理NLP是人工智能

2024-02-05 14:18:07

自然語言處理

2017-10-19 17:05:58

深度學習自然語言

2020-11-16 12:02:22

人工智能語言技術

2024-11-01 08:39:25

2023-05-28 12:26:36

ChatGPTAI

2023-05-14 23:42:58

ChatGPTOpenAI自然語言

2023-08-07 08:41:45

自然語言模型因果推理

2009-11-25 14:25:14

PHP自然語言排序

2021-05-18 07:15:37

Python
點贊
收藏

51CTO技術棧公眾號

看看黄色一级片| 日韩精品一区二区三区色偷偷| 2014亚洲天堂| 国产精品高潮呻吟久久久久| 欧美日韩精品在线| 一区二区不卡在线观看| 黑人乱码一区二区三区av| 国产欧美精品| 美女啪啪无遮挡免费久久网站| 欧美夫妇交换xxx| 国产一区高清| 婷婷综合另类小说色区| 一区二区三区四区欧美日韩| 神马午夜电影一区二区三区在线观看| 奇米色一区二区| 久久久这里只有精品视频| 黄大色黄女片18免费| 大伊香蕉精品在线品播放| 欧美日韩1区2区| 日韩在线一级片| 污视频网站免费在线观看| 久久久久久久久伊人| 成人激情电影一区二区| 亚洲精品男人的天堂| 欧美日本一区二区高清播放视频| 国产一区二区三区18| 朝桐光av一区二区三区| 亚洲乱码一区| 欧美一区二区三区视频免费播放 | 国产综合婷婷| 丝袜亚洲另类欧美重口| 波多野结衣办公室33分钟| 日韩在线观看一区二区三区| 欧美日韩亚洲综合在线| 波多野结衣家庭教师视频| 678在线观看视频| 亚洲综合久久av| 国产91av视频在线观看| 粉嫩av一区| 国产午夜精品美女毛片视频| 久久99国产精品| 色窝窝无码一区二区三区成人网站 | 国产精品国产自产拍在线| 欧美一区二区三区在线免费观看| 少妇高潮一区二区三区69| 国产成人日日夜夜| 亚洲a一级视频| 97在线公开视频| 久久国产精品99精品国产| 国产精品久久久久久五月尺| 波多野结衣在线观看一区| 久久精品官网| 国产精品久久久久久亚洲影视| 探花国产精品一区二区| 免费成人在线影院| 91精品国产自产在线观看永久| 中文字幕在线观看高清| 久久国产乱子精品免费女| 国产精品美女主播| 一区二区www| 国产一区视频在线看| 999国产在线| 乱精品一区字幕二区| 99久久精品免费观看| 久久久影院一区二区三区 | 精品国产亚洲一区二区三区在线 | 国产精品久久精品国产| 免费看黄色一级视频| 97久久精品人人做人人爽50路| 久久久综合香蕉尹人综合网| 福利在线视频导航| 亚洲视频一二三| 精品一区二区三区无码视频| 美洲精品一卡2卡三卡4卡四卡| 亚洲一区二区三区自拍| 国产a级一级片| av激情成人网| 欧美一区二区视频在线观看2022| 亚洲成人激情小说| 日韩欧美在线精品| 在线播放国产一区中文字幕剧情欧美 | 成人在线国产| 久久手机免费视频| 日韩精品视频播放| 奇米精品一区二区三区在线观看| 亚洲jizzjizz日本少妇| 四季av日韩精品一区| 国产欧美精品一区二区三区四区 | 亚洲欧美成人| 国产精品一区专区欧美日韩| 人妻精品一区二区三区| 久久久精品免费免费| 国产对白在线播放| jizz内谢中国亚洲jizz| 欧美狂野另类xxxxoooo| 性欧美18—19sex性高清| 国产探花一区二区| 欧美人与性动交a欧美精品| 狠狠人妻久久久久久| 韩国成人精品a∨在线观看| 欧美成人免费在线| 在线观看电影av| 色婷婷av一区二区三区大白胸| 婷婷激情小说网| 久久99国产精品视频| 久久国产精彩视频| 久久久蜜桃一区二区| 国产精品自拍在线| 亚洲高清资源综合久久精品| 男女免费观看在线爽爽爽视频| 91福利在线免费观看| av漫画在线观看| 99久久久久国产精品| 日本亚洲欧洲色| 黄色av中文字幕| 亚洲精品菠萝久久久久久久| 久久久久久久久久福利| 亚洲精品在线a| 久久激情视频免费观看| 无码人妻av免费一区二区三区 | 国产伦理片在线观看| 亚洲美女啪啪| 99久久精品久久久久久ai换脸| av网站在线播放| 日韩欧美有码在线| 欧美在线一级片| 黄色精品网站| 亚洲最大的成人网| 麻豆影院在线观看| 精品视频免费在线| 娇妻被老王脔到高潮失禁视频| 99在线精品免费视频九九视| 国产99在线免费| 中国av在线播放| 9191成人精品久久| 男人的午夜天堂| 九九**精品视频免费播放| 日韩精彩视频| 日韩在线影院| 亚洲片av在线| 国产乱码77777777| 久久亚洲欧美国产精品乐播| 春日野结衣av| 在线日韩网站| 欧洲成人在线视频| 欧美人体大胆444www| 一本大道av一区二区在线播放| 国产精品一级黄片| 国产亚洲精品久久久久婷婷瑜伽| 精品欧美一区二区精品久久| 欧美xxxhd| 亚洲欧美国产va在线影院| 久久国产精品免费看| 2020国产精品自拍| caopor在线视频| 成人写真视频| 成人有码视频在线播放| 在线视频国产区| 日韩精品一区二| 国产做受高潮漫动| 国产亚洲一二三区| 深夜黄色小视频| 亚洲成av人片乱码色午夜| 3d精品h动漫啪啪一区二区| 免费看电影在线| 亚洲乱码一区二区| 伊人免费在线观看| 亚洲欧美日韩国产成人精品影院| 男人女人拔萝卜视频| 99国产精品久久久久久久| 欧美日韩综合久久| 日韩国产大片| 欧美日韩高清区| 你懂的在线播放| 欧美日韩精品一区二区三区 | 性欧美丰满熟妇xxxx性仙踪林| 久久夜色精品| 看一级黄色录像| 噜噜噜狠狠夜夜躁精品仙踪林| 全亚洲最色的网站在线观看| 欧美性videos| 亚洲第一精品电影| 中文字幕乱伦视频| 亚洲精品免费播放| 法国伦理少妇愉情| 国模娜娜一区二区三区| 三上悠亚久久精品| 青草国产精品| 国产在线精品一区二区三区》| 韩国精品主播一区二区在线观看 | 国产无遮挡aaa片爽爽| 国产亚洲欧美色| 国产精品19p| 男女激情视频一区| 国产主播自拍av| 99精品全国免费观看视频软件| 国产午夜精品在线| 亚洲综合资源| 欧美中在线观看| 污网站在线免费看| 色哟哟网站入口亚洲精品| 性xxxx视频| 日韩亚洲欧美在线| 成人免费一区二区三区| 亚洲福利一区二区三区| 日本二区三区视频| 91视视频在线观看入口直接观看www| 手机av在线网| 天堂成人国产精品一区| 国产自产在线视频| 亚洲五月综合| 日韩黄色影视| 在线日韩一区| 国产欧美一区二区在线播放| 国产精品一区二区三区四区在线观看| 日本不卡高字幕在线2019| 在线看女人毛片| 久久久精品999| 97视频在线观看网站| 亚洲精品天天看| 日韩中文字幕免费观看| 日韩欧美不卡一区| 国产又粗又大又爽视频| 在线观看中文字幕不卡| 伦av综合一区| 欧美日韩亚洲视频一区| 国产一级二级毛片| 亚洲黄色小视频| av成人免费网站| 欧美激情一二三区| 成人性生交大免费看| 91免费看`日韩一区二区| 亚洲婷婷在线观看| 成人h动漫精品| 免费看黄色片的网站| 国产激情视频一区二区在线观看| 在线视频观看91| 极品美女销魂一区二区三区免费| 久久久久国产一区| 麻豆国产欧美一区二区三区| 玩弄japan白嫩少妇hd| 老牛影视一区二区三区| 成人羞羞国产免费网站| 久热re这里精品视频在线6| 国产91美女视频| 久久久777| 五月婷婷深爱五月| 蜜臀久久久99精品久久久久久| 日本激情综合网| 日本欧美加勒比视频| 色综合色综合色综合色综合| 麻豆91在线看| 午夜啪啪小视频| 国产精品原创巨作av| 三级网站免费看| 福利电影一区二区三区| 亚洲观看黄色网| 久久先锋影音av| xxxxx99| 亚洲女同女同女同女同女同69| 欧美精品久久久久性色| 亚洲h动漫在线| 黄瓜视频在线免费观看| 欧美三级日韩三级| 国产丝袜在线视频| 精品国产91洋老外米糕| 青青操视频在线| 日韩在线中文字幕| 狂野欧美激情性xxxx欧美| 欧美一级淫片播放口| 日韩精品免费观看视频| 91中文在线视频| 国产精品久久久网站| 日本免费一区二区三区| 婷婷综合五月| a级黄色一级片| 蜜桃视频在线观看一区二区| 在线观看你懂的视频| 久久精品男人天堂av| 欧美视频www| 精品欧美aⅴ在线网站| 中文字幕日韩第一页| 欧美xxxxxxxx| 成人福利在线| 欧美大秀在线观看| 台湾佬成人网| av一本久道久久波多野结衣| 希岛爱理av免费一区二区| 正在播放91九色| 一本久道久久综合婷婷鲸鱼| 国产又大又黄又猛| 波多野结衣中文字幕一区二区三区| 免费黄在线观看| 五月激情丁香一区二区三区| 91无套直看片红桃| 精品中文视频在线| 在线中文字幕-区二区三区四区| 日本亚洲欧洲色| 国产成人aa在线观看网站站| 四虎永久国产精品| 一区在线观看| 午夜国产福利在线观看| 久久精品一区蜜桃臀影院| 欧美日韩免费一区二区| 欧美三级电影精品| 亚洲 小说区 图片区 都市| 久久福利网址导航| 99re久久| 欧美精品一区在线| 亚洲调教视频在线观看| 国产嫩草在线观看| 久久久久亚洲蜜桃| 国产精品成人网站| 欧美一二区视频| 日本高清中文字幕在线| 国产精品久久久久久久久免费 | 偷拍盗摄高潮叫床对白清晰| 久久激情视频| a级一a一级在线观看| 一区二区三区不卡视频| 国产精品久久久久久久久久久久久久久久 | 亚洲一二三区不卡| 国产乱人乱偷精品视频a人人澡| 伊人久久男人天堂| 神马电影网我不卡| 免费看成人片| 亚洲在线观看| 妖精视频一区二区| 伊人开心综合网| 精品久久久无码中文字幕| xxxx性欧美| 久久久久黄色| 日韩视频在线播放| 日韩电影在线免费| 精品成人无码一区二区三区| 色综合色综合色综合色综合色综合 | 国产成人精品亚洲日本在线桃色| 黄色香蕉视频在线观看| 欧美日韩成人高清| 麻豆视频免费在线观看| 91精品视频大全| 亚洲久久久久| 亚洲一区二区三区三州| 亚洲一二三区视频在线观看| 成人精品在线播放| 国内精久久久久久久久久人| 久久365资源| 久久精品99国产| 久久精品欧美一区二区三区不卡 | se69色成人网wwwsex| 亚洲成人午夜在线| 久久国产剧场电影| 黑人巨大精品一区二区在线| 日韩美女在线视频| av影片在线| 欧美少妇一区| 看国产成人h片视频| 尤物在线免费视频| 日韩精品一区二区三区三区免费| 成人免费观看在线观看| 久久久久久久久久久久久久一区| 老牛嫩草一区二区三区日本| 在线观看免费黄色网址| 日韩午夜在线观看| 97人人爽人人澡人人精品| 欧美日韩精品免费在线观看视频| 日本女人一区二区三区| 青花影视在线观看免费高清| 日韩精品最新网址| 2022成人影院| 亚洲资源在线网| 高清在线观看日韩| 依依成人综合网| 日韩视频在线免费| www国产精品| 91av俱乐部| 亚洲黄色尤物视频| 男人久久精品| 99se婷婷在线视频观看| 在线亚洲国产精品网站| 欧美精品日韩在线| 欧美xxxxxxxxx| 国产69精品久久久久9999人| 999一区二区三区| 国产女主播视频一区二区| av综合在线观看| 日本久久91av| 欧美精品日本| x88av在线| 欧美大片免费久久精品三p| 日韩精品99| 国产欧美久久久久| 亚洲国产精品二十页| 韩国中文字幕hd久久精品| 国产免费一区二区三区香蕉精| 亚洲大片av| 国产精品精品软件男同| 精品视频在线播放免| 精品国产亚洲日本| 我看黄色一级片|