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

Advanced RAG 08:使用 Self-RAG 打造高質量、可追溯的 RAG System 原創 精華

發布于 2024-6-19 12:24
瀏覽
0收藏

編者按:RAG 技術通過檢索并利用外部知識源,能夠較為有效地提升生成內容的準確性和多樣性。然而,經典 RAG 流程也存在一些不足,例如不必要的檢索會浪費計算資源,并可能引入無關內容或錯誤信息,影響生成質量。

本文介紹了 Self-RAG 這一技術,通過引入 Reflection Tokens,語言模型能夠根據具體需求動態決定是否檢索外部知識,從而大大減少了不必要的檢索操作。與此同時,Self-RAG 通過特殊的訓練流程,使生成的內容不僅通順自然,與事實知識相符,甚至還可以追溯知識源。

當然,Self-RAG技術訓練過程相對復雜,在生成階段也融入了諸多特殊機制,在一定程度上增加了推理成本。不過,本文作者也提出了優化 Self-RAG 的一些建議,如簡化 Reflection Tokens 設計、探索不同模型大小的影響等,指明了一些技術發展方向。

作者 | Florian June

編譯 | 岳揚

本文從一個常見的生活場景入手:參加開卷考試。我們通常會采用以下兩種作答策略:

  • 方法一:對于熟悉的題目,直接快速作答;對于不熟悉的題目,快速翻閱參考書,找到相關部分,在腦海中整理分類和總結后,再在試卷上作答。
  • 方法二:每一個題目都需要參考書本進行解答。先找到相關部分,在腦海中進行整合和總結后,再到試卷上書寫答案。

顯然,方法一更受考生青睞,是首選方法。方法二不僅耗時,還有可能引入無關的或錯誤的信息,導致出現混淆和錯誤,甚至在考生原本擅長的領域也不例外。

然而,方法二是經典的 RAG (檢索->整合->生成)流程[1],而方法一則代表 Self-RAG 流程[2],本文將進一步探討這個問題。

01 Overview

圖 1 將 RAG 和 Self-RAG[2] 的主要流程進行了比較:

Advanced RAG 08:使用 Self-RAG 打造高質量、可追溯的 RAG System-AI.x社區

圖 1:Overview of Self-RAG 。Self-RAG(右)的主要功能為檢索(retrieve)、評判(critique)和生成(generate),使生成的文本內容不僅通順流暢,而且與事實知識相符,并且可以追溯到原始知識源。資料來源:https://arxiv.org/pdf/2310.11511.pdf

Self-RAG 主要由三大步驟組成:

  1. 按需檢索(Retrieval as Needed): 當模型需要檢索信息時,例如查詢“美國各州的名字是怎么來的?”(圖 1 右上方)時,模型輸出中會包含一個 [Retrieve] token,表示需要檢索與 Query 相關的內容。相反,當被要求寫 "寫一篇主題為 ‘記憶中深刻的暑假’ 的文章"(圖 1 右下方)時,模型會選擇直接生成答案,無需進行檢索。
  2. 以并行方式生成內容(Parallel Generation): 模型會同時使用提示詞(prompt)和檢索到的內容來生成模型輸出。在整個過程中,有三種 reflection tokens (譯者注:用于指示模型在生成過程中應該執行哪些操作、效果如何的token,比如前文的 [Retrieve]。)會顯示檢索內容的相關性如何。
  3. 內容的評估和選擇: 對步驟 2 中生成的內容進行評估,并選擇最佳文檔段落作為輸出。

請注意,上述模型是經過特殊訓練的,其訓練過程將在本文后續部分進行討論。

02 Reflection Tokens 的介紹

如圖 2 所示,與 RAG 相比,self-RAG 框架的不同之處在于它在生成過程中使用了 reflection tokens 進行更精確的控制。

Advanced RAG 08:使用 Self-RAG 打造高質量、可追溯的 RAG System-AI.x社區

圖 2:Self-RAG 中使用的四種 reflection tokens 。每種類型都使用多個 tokens 來表示其輸出值(output)。底部三行是三類 critique tokens ,粗體字表示這一類中最理想的 critique tokens 。x、y、d 分別表示輸入(input)、輸出(output)和相關段落(relevant passage)。來源:Self-RAG[2]

一般來說,self-RAG 會做出四種不同的判斷:

  • [Retrieve]: 決策過程,決定是否從資源 R 中檢索額外信息。
  • [IsREL]: 相關性檢查,確定給定數據 d 是否包含解決問題 x 所需的信息。
  • [IsSUP]: 驗證過程,檢查數據 d 中是否有依據支持所生成回復 y 中的內容。
  • [IsUSE]: 輸出結果是分數數值(數值范圍 1-5 ),其中 5 代表所生成的回復對問題的解決有用程度最高。

