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

多模態RAG構建指南:為AI系統提供更多可能性

譯文 精選
人工智能
在這篇文章中,我們將討論開發人員如何使用Milvus構建他們自己的多模態RAG系統。我們還將引導你構建這樣一個系統,該系統可以處理文本和圖像數據,特別是執行相似性搜索,并利用語言模型來優化輸出。?

譯者 | 晶顏

審校 | 重樓

本文提供了關于如何使用Milvus構建多模態RAG系統以及如何為AI系統開辟各種可能性的深入指南。

局限于單一的數據格式已經逐漸落伍。隨著企業越來越依賴信息來做出關鍵決策,他們需要能夠比較不同格式的數據。幸運的是,傳統的限于單一數據類型的人工智能系統已經讓位于能夠理解和處理復雜信息的多模態(Multimodal)系統。

多模態搜索和多模態檢索增強生成(RAG)系統近年來在這一領域取得了很大進展。這些系統能夠處理多種類型的數據,包括文本、圖像和音頻,以提供上下文感知的響應。

在這篇文章中,我們將討論開發人員如何使用Milvus構建他們自己的多模態RAG系統。我們還將引導你構建這樣一個系統,該系統可以處理文本和圖像數據,特別是執行相似性搜索,并利用語言模型來優化輸出。

Milvus是什么?

向量數據庫是一種特殊類型的數據庫,用于存儲、索引和檢索向量嵌入,向量嵌入是數據的數學表示(如圖像、文本和音頻),不僅可以比較數據的等價性,還可以比較數據的語義相似性。Milvus就是一個開源、高性能的向量數據庫。你可以在GitHub上找到它,它有Apache-2.0許可證并已獲得超過3萬顆星星。

Milvus幫助開發人員提供靈活的解決方案來管理和查詢大規模向量數據。Milvus的效率使其成為開發人員使用深度學習模型構建應用程序的理想選擇,例如檢索增強生成(RAG)、多模態搜索、推薦引擎和異常檢測。

Milvus提供多種部署選項來滿足開發人員的需求。Milvus Lite是一個輕量級版本,可以在Python應用程序中運行,非常適合在本地環境中創建應用程序原型。Milvus Standalone和Milvus Distributed是可擴展和“生產就緒”(即產品已經過充分測試和優化,可在生產環境中使用)的選項。

多模態RAG:擴展至文本之外

在構建系統之前,了解傳統的基于文本的RAG及其向多模態RAG的演變是很重要的。

檢索增強生成(RAG)是從外部源檢索上下文信息并從大型語言模型(LLM)生成更準確輸出的一種方法。傳統的RAG是提高LLM輸出的一種非常有效的策略,但是它仍然局限于文本數據。而在許多現實世界的應用程序中,數據已經擴展到文本之外,結合圖像、圖表和其他形式提供了關鍵的上下文。

多模態RAG通過支持使用不同的數據類型解決了上述限制,為LLM提供了更好的上下文。

簡單地說,在多模態RAG系統中,檢索組件能夠跨不同的數據模態搜索相關信息,生成組件根據檢索到的信息生成更準確的結果。

理解向量嵌入和相似性搜索

向量嵌入和相似性搜索是多模態RAG的兩個基本概念。讓我們先來理解它們。

向量嵌入

如前所述,向量嵌入是數據的數學/數值表示。機器使用這種表示來理解不同數據類型(如文本、圖像和音頻)的語義含義。

在使用自然語言處理(NLP)時,將文檔塊轉換為向量,并將語義相似的單詞映射到向量空間中的附近點。圖像也是如此,其中嵌入表示語義特征。這使我們能夠以數字格式理解顏色、紋理和物體形狀等指標。

使用向量嵌入的主要目的是幫助保持不同數據塊之間的關系和相似性。

相似性搜索

相似性搜索用于查找和定位給定數據集中的數據。在向量嵌入的背景下,相似性搜索在給定的數據集中找到最接近查詢向量的向量。

以下是幾種常用的度量向量之間相似性的方法:

  • 歐幾里得距離:測量向量空間中兩點之間的直線距離。
  • 余弦相似度:測量兩個向量之間夾角的余弦值(關注它們的方向而不是大小)。
  • 點積:對應元素相加的簡單乘法。

