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

從零到一帶你實(shí)戰(zhàn)RAG混合檢索 原創(chuàng)

發(fā)布于 2024-12-3 08:44
瀏覽
0收藏

在之前的文章中,我們探討了混合檢索的概念以及其后續(xù)的重新排序(rerank)和重組(reorder)操作。今天,我們將從實(shí)踐角度解析如何執(zhí)行混合檢索。下圖是混合檢索的流程:

從零到一帶你實(shí)戰(zhàn)RAG混合檢索-AI.x社區(qū)

BM25

眾所周知,混合檢索主要通過關(guān)鍵詞匹配來確定可能的答案,接著結(jié)合語義匹配以進(jìn)一步提升答案的精確度。BM25就是其中一種常見的關(guān)鍵詞搜索技術(shù)。

BM25就像一個(gè)智能的匹配工具,在我們使用搜索系統(tǒng)時(shí),它能幫助我們找到最相關(guān)的信息。BM25如何做到這一點(diǎn)呢?它主要看兩個(gè)方面:首先,它會(huì)檢查我們的查詢?cè)~在某份文檔中出現(xiàn)了多少次;其次,它還會(huì)看這個(gè)詞在所有文檔中出現(xiàn)的頻率。如果一個(gè)詞在特定文檔中經(jīng)常出現(xiàn),但在其他地方很少見,那么這個(gè)詞對(duì)這篇文檔來說就非常重要,BM25會(huì)認(rèn)為這篇文檔與我們的查詢非常匹配。此外,BM25模型對(duì)于長文檔和短文檔有一個(gè)平衡處理,防止因文檔長度不同,而導(dǎo)致的詞頻偏差。

讓我們通過一個(gè)搜索引擎的簡單例子來揭示BM25的運(yùn)作原理。假設(shè)你在一個(gè)搜索引擎中輸入了"香蕉面包",并且有三篇文章與這個(gè)查詢相關(guān):

  1. 文章A標(biāo)題為 "如何制作香蕉面包",全文1000字,并且"香蕉面包"一詞在其中出現(xiàn)10次。
  2. 文章B標(biāo)題為 "面包的種類",全文500字,在其中"香蕉面包"一詞出現(xiàn)5次。
  3. 文章C標(biāo)題為 "水果和烘焙",全文2000字,其中"香蕉面包"一詞出現(xiàn)10次。

首先,BM25會(huì)考慮查詢?cè)~(即"香蕉面包")在每篇文章中出現(xiàn)的頻率。在文章A和C中,"香蕉面包"都出現(xiàn)了10次,而在文章B中出現(xiàn)了5次。因此,就頻率而言,文章A和C可能比文章B更相關(guān)。

然后,BM25會(huì)考慮文檔的長度。盡管文章A和C中"香蕉面包"的出現(xiàn)次數(shù)相同,但文章A只有1000字,而文章C有2000字。這意味著,在文章A中,"香蕉面包"占據(jù)了更大比例,因此可能更相關(guān)。

因此,綜合考慮以上因素,搜索引擎可能會(huì)認(rèn)為文章A是對(duì)"香蕉面包"這個(gè)查詢最相關(guān)的結(jié)果,其次是文章B,再次是文章C。

langchain中封裝了BM25對(duì)應(yīng)的retriever的實(shí)現(xiàn),我們來看下:

from langchain.retrievers.bm25 import BM25Retriever

doc_list_1 = [
    "I like apples",
    "I like oranges",
    "Apples and oranges are fruits",
]

# initialize the bm25 retriever and chroma retriever
bm25_retriever = BM25Retriever.from_texts(
    doc_list_1, metadatas=[{"source": 1}] * len(doc_list_1)
)
bm25_retriever.k = 2
# [Document(page_cnotallow='I like apples', metadata={'source': 1}), Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 1})]
print(bm25_retriever.invoke("apples"))
# [Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 1}), Document(page_cnotallow='I like oranges', metadata={'source': 1})]
print(bm25_retriever.invoke("apple"))

