精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

夫妇交换中文字幕| 欧美在线观看黄| 伊人网站在线观看| 亚洲成人国产| 日韩三级精品电影久久久| 欧美黑人在线观看| 日本天堂影院在线视频| 美国三级日本三级久久99| 欧美区在线播放| 精品人妻一区二区三区视频| 久久99国产精品二区高清软件| 亚洲乱码中文字幕综合| 国产综合18久久久久久| 中文字幕 自拍偷拍| 国一区二区在线观看| 国产亚洲欧美日韩精品| 无码人妻精品一区二区三| 欧美亚洲大片| 婷婷综合另类小说色区| 亚洲国产精品视频一区| 欧美特级特黄aaaaaa在线看| 麻豆精品久久久| 8050国产精品久久久久久| 999精品视频在线观看播放| 天堂俺去俺来也www久久婷婷| 在线观看91精品国产麻豆| 干日本少妇首页| 成人国产免费电影| 欧美国产精品一区二区三区| 亚洲综合精品一区二区| 中文字幕有码无码人妻av蜜桃| 国产电影一区二区在线观看| 亚洲欧美国内爽妇网| 久草视频福利在线| 国产专区精品| 欧美三级电影精品| 欧美日韩一区二区在线免费观看| 91高清在线观看视频| 中文一区二区在线观看| 免费在线成人av| 二区三区在线视频| 国产一区二区在线观看视频| 国产精品久久久久高潮| 国产无遮挡呻吟娇喘视频| 亚洲三级网站| 久久久在线视频| 国产一级做a爱免费视频| 久久精品青草| 久久精品视频在线观看| 欧美日韩生活片| 大片网站久久| 中文字幕亚洲专区| 91在线无精精品白丝| 国产精品免费不| 亚洲人成电影网| 在线免费观看麻豆| 国产欧美日韩在线观看视频| 亚洲图片在线综合| 国产肥白大熟妇bbbb视频| 色老板在线视频一区二区| 亚洲第一福利网| 亚洲熟女一区二区| jizz国产精品| 精品成人一区二区三区| 国产精九九网站漫画| 一区二区三区亚洲变态调教大结局 | 91精品久久久久久久久久久久久| 国产日韩在线免费观看| 免费一级欧美片在线观看| 国产欧美精品一区二区| 国产伦精品一区二区三区视频痴汉| 麻豆精品在线视频| 亚洲精品免费在线视频| 亚洲精品国产suv一区| 成人动漫一区二区在线| 久久精品一区二区三区不卡免费视频| 天天综合在线视频| 国产偷国产偷亚洲高清人白洁| 色一情一乱一伦一区二区三区| 日本在线视频观看| 亚洲综合激情网| 日本不卡在线观看视频| 影音成人av| 欧美一区二区视频网站| 麻豆精品国产传媒av| 伊人久久大香线蕉| 日韩在线小视频| 国产第一页在线播放| 亚洲综合欧美| 成人国产在线视频| 亚洲欧美黄色片| 久久精品一区蜜桃臀影院| 性欧美大战久久久久久久免费观看 | 成人18精品视频| 日本黑人久久| av大大超碰在线| 色婷婷精品久久二区二区蜜臂av | 婷婷午夜社区一区| 欧美日韩高清在线播放| 亚洲少妇中文字幕| 国产亚洲一卡2卡3卡4卡新区 | 韩国欧美国产1区| 99国产在线观看| wwwxxx在线观看| 亚洲一卡二卡三卡四卡| 99热手机在线| 欧美电影在线观看完整版| 最近日韩中文字幕中文| 亚洲黄色一区二区| 国产高清精品久久久久| 日韩精品在在线一区二区中文| 182tv在线播放| 欧洲精品视频在线观看| 白嫩情侣偷拍呻吟刺激| 91亚洲一区| 日本中文字幕久久看| 国产成人精品一区二区无码呦| 久久精品欧美一区二区三区麻豆| 黄网站色视频免费观看| 久久91超碰青草在哪里看| 日韩国产激情在线| 欧美黄色免费看| 老汉av免费一区二区三区| 久久久国产精品一区二区三区| 成人福利在线观看视频| 欧美人成免费网站| 无码少妇一区二区| 午夜宅男久久久| 国产乱码一区| 羞羞的视频在线看| 欧美丰满一区二区免费视频| 成年人在线免费看片| 亚洲一区欧美二区| 精品视频一区二区三区四区| 免费看电影在线| 日韩一级片在线观看| 国产麻豆a毛片| 蜜臀av性久久久久av蜜臀妖精| 日本日本精品二区免费| 伊人久久精品一区二区三区| 亚洲福利影片在线| 国产香蕉在线视频| av电影在线观看完整版一区二区| 91午夜在线观看| 8x国产一区二区三区精品推荐| 另类视频在线观看| japanese国产| 一区二区三区在线播放| 日本xxxx免费| 国产一区日韩欧美| 国产经品一区二区| a级片免费在线观看| 精品美女在线播放| 日韩免费视频网站| 99久久综合色| 成人在线激情网| 欧美丝袜丝交足nylons172| 国产成人在线播放| 国产黄色片在线观看| 欧美在线一区二区| 午夜激情视频在线播放| 国产成人自拍网| 成人免费毛片在线观看| 国产一区二区三区亚洲| 91高清免费在线观看| 激情在线视频| 欧美剧在线免费观看网站| 亚洲精品自拍视频在线观看| 精品在线免费观看| 日产精品久久久久久久蜜臀| 果冻天美麻豆一区二区国产| 91成人性视频| 欧美日韩在线资源| 精品国产一区二区精华| 美女又爽又黄免费视频| 国产精品久久久久久久蜜臀| 激情久久综合网| 亚洲人妖在线| 亚洲看片网站| 中文无码日韩欧| 国产97色在线| av网站免费在线观看| 日韩av在线高清| 一区二区三区黄色片| 亚洲国产裸拍裸体视频在线观看乱了 | 少妇高潮久久77777| www.色日本| 色呦呦日韩精品| 欧美日韩精品在线观看视频| 91日韩一区二区三区| 欧美一级xxxx| 国产一区成人| 特色特色大片在线| 香蕉久久精品日日躁夜夜躁| 国产在线观看精品| 成年人黄色大片在线| 日韩一区二区三区国产| 污视频软件在线观看| 欧美福利视频导航| av手机天堂网| 亚洲va欧美va天堂v国产综合| 中文字幕免费在线看线人动作大片| 国产精品资源在线观看| 老司机午夜av| 在线日韩中文| a级网站在线观看| 精品国产日韩欧美| 国产一区二区在线网站| 成人av在线播放| 国产精品成人在线| www.综合| 欧美激情va永久在线播放| 最新97超碰在线| 亚洲欧美中文在线视频| 亚洲乱色熟女一区二区三区| 欧美日韩一区三区| 日韩电影在线观看一区二区| 亚洲超碰97人人做人人爱| 青花影视在线观看免费高清| 日本一区二区三区视频视频| 日本japanese极品少妇| 国产盗摄精品一区二区三区在线| 亚洲成人天堂网| 日韩精品一二三四| 久久精品.com| 亚洲在线国产日韩欧美| av在线播放天堂| 国产精品黄色| 国产毛片久久久久久国产毛片 | 欧美一级免费播放| 欧美二区视频| 国产91av视频在线观看| 日本高清免费电影一区| 欧美一区二区视频在线| 无码少妇一区二区三区| 精品久久久久久亚洲| 国产调教精品| 国产自产在线视频一区| 国产精品白浆| 国产精品美女诱惑| 一区三区自拍| 国产成人成网站在线播放青青| 国产一区二区三区| 91|九色|视频| 视频亚洲一区二区| 成人免费看片网站| 91精品尤物| 国产视频一区二区三区四区| 国产成人福利av| 国模一区二区三区私拍视频| 精品少妇3p| 欧美日韩国产综合在线| 国产一区二区三区天码| 日韩久久久久久久| 成人激情免费视频| 一区二区在线不卡| 亚洲女同一区| 精品一二三四五区| 亚洲欧美日韩综合国产aⅴ| 久久久久久久久久久免费视频| 亚洲欧美日本日韩| 黄色三级视频片| 久久99精品国产91久久来源| 亚洲网中文字幕| 成人午夜短视频| 国产呦小j女精品视频| 中文字幕电影一区| 免费在线黄色网| 亚洲成人综合视频| www五月天com| 欧美高清视频不卡网| 亚洲h视频在线观看| 日韩av在线一区| 69av在线| 欧美激情视频在线观看| 欧美男人天堂| 成人女保姆的销魂服务| gogo久久日韩裸体艺术| 日本一区二区免费看| 午夜精品久久久久久久四虎美女版| 成人在线免费高清视频| 国产欧美日韩一区二区三区在线| 91人人澡人人爽人人精品| 国产麻豆日韩欧美久久| 添女人荫蒂视频| 中文字幕一区二区三区不卡| 久久精品国产av一区二区三区| 色综合久久久久久久| a在线观看视频| 亚洲午夜激情免费视频| 在线观看中文字幕的网站| 热久久这里只有精品| 日韩中文字幕在线一区| 欧美一区二区三区四区五区六区 | 啪啪国产精品| 一区二区三区四区| 国产人成精品一区二区三| xxxx在线免费观看| 99精品国产热久久91蜜凸| 亚洲怡红院在线观看| 精品久久久久久中文字幕一区奶水| 又污又黄的网站| 日韩黄色av网站| 国产美女av在线| 国产精品成人av性教育| 红杏一区二区三区| 中文字幕综合在线观看| 老鸭窝91久久精品色噜噜导演| 制服.丝袜.亚洲.中文.综合懂| 国产午夜亚洲精品不卡| 日韩av无码中文字幕| 3d动漫精品啪啪1区2区免费| 黄视频在线播放| 91精品91久久久久久| 国产999精品在线观看| 欧美一级片免费观看| 亚洲国产一区二区三区高清| 亚洲一区二区三区三州| 日本一区二区久久| 久久一区二区三区视频| 亚洲成av人乱码色午夜| a黄色片在线观看| 国产日韩av在线| 欧美丝袜一区| 在线观看av日韩| 久久―日本道色综合久久| 日韩 欧美 亚洲| 精品少妇一区二区三区日产乱码| 一区二区三区视频网站| 国产精品国产福利国产秒拍| 国产精品亚洲二区| 欧美日韩亚洲一| 91在线视频观看| 中文字幕亚洲精品一区| 亚洲国产日韩欧美综合久久| 久久www人成免费看片中文| 1区1区3区4区产品乱码芒果精品| 91亚洲国产| 91aaa精品| 悠悠色在线精品| 国产夫绿帽单男3p精品视频| 欧美成年人视频网站| 电影91久久久| 激情视频小说图片| 国产高清在线观看免费不卡| 青春草免费视频| 日韩精品最新网址| 欧美亚洲系列| 国产精品成人观看视频免费| 亚洲福利精品| 国产中文字幕一区二区| 欧美午夜女人视频在线| 国产在线视频网| 国产精品日韩电影| 婷婷综合久久| 中文字幕永久免费| 亚洲成av人片在www色猫咪| 五月天婷婷社区| 国产成人黄色av| 日韩电影免费网址| 三日本三级少妇三级99| 亚洲精选视频免费看| 免费a级片在线观看| 91av在线免费观看| 欧美猛男同性videos| 天天干天天玩天天操| 亚洲免费三区一区二区| 亚洲欧美另类一区| 奇米影视亚洲狠狠色| 日本久久精品| 日本黄色一级网站| 精品久久久久久中文字幕| 国产1区2区3区在线| 成人xxxx视频| 日韩视频一区| 国产18无套直看片| 日韩一区二区三| 在线手机中文字幕| 黄频视频在线观看| a在线播放不卡| 在线观看亚洲一区二区| 欧美精品情趣视频| 蜜乳av综合| 永久看看免费大片| 欧美日韩亚洲激情| 日本视频在线| 久久精品国产第一区二区三区最新章节| 肉丝袜脚交视频一区二区| 2018天天弄| 亚洲视频在线观看视频| 欧美黄色一级| 国产精品人人妻人人爽人人牛| 亚洲精品视频在线观看免费| 欧美日韩国产亚洲沙发| 91久久久久久| 日韩精品免费专区| 精品在线视频免费观看| 中文字幕在线视频日韩| 香蕉国产成人午夜av影院| 国产精品久久久久久久99|