在 RAG 系統中,檢索是一個必須進行的固定步驟,無論條件如何,都要進行檢索。相比之下,self-RAG 引入了 reflective tokens ,使 LLM 更具適應性(adaptable)和智能性(intelligent)。在文本生成過程中,如果 LLM 遇到了需要額外信息支持的不確定區域,它會在遇到 reflective token 時暫停執行文本生成任務,系統會執行一次快速而精確的信息檢索操作,最后 LLMs 會利用新獲取的信息繼續完成當前的文本生成任務。

03 Code Explanation  通過解讀代碼了解 self-RAG

為了直觀地理解 Self-RAG 過程,我們需要首先查看、檢查代碼,然后詳細討論模型的訓練過程。

Self-RAG 這種技術是開源的[3],知名的開源 Python 庫 Langchain?[4] 和 LlamaIndex 都分別實現了 Self-RAG 功能。本文將以 LlamaIndex 庫中 Self-RAG 的具體技術實現[5]作為參考進行說明。

3.1 環境配置

首先,進行環境配置。

(base) Florian@instance-1:~$ conda create -n llamaindex python=3.11

(base) Florian@instance-1:~$ conda activate llamaindex


(llamaindex) Florian@instance-1:~$ pip install llama-index

(llamaindex) Florian@instance-1:~$ pip install huggingface-hub

(llamaindex) Florian@instance-1:~$ huggingface-cli login

安裝完成后,LlamaIndex 的版本信息如下,請確認:

llama-index                             0.10.20

llama-index-core                        0.10.20.post2

下載論文提供的 Llama2-7B 模型,模型大小約為 4.08G。

(llamaindex) Florian@instance-1:~$ huggingface-cli download m4r1/selfrag_llama2_7b-GGUF selfrag_llama2_7b.q4_k_m.gguf --local-dir "YOUR_DOWNLOAD_MODEL_DIR" --local-dir-use-symlinks False

(llamaindex) Florian@instance-1:~$ ls "YOUR_DOWNLOAD_MODEL_DIR"
selfrag_llama2_7b.q4_k_m.gguf

3.2 測試代碼

測試代碼如下。首次執行時需要下載 SelfRAGPack[5]。

import os
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"

from llama_index.core import Document, VectorStoreIndex
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.readers import SimpleDirectoryReader
from pathlib import Path


# Option: download SelfRAGPack
# The first execution requires the download of SelfRAGPack. 
# Subsequent executions can comment this out.
from llama_index.core.llama_pack import download_llama_pack
download_llama_pack(
 "SelfRAGPack",
 "./self_rag_pack")

from llama_index.packs.self_rag import SelfRAGQueryEngine

# The directory where the Llama2 model was previously downloaded and saved.
download_dir = "YOUR_DOWNLOAD_MODEL_DIR"

# Create testing documents
documents = [
    Document(
        text="A group of penguins, known as a 'waddle' on land, shuffled across the Antarctic ice, their tuxedo-like plumage standing out against the snow."
 ),
    Document(
        text="Emperor penguins, the tallest of all penguin species, can dive deeper than any other bird, reaching depths of over 500 meters."
 ),
    Document(
        text="Penguins' black and white coloring is a form of camouflage called countershading; from above, their black back blends with the ocean depths, and from below, their white belly matches the bright surface."
 ),
    Document(
        text="Despite their upright stance, penguins are birds that cannot fly; their wings have evolved into flippers, making them expert swimmers."
 ),
    Document(
        text="The fastest species, the Gentoo penguin, can swim up to 36 kilometers per hour, using their flippers and streamlined bodies to slice through the water."
 ),
    Document(
        text="Penguins are social birds; many species form large colonies for breeding, which can number in the tens of thousands."
 ),
    Document(
        text="Intriguingly, penguins have excellent hearing and rely on distinct calls to identify their mates and chicks amidst the noisy colonies."
 ),
    Document(
        text="The smallest penguin species, the Little Blue Penguin, stands just about 40 cm tall and is found along the coastlines of southern Australia and New Zealand."
 ),
    Document(
        text="During the breeding season, male Emperor penguins endure the harsh Antarctic winter for months, fasting and incubating their eggs, while females hunt at sea."
 ),
    Document(
        text="Penguins consume a variety of seafood; their diet mainly consists of fish, squid, and krill, which they catch on their diving expeditions."
 ),
]