上述代碼演示了我們?cè)诓樵?apples"時(shí),BM25根據(jù)詞頻能成功返回包含"apples"的兩句話。但是,當(dāng)我們將查詢改為"apple"時(shí),意外地得到了'I like oranges'這一結(jié)果。看起來BM25對(duì)單詞的單復(fù)數(shù)形式十分"敏感",這也暴露出BM25的一個(gè)限制。而同樣是基于詞頻的elasticsearch卻能有效改善這一問題。在使用elasticsearch替換bm25之前,我們先湊合著用bm25看下在langchain中如何做混合檢索。

from langchain.retrievers import EnsembleRetriever
from langchain.retrievers.bm25 import BM25Retriever
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

doc_list_1 = [
    "I like apples",
    "I like oranges",
    "Apples and oranges are fruits",
]

# initialize the bm25 retriever and chroma retriever
bm25_retriever = BM25Retriever.from_texts(
    doc_list_1, metadatas=[{"source": 1}] * len(doc_list_1)
)
bm25_retriever.k = 2

embedding = OpenAIEmbeddings()
chroma_vectorstore = Chroma.from_texts(
    doc_list_1, embedding, metadatas=[{"source": 2}] * len(doc_list_1)
)
chroma_retriever = chroma_vectorstore.as_retriever(search_kwargs={"k": 2})

# initialize the ensemble retriever
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, chroma_retriever], weights=[0.5, 0.5]
)

在上面的代碼中,我們使用了基于關(guān)鍵詞搜索的BM25 retriever和基于向量檢索的chroma retriever, 然后使用了一個(gè)EnsembleRetriever對(duì)這兩個(gè)retriever搜索到的結(jié)果使用RFF算法進(jìn)行整合,整合后我們先來看看查詢"apples"的結(jié)果:

# [Document(page_cnotallow='I like apples', metadata={'source': 1}), Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 1})]
print(ensemble_retriever.invoke("apples"))

我們?cè)賮硭阉饕幌?apple", 結(jié)果如下:

# [Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 1}), Document(page_cnotallow='I like oranges', metadata={'source': 1})]
print(bm25_retriever.invoke("apple"))
# [Document(page_cnotallow='I like apples', metadata={'source': 2}), Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 2})]
print(chroma_retriever.invoke("apple"))
# [Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 1}), Document(page_cnotallow='I like apples', metadata={'source': 2}), Document(page_cnotallow='I like oranges', metadata={'source': 1})]
print(ensemble_retriever.invoke("apple"))

可以看出,基于語義的搜索對(duì)單復(fù)數(shù)形式并不敏感,'I like apples'仍然被檢索到。整合后的EnsembleRetriever返回了更優(yōu)質(zhì)的結(jié)果,前兩個(gè)都是與"蘋果"相關(guān)的文檔。這也證明了,我們通過使用向量檢索成功地彌補(bǔ)了BM25這種關(guān)鍵詞搜索可能存在的短板。

RRF算法

RFF 是一種數(shù)據(jù)融合方法,常用于元搜索。元搜索是將來自多個(gè)不同源或檢索系統(tǒng)的搜索結(jié)果進(jìn)行融合的過程。RRF通過考慮每個(gè)列表中項(xiàng)目的排名和各個(gè)列表本身的可靠性進(jìn)行結(jié)果合并。

RRF算法的公式如下:

RRF(S) = Σ(1 / (60 + rank))

其中,S是待融合的集合,rank表示每一個(gè)條目在其列表中的排名。

以一個(gè)具體例子說明:

假設(shè)我們有三個(gè)搜索系統(tǒng)A、B、C,它們分別產(chǎn)生以下排名:

  • 系統(tǒng)A:[物品1, 物品2, 物品3]
  • 系統(tǒng)B:[物品2, 物品1, 物品3]
  • 系統(tǒng)C:[物品3, 物品1, 物品2]

針對(duì)物品1,它在系統(tǒng)A、B、C中的排名分別為1、2、2。其在RRF算法中的得分為:

1/(60+1) + 1/(60+2) + 1/(60+2) = 0.016129 + 0.016393 + 0.016393 = 0.048915

同樣地,我們可以計(jì)算物品2和物品3的RRF分?jǐn)?shù)。然后比較這些得分,得分最高的物品就被看作是綜合最優(yōu)的選擇。

