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

基于BLIP-2和Gemini開發多模態搜索引擎代理

譯文 精選
人工智能
在本文中,我們將通過解釋BLIP-2的架構、損失函數的工作方式及其訓練過程來對它展開詳細探索。我們還提供了一個實際用例,該用例結合了BLIP-2和Gemini兩種模型,以創建一個多模態時尚搜索代理,該代理可以幫助客戶根據文本或文本和圖像組合提示找到最佳服裝。

譯者 | 朱先忠

審校 | 重樓

本文將利用基于文本和圖像的聯合搜索功能來開發一個多模態時裝輔助代理應用程序。

簡介

傳統模型只能處理單一類型的數據,例如文本、圖像或表格數據。多模態是人工智能研究界的一個流行概念,指的是模型能夠同時從多種類型的數據中學習。這項新技術(并不是很新,但在過去幾個月里有了顯著的改進)有許多潛在的應用,它將改變許多產品的用戶體驗。

這方面一個很好的例子是未來搜索引擎的新工作方式:用戶可以使用多種方式輸入查詢,例如文本、圖像、音頻等。另一個例子是改進人工智能驅動的客戶支持系統,以實現語音和文本輸入。在電子商務中,他們通過允許用戶使用圖像和文本進行搜索來增強產品發現。我們將在本文中使用后者作為案例研究。

前沿的一些人工智能研究實驗室每月都會推出幾種支持多模態的模型。例如,OpenAI公司的CLIP和DALL-E;Salesforce公司的BLIP-2將圖像和文本結合在一起;Meta的ImageBind將多模態概念擴展到六種模態(文本、音頻、深度、溫度、圖像和慣性測量單元)。

在本文中,我們將通過解釋BLIP-2的架構、損失函數的工作方式及其訓練過程來對它展開詳細探索。我們還提供了一個實際用例,該用例結合了BLIP-2和Gemini兩種模型,以創建一個多模態時尚搜索代理,該代理可以幫助客戶根據文本或文本和圖像組合提示找到最佳服裝。

圖1:多模態搜索代理(圖片由作者使用Gemini提供)

與往常一樣,本文對應的示例代碼可在我們的GitHub代碼倉庫上獲取。

BLIP-2:多模態模型

BLIP-2(引導式語言圖像預訓練)(【引文1】)是一種視覺語言模型,旨在解決諸如視覺問答或基于兩種模態輸入(圖像和文本)的多模態推理等任務。正如我們將在下面看到的,該模型是為了解決視覺語言領域的兩個主要挑戰而開發的:

  • 使用凍結的預訓練視覺編碼器和LLM降低計算成本,與視覺和語言網絡的聯合訓練相比,大幅減少所需的訓練資源。
  • 通過引入Q-Former來改善視覺語言對齊。Q-Former使視覺和文本嵌入更加接近,從而提高了推理任務的性能和執行多模態檢索的能力。

架構

BLIP-2的架構采用模塊化設計,集成了三個模塊:

  • Visual Encoder:一種凍結的視覺模型,例如ViT,它從輸入圖像中提取視覺嵌入(然后用于下游任務)。
  • 查詢轉換器(Q-Former):是此架構的關鍵。它由一個可訓練的輕量級轉換器組成,充當視覺模型和語言模型之間的中間層。它負責從視覺嵌入生成上下文化查詢,以便語言模型能夠有效地處理它們。
  • LLM:一種凍結的預訓練LLM,可處理精煉的視覺嵌入以生成文本描述或答案。

圖2:BLIP-2架構(圖片來自作者本人)

損失函數

BLIP-2有三個損失函數來訓練Q-Former模塊:

  • 圖像-文本對比損失(【引文2】):通過最大化成對的圖像-文本表示的相似性,同時推開不相似的圖像-文本對,來強制視覺和文本嵌入之間的對齊。
  • 圖像-文本匹配損失(【引文3】):一種二元分類損失,旨在通過預測文本描述是否與圖像匹配(正,即目標=1)或不匹配(負,即目標=0)來使模型學習細粒度對齊。
  • 基于圖像的文本生成損失(【引文4】):是LLM中使用的交叉熵損失,用于預測序列中下一個標記的概率。Q-Former架構不允許圖像嵌入和文本標記之間進行交互;因此,必須僅基于視覺信息生成文本,從而迫使模型提取相關的視覺特征。

對于圖像文本對比損失和圖像文本匹配損失,作者使用了批量負采樣技術。這意味著,如果我們的批量大小為512,則每個圖像文本對都有一個正樣本和511個負樣本。這種方法提高了效率,因為負樣本是從批次中抽取的,不需要搜索整個數據集。它還提供了一組更加多樣化的比較,從而實現更好的梯度估計和更快的收斂。