相似性度量的選擇通常取決于特定于應用程序的數據以及開發人員處理問題的方式。

在大規模數據集上進行相似性搜索時,需要很強大的計算能力和資源。這就是近似最近鄰(ANN)算法發揮作用的地方。人工神經網絡算法用于交換小百分比或數量的準確性,以獲得顯著的速度提升。這使得它們成為大規模應用程序的合適選擇。

Milvus還使用先進的人工神經網絡算法(包括HNSW和DiskANN),在大型向量嵌入數據集上執行高效的相似性搜索,使開發人員能夠快速找到相關數據點。此外,Milvus支持其他索引算法,如HSNW, IVF, CAGRA等,使其成為一個更有效的向量搜索解決方案。

用Milvus構建多模態RAG

現在我們已經學習了這些概念,是時候使用Milvus構建一個多模態RAG系統了。在下述示例中,我們將使用Milvus Lite(Milvus的輕量級版本,非常適合實驗和原型設計)進行向量存儲和檢索,BGE用于精確的圖像處理和嵌入,GPT用于高級結果重新排序。

先決條件

首先,你需要一個Milvus實例來存儲你的數據。你可以使用pip設置Milvus Lite,使用Docker運行本地實例,或者通過Zilliz Cloud注冊一個免費托管的Milvus帳戶。

其次,你需要為你的RAG管道提供LLM,因此建議前往OpenAI并獲取API密鑰。免費層足以使此代碼運行。

接下來,創建一個新目錄和一個Python虛擬環境(或者采取你用來管理Python的任何步驟)。

對于本教程,你還需要安裝pymilvus庫(它是Milvus的官方Python SDK)和一些常用工具。

設置Milvus Lite

pip install -U pymilvus

安裝依賴項

pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm
git clone https://github.com/FlagOpen/FlagEmbedding.git
pip install -e FlagEmbedding

下載數據

下面的命令將下載示例數據并將其解壓縮到本地文件夾“./images_folder”,其中包括:

  • 圖片:Amazon Reviews 2023的一個子集,包含大約900張來自“Appliance”、 “Cell_Phones_and_Accessories”和“Electronics”類別的圖片。
  • 查詢圖片示例:leopard.jpg

wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gztar -xzf amazon_reviews_2023_subset.tar.gz

加載嵌入模型

我們將使用可視化BGE模型“big - visualizing -base-en-v1.5”來生成圖像和文本的嵌入。

現在從HuggingFace下載權重。

wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.

然后,讓我們構建一個編碼器。

import torchfrom visual_bge.modeling import Visualized_BGE
class Encoder:

    def __init__(self, model_name: str, model_path: str):

        self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)

        self.model.eval()

    def encode_query(self, image_path: str, text: str) -> list[float]:

        with torch.no_grad():

            query_emb = self.model.encode(image=image_path, text=text)

        return query_emb.tolist()[0]

    def encode_image(self, image_path: str) -> list[float]:

        with torch.no_grad():

            query_emb = self.model.encode(image=image_path)

        return query_emb.tolist()[0]

model_name = "BAAI/bge-base-en-v1.5"

model_path = "./Visualized_base_en_v1.5.pth"  # Change to your own value if using a different model path

encoder = Encoder(model_name, model_path)

生成嵌入和加載數據到Milvus

本節將指導你如何將示例圖像與其相應的嵌入加載到數據庫中。

生成嵌入

首先,我們需要為數據集中的所有圖像創建嵌入。

從data目錄加載所有圖像并將它們轉換為嵌入。

import os
from tqdm import tqdm
from glob import glob

data_dir = (

    "./images_folder"  # Change to your own value if using a different data directory
)

image_list = glob(

    os.path.join(data_dir, "images", "*.jpg")
)  # We will only use images ending with ".jpg"

image_dict = {}
for image_path in tqdm(image_list, desc="Generating image embeddings: "):

    try:

        image_dict[image_path] = encoder.encode_image(image_path)

    except Exception as e:

        print(f"Failed to generate embedding for {image_path}. Skipped.")

        continue
print("Number of encoded images:", len(image_dict))

執行多模態搜索和重新排序結果

在本節中,我們將首先使用多模態查詢搜索相關圖像,然后使用LLM服務對檢索結果進行重新排序,并找到帶有解釋的最佳圖像。