index = VectorStoreIndex.from_documents(documents)

# Setup a simple retriever
retriever = VectorIndexRetriever(
    index=index,
    similarity_top_k=10,
)


model_path = Path(download_dir) / "selfrag_llama2_7b.q4_k_m.gguf"
query_engine = SelfRAGQueryEngine(str(model_path), retriever, verbose=True)

# No retreival example
response = query_engine.query("Which genre the book pride and prejudice?")

# Retreival example
response = query_engine.query("How tall is the smallest penguins?")

測試代碼運行結果如下(大部分 llama_cpp 的調試信息已被刪除):

...
...
Model metadata: {'tokenizer.ggml.add_eos_token': 'false', 'tokenizer.ggml.eos_token_id': '2', 'general.architecture': 'llama', 'llama.rope.freq_base': '10000.000000', 'llama.context_length': '4096', 'general.name': 'LLaMA v2', 'tokenizer.ggml.add_bos_token': 'true', 'llama.embedding_length': '4096', 'llama.feed_forward_length': '11008', 'llama.attention.layer_norm_rms_epsilon': '0.000010', 'llama.rope.dimension_count': '128', 'tokenizer.ggml.bos_token_id': '1', 'llama.attention.head_count': '32', 'llama.block_count': '32', 'llama.attention.head_count_kv': '32', 'general.quantization_version': '2', 'tokenizer.ggml.model': 'llama', 'general.file_type': '15'}
Using fallback chat format: None

llama_print_timings:        load time = 4887.53 ms
llama_print_timings:      sample time = 11.29 ms / 22 runs   ( 0.51 ms per token, 1947.76 tokens per second)
llama_print_timings: prompt eval time = 4887.46 ms / 24 tokens ( 203.64 ms per token, 4.91 tokens per second)
llama_print_timings: eval time = 5883.27 ms / 21 runs   ( 280.16 ms per token, 3.57 tokens per second)
llama_print_timings:       total time = 10901.84 ms / 45 tokens
Final answer: The book "Pride and Prejudice" is a romantic novel by Jane Austen.
...
...
llama_print_timings:        load time = 4887.53 ms
llama_print_timings:      sample time = 11.74 ms / 20 runs   ( 0.59 ms per token, 1703.29 tokens per second)
llama_print_timings: prompt eval time = 7473.66 ms / 37 tokens ( 201.99 ms per token, 4.95 tokens per second)
llama_print_timings: eval time = 5414.34 ms / 19 runs   ( 284.96 ms per token, 3.51 tokens per second)
llama_print_timings:       total time = 13076.88 ms / 56 tokens
Input: ### Instruction:
How tall is the smallest penguins?

### Response:
[Retrieval]<paragraph>Penguins consume a variety of seafood; their diet mainly consists of fish, squid, and krill, which they catch on their diving expeditions.</paragraph>
Prediction: [Relevant]The height of the smallest penguin species can vary depending on the species.[No support / Contradictory][Utility:5]
Score: 1.4213598342974367
10/10 paragraphs done

End evaluation
Selected the best answer: [Relevant]The smallest penguin species is the Little Blue Penguin (also known as the Fairy Penguin), which can grow to be around 40 centimeters (16 inches) in height.[Fully supported][Utility:5]
Final answer: The smallest penguin species is the Little Blue Penguin (also known as the Fairy Penguin), which can grow to be around 40 centimeters (16 inches) in height.

我們可以看到,第一個 query 不需要執行檢索操作,而第二個 query 已進行了檢索操作并進行了輸出內容的評估。

理解測試代碼的關鍵在于弄清楚類 SelfRAGQueryEngine[6] 的實現,現在我們來深入探討一下這個類。

3.2 類 SelfRAGQueryEngine

首先來看看構造函數[7],它主要用于使用 llama_cpp 加載 Llama2-7B 模型。

class SelfRAGQueryEngine(CustomQueryEngine):
 """Simple short form self RAG query engine."""

    llm: Any = Field(default=None, description="llm")
    retriever: BaseRetriever = Field(default=None, description="retriever")
    generate_kwargs: Dict = Field(default=None, description="llm generation arguments")
    verbose: bool = Field(default=True, description="Verbose.")

 def __init__(
        self,
        model_path: str,
        retriever: BaseRetriever,
        verbose: bool = False,
        model_kwargs: Dict = None,
        generate_kwargs: Dict = None,
 **kwargs: Any,
 ) -> None:
 """Init params."""
 super().__init__(verbose=verbose, **kwargs)
        model_kwargs = model_kwargs or _MODEL_KWARGS
        self.generate_kwargs = generate_kwargs or _GENERATE_KWARGS
 try:
 from llama_cpp import Llama
 except ImportError:
 raise ImportError(_IMPORT_ERROR_MSG)
        self.llm = Llama(model_path=model_path, verbose=verbose, **model_kwargs)
        self.retriever = retriever