圖3:訓練損失解釋(圖片來自作者本人)

訓練過程

BLIP-2的訓練包含兩個階段:

第1階段——引導視覺語言表征:

  • 該模型接收圖像作為輸入,然后使用凍結的視覺編碼器將其轉換為嵌入。
  • 除了這些圖像,模型還會接收它們的文本描述,并將其轉換為嵌入。
  • Q-Former使用圖像文本對比損失進行訓練,確保視覺嵌入與其對應的文本嵌入緊密對齊,并遠離不匹配的文本描述。同時,圖像文本匹配損失通過學習對給定文本是否正確描述圖像進行分類,幫助模型開發細粒度表示。

圖4:第一階段訓練過程(圖片來自作者本人)

第2階段——引導視覺到語言的生成:

  • 預訓練語言模型被集成到架構中,以根據先前學習的表示生成文本。
  • 通過使用基于圖像的文本生成損失,將重點從對齊轉移到文本生成,從而提高模型的推理和文本生成能力。

圖5:第二階段訓練過程(圖片由作者提供)

使用BLIP-2和Gemini創建多模態時尚搜索代理

在本節中,我們將利用BLIP-2的多模態功能構建一個時尚代理搜索代理,該代理可以接收輸入的文本和/或圖像并返回建議。對于代理的對話功能,我們將使用VertexAI中托管的Gemini 1.5 Pro;對于界面,我們將構建一個Streamlit應用實現。

本實例中使用的時尚數據集是根據MIT許可證授權的,可以通過以下鏈接訪問:時尚產品圖像數據集,它包含超過44,000張時尚產品圖像。

實現此目的的第一步是設置一個向量數據庫。這使代理能夠根據商店中可用商品的圖像嵌入以及輸入中的文本或圖像嵌入執行向量化搜索。我們使用Docker和docker-compose來幫助我們設置環境:

  • Docker-Compose與Postgres(數據庫)和允許向量化搜索的PGVector擴展一起使用。
services:
  postgres:
    container_name: container-pg
    image: ankane/pgvector
    hostname: localhost
    ports:
      - "5432:5432"
    env_file:
      - ./env/postgres.env
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  pgadmin:
    container_name: container-pgadmin
    image: dpage/pgadmin4
    depends_on:
      - postgres
    ports:
      - "5050:80"
    env_file:
      - ./env/pgadmin.env
    restart: unless-stopped

volumes:
  postgres-data:

Postgres對應的.env文件定義部分,其中包含用于登錄數據庫的變量。

POSTGRES_DB=postgres
POSTGRES_USER=admin
POSTGRES_PASSWORD=root

Pgadmin對應的.env文件定義部分,其中包含用于登錄UI以手動查詢數據庫的變量(可選)。

PGADMIN_DEFAULT_EMAIL=admin@admin.com 
PGADMIN_DEFAULT_PASSWORD=root

連接功能對應的.env文件部分,包含使用Langchain連接到PGVector所需的所有組件。

DRIVER=psycopg
HOST=localhost
PORT=5432
DATABASE=postgres
USERNAME=admin
PASSWORD=root

一旦設置并運行Vector DB(docker-compose up -d),就該創建代理和工具來執行多模態搜索了。我們構建了兩個代理來解決此場景應用:一個用于了解用戶的請求,另一個用于提供建議:

  • 分類器:負責接收來自客戶的輸入消息并提取用戶正在尋找的衣服類別,例如T恤、褲子、鞋子、運動衫或襯衫。它還將返回客戶想要的商品數量,以便我們可以從Vector DB中檢索準確的數量。
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_google_vertexai import ChatVertexAI
from pydantic import BaseModel, Field

class ClassifierOutput(BaseModel):
    """
    模型輸出的數據結構。
    """

    category: list = Field(
        description="A list of clothes category to search for ('t-shirt', 'pants', 'shoes', 'jersey', 'shirt')."
    )
    number_of_items: int = Field(description="The number of items we should retrieve.")