運行多模態搜索

現在,我們準備使用由圖像和文本指令組成的查詢來執行高級多模態搜索。

query_image = os.path.join(

    data_dir, "leopard.jpg"
)  # Change to your own query image path

query_text = "phone case with this image theme"

query_vec = encoder.encode_query(image_path=query_image, text=query_text)

search_results = milvus_client.search(

    collection_name=collection_name,

    data=[query_vec],

    output_fields=["image_path"],

    limit=9,  # Max number of search results to return

    search_params={"metric_type": "COSINE", "params": {}},  # Search parameters
)[0]

retrieved_images = [hit.get("entity").get("image_path") for hit in search_results]
print(retrieved_images)

結果如下:

['./images_folder/images/518Gj1WQ-RL._AC_.jpg', 
'./images_folder/images/41n00AOfWhL._AC_.jpg'

用GPT-40重新排序結果

現在,我們將使用GPT-40對檢索到的圖像進行排序,并找到最匹配的結果。最后,LLM還將解釋排名原因。

1. 創建全景視圖。

import numpy as np
import cv2

img_height = 300

img_width = 300

row_count = 3
def create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:

    """

creates a 5x5 panoramic view image from a list of images

args:

images: list of images to be combined

returns:

np.ndarray: the panoramic view image

"""

    panoramic_width = img_width * row_count

    panoramic_height = img_height * row_count

    panoramic_image = np.full(

        (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8

    )

    # create and resize the query image with a blue border

    query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)

    query_image = Image.open(query_image_path).convert("RGB")

    query_array = np.array(query_image)[:, :, ::-1]

    resized_image = cv2.resize(query_array, (img_width, img_height))

    border_size = 10

    blue = (255, 0, 0)  # blue color in BGR

    bordered_query_image = cv2.copyMakeBorder(

        resized_image,

        border_size,

        border_size,

        border_size,

        border_size,

        cv2.BORDER_CONSTANT,

        value=blue,

    )

    query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(

        bordered_query_image, (img_width, img_height)

    )

    # add text "query" below the query image

    text = "query"

    font_scale = 1

    font_thickness = 2

    text_org = (10, img_height * 3 + 30)

    cv2.putText(

        query_image_null,

        text,

        text_org,

        cv2.FONT_HERSHEY_SIMPLEX,

        font_scale,

        blue,

        font_thickness,

        cv2.LINE_AA,

    )

    # combine the rest of the images into the panoramic view

    retrieved_imgs = [

        np.array(Image.open(img).convert("RGB"))[:, :, ::-1] for img in retrieved_images

    ]

    for i, image in enumerate(retrieved_imgs):

        image = cv2.resize(image, (img_width - 4, img_height - 4))

        row = i // row_count

        col = i % row_count

        start_row = row * img_height

        start_col = col * img_width

        border_size = 2

        bordered_image = cv2.copyMakeBorder(

            image,

            border_size,

            border_size,

            border_size,

            border_size,

            cv2.BORDER_CONSTANT,

            value=(0, 0, 0),

        )

        panoramic_image[

            start_row : start_row + img_height, start_col : start_col + img_width

        ] = bordered_image

        # add red index numbers to each image

        text = str(i)

        org = (start_col + 50, start_row + 30)

        (font_width, font_height), baseline = cv2.getTextSize(

            text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2

        )

        top_left = (org[0] - 48, start_row + 2)

        bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)

        cv2.rectangle(

            panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED

        )

        cv2.putText(

            panoramic_image,

            text,

            (start_col + 10, start_row + 30),

            cv2.FONT_HERSHEY_SIMPLEX,

            1,

            (0, 0, 255),

            2,

            cv2.LINE_AA,

        )

    # combine the query image with the panoramic view

    panoramic_image = np.hstack([query_image_null, panoramic_image])

    return panoramic_image

2. 將查詢圖像和檢索圖像與索引結合在一個全景視圖中。

from PIL import Image

combined_image_path = os.path.join(data_dir, "combined_image.jpg")

panoramic_image = create_panoramic_view(query_image, retrieved_images)

cv2.imwrite(combined_image_path, panoramic_image)

combined_image     = Image    .open(combined_image_path    )