接下來,我們將介紹處理 query 的相關函數[8]。其主要流程如圖 3 所示:

Advanced RAG 08:使用 Self-RAG 打造高質量、可追溯的 RAG System-AI.x社區

圖 3:query 處理功能的主要流程。圖片由作者提供。

關鍵部分已作注釋,以便讀者更好地理解。

def custom_query(self, query_str: str) -> Response:
 """Run self-RAG."""
 # Obtain responses using the Llama2 model.
        response = self.llm(prompt=_format_prompt(query_str), **_GENERATE_KWARGS)
        answer = response["choices"][0]["text"]
        source_nodes = []

 # Determine if a retrieval is necessary.
 if "[Retrieval]" in answer:
 if self.verbose:
                print_text("Retrieval required\n", color="blue")
 # The step 1 of Figure 1, retrieve as needed.
            documents = self.retriever.retrieve(query_str)
 if self.verbose:
                print_text(f"Received: {len(documents)} documents\n", color="blue")
            paragraphs = [
                _format_prompt(query_str, document.node.text) for document in documents
 ]

 if self.verbose:
                print_text("Start evaluation\n", color="blue")

 # Step 2 and 3 in Figure 1, generate in parallel and evaluate 
 # (the code does not implement parallelism)
            critic_output = self._run_critic(paragraphs)

            paragraphs_final_score = critic_output.paragraphs_final_score
            llm_response_per_paragraph = critic_output.llm_response_per_paragraph
            source_nodes = critic_output.source_nodes

 if self.verbose:
                print_text("End evaluation\n", color="blue")

 # Select the paragraph with the highest score and return it.
            best_paragraph_id = max(
                paragraphs_final_score, key=paragraphs_final_score.get
 )
            answer = llm_response_per_paragraph[best_paragraph_id]
 if self.verbose:
                print_text(f"Selected the best answer: {answer}\n", color="blue")

        answer = _postprocess_answer(answer)
 if self.verbose:
            print_text(f"Final answer: {answer}\n", color="green")
 return Response(response=str(answer), source_nodes=source_nodes)

從代碼中可以看到,圖 1 中的三個步驟都有所體現。然而,LlamaIndex 的 self-RAG 功能并未實現并行化。感興趣的讀者可以查看 self._run_critic 函數了解更多信息,該函數也處理與各種 reflection tokens 相對應的分數。

04 如何訓練 Llama2–7B 模型

我們以前曾多次使用過 Llama2-7B 模型,本文來探討一下如何獲取和訓練該模型。

4.1 訓練目標

使語言模型能夠生成包含 reflection tokens 的文本。

4.2 兩個模型

在訓練過程中,需要使用兩個模型:批判模型(critic model) C 和生成模型(generator model) M。批判模型 C 主要生成 M 所需的已經標注好的用于有監督學習任務的數據(supervision data)。

然而,在推理過程中,只需使用模型 M,不需要批判模型 C。

4.3 批判模型 C

批判模型(critic model)經過訓練可生成 reflection tokens 。使用該模型是為了在任務輸出中能夠離線插入 reflection tokens ,從而更新訓練語料庫(training corpus)。

手動為每個文本段落標注 reflection tokens 的成本非常高。Self-RAG 利用 GPT-4 根據不同 reflection token 的定義、輸入和輸出,為每個 reflection token 分配唯一的特定指令,從而高效地完成數據標注任務。例如,[retrieval] token 會指導模型在進行內容評估時是否需要檢索外部文檔。

獲得訓練數據 D_critic 后,我們就可以基于傳統的、基于條件的語言模型(standard conditional language model)構建用于訓練機器學習模型的目標函數,如下所示:

Advanced RAG 08:使用 Self-RAG 打造高質量、可追溯的 RAG System-AI.x社區

批判模型 C 可以用任何預訓練的語言模型進行初始化和進一步微調。例如,它可以直接使用與生成模型相同的預訓練模型(如Llama 2 7B)進行初始化。

4.4 生成模型 M