class Classifier:
    """
    用于輸入文本分類的分類器類。
    """

    def __init__(self, model: ChatVertexAI) -> None:
        """
        通過創建鏈來初始化 Chain 類。
        參數:
            model (ChatVertexAI): 大型語言模型 (LLM)。
        """
        super().__init__()

        parser = PydanticOutputParser(pydantic_object=ClassifierOutput)

        text_prompt = """
        You are a fashion assistant expert on understanding what a customer needs and on extracting the category or categories of clothes a customer wants from the given text.
        Text:
        {text}

        Instructions:
        1. Read carefully the text.
        2. Extract the category or categories of clothes the customer is looking for, it can be:
            - t-shirt if the custimer is looking for a t-shirt.
            - pants if the customer is looking for pants.
            - jacket if the customer is looking for a jacket.
            - shoes if the customer is looking for shoes.
            - jersey if the customer is looking for a jersey.
            - shirt if the customer is looking for a shirt.
        3. If the customer is looking for multiple items of the same category, return the number of items we should retrieve. If not specfied but the user asked for more than 1, return 2.
        4. If the customer is looking for multiple category, the number of items should be 1.
        5. Return a valid JSON with the categories found, the key must be 'category' and the value must be a list with the categories found and 'number_of_items' with the number of items we should retrieve.

        Provide the output as a valid JSON object without any additional formatting, such as backticks or extra text. Ensure the JSON is correctly structured according to the schema provided below.
        {format_instructions}

        Answer:
        """

        prompt = PromptTemplate.from_template(
            text_prompt, partial_variables={"format_instructions": parser.get_format_instructions()}
        )
        self.chain = prompt | model | parser

    def classify(self, text: str) -> ClassifierOutput:
        """
        根據文本上下文從模型獲取類別。
        參數:
            text (str): 用戶消息。
        返回值:
            ClassifierOutput:模型的答案。
        """
        try:
            return self.chain.invoke({"text": text})
        except Exception as e:
            raise RuntimeError(f"Error invoking the chain: {e}")
  • 助手:負責使用從Vector DB中檢索到的個性化建議進行回答。在這種情況下,我們還利用Gemini的多模態功能來分析檢索到的圖像并給出更好的答案。
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_google_vertexai import ChatVertexAI
from pydantic import BaseModel, Field

class AssistantOutput(BaseModel):
    """
    模型輸出的數據結構。
    """

    answer: str = Field(description="A string with the fashion advice for the customer.")

class Assistant:
    """
    提供時尚建議的代理類。
    """

    def __init__(self, model: ChatVertexAI) -> None:
        """
        通過創建鏈來初始化鏈類。
        參數:
            model (ChatVertexAI): LLM模型.
        """
        super().__init__()

        parser = PydanticOutputParser(pydantic_object=AssistantOutput)

        text_prompt = """
        You work for a fashion store and you are a fashion assistant expert on understanding what a customer needs.
        Based on the items that are available in the store and the customer message below, provide a fashion advice for the customer.
        Number of items: {number_of_items}

        Images of items:
        {items}

        Customer message:
        {customer_message}

        Instructions:
        1. Check carefully the images provided.
        2. Read carefully the customer needs.
        3. Provide a fashion advice for the customer based on the items and customer message.
        4. Return a valid JSON with the advice, the key must be 'answer' and the value must be a string with your advice.

        Provide the output as a valid JSON object without any additional formatting, such as backticks or extra text. Ensure the JSON is correctly structured according to the schema provided below.
        {format_instructions}

        Answer:
        """

        prompt = PromptTemplate.from_template(
            text_prompt, partial_variables={"format_instructions": parser.get_format_instructions()}
        )
        self.chain = prompt | model | parser

    def get_advice(self, text: str, items: list, number_of_items: int) -> AssistantOutput:
        """
        根據文本和項上下文從模型中獲取建議。
        參數:
            text (str): 用戶消息。
            items (list): 為客戶找到的項。
            number_of_items (int): 要檢索的項數。
        Returns:
            AssistantOutput: 模型的答案。
        """
        try:
            return self.chain.invoke({"customer_message": text, "items": items, "number_of_items": number_of_items})
        except Exception as e:
            raise RuntimeError(f"Error invoking the chain: {e}")

在工具方面,我們基于BLIP-2定義了一個工具。它由一個函數組成,該函數接收文本或圖像作為輸入并返回規范化的嵌入。根據輸入,嵌入是使用BLIP-2的文本嵌入模型或圖像嵌入模型生成的。

from typing import Optional

import numpy as np
import torch
import torch.nn.functional as F
from PIL import Image
from PIL.JpegImagePlugin import JpegImageFile
from transformers import AutoProcessor, Blip2TextModelWithProjection, Blip2VisionModelWithProjection

PROCESSOR = AutoProcessor.from_pretrained("Salesforce/blip2-itm-vit-g")
TEXT_MODEL = Blip2TextModelWithProjection.from_pretrained("Salesforce/blip2-itm-vit-g", torch_dtype=torch.float32).to(
    "cpu"
)
IMAGE_MODEL = Blip2VisionModelWithProjection.from_pretrained(
    "Salesforce/blip2-itm-vit-g", torch_dtype=torch.float32
).to("cpu")