下面是EnsembleRetriever中對(duì)數(shù)據(jù)融合的RRF算法核心實(shí)現(xiàn):

rrf_score: Dict[str, float] = defaultdict(float)
for doc_list, weight in zip(doc_lists, self.weights):
    for rank, doc in enumerate(doc_list, start=1):
        # self.c = 60
        rrf_score[doc.page_content] += weight / (rank + self.c)

使用elasticsearch替換BM25模型

我們先通過下面的docker-compose.yml安裝elasticsearch

version: "2.3"
services:
  elasticsearch:
    image: elasticsearch:8.9.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
      - xpack.security.enabled=false
    volumes:
      - ./es_data:/usr/share/elasticsearch/data
      - ./plugins:/usr/share/elasticsearch/plugins
    ports:
      - 9200:9200
    networks:
      - elastic
 
  kibana:
    image: kibana:8.6.0
    container_name: kibana
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
    networks:
      - elastic      
 
networks:
  elastic:
    name: elastic
    driver: bridge

這里我們只是做演示示例,所以安裝比較簡單,沒有安裝證書和映射分詞器等等,elasticsearch安裝完之后,我們就可以往里面插入數(shù)據(jù)并進(jìn)行查詢了。在插入數(shù)據(jù)之前,我們先建好index, 這個(gè)index可以理解成向量庫的collection、mysql的table:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "english": {
          "tokenizer": "standard",
          "filter": ["lowercase", "english_stemmer"]
        }
      },
      "filter": {
        "english_stemmer": {
          "type": "stemmer",
          "language": "english"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "english"
      }
    }
  }
}
'

索引創(chuàng)建好之后,我們可以開始插入數(shù)據(jù)。下面是一個(gè) Python 示例,展示了如何使用 ??langchain_elasticsearch?? 模塊向 Elasticsearch 插入數(shù)據(jù),并進(jìn)行查詢:

from langchain_elasticsearch import ElasticsearchStore,  BM25Strategy


doc_list_1 = [
    "I like apples",
    "You like Apples",
    "I like oranges",
    "Apples and oranges are fruits",
]

db = ElasticsearchStore(
    es_url="http://localhost:9200",
    index_name="my_index",
    strategy=BM25Strategy(),
)

# initialize the bm25 retriever and chroma retriever
db.add_texts(doc_list_1, metadatas=[{"source": 1}] * len(doc_list_1))
elasticsearch_retriever = db.as_retriever(search_kwargs={"k": 4})
# [Document(metadata={'source': 1}, page_cnotallow='I like apples'), Document(metadata={'source': 1}, page_cnotallow='You like Apples'), Document(metadata={'source': 1}, page_cnotallow='Apples and oranges are fruits')]
print(elasticsearch_retriever.invoke("apple"))

你會(huì)看到,當(dāng)我們查詢 "apple" 時(shí),Elasticsearch 能夠返回所有包含 "apple" 的文檔。這展示了 Elasticsearch 相比單獨(dú)使用 BM25 算法的優(yōu)勢(shì)。此外,elasticsearch還支持模糊匹配和自動(dòng)補(bǔ)全功能,即使用戶輸入有誤,也能提供相關(guān)的搜索結(jié)果,感興趣的可以自行去研究,這里我們不做重點(diǎn)講解。

現(xiàn)在我們可以使用elasticsearch和chromadb來做混合檢索了,具體代碼如下:

from langchain_community.vectorstores import Chroma
from langchain.retrievers import EnsembleRetriever
from langchain_openai import OpenAIEmbeddings
from langchain_elasticsearch import ElasticsearchStore, BM25Strategy

doc_list_1 = [
    "I like apples",
    "You like Apples",
    "I like oranges",
    "Apples and oranges are fruits",
]

db = ElasticsearchStore(
    es_url="http://localhost:9200",
    index_name="my_index",
    strategy=BM25Strategy(),
)

