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

自己動手實現一個RAG應用

人工智能
RAG 是為了讓大模型知道更多的東西,所以,接下來要實現的 RAG 應用,用來增強的信息就是我們這門課程的內容,我會把開篇詞做成一個文件,這樣,我們就可以和大模型討論我們的課程了。LangChain 已經提供了一些基礎設施,我們可以利用這些基礎設施構建我們的應用。

我們知道 RAG 有兩個核心的過程,一個是把信息存放起來的索引過程,一個是利用找到相關信息生成內容的檢索生成過程。所以,我們這個 RAG 應用也要分成兩個部分:索引和檢索生成。

RAG 是為了讓大模型知道更多的東西,所以,接下來要實現的 RAG 應用,用來增強的信息就是我們這門課程的內容,我會把開篇詞做成一個文件,這樣,我們就可以和大模型討論我們的課程了。LangChain 已經提供了一些基礎設施,我們可以利用這些基礎設施構建我們的應用。

我們先從索引的過程開始!

圖片圖片

下面是實現這個索引過程的代碼:

from langchain_community.document_loaders import TextLoader


loader = TextLoader("introduction.txt")
docs = loader.load()


text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma(
    collection_name="ai_learning",
    embedding_functinotallow=OpenAIEmbeddings(),
    persist_directory="vectordb"
)
vectorstore.add_documents(splits)

出于簡化的目的,我這里直接從文本內容中加載信息源,而且選擇了 Chroma 作為向量數據庫,它對開發(fā)很友好,可以把向量數據存儲在本地的指定目錄下。

我們結合代碼來看一下。首先是 TextLoader,它負責加載文本信息。

loader = TextLoader("introduction.txt")
docs = loader.load()

這里的 TextLoader 屬于 DocumentLoader。在 LangChain 中,有一個很重要的概念叫文檔(Document),它包括文檔的內容(page_content)以及相關的元數據(metadata)。所有原始信息都是文檔,索引信息的第一步就是把這些文檔加載進來,這就是 DocumentLoader 的作用。

除了這里用到的 TextLoader,LangChain 社區(qū)里已經實現了大量的 DocumentLoader,比如,從數據庫里加載數據的 SQLDatabaseLoader,從亞馬遜 S3 加載文件的 S3FileLoader?;旧?,大部分我們需要的文檔加載器都可以找到直接的實現。

拆分加載進來的文檔是 TextSplitter 的主要職責。

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

雖然都是文本,但怎樣拆分還是有講究的,拆分源代碼和拆分普通文本,處理方法就是不一樣的。LangChain 社區(qū)里同樣實現了大量的 TextSplitter,我們可以根據自己的業(yè)務特點進行選擇。我們這里使用了 RecursiveCharacterTextSplitter,它會根據常見的分隔符(比如換行符)遞歸地分割文檔,直到把每個塊拆分成適當的大小。

做好基礎的準備之后,就要把拆分的文檔存放到向量數據庫里了:

vectorstore = Chroma(
    collection_name="ai_learning",
    embedding_functinotallow=OpenAIEmbeddings(),
persist_directory="vectordb"
)
vectorstore.add_documents(splits)

LangChain 支持了很多的向量數據庫,它們都有一個統(tǒng)一的接口:VectorStore,在這個接口中包含了向量數據庫的統(tǒng)一操作,比如添加、查詢之類的。這個接口屏蔽了向量數據庫的差異,在向量數據庫并不為所有程序員熟知的情況下,給嘗試不同的向量數據庫留下了空間。各個具體實現負責實現這些接口,我們這里采用的實現是 Chroma。

在 Chroma 初始化的過程中,我們指定了 Embedding 函數,它負責把文本變成向量。這里我們采用了 OpenAI 的 Embeddings 實現,你完全可以根據自己的需要選擇相應的實現,LangChain 社區(qū)同樣提供了大量的實現,比如,你可以指定 Hugging Face 這個模型社區(qū)中的特定模型來做 Embedding。

到這里,我們就完成了索引的過程,看上去還是比較簡單的。為了驗證我們索引的結果,我們可以調用 similarity_search 檢索向量數據庫的數據:

vectorstore = Chroma(
    collection_name="ai_learning",
    embedding_functinotallow=OpenAIEmbeddings(),
    persist_directory="vectordb"
)
documents = vectorstore.similarity_search("專欄的作者是誰?")
print(documents)