def generate_embeddings(text: Optional[str] = None, image: Optional[JpegImageFile] = None) -> np.ndarray:
    """
    使用Blip2模型從文本或圖像中生成嵌入。
    參數:
        text (Optional[str]): 客戶輸入文本
        image (Optional[Image]): 客戶輸入圖像
    返回值:
        np.ndarray: 嵌入向量
    """
    if text:
        inputs = PROCESSOR(text=text, return_tensors="pt").to("cpu")
        outputs = TEXT_MODEL(**inputs)
        embedding = F.normalize(outputs.text_embeds, p=2, dim=1)[:, 0, :].detach().numpy().flatten()
    else:
        inputs = PROCESSOR(images=image, return_tensors="pt").to("cpu", torch.float16)
        outputs = IMAGE_MODEL(**inputs)
        embedding = F.normalize(outputs.image_embeds, p=2, dim=1).mean(dim=1).detach().numpy().flatten()

    return embedding

請注意,我們使用不同的嵌入模型創建與PGVector的連接,因為它是強制性的,但由于我們將直接存儲由BLIP-2生成的嵌入,因此不會使用它。

在下面的循環中,我們遍歷所有服裝類別,加載圖像,并創建要存儲在向量數據庫中的嵌入并將其附加到列表中。此外,我們將圖像的路徑存儲為文本,以便我們可以在Streamlit應用中展示它。最后,我們存儲起類別,以便根據分類器代理預測的類別過濾結果。

import glob
import os

from dotenv import load_dotenv
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from langchain_postgres.vectorstores import PGVector
from PIL import Image

from blip2 import generate_embeddings

load_dotenv("env/connection.env")

CONNECTION_STRING = PGVector.connection_string_from_db_params(
    driver=os.getenv("DRIVER"),
    host=os.getenv("HOST"),
    port=os.getenv("PORT"),
    database=os.getenv("DATABASE"),
    user=os.getenv("USERNAME"),
    password=os.getenv("PASSWORD"),
)

vector_db = PGVector(
    embeddings=HuggingFaceEmbeddings(model_name="nomic-ai/modernbert-embed-base"),  # 這對我們的情況來說并不重要
    collection_name="fashion",
    connection=CONNECTION_STRING,
    use_jsonb=True,
)

if __name__ == "__main__":

    # 生成圖像嵌入
    # 以文本形式保存圖像的路徑
    # 在元數據中保存類別
    texts = []
    embeddings = []
    metadatas = []

    for category in glob.glob("images/*"):
        cat = category.split("/")[-1]
        for img in glob.glob(f"{category}/*"):
            texts.append(img)
            embeddings.append(generate_embeddings(image=Image.open(img)).tolist())
            metadatas.append({"category": cat})

    vector_db.add_embeddings(texts, embeddings, metadatas)

現在,我們可以構建Streamlit應用程序,以便與我們的代理聊天并征求建議了。聊天從代理詢問它可以提供什么幫助開始,并為客戶提供一個組件框來編寫消息和/或上傳文件。

一旦客戶回復,工作流程如下:

  • 分類代理可以識別顧客正在尋找哪些類別的衣服以及他們想要多少件。
  • 如果客戶上傳文件,該文件將被轉換為嵌入,我們將根據客戶想要的衣服類別和單位數量在向量數據庫中尋找類似的項目。
  • 然后,檢索到的項目和客戶的輸入信息被發送給代理代理,以產生與檢索到的圖像一起呈現的推薦信息。
  • 如果客戶沒有上傳文件,流程是相同的,但我們不是生成用于檢索的圖像嵌入,而是創建文本嵌入。
import os

import streamlit as st
from dotenv import load_dotenv
from langchain_google_vertexai import ChatVertexAI
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
from langchain_postgres.vectorstores import PGVector
from PIL import Image

import utils
from assistant import Assistant
from blip2 import generate_embeddings
from classifier import Classifier

load_dotenv("env/connection.env")
load_dotenv("env/llm.env")

CONNECTION_STRING = PGVector.connection_string_from_db_params(
    driver=os.getenv("DRIVER"),
    host=os.getenv("HOST"),
    port=os.getenv("PORT"),
    database=os.getenv("DATABASE"),
    user=os.getenv("USERNAME"),
    password=os.getenv("PASSWORD"),
)