圖 4 顯示了在 Self-RAG 框架中如何收集用于訓練生成模型(Generator)的 supervision data(譯者注:已經標注好的用于有監督學習任務的數據) 。給定一對輸入輸出(x, y),self-RAG 使用檢索器和批判模型對原始的模型輸出 y 進行標注,從而創建 supervision data(譯者注:已經標注好的用于有監督學習任務的數據) 。對于 y 中的每個段落 yt(yt ∈ y):

Advanced RAG 08:使用 Self-RAG 打造高質量、可追溯的 RAG System-AI.x社區

圖4:收集生成模型(generator)的訓練數據。圖中的每次條件判斷都是通過批判模型 C 執行的。該圖片由作者提供,靈感來源于 Self-RAG[2] section 3.2.2 。

請注意,圖 4 中的每次條件判斷都是通過批判模型 C 執行的。獲得的訓練數據如圖 5 所示:

Advanced RAG 08:使用 Self-RAG 打造高質量、可追溯的 RAG System-AI.x社區

圖 5:Self-RAG 訓練示例。左邊的例子不需要進行外部檢索,而右邊的例子需要檢索外部文檔,因此插入了相關文檔段落。來源:Self-RAG[2]。

獲得訓練數據 D_gen 后,我們就可以構建用于訓練語言模型的 standard next-token prediction objective function (譯者注:“Standard”指這是語言模型訓練中最普遍、最基礎的目標函數形式?!癗ext-token prediction”指的是該函數的目標是預測序列中的下一個token(詞元),“Objective function”即目標函數,可能是損失函數等內容。)啦,如下所示:

生成模型 M 需要預測的不僅僅是輸出內容,還包括 reflection tokens 。


05 作者對 self-RAG 的見解和思考

總體來看,self-RAG 為 RAG 技術的增強和優化提供了一種全新的視角。不過,這種技術需要更復雜的訓練流程,并且在內容生成階段(generation phase) 融入了一些特殊機制,不僅生成目標輸出文本,還會生成多種類型的反饋標簽,并在生成時根據這些標簽執行多個判斷操作,這樣會不可避免地會增加推理成本??赡軙?/span>嚴重影響重視實時性能要求的項目。

此外,該框架還有很大的優化空間。為激發進一步的討論和創新,這里有一些建議:

  • 如何優化 reflection tokens 。Self-RAG 設計了四種 reflection tokens 。除了 [Retrieve] token 之外,其他三個([IsREL]、[IsSUP]、[IsUSE])都有一定的相似性。可以考慮使用更少的 reflection tokens ,或者設計表示其他語義的 reflection tokens ,這可能是一個值得探索的優化方向。
  • 為什么批判模型(critic model)要使用大語言模型(LLM)呢?我認為這可能是由于像[IsUSE]這樣的 token 嚴重依賴于常識性知識。判斷某個回答的有用,是一項較小的模型可能也能夠勝任的任務。然而,這些較小的模型通常僅學習了特定的訓練數據,缺乏全面的知識。因此,使用LLM作為批判模型(critic model)是有道理的。
  • 批判模型(critic model)模型大小的選擇。我們已經在 7B 和 13B 的模型上對 Self-RAG 進行了測試,結果非常出色。但是,如果我們切換到較小尺寸的 LLM,比如 3B ,會觀察到哪些差異?同樣,如果我們過渡到使用更大的 LLM ,比如 33B ,我們又能預見到多大的系統性能提升呢?
  • 為什么不使用基于人類反饋的強化學習(RLHF)呢?該論文建議在特定任務示例數據(task examples)上訓練目標語言模型。然后使用離線但是批判模型對這些數據進行增強(使用 reflection tokens),與 RLHF 相比,訓練成本大大降低。此外,self-RAG 中的 reflection tokens 使得在推理階段的內容生成可控,而 RLHF 專注于在訓練期間與人類的偏好對齊。不過,論文中沒有包含任何與 RLHF 相關的對比實驗。


06 Conclusion

本文從一個直觀的生活場景(開卷考試)入手,介紹了 self-RAG 技術的基本流程,并輔以代碼解釋。文章還分享了作者的一些見解和思考。

如果你對 RAG(檢索增強生成) 技術非常感興趣,歡迎瀏覽、分享本系列其他文章。 : ) 

Thanks for reading!

Julian Yip

Multi-Cloud Data Architect | Azure, GCP, Databricks Certified | ML and MLOps Practitioner

END

參考資料

[1]https://medium.com/ai-in-plain-english/a-brief-introduction-to-retrieval-augmented-generation-rag-b7eb70982891