我們這里用的 similarity_search 表示的是根據相似度進行搜索,還可以使用 max_marginal_relevance_search,它會采用 MMR(Maximal Marginal Relevance,最大邊際相關性)算法。這個算法可以在保持結果相關性的同時,盡量選擇與已選結果不相似的內容,以增加結果的多樣性。

檢索生成

現在,我們已經為我們 RAG 應用準備好了數據。接下來,就該正式地構建我們的 RAG 應用了。我在之前的聊天機器上做了一些修改,讓它能夠支持 RAG,代碼如下:

from operator import itemgetter
from typing import List
import tiktoken
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, ToolMessage, SystemMessage, trim_messages
from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import OpenAIEmbeddings
from langchain_openai.chat_models import ChatOpenAI
from langchain_chroma import Chroma


vectorstore = Chroma(
    collection_name="ai_learning",
    embedding_functinotallow=OpenAIEmbeddings(),
    persist_directory="vectordb"
)


retriever = vectorstore.as_retriever(search_type="similarity")


def str_token_counter(text: str) -> int:
    enc = tiktoken.get_encoding("o200k_base")
return len(enc.encode(text))


def tiktoken_counter(messages: List[BaseMessage]) -> int:
    num_tokens = 3
    tokens_per_message = 3
    tokens_per_name = 1
for msg in messages:
if isinstance(msg, HumanMessage):
            role = "user"
elif isinstance(msg, AIMessage):
            role = "assistant"
elif isinstance(msg, ToolMessage):
            role = "tool"
elif isinstance(msg, SystemMessage):
            role = "system"
else:
raise ValueError(f"Unsupported messages type {msg.__class__}")
        num_tokens += (
                tokens_per_message
                + str_token_counter(role)
                + str_token_counter(msg.content)
        )
if msg.name:
            num_tokens += tokens_per_name + str_token_counter(msg.name)
return num_tokens


trimmer = trim_messages(
    max_tokens=4096,
    strategy="last",
    token_counter=tiktoken_counter,
    include_system=True,
)


store = {}


def get_session_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
return store[session_id]


model = ChatOpenAI()


prompt = ChatPromptTemplate.from_messages(
    [
        (
"system",
"""You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.
            Context: {context}""",
        ),
        MessagesPlaceholder(variable_name="history"),
        ("human", "{question}"),
    ]
)


def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)


context = itemgetter("question") | retriever | format_docs
first_step = RunnablePassthrough.assign(cnotallow=context)
chain = first_step | prompt | trimmer | model


with_message_history = RunnableWithMessageHistory(
    chain,
    get_session_history=get_session_history,
    input_messages_key="question",
    history_messages_key="history",
)


config = {"configurable": {"session_id": "dreamhead"}}


while True:
    user_input = input("You:> ")
if user_input.lower() == 'exit':
break


if user_input.strip() == "":
continue


    stream = with_message_history.stream(
        {"question": user_input},
        cnotallow=config
    )
for chunk in stream:
        print(chunk.content, end='', flush=True)
    print()

為了進行檢索,我們需要指定數據源,這里就是我們的向量數據庫,其中存放著我們前面已經索引過的數據:

vectorstore = Chroma(
    collection_name="ai_learning",
    embedding_functinotallow=OpenAIEmbeddings(),
    persist_directory="vectordb"
)


retriever = vectorstore.as_retriever(search_type="similarity")

這段代碼引入了一個新的概念:Retriever。從名字不難看出,它就是充當 RAG 中的 R。Retriever 的核心能力就是根據文本查詢出對應的文檔(Document)。

為什么不直接使用向量數據庫呢?因為 Retriever 并不只有向量數據庫一種實現,比如,WikipediaRetriever 可以從 Wikipedia 上進行搜索。所以,一個 Retriever 接口就把具體的實現隔離開來。

回到向量數據庫上,當我們調用 as_retriever 創(chuàng)建 Retriever 時,還傳入了搜索類型(search_type),這里的搜索類型和前面講到向量數據庫的檢索方式是一致的,這里我們傳入的是 similarity,當然也可以傳入 mmr

You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.
Context: {context}