show_combined_image = combined_image.resize((300, 300))

show_combined_image.show()

多模態搜索結果

3. 對結果重新排序并給出解釋

我們將把所有組合的圖像發送到多模態LLM服務,并提供適當的提示,對檢索結果進行排序并給出解釋。注意:要啟用GPT- 40作為LLM,你需要提前準備好你的OpenAI API Key。

import requests
import base64

openai_api_key = "sk-***"  # Change to your OpenAI API Key
def generate_ranking_explanation(

    combined_image_path: str, caption: str, infos: dict = None
) -> tuple[list[int], str]:

    with open(combined_image_path, "rb") as image_file:

        base64_image = base64.b64encode(image_file.read()).decode("utf-8")

    information = (

        "You are responsible for ranking results for a Composed Image Retrieval. "

        "The user retrieves an image with an 'instruction' indicating their retrieval intent. "

        "For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. "

        "Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. "

        f"User instruction: {caption} \n\n"

    )

    # add additional information for each image

    if infos:

        for i, info in enumerate(infos["product"]):

            information += f"{i}. {info}\n"

    information += (

        "Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. "

        "The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent."

    )

    headers = {

        "Content-Type": "application/json",

        "Authorization": f"Bearer {openai_api_key}",

    }

    payload = {

        "model": "gpt-4o",

        "messages": [

            {

                "role": "user",

                "content": [

                    {"type": "text", "text": information},

                    {

                        "type": "image_url",

                        "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},

                    },

                ],

            }

        ],

        "max_tokens": 300,

    }

    response = requests.post(

        "https://api.openai.com/v1/chat/completions", headers=headers, json=payload

    )

    result = response.json()["choices"][0]["message"]["content"]

    # parse the ranked indices from the response

    start_idx = result.find("[")

    end_idx = result.find("]")

    ranked_indices_str = result[start_idx + 1 : end_idx].split(",")

    ranked_indices = [int(index.strip()) for index in ranked_indices_str]

    # extract explanation

    explanation = result[end_idx + 1 :].strip()

    return ranked_indices, explanation

得到排名后的圖像指標和最佳結果的原因:

ranked_indices, explanation = generate_ranking_explanation(

    combined_image_path, query_text
)

4. 顯示最佳結果并附有說明

print(explanation)

best_index = ranked_indices[0]

best_img = Image.open(retrieved_images[best_index])

best_img = best_img.resize((150, 150))

best_img.show()

結果:

“原因:最適合用戶查詢意圖的項是索引6,因為指令指定了一個以圖片為主題的手機殼,是一只豹子。索引為6的手機殼采用了類似豹紋的主題設計,最符合用戶對圖像主題手機殼的需求。”

豹紋手機殼-最佳效果

結語

在這篇文章中,我們討論了使用Milvus(一個開源向量數據庫)構建一個多模態RAG系統的具體操作指南,介紹了開發人員如何設置Milvus、加載圖像數據、執行相似性搜索以及使用LLM對檢索結果進行重新排序以獲得更準確的響應。

可以說,多模態RAG解決方案為人工智能系統提供了多種可能性,可以輕松理解和處理多種形式的數據。一些常見的可能性包括改進圖像搜索引擎、更好的上下文驅動結果等等,其他更多可能性等你來探索!

原文標題:Want to Search for Something With an Image and a Text Description? Try a Multimodal RAG作者:Jiang Chen

責任編輯:姜華 來源: 51CTO內容精選
相關推薦

2021-06-17 11:14:22

云計算云原生

2022-12-30 07:40:12

DeepKitTypeScript靜態類型

2024-01-10 16:42:23

人工智能工業

2017-07-21 16:40:29

網易云場景專屬云

2024-01-11 16:24:12

人工智能RAG

2016-09-21 09:16:55

Qlik

2019-10-09 17:28:08

程序員人生第一份工作技術

2025-07-09 02:10:00

2021-09-29 18:59:42

戴爾

2011-04-20 10:07:15

2023-04-19 08:00:00

人工智能視覺語言模型

2025-10-27 01:50:00

2018-03-02 11:38:11

2012-03-10 21:35:54

iPad

2021-08-09 17:14:55

低代碼用友BIP

2025-01-02 08:36:25