vector_db = PGVector(
    embeddings=HuggingFaceEmbeddings(model_name="nomic-ai/modernbert-embed-base"),  #這對我們的情況來說并不重要
    collection_name="fashion",
    connection=CONNECTION_STRING,
    use_jsonb=True,
)

model = ChatVertexAI(model_name=os.getenv("MODEL_NAME"), project=os.getenv("PROJECT_ID"), temperarture=0.0)
classifier = Classifier(model)
assistant = Assistant(model)

st.title("Welcome to ZAAI's Fashion Assistant")

user_input = st.text_input("Hi, I'm ZAAI's Fashion Assistant. How can I help you today?")

uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"])

if st.button("Submit"):

    #了解用戶的要求
    classification = classifier.classify(user_input)

    if uploaded_file:

        image = Image.open(uploaded_file)
        image.save("input_image.jpg")
        embedding = generate_embeddings(image=image)

    else:

        # 在用戶不上傳圖像時創建文本嵌入
        embedding = generate_embeddings(text=user_input)

    # 創建要檢索的項目和路徑的列表
    retrieved_items = []
    retrieved_items_path = []
    for item in classification.category:
        clothes = vector_db.similarity_search_by_vector(
            embedding, k=classification.number_of_items, filter={"category": {"$in": [item]}}
        )
        for clothe in clothes:
            retrieved_items.append({"bytesBase64Encoded": utils.encode_image_to_base64(clothe.page_content)})
            retrieved_items_path.append(clothe.page_content)

    #得到助理的建議
    assistant_output = assistant.get_advice(user_input, retrieved_items, len(retrieved_items))
    st.write(assistant_output.answer)

    cols = st.columns(len(retrieved_items)+1)
    for col, retrieved_item in zip(cols, ["input_image.jpg"]+retrieved_items_path):
        col.image(retrieved_item)

    user_input = st.text_input("")

else:
    st.warning("Please provide text.")

上面這兩個例子運行結果如下所示:

圖6顯示了一個例子,其中客戶上傳了一張紅色T恤的圖片并要求代理商完成服裝制作。

圖6:文本和圖像輸入的示例(圖片來自作者本人)

圖7顯示了一個更直接的例子,客戶要求代理向他們展示黑色T恤。

圖7:文本輸入示例(圖片來自作者本人)

結論

多模態AI已不再僅僅是一個研究課題。它正在業界用于重塑客戶與公司產品目錄的互動方式。在本文中,我們探討了如何結合使用BLIP-2和Gemini等多模態模型來解決實際問題,并以可擴展的方式為客戶提供更加個性化的體驗。

其中,我們深入探索了BLIP-2的架構,展示了它如何彌合文本和圖像模態之間的差距。為了擴展其功能,我們開發了一個代理系統,每個代理專門負責不同的任務。該系統集成了LLM(Gemini)和向量數據庫,可以使用文本和圖像嵌入檢索產品目錄。我們還利用Gemini的多模態推理來改進銷售輔助代理的響應,使其更像真實的人類。

總之,借助BLIP-2、Gemini和PG Vector等工具,多模態搜索和檢索的未來已經實現,未來的搜索引擎將與我們今天使用的搜索引擎大不相同。

參考文獻

【1】Junnan Li、Dongxu Li、Silvio Savarese、Steven Hoi,2023年。BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models(BLIP-2:使用凍結圖像編碼器和大型語言模型進行引導語言圖像預訓練),arXiv:2301.12597。

【2】Prannay Khosla、Piotr Teterwak、Chen Wang、Aaron Sarna、Yonglong Tian、Phillip Isola、Aaron Maschinot、Ce Liu、Dilip Krishnan,2020年。Supervised Contrastive Learning(監督對比學習),arXiv:2004.11362。

【3】Junnan Li、Ramprasaath R. Selvaraju、Akhilesh Deepak Gotmare、Shafiq Joty、Caiming Xiong、Steven Hoi,2021年。Align before Fuse: Vision and Language Representation Learning with Momentum Distillation(融合前對齊:使用動量蒸餾進行視覺和語言表征學習),arXiv:2107.07651。

【4】李東,南陽,王文輝,魏福如,劉曉東,王宇,高劍鋒,周明,Hsiao-Wen Hon。2019。Unified Language Model Pre-training for Natural Language Understanding and Generation(自然語言理解和生成的統一語言模型預訓練),arXiv:1905.03197。

譯者介紹

朱先忠,51CTO社區編輯,51CTO專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。

原文標題:Multimodal Search Engine Agents Powered by BLIP-2 and Gemini,作者:Luís Roque,Rafael Guedes

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