db.add_texts(doc_list_1, metadatas=[{"source": 1}] * len(doc_list_1))
elasticsearch_retriever = db.as_retriever(search_kwargs={"k": 4})
# elasticsearch_retriever:  [Document(page_cnotallow='I like apples', metadata={'source': 1}), Document(page_cnotallow='You like Apples', metadata={'source': 1}), Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 1})]
print("elasticsearch_retriever: ", elasticsearch_retriever.invoke("apple"))
# initialize the bm25 retriever and chroma retriever

embedding = OpenAIEmbeddings()
chroma_vectorstore = Chroma.from_texts(
    doc_list_1, embedding, metadatas=[{"source": 2}] * len(doc_list_1)
)
chroma_retriever = chroma_vectorstore.as_retriever(search_kwargs={"k": 4})
# chroma_retriever:  [Document(page_cnotallow='I like apples', metadata={'source': 2}), Document(page_cnotallow='You like Apples', metadata={'source': 2}), Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 2}), Document(page_cnotallow='I like oranges', metadata={'source': 2})]
print("chroma_retriever: ", chroma_retriever.invoke("apple"))
# initialize the ensemble retriever
ensemble_retriever = EnsembleRetriever(
    retrievers=[elasticsearch_retriever, chroma_retriever], weights=[0.5, 0.5]
)
# ensemble_retriever:  [Document(page_cnotallow='I like apples', metadata={'source': 1}), Document(page_cnotallow='You like Apples', metadata={'source': 1}), Document(page_cnotallow='Apples and oranges are fruits', metadata={'source': 1}), Document(page_cnotallow='I like oranges', metadata={'source': 2})]
print("ensemble_retriever: ", ensemble_retriever.invoke("apple"))

實(shí)際上,Elasticsearch已經(jīng)提供了混合檢索功能。它允許在存儲(chǔ)文檔時(shí)同時(shí)存儲(chǔ)對(duì)應(yīng)的文本向量,在進(jìn)行搜索時(shí)只需指定為混合搜索模式即可啟用這項(xiàng)功能。但需注意,該功能屬于付費(fèi)服務(wù)。以下是相關(guān)示例代碼:

from langchain_openai import OpenAIEmbeddings
from langchain_elasticsearch import ElasticsearchStore, BM25Strategy, DenseVectorStrategy


doc_list_1 = [
    "I like apples",
    "You like Apples",
    "I like oranges",
    "Apples and oranges are fruits",
]

db = ElasticsearchStore(
    es_url="http://localhost:9200",
    index_name="my_index_1",
    embedding = OpenAIEmbeddings(),
    strategy=DenseVectorStrategy(hybrid=True),
)

db.add_texts(doc_list_1, metadatas=[{"source": 1}] * len(doc_list_1))
elasticsearch_retriever = db.as_retriever(search_kwargs={"k": 4})
print("elasticsearch_retriever: ", elasticsearch_retriever.invoke("apple"))

在這個(gè)例子中,我們?cè)O(shè)置了DenseVectorStrategy策略并開啟了混合檢索模式(hybrid=True)。然而,此時(shí)我們遇到了一個(gè)報(bào)錯(cuò):

elasticsearch.AuthorizationException: AuthorizationException(403, 'security_exception', 'current license is non-compliant for [Reciprocal Rank Fusion (RRF)]')

這個(gè)錯(cuò)誤表示當(dāng)前的許可證并不包含“Reciprocal Rank Fusion (RRF)”功能,即Elasticsearch的混合檢索功能。如果我們只設(shè)置hybrid=False,那么就會(huì)使用Elasticsearch的基礎(chǔ)向量檢索功能,而不涉及任何付費(fèi)服務(wù)。


本文轉(zhuǎn)載自公眾號(hào)AI 博物院 作者:longyunfeigu