多模態RAG深度學習自然語言處理

2024-10-29 11:54:25

2025-01-16 14:38:10

點贊
收藏

51CTO技術棧公眾號

美女福利视频网| 丝袜足脚交91精品| 国产无码精品在线观看| 老牛精品亚洲成av人片| 日韩欧美成人区| 欧美久久久久久| 国产精品怡红院| 99精品国产一区二区青青牛奶| 亚洲欧美日韩高清| 天天干天天玩天天操| 中文字幕在线播放网址| av中文字幕在线不卡| 国产精品jvid在线观看蜜臀| 午夜黄色福利视频| 国产精品丝袜在线播放| 在线观看日韩毛片| 美脚丝袜脚交一区二区| 国产在线播放观看| 国产精品麻豆入口| 777午夜精品电影免费看| 亚洲精品乱码久久久久久黑人| 久草一区二区| 国产夫绿帽单男3p精品视频| 免费日韩av| 欧美日韩高清在线观看| 怡红院一区二区三区| 99re热精品视频| 日本一区精品视频| 国产福利一区二区三区在线播放| 99久久久国产精品| 91久久久久久久久| 91丨九色丨海角社区| 亚洲承认在线| 欧美成年人在线观看| 国产黄片一区二区三区| h视频久久久| 欧美片在线播放| 国产黄色特级片| sm在线播放| 亚洲黄色小说网站| 小说区视频区图片区| 国产美女性感在线观看懂色av| 成人天堂资源www在线| 91九色国产视频| 羞羞色院91蜜桃| 久久国产99| 97在线视频观看| 欧美成人三级在线观看| 久久精品亚洲欧美日韩精品中文字幕| 99在线热播精品免费| 欧美黄网免费在线观看| 最新av电影网站| 久久香蕉国产| 深夜成人在线观看| 丰满的亚洲女人毛茸茸| 深夜福利久久| 亚洲三级 欧美三级| 日韩 中文字幕| 亚洲+变态+欧美+另类+精品| 亚洲国产精品va在线看黑人| 青青草原播放器| 亚洲精品一区二区在线播放∴| 在线视频欧美区| av动漫在线观看| 欧美日韩国产v| 91久久香蕉国产日韩欧美9色| 波多野结衣50连登视频| 超级碰碰久久| 欧美性猛交一区二区三区精品| 成年人小视频网站| 欧美日韩国产网站| 欧美日韩1234| 亚洲丝袜在线观看| h视频久久久| 日韩精品免费在线| 美女被到爽高潮视频| 精品久久综合| 最近2019年日本中文免费字幕 | 亚洲成a人片| 日本高清视频一区二区| 激情综合网婷婷| 99久久精品一区二区成人| 欧美高清dvd| 可以看的av网址| 美腿丝袜亚洲图片| 亚洲一级黄色片| 91香蕉视频网| 激情丁香综合| 国产成人在线播放| 97成人免费视频| 国产成人精品在线看| 精品无码久久久久久久动漫| 男女污污视频在线观看| 国产精品的网站| 东北少妇不带套对白| 韩国美女久久| 欧美一区二区人人喊爽| 在线免费观看a级片| 国产一区网站| 九九精品视频在线| 91精品国产高清一区二区三密臀| 日韩电影免费一区| 99re在线视频上| 男女网站在线观看| 亚洲人成小说网站色在线| www.日本少妇| 亚洲狼人综合| 亚洲欧美日韩久久久久久| 日韩激情小视频| 国产日韩亚洲欧美精品| 成人免费网站在线观看| 性xxxx搡xxxxx搡欧美| 亚洲视频在线一区| 国产精品欧美激情在线观看| 国产欧美88| 亚洲人成在线观看| 国产无遮挡又黄又爽又色| 蜜桃av噜噜一区| 久久国产精品久久| 性直播体位视频在线观看| 色八戒一区二区三区| 苍井空张开腿实干12次| 围产精品久久久久久久| 热久久美女精品天天吊色| 精品乱子伦一区二区| 日本一区二区三区四区| 国产二级片在线观看| 国产精品1区| 伊人久久精品视频| 日本中文字幕在线| 成人av网站在线观看免费| 特色特色大片在线| 精品久久在线| 亚洲香蕉在线观看| 亚洲精品午夜国产va久久成人| 国产一区不卡视频| 在线成人性视频| 成人午夜精品| 亚洲欧美日韩高清| 天天操夜夜操视频| 99久久久久免费精品国产| 超碰97在线看| 欧美a在线观看| 久久久国产精品亚洲一区| 久久国产香蕉视频| 国产亚洲欧美日韩俺去了| 欧美牲交a欧美牲交aⅴ免费下载| 国产精品久久久网站| 欧美日韩成人在线播放| 精品人妻一区二区三区含羞草 | 亚洲成人亚洲激情| 久久精品无码人妻| 成人黄色在线看| 日韩黄色短视频| 老司机凹凸av亚洲导航| 97在线观看视频国产| 青青草在线免费观看| 亚洲电影中文字幕在线观看| 激情av中文字幕| 在线播放精品| 裸模一区二区三区免费| 在线能看的av网址| 国产香蕉精品视频一区二区三区| 影音先锋在线国产| 国产婷婷色一区二区三区在线| 日本xxxxxxx免费视频| 精品国产乱码久久久久久1区2匹| 国产精品黄色av| 国产精品一区二区婷婷| 欧美日韩精品综合在线| 免费黄色激情视频| 国产精品一区在线观看乱码| 菠萝蜜视频在线观看入口| 91免费精品国偷自产在线在线| 久久久久久久成人| 天堂av在线资源| 在线观看成人小视频| 精品一区二区三孕妇视频| 国内精品不卡在线| 妞干网视频在线观看| 乱中年女人伦av一区二区| 欧洲精品在线视频| 日本天堂在线观看| 亚洲成人中文字幕| 欧美激情一区二区三区免费观看 | 国产盗摄视频一区二区三区| 青青草精品视频在线| 精品视频久久| 91福利视频导航| 国产精品迅雷| 久久精品国产免费观看| 日韩中文字幕免费在线观看| 色欧美片视频在线观看在线视频| 国产又粗又长又硬| 成人蜜臀av电影| 91日韩视频在线观看| 牛夜精品久久久久久久99黑人| 国外成人在线视频网站| 日韩av首页| 欧美激情视频在线| 国产精品毛片一区二区三区四区| 欧美一级日韩一级| 一级黄色av片| 亚洲第一搞黄网站| 午夜精品一区二区三级视频| 26uuu另类欧美| 美女日批在线观看| 麻豆免费看一区二区三区| 国产精品入口芒果| 先锋资源久久| 欧洲av一区| 日韩欧美影院| 成人av资源网| a一区二区三区亚洲| 奇米一区二区三区四区久久| 色呦呦在线看| 日韩中文字幕精品| 黄色影院在线播放| 亚洲精品720p| 精品二区在线观看| 欧美日韩一二区| 人人妻人人爽人人澡人人精品| 亚洲丶国产丶欧美一区二区三区| 色哟哟一一国产精品| 国产日产欧美精品一区二区三区| 特黄特黄一级片| 另类小说欧美激情| 手机看片福利盒子久久| 国产日韩欧美三区| 极品美女扒开粉嫩小泬| 亚洲国产精品一区制服丝袜| 日本中文字幕一级片| 天天av综合| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 亚洲素人在线| 国产麻豆日韩| 一区二区日韩| 国产这里只有精品| 91亚洲精品| 国产99久久精品一区二区 夜夜躁日日躁| www视频在线观看免费| 精品久久久久久中文字幕一区奶水 | 精品免费日产一区一区三区免费| 五月婷婷激情网| 中文字幕巨乱亚洲| 中文字幕在线视频播放| 日本不卡视频在线| 亚洲性生活网站| 国产亚洲网站| 欧妇女乱妇女乱视频| 欧美fxxxxxx另类| 免费观看黄色大片| 91综合视频| 日韩不卡一二区| 中文字幕人成人乱码| 中文字幕黄色大片| 国产亚洲一区二区三区啪| 欧美专区一二三| 国产不卡av一区二区| 麻豆91av| 欧美国产一区二区三区激情无套| 日韩欧美视频第二区| 国精一区二区| 三级三级久久三级久久18| 欧美大黑bbbbbbbbb在线| 亚洲午夜精品一区二区| 97精品国产福利一区二区三区| 伊人情人网综合| 91精品啪在线观看国产18| japanese在线视频| 亚洲视屏一区| 免费看国产一级片| 一本色道久久综合亚洲精品不卡| 虎白女粉嫩尤物福利视频| 久久国产精品久久w女人spa| 国产精品99久久免费黑人人妻| 人人精品人人爱| 中文字幕乱码久久午夜不卡| 一区二区三区免费在线观看视频| 国产成人啪午夜精品网站男同| 又大又长粗又爽又黄少妇视频| 国产精品一卡二| 涩视频在线观看| 国产日韩欧美不卡在线| 国产aaaaaaaaa| 最新高清无码专区| 国产性生活网站| 亚洲精品精品亚洲| 日韩女同强女同hd| 日韩人在线观看| 国产免费一区二区三区最新不卡| 日韩三级视频中文字幕| 内射无码专区久久亚洲| 在线亚洲国产精品网| 国产三级在线播放| 97国产精品免费视频| 在线成人视屏 | 亚洲国产精品女人久久久| 神马午夜电影一区二区三区在线观看 | 久久久久久久久久久久av| 欧美gv在线| 国产97在线|亚洲| 国产95亚洲| 九九九九九九精品| 精品国产一区二区三区香蕉沈先生 | 按摩亚洲人久久| 成人免费看视频网站| 成人在线中文字幕| 欧美aaaaa级| 女女百合国产免费网站| 亚洲在线视频| 久色乳综合思思在线视频| 九九九久久久久| 精品国产999| 亚洲系列第一页| 亚洲人成免费电影| 日韩激情美女| 国产精品高潮在线| 午夜精品福利影院| 中文字幕乱码免费| 美日韩精品视频| 黄色网址在线视频| 亚洲婷婷国产精品电影人久久| 国产性xxxx高清| 精品久久久影院| 欧美尤物美女在线| 97视频国产在线| 成人av激情人伦小说| 亚洲狠狠婷婷综合久久久| 亚洲黄色大片| 韩国三级在线看| 亚洲图片激情小说| 久久久久亚洲av成人毛片韩| 精品国产一区二区三区不卡| av中文字幕在线| 久久亚洲国产成人| 国产91在线播放精品| 精品视频第一区| 亚洲日韩成人| 蜜桃视频无码区在线观看| 欧美激情综合网| 国产情侣免费视频| 日韩精品视频中文在线观看| 国产精品一卡二卡三卡| 国产日韩欧美视频在线| 精品大片一区二区| 久久免费视频3| 久久一区二区视频| 可以免费看的av毛片| 亚洲二区在线播放视频| 在线电影福利片| 亚洲www永久成人夜色| 欧美福利电影在线观看| 加勒比av中文字幕| 国产精品丝袜91| 国产农村老头老太视频| 日韩视频第一页| 欧美日韩免费电影| 2021狠狠干| 国产老妇另类xxxxx| 中文字幕第28页| 欧美精品一区二区三区蜜桃| 怡红院在线观看| 国产视频一区二区三区四区| 黄色欧美日韩| 国产女主播在线播放| 午夜一区二区三区在线观看| 蜜臀av免费在线观看| 欧美疯狂性受xxxxx另类| 视频一区中文字幕精品| 高清无码一区二区在线观看吞精| 成人精品视频一区二区三区| 久久无码精品丰满人妻| 精品久久久久久久久久久久久久久久久 | 免费人成又黄又爽又色| 色偷偷成人一区二区三区91| 男人av在线| 国产主播精品在线| 亚洲激情专区| 久久久无码人妻精品一区| 色婷婷av一区二区三区软件| 日本精品在线| 91久久极品少妇xxxxⅹ软件| 亚洲自啪免费| 国产精品国产三级国产专业不 | 亚洲在线观看一区| 国产一区视频在线看| 久久国产精品波多野结衣av| 亚洲人成网站免费播放| 成人在线免费电影网站| 亚洲v国产v在线观看| 国产a视频精品免费观看| 韩国av免费观看| 久久精品亚洲一区| 51精品国产| 国产成人亚洲精品无码h在线| **欧美大码日韩| 手机在线观看毛片| 国产欧美精品一区二区三区-老狼| 自拍视频亚洲|