在這段提示詞里,我們告訴大模型,根據提供的上下文回答問題,不知道就說不知道。這是一個提示詞模板,在提示詞的最后是我們給出的上下文(Context)。這里上下文是根據問題檢索出來的內容。

有了這個提示詞,再加上聊天歷史和我們的問題,就構成了一個完整的提示詞模板:

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            """You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question. If you don't know the answer, just say that you don't know. Use three sentences maximum and keep the answer concise.
Context: {context}""",
        ),
        MessagesPlaceholder(variable_name="history"),
        ("human", "{question}"),
    ]
)

好,我們已經理解了這一講的新內容,接下來,就是把各個組件組裝到一起,構成一條完整的鏈:

context = itemgetter("question") | retriever | format_docs
first_step = RunnablePassthrough.assign(cnotallow=context)
chain = first_step | prompt | trimmer | model


with_message_history = RunnableWithMessageHistory(
    chain,
    get_session_history=get_session_history,
    input_messages_key="question",
    history_messages_key="history",
)

在這段代碼里,我們首先構建了一個 context 變量,它也一條鏈。第一步是從傳入參數中獲取到 question 屬性,也就是我們的問題,然后把它傳給 retriever。retriever 會根據問題去做檢索,對應到我們這里的實現,就是到向量數據庫中檢索,檢索的結果是一個文檔列表。

文檔是 LangChain 應用內部的表示,要傳給大模型,我們需要把它轉成文本,這就是 format_docs 做的事情,它主要是把文檔內容取出來拼接到一起:

def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)

這里補充幾句實現細節(jié)。在 LangChain 代碼里, | 運算符被用作不同組件之間的連接,其實現的關鍵就是大部分組件都實現了 Runnable 接口,在這個接口里實現了 __or__ 和 __ror__。__or__ 表示這個對象出現在| 左邊時的處理,相應的 __ror__ 表示這個對象出現在右邊時的處理。

Python 在處理 a | b 這個表達式時,它會先嘗試找 a 的 __or__,如果找不到,它會嘗試找 b 的 __ror__。所以,在 context 的處理中, 來自標準庫的 itemgetter 雖然沒有實現

__or__,但 retriever 因為實現了 Runnable 接口,所以,它也實現了 __ror__。所以,這段代碼才能組裝出我們所需的鏈。

有了 context 變量,我們可以用它構建了另一個變量 first_step:

first_step = RunnablePassthrough.assign(cnotallow=context)

還記得我們的提示詞模板里有一個 context 變量嗎?它就是從這里來的。

RunnablePassthrough.assign 這個函數就是在不改變鏈當前狀態(tài)值的前提下,添加新的狀態(tài)值。前面我們說了,這里賦給 context 變量的值是一個鏈,我們可以把它理解成一個函數,它會在運行期執(zhí)行,其參數就是我們當前的狀態(tài)值。現在你可以理解 itemgetter(“question”) 的參數是從哪來的了。這個函數的返回值會用來在當前的狀態(tài)里添加一個叫 context 的變量,以便在后續(xù)使用。

其余的代碼我們之前已經講解過了,這里就不再贅述了。至此,我們擁有了一個可以運行的 RAG 應用,我們可以運行一下看看效果:

You:> 專欄的作者是誰?
專欄的作者是鄭曄。
You:> 作者還寫過哪些專欄?
作者鄭曄還寫過《10x程序員工作法》、《軟件設計之美》、《代碼之丑》和《程序員的測試課》這四個專欄。
責任編輯:武曉燕 來源: 二進制跳動
相關推薦

2017-02-14 10:20:43

Java Class解析器

2017-03-02 13:31:02

監(jiān)控系統(tǒng)

2022-01-04 11:08:02

實現Localcache存儲

2021-12-08 07:31:40

設計Localcache緩存

2015-06-02 09:51:40

iOS網絡請求封裝接口

2015-06-02 10:24:43

iOS網絡請求降低耦合

2023-10-10 13:28:44

Pythonpygame

2024-03-08 12:45:00

C#Web服務器

2022-08-29 14:22:03

bpmn.jsVue流程

2021-04-26 07:31:22

SpringMVCweb框架

2023-12-16 13:21:00

Python元類ORM

2021-08-21 15:40:24

CPU計算機電子領域

2014-06-20 09:18:54

Dustjs中間件

2019-03-21 09:45:20