[2]https://arxiv.org/pdf/2310.11511.pdf

[3]https://github.com/AkariAsai/self-rag

[4]https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_self_rag.ipynb?ref=blog.langchain.dev

[5]https://github.com/run-llama/llama_index/tree/v0.10.20/llama-index-packs/llama-index-packs-self-rag

[6]https://github.com/run-llama/llama_index/blob/v0.10.20/llama-index-packs/llama-index-packs-self-rag/llama_index/packs/self_rag/base.py

[7]https://github.com/run-llama/llama_index/blob/v0.10.20/llama-index-packs/llama-index-packs-self-rag/llama_index/packs/self_rag/base.py#L174

[8]https://github.com/run-llama/llama_index/blob/v0.10.20/llama-index-packs/llama-index-packs-self-rag/llama_index/packs/self_rag/base.py#L245

本文經原作者授權,由 Baihai IDP 編譯。如需轉載譯文,請聯系獲取授權。

原文鏈接:

???https://ai.gopubby.com/advanced-rag-08-self-rag-c0c5b5952e0e????


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
標簽
收藏
回復
舉報
回復
相關推薦
欧洲天堂在线观看| 亚洲天堂av片| 国产精品流白浆在线观看| 亚洲国产中文字幕| 欧美日本韩国在线| 99久久久国产精品无码网爆| 亚洲美女网站| 日韩有码视频在线| 香港三日本8a三级少妇三级99| 午夜日韩成人影院| 亚洲免费伊人电影| 免费av一区二区三区| 91欧美日韩麻豆精品| 最新日韩欧美| 久久成年人视频| 亚洲自拍偷拍图| 中文字幕区一区二区三| 日本道色综合久久| 美女扒开大腿让男人桶| 大乳在线免费观看| 北条麻妃一区二区三区| 国产精品久久久久久久久久小说| 久久久久久久久久一区二区三区| 欧美日韩有码| 日韩黄色av网站| 久久精品视频在线观看免费| 成人开心激情| 精品久久久久久亚洲精品| 永久免费在线看片视频| se在线电影| 久久久久久久久久电影| 国产精选一区二区| 91国产精品一区| 日韩专区一卡二卡| 51ⅴ精品国产91久久久久久| 欧美黑人一级片| 婷婷久久综合| 最近2019中文字幕第三页视频| 黄色工厂在线观看| 国产精品宾馆| 欧美精品一区二区三区蜜桃视频| 色黄视频免费看| 香蕉久久久久久| 欧美日本在线一区| wwwwww.色| 欧美xxxx做受欧美护士| 色哟哟欧美精品| 超碰97人人射妻| 在线高清av| 色拍拍在线精品视频8848| 免费在线观看日韩视频| 精品极品在线| 狠狠躁夜夜躁人人爽天天天天97| 无码粉嫩虎白一线天在线观看 | 五月婷婷亚洲综合| 一区视频在线看| 久久久久久久一区二区| 久久久久久久福利| 亚洲国产三级| 538国产精品一区二区在线| 999这里只有精品| 亚洲精一区二区三区| 91精品国产免费久久久久久| 国产一级18片视频| 另类亚洲自拍| 国产精品精品一区二区三区午夜版 | 2019中文字幕在线观看| 国产视频1区2区| 日韩国产精品大片| 国产日韩欧美成人| 国产婷婷在线视频| 成人中文字幕合集| 九色综合日本| 国产一级片在线| 日韩一区在线看| 日本一级黄视频| 日韩伦理在线| 欧美日韩日日摸| 中国老熟女重囗味hdxx| 欧美激情15p| 夜夜嗨av一区二区三区免费区| 99热这里只有精品4| 亚洲无线一线二线三线区别av| 91干在线观看| 中文字幕在线观看国产| 国产乱码精品一区二区三区av| 国产伦精品一区二区三毛| 日韩电影网址| 一色屋精品亚洲香蕉网站| 欧洲精品一区二区三区久久| 久久久一本精品| 欧美一区二区三区电影| 一级特黄a大片免费| 日韩精品永久网址| 欧美激情视频一区二区| 丰满人妻老熟妇伦人精品| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品一区二| 日韩精品毛片| 欧美日韩亚洲系列| 色综合五月婷婷| 亚洲伊人春色| 欧美激情在线观看| 亚洲天堂avav| 91女厕偷拍女厕偷拍高清| 二级片在线观看| 惠美惠精品网| 欧美va亚洲va在线观看蝴蝶网| 91视频免费观看网站| 欧美fxxxxxx另类| 日韩免费中文字幕| 风流老熟女一区二区三区| 中文欧美字幕免费| 国产精品后入内射日本在线观看| 国产精品1区| 中国china体内裑精亚洲片| 懂色av.com| 国产成人av一区二区三区在线观看| 欧美二区三区在线| 国产伦子伦对白在线播放观看| 欧美精品乱码久久久久久 | 欧洲亚洲一区二区三区| 久久视频免费观看| 亚洲成人av网址| 99久久er热在这里只有精品66| 一区不卡字幕| 日本精品网站| 亚洲午夜av电影| 精品美女久久久久| 不卡av免费在线观看| www国产无套内射com| 色噜噜成人av在线| 亚洲欧美国产日韩天堂区| 久久精品国产亚洲av麻豆色欲| 九九九久久久精品| 亚洲不卡中文字幕| 涩涩网在线视频| 亚洲精品不卡在线| 日本三级2019| 成人v精品蜜桃久久一区| 国产女人18毛片| 欧美午夜在线播放| 不卡毛片在线看| 国产精品系列视频| 亚洲视频一区在线观看| 午夜剧场在线免费观看| 日韩国产专区| 国产在线播放不卡| 久久国产精品一区| 欧美一区二区三区思思人| 中国毛片直接看| 国产精品一区专区| 久久久久久久香蕉| 大陆精大陆国产国语精品| 欧美韩国理论所午夜片917电影| 国产草草影院ccyycom| 一区二区三区四区精品在线视频| 黑人性生活视频| 伊人久久成人| 欧美日韩国产精品一区二区| 久久91导航| 在线性视频日韩欧美| 亚洲一级特黄毛片| 亚洲精品成a人| 国模私拍在线观看| 久久青草久久| 亚洲伊人婷婷| 一区中文字幕| 7777精品视频| 福利视频在线导航| 91精品婷婷国产综合久久竹菊| 午夜爽爽爽男女免费观看| 高清国产午夜精品久久久久久| 国产精品又粗又长| 欧美美女一区| 亚洲一区二区三区在线免费观看| 国产蜜臀av在线播放| 国产丝袜高跟一区| 天天综合久久综合| 亚洲精品国久久99热| 加勒比精品视频| 麻豆精品在线观看| 毛片在线视频观看| 九九热精品视频在线观看| 国产精品一区二区久久| 性欧美猛交videos| 日韩精品在线观看网站| 国产又粗又黄又爽| 亚洲一二三四久久| 美国黄色特级片| 国产高清精品久久久久| 91黄色小网站| 在线精品小视频| 欧美日韩精品久久| 亚洲综合网狠久久| 国产精品免费一区豆花| 日本无删减在线| 国产午夜精品免费一区二区三区 | 国产精品久久久久久久精| 91亚洲精品久久久蜜桃网站| www.久久av.com| 国产精品女主播一区二区三区| 一区二区不卡视频| 偷窥自拍亚洲色图精选| 91老司机在线| 天堂久久午夜av| 久久久爽爽爽美女图片| 免费av在线网站| 亚洲美女av黄| 亚洲欧美强伦一区二区| 欧美日韩久久一区二区| 91视频免费网址| 亚洲韩国一区二区三区| 黑人操日本美女| 久久婷婷综合激情| 国产人妻黑人一区二区三区| 精品一区二区免费| 久久婷婷国产91天堂综合精品| 亚洲区欧美区| 日本黄色片一级片| 婷婷精品进入| 亚洲免费视频一区| 亚洲人成网站77777在线观看| 成人三级视频在线观看一区二区| 91丨精品丨国产| 国产精品精品视频一区二区三区| 午夜裸体女人视频网站在线观看| 欧美丰满少妇xxxxx做受| 婷婷成人激情| 夜夜嗨av色一区二区不卡| 青青草视频在线观看| 亚洲国内精品在线| 老牛影视av牛牛影视av| 欧美岛国在线观看| a级片在线视频| 91精品一区二区三区久久久久久| 一级黄色大片免费| 欧美视频在线不卡| 一级黄色av片| 一本色道久久综合亚洲精品按摩| 中文字幕视频网站| 欧美视频第一页| 毛片在线免费视频| 精品久久中文字幕| 黄色在线观看国产| 欧美日韩国产丝袜美女| 五月婷婷亚洲综合| 欧美特黄级在线| 91久久国产综合久久91| 精品国产91久久久久久老师| 国产尤物在线视频| 色综合色综合色综合色综合色综合 | 午夜亚洲国产au精品一区二区| 日本在线观看视频网站| 高潮白浆女日韩av免费看| 中文字幕亚洲精品在线| 欧美性高潮在线| 影音先锋在线国产| 欧洲亚洲国产日韩| 中文字幕乱码一区二区 | 国内精品400部情侣激情| 欧美性爽视频| 91成人在线观看国产| 2022成人影院| 国产精品视频内| 日韩成人精品| 国产精品99久久久久久久| 日韩欧美国产大片| 日韩精品av一区二区三区| 日韩在线二区| 丁香婷婷综合激情| 亚洲一区自拍| 色www免费视频| 国产suv精品一区二区6| 熟女丰满老熟女熟妇| 国产人伦精品一区二区| 亚洲综合久久av一区二区三区| 亚洲伊人色欲综合网| 日韩在线 中文字幕| 91精品国产aⅴ一区二区| 视频二区在线观看| 自拍亚洲一区欧美另类| 少妇视频在线| 国产成人午夜视频网址| 亚洲18在线| 精品国产综合| 99精品在线免费在线观看| 久久久久久av无码免费网站下载| 亚洲一区二区网站| 日本一二区免费| 91在线视频免费观看| 国产主播av在线| 午夜精品久久久久久久久久| 亚洲中文一区二区三区| 亚洲电影中文字幕| 黄色网址在线免费| 热久久这里只有精品| 久久久久久爱| 午夜精品电影在线观看| 伊人成人网在线看| 日本中文字幕观看| 久久九九国产精品| 青青草成人免费| 欧洲一区二区av| 深夜福利免费在线观看| 久久香蕉频线观| 成人精品高清在线视频| 国产自产精品| 天天影视天天精品| 国产v片免费观看| 国产制服丝袜一区| 免费看污片的网站| 婷婷成人激情在线网| 国产精品熟女久久久久久| 亚洲色图综合久久| 久久青草伊人| 国产91色在线|亚洲| 久久综合国产| 中文字幕欧美人妻精品一区| 不卡的av在线| 欧美成人精品欧美一级私黄| 欧美日韩高清一区二区三区| 国产尤物视频在线| 欧美一级在线亚洲天堂| 国产精品对白| 一级性生活视频| 国产在线精品不卡| 女人裸体性做爰全过| 欧洲av在线精品| 人操人视频在线观看| 97国产一区二区精品久久呦| 麻豆久久一区| 色爽爽爽爽爽爽爽爽| 精品一区精品二区高清| 久久久国产一级片| 欧美亚洲国产怡红院影院| 欧美性孕妇孕交| 日韩免费精品视频| 国产一区二区区别| 国产主播在线看| 99精品黄色片免费大全| 精品91久久久| 精品中文字幕久久久久久| 色多多在线观看| 欧美大香线蕉线伊人久久| 99热这里只有精品8| 国产精品久久AV无码| 亚洲成人av一区二区三区| 凸凹人妻人人澡人人添| 欧美在线激情视频| 亚洲区小说区图片区qvod| 欧美精品一区二区三区免费播放| 国产亚洲成年网址在线观看| 国产精品xxxxxx| www.亚洲人.com| 中文一区二区三区四区| 日韩视频免费播放| 久久亚洲免费视频| 波多野结衣人妻| 日韩最新av在线| 欧美影院视频| 精品人妻一区二区三区四区在线| 91亚洲精品一区二区乱码| 久久久久久无码精品大片| 日韩在线观看免费网站| 日本免费一区二区视频| 人妻夜夜添夜夜无码av| 久久久影视传媒| 中文字幕在线播放av| 萌白酱国产一区二区| 精品欠久久久中文字幕加勒比| 337p粉嫩大胆噜噜噜鲁| 国产精品美女一区二区| 国产高潮在线观看| 97在线看福利| 精品美女久久| 久久久久无码精品| 精品欧美一区二区三区| www.亚洲资源| 草莓视频一区| 日本 国产 欧美色综合| 69xx绿帽三人行| 亚洲欧洲激情在线| 国产精品毛片aⅴ一区二区三区| 韩日视频在线观看| 中文字幕精品一区| www日本在线| 国产精品福利在线观看| 一个色综合网| av在线网站观看| 欧美一区二区久久| 亚洲精品一区| 伊人再见免费在线观看高清版 | 欧美aaaaaa午夜精品| 久久免费精彩视频| 这里只有精品视频| 国产精品乱战久久久| 久久久久久久久久一区二区| 高跟丝袜欧美一区| 高h视频在线观看|