2011-06-20 18:23:06

SEO

2012-09-03 11:01:44

搜索引擎Polaris沃爾瑪

2022-03-31 20:15:21

圖像搜索引擎

2009-05-06 14:35:17

搜索引擎PHP技術

2019-07-10 13:17:07

大數據搜索代碼

2017-08-07 08:15:31

搜索引擎倒排

2023-07-03 16:21:25

數據模型

2020-03-20 10:14:49

搜索引擎倒排索引

2012-09-07 13:22:21

搜索搜狗

2022-10-08 09:13:18

搜索引擎?站

2010-04-20 11:43:46

2009-02-19 09:41:36

搜索引擎搜狐百度

2009-06-23 08:05:02

搜索引擎

2009-09-22 16:23:52

搜索引擎

2009-06-23 08:03:54

搜索引擎

2023-01-03 15:42:29

機器學習視頻搜索

2023-02-08 10:45:23

2009-07-30 10:40:56

搜索引擎優化網站

2022-02-24 00:07:22

Shodan網絡搜索

2010-06-13 16:27:28

搜索引擎
點贊
收藏

51CTO技術棧公眾號

中国黄色a级片| 日韩一区二区高清视频| 亚洲天堂手机版| 91精品电影| 精品国免费一区二区三区| 天堂…中文在线最新版在线| 国产福利在线观看| 国产专区欧美精品| 久久免费视频网| japanese中文字幕| 日本免费精品| 色播五月激情综合网| 警花观音坐莲激情销魂小说| 香港三日本三级少妇66| 蜜桃av一区二区三区| 欧美激情一区二区三区在线视频观看 | 国产乱子伦视频一区二区三区| 欧美精品www| 婷婷综合在线视频| 欧美日韩看看2015永久免费| 91精品国产综合久久精品性色| 久久久亚洲精品无码| 国产黄色小视频在线| 久久综合丝袜日本网| 成人精品在线视频| 亚洲GV成人无码久久精品| 最新欧美人z0oozo0| 在线电影中文日韩| 国产精品九九视频| 九九99久久精品在免费线bt| 在线看国产一区| 欧美久久久久久久久久久久久| 日韩理伦片在线| 26uuu久久天堂性欧美| 亚洲综合中文字幕68页| 中文精品久久久久人妻不卡| 日韩午夜精品| 欧美激情久久久久久| 亚洲精品成人av久久| 亚洲人成网77777色在线播放| 精品久久久久久久久久ntr影视 | 亚洲婷婷噜噜| 中文字幕中文字幕在线一区| 蜜桃网站成人| 十八禁一区二区三区| 国产激情精品久久久第一区二区| 国产美女久久久| 999视频在线| 久久夜色精品| 日本精品视频在线播放| 久草视频在线观| 亚洲精品专区| 久久人人爽人人爽人人片av高请 | 国精产品一区一区三区免费视频 | 中文字幕资源网在线观看免费| 亚洲黄色性网站| 99久久久无码国产精品性色戒| a天堂中文在线88| 欧美激情一二三区| 欧美日韩综合久久| 精品999视频| 国产亚洲一区字幕| 亚洲a∨一区二区三区| 国产精品秘入口| 欧美国产综合一区二区| 色综合久久88色综合天天提莫| 可以在线观看的av| 久久精品人人爽人人爽| 日韩一区不卡| 日本黄色片在线观看| 综合久久给合久久狠狠狠97色| 天天人人精品| 国产写真视频在线观看| 亚洲精品免费在线观看| 宅男av一区二区三区| 国产素人视频在线观看| 亚洲美女精品一区| 日本一本中文字幕| 一个人www视频在线免费观看| 色婷婷久久综合| the porn av| 免费一级欧美片在线观看网站| 欧美成人一区二区三区在线观看| 亚洲一区二区三区四区av| 精品三级av| 国产一区二区三区精品久久久 | 一区二区在线看| 久久这里只有精品23| 正在播放日韩精品| 欧美日韩国产精品成人| 日本性生活一级片| 自拍偷拍精品| 久久久国产91| 国产精品美女久久久久av爽| 日产国产欧美视频一区精品| 91免费视频网站| 日韩亚洲视频在线观看| 1区2区3区精品视频| 日韩网站在线免费观看| 日韩美女在线看免费观看| 56国语精品自产拍在线观看| 日本精品一二三区| 精品国产美女| 欧美精品videosex牲欧美| 波多野结衣视频网址| 狠狠色综合播放一区二区| 精品国产第一页| 国产传媒在线播放| 欧美性猛交xxxx富婆| 青青草原播放器| 久久最新网址| 久久久久久91| 国产一区二区在线不卡| 91视视频在线直接观看在线看网页在线看| 日日夜夜精品网站| 三级在线观看视频| 日韩一卡二卡三卡| 波多野结衣一二三四区| 国产欧美欧美| av免费观看久久| 日本成人在线播放| 欧美性猛xxx| 扒开伸进免费视频| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | ass极品水嫩小美女ass| 精品日产免费二区日产免费二区| 欧美精品电影免费在线观看| 国产又粗又黄又爽的视频| 久久免费精品国产久精品久久久久| 国产乱人伦精品一区二区三区| 123成人网| 亚洲天堂网站在线观看视频| 日本少妇在线观看| 国产精品自在欧美一区| 亚洲砖区区免费| 成人自拍av| 日韩精品视频在线| 国产无码精品在线播放| 国产精品自拍毛片| 在线观看欧美一区| 亚洲日本在线观看视频| 亚洲免费影视第一页| 日本一区二区三区四区五区| 国产高清一区日本| 精品91一区二区三区| 国内自拍亚洲| 中文字幕不卡av| 成人黄色三级视频| 欧美韩国日本一区| 九色porny自拍| 日韩av在线播放网址| 国产精品久久久久免费a∨大胸 | 欧美床上激情在线观看| 国产又黄又大又粗的视频| 中文av一区二区| 污污网站免费观看| 日本一区二区三区视频| 国产精品久久久久秋霞鲁丝| 日本暖暖在线视频| 欧美一区二区三区免费| 青娱乐av在线| 成人免费视频网站在线观看| 日韩人妻无码精品久久久不卡| 国产福利一区二区精品秒拍| 久久伊人精品天天| 91亚洲国产成人精品一区| 国产精品污污网站在线观看| 第一区免费在线观看| 欧美三级特黄| 国产亚洲二区| 88xx成人免费观看视频库 | 精品国产区一区| 在线观看免费国产视频| 国产日韩精品一区二区三区 | 欧美 亚洲 另类 激情 另类| 最新久久zyz资源站| 制服.丝袜.亚洲.中文.综合懂| 日韩午夜av| 色一情一乱一伦一区二区三欧美| 国产免费av国片精品草莓男男| 久久久久久伊人| 国产中文在线视频| 欧美一区二区在线看| 亚洲黄色三级视频| 欧美国产精品一区二区三区| 黄色三级视频在线播放| 亚洲深夜福利| 综合久久国产| 欧美在线关看| 91精品视频在线| 老司机深夜福利在线观看| 中文字幕亚洲一区二区三区| 性欧美18一19性猛交| 欧美日韩国产色视频| 免费看裸体网站| 一本色道久久综合| 亚洲一区精彩视频| 日韩视频一区二区三区四区| 久久久久五月天| 高清性色生活片在线观看| 欧美日韩亚洲综合在线| 国产高潮国产高潮久久久91| 国产精品亚洲视频| www.色就是色| 欧美精品黄色| 日本一区二区三区视频在线播放 | 夜久久久久久| 一区二区三区在线视频111| 日本免费精品| 国产一区红桃视频| 色在线免费观看| 久久精品91久久香蕉加勒比| 亚洲国产精品无码久久| 欧美视频中文字幕在线| 欧美三级黄色大片| 91在线视频18| 91精品啪在线观看国产| 免费xxxx性欧美18vr| 99色这里只有精品| 清纯唯美综合亚洲| 欧美日韩一区在线播放| 日韩欧美另类中文字幕| 日韩美女福利视频| 视频在线观看入口黄最新永久免费国产| 亚洲欧美国产一区二区三区| www.蜜臀av| 欧美一a一片一级一片| 国产成人免费观看视频| 一区二区三区四区精品在线视频 | 欧美大片在线看| 国产黄a三级三级三级av在线看| 亚洲免费视频网站| 亚洲精品视频专区| 欧美视频完全免费看| 加勒比在线一区| 欧美日韩黄色大片| 久草视频免费在线| 亚洲一区二区三区四区在线免费观看 | 久久国产日韩| 91丨porny丨探花| 在线精品国产| 一级做a爰片久久| 国产图片一区| 国产亚洲二区| 久9re热视频这里只有精品| 亚洲最大福利网站| 91久久久久久白丝白浆欲热蜜臀| 欧美一级大片视频| 国产免费拔擦拔擦8x高清在线人| 欧美xxxx14xxxxx性爽| h视频在线免费| 亚洲欧美激情精品一区二区| 秋霞欧美在线观看| 精品不卡在线视频| 亚洲AV无码精品国产| 欧美一区二区视频在线观看2020 | 精品动漫一区二区三区在线观看| 一级aaaa毛片| 欧美日韩国产影片| 日韩手机在线视频| 欧美伊人久久久久久午夜久久久久| 天天干天天干天天操| 欧美日韩免费区域视频在线观看| 久一视频在线观看| 亚洲一区二区欧美激情| 久久久久无码国产精品 | aaaaaa毛片| 色国产精品一区在线观看| 中文字幕激情小说| 色久综合一二码| 中文字幕在线观看欧美| 欧美日韩亚洲国产综合| 一级全黄裸体免费视频| 91超碰这里只有精品国产| 国产日韩精品suv| 亚洲国产精品久久久| 西西人体44www大胆无码| 亚洲欧美日韩国产成人| 亚洲日本在线播放| 日日狠狠久久偷偷四色综合免费| 国产在线观看免费麻豆| 久久久久久久久久久久av| 国产欧美一区二区三区精品酒店| 国产成人精品免高潮在线观看| 成人久久网站| 成人情趣片在线观看免费| 日本精品视频| 免费在线成人av| 免费精品国产| 免费成人深夜夜行网站视频| 红桃视频国产一区| 国产淫片av片久久久久久| 国产在线精品视频| 国产69视频在线观看| 久久免费偷拍视频| 精品无码人妻一区二区三| 黑人巨大精品欧美一区二区一视频 | 国产精品亚洲综合天堂夜夜| 精品国产亚洲一区二区在线观看 | 国产免费黄视频| 韩国一区二区视频| 精品1卡二卡三卡四卡老狼| 国产欧美久久久精品影院| 免费在线一级片| 91黄色免费观看| www国产一区| 中文字幕精品在线| 人交獸av完整版在线观看| 日韩免费在线播放| 中文.日本.精品| 精品国产综合| 911精品美国片911久久久| 欧美 丝袜 自拍 制服 另类| 加勒比av一区二区| 女尊高h男高潮呻吟| 一区二区在线免费| 中文字幕在线2018| 亚洲精品久久在线| 亚洲欧美视频一区二区| 2021久久精品国产99国产精品| 成人网ww555视频免费看| 精品一区在线播放| 亚洲九九在线| 国产三级三级三级看三级| 9色porny自拍视频一区二区| 九九这里只有精品视频| 色视频一区二区| 天天干,夜夜爽| 欧美美最猛性xxxxxx| 国产亚洲人成a在线v网站| 免费看成人午夜电影| 亚洲国产日韩欧美一区二区三区| 91制片厂毛片| 欧美国产精品专区| 日本一区二区免费电影| 精品人在线二区三区| av超碰免费在线| 成人激情视频网| 欧美日韩在线观看视频小说| 精品这里只有精品| 成人avav影音| 网站永久看片免费| 91久久奴性调教| 巨骚激情综合| 国产精品久久久久久超碰| 亚洲视频分类| 国产精品va无码一区二区| 99久久99久久精品国产片果冻| 久久久久久欧美精品se一二三四| 91精品综合久久久久久| 动漫一区在线| 国产精品网站视频| 日韩久久综合| 特级黄色片视频| 亚洲另类中文字| 国产av无码专区亚洲av| 欧美第一淫aaasss性| baoyu135国产精品免费| 免费观看黄色大片| 国产成人亚洲综合a∨婷婷| 男人操女人的视频网站| 欧美探花视频资源| 免费网站成人| 亚洲影院色在线观看免费| 亚洲视频一区| 加勒比精品视频| 日韩欧美中文在线| 在线播放麻豆| 成人动漫网站在线观看| 在线国产一区二区| 小毛片在线观看| 婷婷久久综合九色综合伊人色| 手机看片国产1024| 国产精品久久久av久久久| 日韩大片在线播放| 精品www久久久久奶水| 成人欧美一区二区三区小说| 国产精品污视频| 久久久久久香蕉网| 亚洲免费福利一区| 三级视频中文字幕| 亚洲观看高清完整版在线观看| 日韩中文字幕观看| 国产91网红主播在线观看| 五月综合激情| 国产一级免费片| 精品国产电影一区| 免费黄网在线观看| 粉嫩高清一区二区三区精品视频| 免费欧美在线| 任我爽在线视频| 日韩午夜激情视频| 羞羞影院欧美| 伊人久久在线观看| www.av精品| 国产理论片在线观看| 97视频人免费观看| 亚洲国产精品91| 国产伦精品一区二区三区妓女| 欧美视频免费在线|