IM即時通訊CIM

2009-12-03 13:56:05

Suse Linux開xinetd

2024-01-08 13:47:00

代碼分析工具

2021-11-26 08:33:51

React組件前端

2015-06-02 09:41:00

iOS網絡請求NSURLSessio

2025-05-22 06:48:50

RAGAI應用開發(fā)框架DeepSeek

2021-06-25 07:18:50

開發(fā)IDEA插件項目
點贊
收藏

51CTO技術棧公眾號

日本在线视频免费观看| 国产白袜脚足j棉袜在线观看 | 爱啪视频在线观看视频免费| yourporn久久国产精品| 国产成人鲁鲁免费视频a| 卡一卡二卡三在线观看| 日韩一区二区三区在线看| 懂色av一区二区三区| 一区二区三区四区欧美| 农村少妇久久久久久久| 久久精品免费看| 97精品国产97久久久久久| 黄色片在线观看免费| av不卡一区二区| 欧美日韩一二三区| 成人黄色av片| 成人福利片网站| 久久丝袜美腿综合| 成人动漫在线观看视频| 中日精品一色哟哟| 国产精品久久久久久模特| 精品国偷自产在线视频99| 亚洲啪av永久无码精品放毛片| 欧美电影免费看| 亚洲一区在线看| 在线国产99| 日本黄在线观看| 成人网在线播放| 国产深夜精品福利| 日韩精品久久久久久免费| 国内精品嫩模av私拍在线观看| 中文字幕日韩视频| 久久精品一区二区免费播放| 亚洲日本va中文字幕| 欧美日产国产精品| 美女网站免费观看视频| 超碰91在线观看| 亚洲免费成人av| 一区二区三区在线观看www| 少妇性bbb搡bbb爽爽爽欧美| 99久久99久久免费精品蜜臀| 国产经品一区二区| 国产av无码专区亚洲av麻豆| 另类小说视频一区二区| 国产91九色视频| 69视频免费在线观看| 在线观看亚洲| 久久久久久亚洲| 精品国产乱码久久久久久鸭王1| 日韩专区精品| 中文字幕在线国产精品| 国产三级短视频| 国产一区2区| 国产一区二区三区精品久久久| 国精产品一区一区三区免费视频 | 日韩欧美一级精品久久| 手机av在线免费| 国产福利亚洲| 欧美日韩国产不卡| 九九九九九九九九| 精品午夜视频| 日韩久久久久久| 中文字幕人妻一区| 国产精品任我爽爆在线播放| 亚洲精品一区在线观看| 色婷婷精品久久二区二区密| 久久久伦理片| 亚洲老头老太hd| 亚洲成人黄色av| 欧美日中文字幕| 日韩中文字幕在线| 538精品在线观看| 红桃视频国产一区| 人妖精品videosex性欧美| 国产主播第一页| 麻豆国产一区二区| 91九色蝌蚪嫩草| 五月天婷婷在线播放| 久久亚洲春色中文字幕久久久| 欧美一区二区综合| 日本免费在线观看| 亚洲一区二区三区精品在线| 99999精品视频| 亚洲爱爱视频| 日韩免费视频一区二区| 亚洲麻豆一区二区三区| 精品无人区麻豆乱码久久久| 久久久精品久久久| 懂色av.com| 老牛国产精品一区的观看方式| 国产精品免费网站| 一女二男一黄一片| 国产v日产∨综合v精品视频| 久久精品国产综合精品| 三区四区电影在线观看| 亚洲一区二区三区四区五区中文 | 久久国产三级| 日韩欧美一区在线| 久久精品—区二区三区舞蹈| 久久久久国产| 欧美一区二区三区免费观看| 91福利在线观看视频| 国产91色综合久久免费分享| 欧美少妇一区| 国产美女情趣调教h一区二区| 91福利在线免费观看| 女王人厕视频2ⅴk| 国产成人三级| 国模视频一区二区| 国产精品嫩草影院精东| 95精品视频在线| 天天干天天色天天爽| 波多野结衣亚洲一二三| 日韩视频一区二区三区| 欧美激情aaa| 尤物网精品视频| 国产免费亚洲高清| 深夜福利视频一区| 亚洲自拍偷拍av| 伊人国产在线视频| 偷拍亚洲精品| 欧美激情久久久| 国产精品视频第一页| 国产女人18水真多18精品一级做| 男人添女荫道口女人有什么感觉| 久久伊人国产| 在线电影中文日韩| 国产精品一区二区三区四| 成人免费视频国产在线观看| 中文字幕免费高| 农村妇女一区二区| 一区三区二区视频| 午夜久久久久久久久久影院| 99久久精品国产精品久久| 91国在线高清视频| 国产精品一区二区精品视频观看| 夜夜躁日日躁狠狠久久88av| 国产婷婷色一区二区在线观看| www.久久久久久久久| 日本五级黄色片| 亚洲码欧美码一区二区三区| 久久久精品国产网站| 在线观看免费黄色小视频| 国产亚洲欧美一级| 日本成人在线免费视频| 同性恋视频一区| 97免费中文视频在线观看| 国产男女无套免费网站| 专区另类欧美日韩| 自拍一级黄色片| 91精品天堂福利在线观看| 国产啪精品视频| 91精品专区| 欧美日韩精品一区二区天天拍小说 | 日韩中文有码在线视频| 中文字幕免费播放| 一区二区中文字幕在线| 色婷婷激情视频| 午夜精品毛片| 国产成人精品日本亚洲11| 日本片在线看| 日韩成人中文字幕| 免费的毛片视频| 国产精品情趣视频| 亚洲免费黄色网| 综合激情婷婷| 国产亚洲第一区| 免费成人动漫| 日韩中文在线视频| a级片在线播放| 亚洲mv大片欧洲mv大片精品| 中文字幕av网址| 美女网站在线免费欧美精品| 99热这里只有精品7| 婷婷综合国产| 2018中文字幕一区二区三区| 国产黄在线观看| 91精品在线麻豆| 久久午夜无码鲁丝片| 99国产精品一区| 婷婷六月天在线| 欧美精品麻豆| 欧美污视频久久久| 成人短视频软件网站大全app| 美女视频黄免费的亚洲男人天堂| 日韩永久免费视频| 欧美视频一区二区三区四区| 男人与禽猛交狂配| 久久午夜免费电影| 天天综合天天添夜夜添狠狠添| 欧美午夜一区| 日韩亚洲欧美精品| 成人性生交大片免费看96| 日本老师69xxx| 天天色天天射天天综合网| 亚洲欧美中文在线视频| 国产福利第一视频| 一本大道av一区二区在线播放| 国产黄色录像片| 91香蕉视频污| 国产精品中文久久久久久| 日韩精品三区四区| 国产玉足脚交久久欧美| 欧美色图激情小说| 亚洲va男人天堂| 精品欧美一区二区三区在线观看 | 欧美性猛交内射兽交老熟妇| 亚洲综合图色| 成人资源av| 激情久久一区二区| 国产成人一区三区| 国产美女情趣调教h一区二区| 色偷偷综合社区| 青青青手机在线视频观看| 欧美一级国产精品| 日韩xxx视频| 天天操天天干天天综合网| 暗呦丨小u女国产精品| 久久精品日产第一区二区三区高清版| 性生活一级大片| 蜜桃视频在线观看一区| aⅴ在线免费观看| 亚洲精选在线| 久久艹国产精品| 欧美日韩爆操| 永久免费网站视频在线观看| 日韩国产一区| 日韩亚洲视频在线| 久久亚洲道色| 国产精品成人一区二区三区| 久久久久久久久久久久电影| 国产精品夜间视频香蕉| 成人在线不卡| 国产精品久久久久77777| 在线女人免费视频| 性欧美办公室18xxxxhd| 黄色成人在线网| 欧美精品xxx| 2024最新电影免费在线观看| 久青草国产97香蕉在线视频| 久操视频在线播放| 久久伊人91精品综合网站| 1区2区3区在线观看| 中文在线不卡视频| 国产女人在线视频| 在线播放日韩av| 午夜视频在线观看网站| 色多多国产成人永久免费网站 | 欧美婷婷精品激情| 日韩高清不卡一区| the porn av| 蜜臀av性久久久久蜜臀aⅴ| 久久婷婷综合色| 狠狠色丁香久久婷婷综合_中| 国产资源中文字幕| 国产一区不卡视频| 国产精品成人免费一区久久羞羞| 成人自拍视频在线| 亚洲av成人片色在线观看高潮 | 亚洲春色在线视频| 日韩免费看片| 国产精品久久久影院| 欧美区亚洲区| 国产亚洲欧美在线视频| 手机精品视频在线观看| 超碰影院在线观看| 精品一区二区三区视频| 中文字幕在线播放一区二区| 成人视屏免费看| 在线免费观看成年人视频| 亚洲国产精品成人综合| 97在线观看免费高| 亚洲高清视频在线| 天干夜夜爽爽日日日日| 精品视频全国免费看| 国产ts变态重口人妖hd| 亚洲第一av在线| 国产资源在线看| 久久天天躁狠狠躁夜夜av| hd国产人妖ts另类视频| 日本91av在线播放| 久久久久久久久成人| 久久久久久久久久久久久久一区| 欧美亚洲在线日韩| 喜爱夜蒲2在线| 亚洲一区二区三区高清不卡| 天堂网在线免费观看| 成年人国产精品| gv天堂gv无码男同在线观看| 有码一区二区三区| 国产寡妇亲子伦一区二区三区四区| 欧美日韩国产123区| 免费观看黄一级视频| 中文字幕精品一区久久久久| 蜜乳av一区| 国产精品美女久久久免费| 成人直播在线观看| 亚洲欧美日韩在线综合| 91久久中文| 91pony九色| 国产亚洲污的网站| 国产乡下妇女做爰视频| 欧美日韩精品一区二区天天拍小说| 黄色aaa毛片| 日韩在线观看免费高清| 日韩电影毛片| 91视频婷婷| 日韩欧美精品综合| 国产网站免费在线观看| 国产精品99久久久久久久女警| 瑟瑟视频在线观看| 樱花影视一区二区| 亚洲图片视频小说| 亚洲乱码一区av黑人高潮| 在线午夜影院| 国产日韩欧美黄色| 精品freesex老太交| 久久免费视频3| 国产99久久久国产精品潘金| 日韩精品123区| 欧美色网一区二区| 国产资源在线看| 欧亚精品在线观看| 久久久久影视| 国内精品视频一区二区三区| 国产一区不卡在线| 91传媒免费观看| 欧美乱妇20p| 亚洲1卡2卡3卡4卡乱码精品| 国产成人精品在线| 美女久久久久| 18禁免费无码无遮挡不卡网站 | 亚洲精品成人无码| 黑人与娇小精品av专区| 色综合免费视频| 久久久久久久久国产精品| 日韩中文在线| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 成人av综合网| 国产成人永久免费视频| 国产一区二区0| 欧美成人精品欧美一| 日韩欧美自拍偷拍| 成人ww免费完整版在线观看| 91久久久久久久久久久久久| 婷婷综合在线| 国产欧美激情视频| 亚洲精品视频免费观看| 国产人妻精品一区二区三| 免费91在线视频| 9l视频自拍蝌蚪9l视频成人| 2019日韩中文字幕mv| 99久久99久久精品免费观看| 天天操天天摸天天干| 日韩成人xxxx| www.成人在线视频| 懂色av一区二区三区四区五区| 国产在线精品一区二区不卡了| 美女的奶胸大爽爽大片| 日韩午夜精品电影| 国产在线观看www| 欧美日韩天天操| 蜜臀av性久久久久av蜜臀妖精| 日韩精品123区| 亚洲成人久久久| 亚洲福利影院| 视频三区二区一区| 精品在线观看免费| 久久久久久久久久久97| 亚洲国产日韩欧美在线99| 男人最爱成人网| 制服诱惑一区| 成人av午夜电影| 尤物视频免费观看| 久久影院模特热| 色橹橹欧美在线观看视频高清| www.欧美日本| 亚洲美女屁股眼交| 天天干天天插天天操| 国产精品aaaa| 欧美激情日韩| 中国毛片在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 91精品国产91久久久久| 欧美午夜精彩| 99热超碰在线| 欧美性极品少妇| 狂野欧美激情性xxxx欧美| 日本一区精品| 国产不卡一区视频| 影音先锋国产在线| 欧美激情精品久久久久久变态| 国产欧美日韩精品高清二区综合区| 中文 日韩 欧美| 色中色一区二区| av免费在线免费| 日本一区网站| www.激情成人| av综合在线观看| 国产美女精品视频免费观看|