原文鏈接:??https://mp.weixin.qq.com/s/F2Ffb2rsCam_6BVDSak-GQ??

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
標(biāo)簽
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
成人av网在线| 最新亚洲一区| 日韩欧美一区二区视频| 久久人人爽人人爽人人av| 手机在线观看免费av| 日韩午夜激情| 中文字幕亚洲自拍| 黄色av电影网站| 亚洲www免费| 亚洲免费观看高清完整版在线| 国产精品免费一区二区三区观看 | 欧美黑人巨大xxx极品| 亚洲成年人在线观看| 欧洲成人一区| 午夜精品成人在线| 久久久一二三四| 青青操视频在线| 国产精品一区二区三区99| 青青在线视频一区二区三区| 亚洲av无码一区二区三区在线| 天天操综合520| 日韩精品一区国产麻豆| 黄色在线视频网| yellow字幕网在线| 亚洲人精品午夜| 日韩电影免费观看在| 日韩中文字幕影院| 国产一区二区三区日韩| 国产精品白丝jk喷水视频一区| 久久久综合久久| 国产精品黑丝在线播放| 亚洲人精选亚洲人成在线| 欧美一级片在线免费观看| 欧美成人一二区| 日本韩国欧美一区二区三区| 野外做受又硬又粗又大视频√| 免费在线视频欧美| 国产日韩影视精品| 老司机精品福利在线观看| 亚洲经典一区二区三区| 激情久久久久久久久久久久久久久久| 国产999视频| 91在线看视频| 亚洲精品孕妇| 孩xxxx性bbbb欧美| 国产一级二级毛片| 欧美日本三区| 欧美人在线观看| 中国一级片在线观看| 久久精品av| 搡老女人一区二区三区视频tv| 丰满少妇高潮一区二区| 综合色就爱涩涩涩综合婷婷| 日韩精品久久久久久福利| www国产视频| 麻豆一区二区| 亚洲精品国产拍免费91在线| 中文视频在线观看| 久久久久观看| 日韩精品中文字幕在线观看| 国产福利在线观看视频| 欧美人妖在线观看| 日韩精品视频在线免费观看| 国产ts丝袜人妖系列视频| 国内视频在线精品| 日韩精品视频在线观看网址| 免费黄色在线视频| 精品72久久久久中文字幕| 亚洲天堂av网| 免费成人深夜蜜桃视频| 午夜激情久久| 欧美国产中文字幕| 国产免费观看av| 日日夜夜免费精品| 国产伦精品一区二区三区精品视频| 在线免费看av的网站| 久久国产剧场电影| 亚洲综合一区二区不卡| 国内爆初菊对白视频| 91在线视频播放| 视频在线精品一区| av文字幕在线观看| 亚洲成年人网站在线观看| 777米奇影视第四色| 亚洲电影有码| 日韩午夜中文字幕| 国产 中文 字幕 日韩 在线| 欧美综合在线视频观看| 久久夜色精品亚洲噜噜国产mv | caopor在线| 免费av一区二区三区四区| 中文字幕在线观看亚洲| 九九久久免费视频| 日韩在线一区二区| 97久草视频| 国产黄色片在线播放| 亚洲视频在线一区观看| 男人插女人视频在线观看| 亚洲a∨精品一区二区三区导航| 欧美一区午夜精品| 亚洲一区二区三区四区五区六区| 欧美黄色录像片| 久久久在线视频| 这里只有精品9| 91视频免费观看| 国产av不卡一区二区| 免费观看一级欧美片| 欧美一区二区播放| 少妇无套高潮一二三区| 国内久久视频| 国产精品自产拍高潮在线观看| 国产91免费在线观看| 国产精品伦理一区二区| 水蜜桃色314在线观看| 日本一区二区三区中文字幕| 亚洲欧美一区二区三区久久 | 日韩av成人网| 欧美一二区在线观看| 久久免费国产视频| 91激情在线观看| 久久嫩草精品久久久精品| 成人毛片100部免费看| 成人国产精选| 国产一区二区免费| 黄色一级片免费看| 国产成人福利片| 亚洲一卡二卡| 欧美日韩国产v| 亚洲国产精品久久久久| 日本妇女毛茸茸| 久久99精品久久久久久国产越南 | 亚洲色图欧美另类| 亚洲91精品| 国产精品久久久久久久久| 日韩av资源站| 欧美日韩性视频在线| 97精品人人妻人人| 在线免费观看日本欧美爱情大片| 国产精品久久久久久久久| 狠狠狠综合7777久夜色撩人| 天天影视涩香欲综合网| 欧美日韩一区二区三区四区五区六区| 91精品动漫在线观看| 国产在线久久久| 欧美尤物美女在线| 欧美日本一区二区三区四区| 国产又黄又粗的视频| 日韩精品色哟哟| 日韩av不卡播放| 欧美亚洲大片| 在线观看免费高清视频97| 中文字幕天堂在线| 久久午夜免费电影| 老熟妇仑乱视频一区二区| 九九热精品视频在线观看| 全亚洲最色的网站在线观看| 四虎在线免费看| 一本一道综合狠狠老| 在线免费观看日韩av| 久久精品一区二区三区中文字幕| 久久影视中文粉嫩av| 日本欧美日韩| 中文字幕无线精品亚洲乱码一区| 中文字幕一区二区人妻| 亚洲欧洲av一区二区三区久久| 伊人网在线综合| 欧美激情精品久久久六区热门| 999日本视频| 丰乳肥臀在线| 亚洲精品天天看| 精品乱码一区内射人妻无码| 中文字幕一区二区三区乱码在线| 亚洲一区二区图片| 亚洲韩日在线| 三级三级久久三级久久18| 免费成人黄色网| 免费av一区二区| 少妇一级淫片免费看| 色婷婷综合久久| 女同久久另类69精品国产| 国产精品亚洲成人| 中国丰满人妻videoshd| 精品国产中文字幕第一页| 成人免费午夜电影| 金瓶狂野欧美性猛交xxxx| 日韩成人中文字幕| 在线观看不卡的av| 亚洲一区二区三区四区五区黄| aaaaa一级片| 久久精品国产在热久久| 国产欧美日韩小视频| 免费欧美激情| 亚洲字幕一区二区| 日本免费久久| 欧美激情中文网| 在线观看黄av| 亚洲国产91精品在线观看| 啪啪小视频网站| 亚洲午夜三级在线| jizzjizz日本少妇| av一区二区三区黑人| www.超碰97.com| 夜夜嗨网站十八久久| 艳母动漫在线免费观看| 一区二区三区韩国免费中文网站| 成人自拍性视频| 成人动漫一区| 欧美大片免费观看| 幼a在线观看| 日韩成人网免费视频| 国产乱人乱偷精品视频| 一本久久综合亚洲鲁鲁五月天 | 精品久久久久久国产91| 国产亚洲精品久久久久久豆腐| 99精品久久只有精品| 亚洲精品乱码久久久久久动漫| 欧美中文日韩| 久青草视频在线播放| 欧美国产美女| 欧美一区三区二区在线观看| caoporn成人| 成人亚洲欧美一区二区三区| 99久久综合国产精品二区| 午夜精品美女自拍福到在线| 色呦呦在线资源| 色狠狠久久aa北条麻妃| 国产主播福利在线| 日韩精品免费在线观看| 亚洲欧美激情在线观看| 91精品免费观看| 怡红院成永久免费人全部视频| 欧美性猛交xxxxx免费看| 久久久全国免费视频| 亚洲免费资源在线播放| 午夜成人亚洲理伦片在线观看| 久久久久久久综合| 国产精品三级在线观看无码| 99综合电影在线视频| 日本wwwwwww| 国产99精品在线观看| 亚洲精品一二三四| 国产美女av一区二区三区| 欧美激情第3页| 久久精品99国产精品| 五月天激情视频在线观看| 日韩国产高清影视| 黄色av免费在线播放| 日韩不卡手机在线v区| 天天影视综合色| 日韩vs国产vs欧美| 久热精品在线播放| 久久精品国产亚洲高清剧情介绍| 手机在线成人免费视频| 久久精品国产99国产精品| 亚洲久久中文字幕| 久久99精品国产| 黄色片子免费看| 国产99久久久国产精品潘金| 你懂的在线观看网站| 99久久精品免费观看| 免费观看一级一片| 久久久久久亚洲综合影院红桃 | 黄片毛片在线看| 精品sm在线观看| 亚洲 精品 综合 精品 自拍| 亚洲男人天堂2019| 爱久久·www| 久久视频在线播放| 精精国产xxxx视频在线中文版 | 永久免费网站视频在线观看| 欧美1区免费| 欧美一区二区中文字幕| 久久久夜夜夜| 奇米视频888| 成人国产在线观看| aa一级黄色片| 国产精品成人在线观看| 青青草原免费观看| 欧美日韩亚洲一区二区三区| 中文永久免费观看| 日韩免费一区二区三区在线播放| 少妇一区二区三区四区| 在线观看国产精品91| 日本欧美电影在线观看| 欧美自拍视频在线| 日本午夜免费一区二区| 国产精品久久久久久久久久久久冷 | 日韩人在线观看| 91福利在线观看视频| 日韩一级视频免费观看在线| 香蕉久久一区二区三区| 视频一区视频二区国产精品| 51漫画成人app入口| 国产精品久久久久久超碰 | 日韩国产精品久久久久久亚洲| 亚洲天堂网2018| 99精品国产视频| 麻豆精品国产免费| 午夜在线电影亚洲一区| 中文字幕一区二区人妻| 亚洲成人亚洲激情| 色老头视频在线观看| 97香蕉久久夜色精品国产| 在线成人免费| 人禽交欧美网站免费| 国产精品国码视频| av亚洲天堂网| 久久久久久影视| 国产精品不卡av| 欧美日韩视频在线第一区 | 99久精品国产| 激情无码人妻又粗又大| 欧美午夜丰满在线18影院| a毛片在线免费观看| 亚洲一区二区久久久| 1234区中文字幕在线观看| 国产日韩在线亚洲字幕中文| 天美av一区二区三区久久| 国产成人亚洲综合无码| 美美哒免费高清在线观看视频一区二区 | 91久久国产综合久久91| 欧美va日韩va| 国产在线激情| 国产精品中文字幕久久久| 婷婷五月色综合香五月| 六月婷婷在线视频| 国产一区二区0| 毛片视频免费播放| 色哦色哦哦色天天综合| 亚洲色图21p| 97国产在线视频| swag国产精品一区二区| 91大学生片黄在线观看| 国产精品综合网| 免费成人深夜夜行网站| 欧美精品一级二级三级| av资源在线观看免费高清| 日韩av电影在线播放| 亚洲动漫在线观看| 国产免费成人在线| 91丨porny丨户外露出| 99热在线观看免费精品| 亚洲成人中文字幕| 激情av在线播放| 国产精品久久久久久久久久久久冷| 欧美精品1区| 国产伦精品一区二区三区妓女下载 | 在线播放亚洲一区| 黄色在线免费网站| 91色p视频在线| 亚洲一区在线| 黄色片子免费看| 亚洲最快最全在线视频| 亚洲精品一区二区口爆| 久久久久久久久久久网站| 亚洲乱码一区| 黄色一级在线视频| 91年精品国产| 啪啪小视频网站| 精品国产依人香蕉在线精品| 精品91福利视频| 黄色三级中文字幕| jvid福利写真一区二区三区| 欧美三级午夜理伦| 亚洲性无码av在线| 人人精品久久| 女人色极品影院| 99精品视频在线播放观看| 五月婷婷激情视频| 色偷偷av一区二区三区乱| 精品中文字幕一区二区三区四区 | 久久99久久精品国产| 久久午夜精品一区二区| 久久精品色妇熟妇丰满人妻| 91精品国产91久久久久久一区二区 | 日本激情综合网| 亚洲男人的天堂在线观看| 国精产品乱码一区一区三区四区| 2018日韩中文字幕| 欧美日韩久久精品| 人妻精品久久久久中文字幕69| 亚洲 欧美综合在线网络| 黄色在线小视频| 91亚洲精品久久久久久久久久久久| 亚洲视频观看| 山东少妇露脸刺激对白在线| 日韩一级大片在线观看| 色偷偷偷在线视频播放 | 女人香蕉久久**毛片精品| 国产精品无码在线| 欧美日韩综合不卡| 欧美v亚洲v| 天天好比中文综合网| 国产二区国产一区在线观看| 黄色片网站在线免费观看| 色婷婷综合久久久久| 女人抽搐喷水高潮国产精品| 三上悠亚av一区二区三区| 亚洲第一成人在线| av在线电影观看|