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

基于Agent的金融問答系統:RAG檢索模塊初建成 原創

發布于 2024-11-22 15:46
瀏覽
0收藏

前言

我們在上一章《【項目實戰】基于Agent的金融問答系統之項目簡介》中簡單介紹了項目背景以及數據集情況,本章將介紹RAG模塊的實現。

功能列表

參考之前所學內容《大模型之初識RAG》,我們需要實現如下功能:

  • 向量庫的基礎功能

     向量庫

     數據入庫

  • 文件導入

    PDF文件的讀取

    PDF文件的切分

    調用向量庫接口入庫

  • 文件檢索

    連接向量庫

    檢索器檢索文件

開發過程

1、規劃工程文件

項目開始之后,我們如果能夠抑制住直接擼代碼的沖動,改為提前做好規劃,這會是一個好的習慣。 為此,我提前做了如下規劃:

代碼管理

  • 代碼使用Git進行管理,這樣后期多人協作時方便代碼更新、代碼Merge、沖突解決等。
  • 由于國內訪問Github優勢會ban,所以我們將代碼倉庫放在Gitee上。
  • 為代碼倉庫起了一個響亮的名稱后,倉庫地址定為https://gitee.com/deadwalk/smart-finance-bot

項目目錄

考慮這個項目會涉及到前端、后端、數據集、模型等,所以項目目錄規劃如下:

smart-finance-bot \
|- dataset \  # 該目錄用于保存PDF以及SQLite數據
|- doc \  # 該目錄用于保存文檔類文件,例如:需求文檔、說明文檔、數據文檔
|- app \   # 該目錄用于服務端代碼
|- agent \ # 該目錄用于保存agent相關代碼
|- rag \   # 該目錄用于保存rag相關代碼
|-test \   # 該目錄用于保存測試類驅動相關代碼
|- conf \  # 該目錄用于保存配置文件
|-.qwen # 該文件保存QWen的配置文件(請自行添加對應的API KEY)
|-.ernie # 該文件保存百度千帆的配置文件(請自行添加對應的API KEY)
|- chatweb \   # 該目錄用于保存前端頁面代碼
|- scripts \   # 該目錄用于保存腳本文件,例如:啟動腳本、導入向量數據庫腳本等
|- test_result \   # 該目錄用于保存測試結果
|- docker \
|- backend \ # 該目錄對應后端python服務的Dockerfile
|- frontend \ # 該目錄對應前端python服務的Dockerfile

上述目錄中,??dataset?? 是直接使用git的submodul命令,直接將天池大賽提供的數據集引入到本項目中,方便后續使用。

引入方法:

git submodule add https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_financial_14b_dataset.git dataset

命名規范

項目如果能夠約束統一的命名規范,這對于后續代碼的可讀性、可維護性會提供需要便利,在此我沿用了約定俗成的代碼命名規范:

  • 類名:使用大駝峰命名法,例如:??MyClass??
  • 函數名:使用小駝峰命名法,例如:??my_function??
  • 變量名:使用小駝峰命名法,例如:??my_variable??
  • 文件夾:使用小駝峰命名法。

整體命名時,要盡量見文知意。

2、實現基本的連接大模型的util庫

代碼文件及目錄:??app/utils/util.py??

from dotenv import load_dotenv
import os

# 獲取當前文件的目錄
current_dir = os.path.dirname(__file__)

# 構建到 conf/.qwen 的相對路徑
conf_file_path_qwen = os.path.join(current_dir,'..','conf','.qwen')

# 加載千問環境變量
load_dotenv(dotenv_path=conf_file_path_qwen)

defget_qwen_models():
"""
    加載千問系列大模型
    """
# llm 大模型
from langchain_community.llms.tongyi importTongyi

    llm =Tongyi(model="qwen-max", temperature=0.1, top_p=0.7, max_tokens=1024)

# chat 大模型
from langchain_community.chat_models importChatTongyi

    chat =ChatTongyi(model="qwen-max", temperature=0.01, top_p=0.2, max_tokens=1024)
# embedding 大模型
from langchain_community.embeddings importDashScopeEmbeddings

    embed =DashScopeEmbeddings(model="text-embedding-v3")

return llm, chat, embed

在app/conf/.qwen中,添加對應的API KEY,例如:

DASHSCOPE_API_KEY = sk-xxxxxx

3、實現向量庫基礎功能

向量庫文件考慮使用Chroma實現,所以我們先實現一個向量庫的類,用于完成基本的向量庫連接、數據入庫操作。

代碼文件及目錄:??app/rag/chroma_conn.py??

import chromadb
from chromadb importSettings
from langchain_chroma importChroma


classChromaDB:
def__init__(self,
                 chroma_server_type="local",  # 服務器類型:http是http方式連接方式,local是本地讀取文件方式
                 host="localhost", port=8000,  # 服務器地址,http方式必須指定
                 persist_path="chroma_db",  # 數據庫的路徑:如果是本地連接,需要指定數據庫的路徑
                 collection_name="langchain",  # 數據庫的集合名稱
                 embed=None  # 數據庫的向量化函數
                 ):

        self.host = host
        self.port = port
        self.path = persist_path
        self.embed = embed
        self.store =None

# 如果是http協議方式連接數據庫
if chroma_server_type =="http":
            client = chromadb.HttpClient(host=host, port=port)

            self.store =Chroma(collection_name=collection_name,
                                embedding_function=embed,
                                client=client)

if chroma_server_type =="local":
            self.store =Chroma(collection_name=collection_name,
                                embedding_function=embed,
                                persist_directory=persist_path)

if self.store isNone:
raiseValueError("Chroma store init failed!")

defadd_with_langchain(self, docs):
"""
        將文檔添加到數據庫
        """
        self.store.add_documents(documents=docs)

defget_store(self):
"""
        獲得向量數據庫的對象實例
        """
return self.store

在實際項目實踐過程中,我們發現導入Chroma數據時使用本地化連接方式更快一些,所以對連接方式做了兩個參數的擴展,local 代表本地連接,http 代表遠程連接。

4、實現入庫功能

本著先跑通流程,再優化交互過程的思路,對于PDF文件入向量庫的過程,我們先通過一段腳本實現(暫不做前端UI的交互)。

代碼文件及目錄:??app/rag/pdf_processor.py??

import os
import logging
import time
from tqdm import tqdm
from langchain_community.document_loaders importPyMuPDFLoader
from langchain_text_splitters importRecursiveCharacterTextSplitter
from rag.chroma_conn importChromaDB


classPDFProcessor:
def__init__(self,
                 directory,  # PDF文件所在目錄
                 chroma_server_type,  # ChromaDB服務器類型
                 persist_path,  # ChromaDB持久化路徑
                 embed):# 向量化函數

        self.directory = directory
        self.file_group_num =80# 每組處理的文件數
        self.batch_num =6# 每次插入的批次數量

        self.chunksize =500# 切分文本的大小
        self.overlap =100# 切分文本的重疊大小

        self.chroma_db =ChromaDB(chroma_server_type=chroma_server_type,
                                  persist_path=persist_path,
                                  embed=embed)
# 配置日志
        logging.basicConfig(
            level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
            datefmt='%Y-%m-%d %H:%M:%S'
)

defload_pdf_files(self):
"""
        加載目錄下的所有PDF文件
        """
        pdf_files =[]
for file in os.listdir(self.directory):
if file.lower().endswith('.pdf'):
                pdf_files.append(os.path.join(self.directory, file))

        logging.info(f"Found {len(pdf_files)} PDF files.")
return pdf_files

defload_pdf_content(self, pdf_path):
"""
        讀取PDF文件內容
        """
        pdf_loader =PyMuPDFLoader(file_path=pdf_path)
        docs = pdf_loader.load()
        logging.info(f"Loading content from {pdf_path}.")
return docs

defsplit_text(self, documents):
"""
        將文本切分成小段
        """
# 切分文檔
        text_splitter =RecursiveCharacterTextSplitter(
            chunk_size=self.chunksize,
            chunk_overlap=self.overlap,
            length_function=len,
            add_start_index=True,
)

        docs = text_splitter.split_documents(documents)

        logging.info("Split text into smaller chunks with RecursiveCharacterTextSplitter.")
return docs

definsert_docs_chromadb(self, docs, batch_size=6):
"""
        將文檔插入到ChromaDB
        """
# 分批入庫
        logging.info(f"Inserting {len(docs)} documents into ChromaDB.")

# 記錄開始時間
        start_time = time.time()
        total_docs_inserted =0

# 計算總批次
        total_batches =(len(docs)+ batch_size -1)// batch_size

with tqdm(total=total_batches, desc="Inserting batches", unit="batch")as pbar:
for i inrange(0,len(docs), batch_size):
# 獲取當前批次的樣本
                batch = docs[i:i + batch_size]

# 將樣本入庫
                self.chroma_db.add_with_langchain(batch)
# self.chroma_db.async_add_with_langchain(batch)

# 更新已插入的文檔數量
                total_docs_inserted +=len(batch)

# 計算并顯示當前的TPM
                elapsed_time = time.time()- start_time  # 計算已用時間(秒)
if elapsed_time >0:# 防止除以零
                    tpm =(total_docs_inserted / elapsed_time)*60# 轉換為每分鐘插入的文檔數
                    pbar.set_postfix({"TPM":f"{tpm:.2f}"})# 更新進度條的后綴信息

# 更新進度條
                pbar.update(1)

defprocess_pdfs_group(self, pdf_files_group):
# 讀取PDF文件內容
        pdf_contents =[]

for pdf_path in pdf_files_group:
# 讀取PDF文件內容
            documents = self.load_pdf_content(pdf_path)

# 將documents 逐一添加到pdf_contents
            pdf_contents.extend(documents)

# 將文本切分成小段
        docs = self.split_text(pdf_contents)

# 將文檔插入到ChromaDB
        self.insert_docs_chromadb(docs, self.batch_num)

defprocess_pdfs(self):
# 獲取目錄下所有的PDF文件
        pdf_files = self.load_pdf_files()

        group_num = self.file_group_num

# group_num 個PDF文件為一組,分批處理
for i inrange(0,len(pdf_files), group_num):
            pdf_files_group = pdf_files[i:i + group_num]
            self.process_pdfs_group(pdf_files_group)

print("PDFs processed successfully!")

5、測試導入功能

因為Python的導入庫的原因(一般都是從工作目錄查找),所以我們在項目根目錄下創建test_framework.py,方便后續統一測試工作。

smart-finance-bot \
    |- app \   # 該目錄用于服務端代碼
        |- rag \   # 該目錄用于保存rag相關代碼
            |- pdf_processor.py
            |- chroma_conn.py
        |- test_framework.py

代碼文件: ??app/test_framework.py??

# 測試導入PDF到向量庫主流程
deftest_import():
from rag.pdf_processor importPDFProcessor
from utils.util import get_qwen_models

    llm , chat , embed = get_qwen_models()
# embed = get_huggingface_embeddings()

    directory ="./app/dataset/pdf"
    persist_path ="chroma_db"
    server_type ="local"

# 創建 PDFProcessor 實例
    pdf_processor =PDFProcessor(directory=directory,
                                 chroma_server_type=server_type,
                                 persist_path=persist_path,
                                 embed=embed)

# 處理 PDF 文件
    pdf_processor.process_pdfs()

if __name__ =="__main__":
    test_import()

1.通過命令行啟動ChromaDB服務端:

chroma run --path chroma_db --port 8000 --host localhost

2.運行test_framework.py

運行效果:

基于Agent的金融問答系統:RAG檢索模塊初建成-AI.x社區


備注:一般測試框架會使用Pytest并且編寫相應的單元測試函數,本次項目中由于項目較小且函數返回結果不固定,所以就沒有寫UnitTest。如果想了解Pytest的使用示例,可以參考我的其他代碼倉庫,例如:UnitTest的使用

6、實現檢索功能

代碼文件: ??app/rag/rag.py??

import logging
from langchain_core.prompts importChatPromptTemplate
from langchain_core.runnables importRunnablePassthrough
from langchain_core.runnables.base importRunnableLambda
from langchain_core.output_parsers importStrOutputParser
from.chroma_conn importChromaDB

# 配置日志記錄
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s')


classRagManager:
def__init__(self,
                 chroma_server_type="http",
                 host="localhost", port=8000,
                 persist_path="chroma_db",
                 llm=None, embed=None):
        self.llm = llm
        self.embed = embed

        chrom_db =ChromaDB(chroma_server_type=chroma_server_type,
                            host=host, port=port,
                            persist_path=persist_path,
                            embed=embed)
        self.store = chrom_db.get_store()

defget_chain(self, retriever):
"""獲取RAG查詢鏈"""

# RAG系統經典的 Prompt (A 增強的過程)
        prompt =ChatPromptTemplate.from_messages([
("human","""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.
          Question: {question} 
          Context: {context} 
          Answer:""")
])
# 將 format_docs 方法包裝為 Runnable
        format_docs_runnable =RunnableLambda(self.format_docs)
# RAG 鏈
        rag_chain =(
{"context": retriever | format_docs_runnable,
"question":RunnablePassthrough()}
| prompt
| self.llm
|StrOutputParser()
)

return rag_chain

defformat_docs(self, docs):
# 返回檢索到的資料文件名稱
        logging.info(f"檢索到資料文件個數:{len(docs)}")
        retrieved_files ="\n".join([doc.metadata["source"]for doc in docs])
        logging.info(f"資料文件分別是:\n{retrieved_files}")

        retrieved_content ="\n\n".join(doc.page_content for doc in docs)
        logging.info(f"檢索到的資料為:\n{retrieved_content}")

return retrieved_content

defget_retriever(self, k=4, mutuality=0.3):
        retriever = self.store.as_retriever(search_type="similarity_score_threshold",
                                            search_kwargs={"k": k,"score_threshold": mutuality})

return retriever

defget_result(self, question, k=4, mutuality=0.3):
"""獲取RAG查詢結果"""

        retriever = self.get_retriever(k, mutuality)

        rag_chain = self.get_chain(retriever)

return rag_chain.invoke(input=question)

以上是實現了一個使用基本檢索器的RAG,其中:

  • 代碼中通過chroma_conn.py模塊連接到ChromaDB數據庫,并使用ChromaDB的as_retriever方法創建一個檢索器。

7、測試檢索效果

在test_framework.py中添加RAG的測試調用函數。

代碼文件:??app/test_framework.py??

# 測試RAG主流程
deftest_rag():
from rag.rag importRagManager
from utils.util import get_qwen_models

    llm, chat, embed = get_qwen_models()
    rag =RagManager(host="localhost", port=8000, llm=llm, embed=embed)

    result = rag.get_result("湖南長遠鋰科股份有限公司變更設立時作為發起人的法人有哪些?")

print(result)


if __name__ =="__main__":
    test_rag()# RAG測試函數
# test_import()         # 批量導入PDF測試函數

注釋掉批量導入函數,開啟test_rag()函數,運行效果:

基于Agent的金融問答系統:RAG檢索模塊初建成-AI.x社區

至此,我們完成了RAG模塊的基本功能,它包括PDF文件的批量導入以及檢索功能。

內容小結

  • 首先,我們創建了一個ChromaDB的類,封裝了基礎的Chroma連接、插入、檢索。
  • 其次,我們實現了PDFProcessor類,該類中會調用ChromaDB類的插入函數,將批量讀取的PDF文件進行切分后保存至向量庫。
  • 然后,我們實現了RagManager類,該類中封裝了RAG的檢索鏈,并定義了檢索的參數。
  • 最后,我們實現了一個測試函數,用于測試RAG的檢索功能。
  • 除此之外,有兩個注意事項:

    在項目初期,進行合理的項目文件目錄規劃,可以有效減少項目維護的難度。

    在項目行進中,通過搭建測試框架,可以方便函數驗證以及后續重構的回歸測試。


本文轉載自公眾號一起AI技術 作者:Dongming

原文鏈接:??https://mp.weixin.qq.com/s/ZMwZSsmms03U-GRRwnxMNg??


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
標簽
收藏
回復
舉報
回復
相關推薦
这里只有精品9| 爱爱免费小视频| 暖暖在线中文免费日本| 成人av电影在线播放| 97avcom| 九九九视频在线观看| 国产高清亚洲| 精品久久久久久久久国产字幕| 久久精品女人的天堂av| 91麻豆成人精品国产| 亚洲欧洲日本mm| 原创国产精品91| 亚洲精品成人无码毛片| 日本一区免费网站| 一二三区精品福利视频| 五月天久久综合网| 少妇高潮久久久| 精品一区二区三区在线观看| 国内揄拍国内精品少妇国语| 肉色超薄丝袜脚交69xx图片| 欧美激情网址| 日韩一区二区在线看| 欧美日韩一区二区在线免费观看| av在线影院| 国产偷国产偷精品高清尤物| 国产精品一区二区免费看| 中文区中文字幕免费看| 宅男噜噜噜66国产日韩在线观看| 久久久成人精品| 成年人在线免费看片| 久久精品论坛| 精品久久久久久亚洲综合网| www.污网站| 日韩中文影院| 日韩欧美高清在线视频| 17c丨国产丨精品视频| 天堂资源在线中文| 久久久久久免费| 国产视频一区二区不卡| 午夜精品久久久久久久99热黄桃| 麻豆91精品91久久久的内涵| 国产成人jvid在线播放| 超碰中文字幕在线| 99re国产精品| 91精品国产电影| 久久精品免费av| 在线看片不卡| 超碰97人人做人人爱少妇| av在线免费播放网址| 国产一区二区精品福利地址| 亚洲欧美日韩国产中文专区| jizz欧美性20| 亚欧洲精品视频在线观看| 亚洲国产精品99久久| 精品人妻伦一二三区久| 风间由美中文字幕在线看视频国产欧美| 精品视频在线免费观看| 亚洲欧美日韩综合网| 国产成人免费精品| 欧美日本一区二区三区| 三上悠亚在线一区| 欧美aaaaaaaa| 欧美巨大另类极品videosbest | 欧亚乱熟女一区二区在线| 日韩国产在线不卡视频| 欧美v国产在线一区二区三区| 色黄视频免费看| 日韩08精品| 亚洲第一精品自拍| 9.1成人看片| 免费看av成人| 色婷婷av一区二区三区久久| 国产男女猛烈无遮挡在线喷水| 国产精品毛片久久| 欧美大秀在线观看| 日韩欧美视频在线免费观看| 亚洲综合日韩| 国产精品r级在线| 在线免费av网| 国产suv精品一区二区883| 成人午夜电影免费在线观看| 四虎影视精品成人| 中文字幕精品一区二区精品绿巨人| 亚洲欧美日韩不卡| 精灵使的剑舞无删减版在线观看| 懂色av中文一区二区三区天美| 日本中文字幕网址| 欧美日韩精品免费观看视完整| 精品视频在线视频| 欧美熟妇精品一区二区| 国产一区二区三区日韩精品| 久久久精品在线| 中文字幕第28页| 久久精品九九| 亚洲一区二区三区在线免费观看| 亚洲欧美激情国产综合久久久| xnxx国产精品| 男女h黄动漫啪啪无遮挡软件| 国产欧洲在线| 这里是久久伊人| 中文在线永久免费观看| 日韩av在线播放网址| 午夜精品久久久久久久久久久久久| 无码人妻丰满熟妇奶水区码| 国产精品77777竹菊影视小说| 欧美亚州在线观看| 午夜伦理在线视频| 在线观看一区二区视频| 免费看91视频| 色综合久久网| 97国产成人精品视频| 97精品人妻一区二区三区在线| 成年人国产精品| 中文字幕一区二区三区四区五区| 波多野结衣在线高清| 精品视频在线视频| 97超碰在线资源| 伊人影院久久| 成人信息集中地欧美| 瑟瑟在线观看| 亚洲国产日韩综合久久精品| 色免费在线视频| 亚洲毛片免费看| 国产+人+亚洲| 99久久亚洲精品日本无码| 国产日韩精品一区二区三区| 国产素人在线观看| caoporn成人| 久久精品视频导航| 伊人网站在线观看| 国产无一区二区| 日韩a在线播放| 日韩成人一级| 久久久这里只有精品视频| 国产精品一区二区三区在线免费观看 | 中文字幕一区二区三区欧美日韩| 国产精品av在线| 日本国产在线| 欧美性xxxx在线播放| 久久久老熟女一区二区三区91| 亚洲第一天堂| 92看片淫黄大片看国产片| 嫩草在线视频| 欧美日韩国产首页| 欧美视频一区二区在线| 日本成人在线一区| 视频一区亚洲| 99热播精品免费| 最近2019年手机中文字幕| 懂色av蜜臀av粉嫩av喷吹| 国产婷婷色一区二区三区四区| www.四虎成人| 国产精品探花在线观看| 日韩av电影在线播放| 久久免费看视频| 欧美最新大片在线看| 手机看片日韩av| 日本色综合中文字幕| 亚洲精品中文字幕乱码三区不卡| www.一区| 欧美成人sm免费视频| 精品毛片一区二区三区| 亚洲自拍偷拍图区| 国产熟女高潮一区二区三区 | 亚洲综合色成人| 中文字幕天堂网| 亚洲欧美日本国产专区一区| 欧美三级华人主播| 国产成人精选| 欧美疯狂性受xxxxx另类| 人妻无码中文字幕| 色网站国产精品| 999久久久国产| 国产精品456露脸| 99视频在线免费播放| 国产欧美日韩在线一区二区| 国产精品日韩欧美| 18视频在线观看网站| 精品国产91久久久久久久妲己| 日韩精品在线免费视频| 亚洲国产成人自拍| japan高清日本乱xxxxx| 亚洲麻豆一区| 亚洲欧洲一区二区福利| 日韩精品一区国产| 2025国产精品视频| 网友自拍视频在线| 亚洲国产精品系列| 一本一道人人妻人人妻αv| 一区二区三区四区在线| 免费在线观看你懂的| 久久99精品久久久久婷婷| 丰满的少妇愉情hd高清果冻传媒| 免费视频一区三区| 亚洲free性xxxx护士白浆| 亚洲精品动漫| 欧美成人中文字幕在线| 欧美精品久久久久久久久久丰满| 制服丝袜亚洲色图| 亚洲成人av影片| 亚洲男人天堂一区| 欧洲av一区二区三区| 国产福利91精品一区二区三区| 亚洲人成色77777| 亚洲中无吗在线| 日韩精品极品视频在线观看免费| 国产aa精品| 国产精品美女久久久久久免费| 成年人国产在线观看| 久久人人爽亚洲精品天堂| 天堂在线中文字幕| 日韩丝袜情趣美女图片| 在线观看国产成人| 欧美性猛交视频| 久久精品视频久久| 亚洲青青青在线视频| 成年人网站免费在线观看| 国产成人自拍高清视频在线免费播放| 天天爽人人爽夜夜爽| 国产一区二区高清| 青草视频在线观看视频| 91成人网在线观看| 一区二区三区电影| 国产毛片一区二区三区| 久久国产精品 国产精品| 99精品中文字幕在线不卡| 91美女片黄在线观| 国产精品亚洲一区二区三区在线观看| 欧美激情一区二区三区在线视频观看| 日韩精品黄色| 日日骚久久av| 97超碰人人在线| 正在播放国产一区| 毛片在线播放网址| 国产视频精品在线| 婷婷色在线观看| 亚洲福利视频免费观看| 男人天堂网在线视频| 日韩精品专区在线| www.四虎在线观看| 日韩免费在线观看| 午夜精品久久久久久久96蜜桃| 91精品欧美综合在线观看最新| 亚洲精品91天天久久人人| 色av成人天堂桃色av| 午夜毛片在线观看| 动漫精品一区二区| 亚洲欧美偷拍一区| 日本丶国产丶欧美色综合| 亚洲熟女综合色一区二区三区| 欧美日韩一区二区在线| 国产又粗又爽视频| 色综合天天综合狠狠| 五月婷婷激情视频| 在线观看www91| 一区二区视频网站| 欧美精品在线视频| 国产黄色片免费| 亚洲成人xxx| 欧美一区二区三区少妇| 亚洲图片欧洲图片av| 爱爱爱免费视频在线观看| 中文字幕在线日韩 | 特级丰满少妇一级aaaa爱毛片| 亚洲国产高潮在线观看| 精品影院一区| www.欧美免费| 性欧美高清come| 欧美一性一乱一交一视频| 免费高清视频在线一区| 91精品视频播放| 极品国产人妖chinesets亚洲人妖| 九色一区二区| 成人精品电影| 大片在线观看网站免费收看| 在线亚洲成人| 国产成年人视频网站| 成人午夜视频福利| 成年人网站免费看| 国产精品久久国产精麻豆99网站| 青青草手机在线视频| 疯狂欧美牲乱大交777| 中文字幕人妻一区二区在线视频| 337p亚洲精品色噜噜噜| 日本高清视频在线| 欲色天天网综合久久| 欧美性受ⅹ╳╳╳黑人a性爽| 91爱爱小视频k| 四虎成人精品一区二区免费网站| 国产免费一区二区| 欧美精选视频在线观看| 日韩欧美猛交xxxxx无码| 老司机精品福利视频| 4438x全国最大成人| 久久久久久免费毛片精品| 青娱乐免费在线视频| 91久久奴性调教| 亚洲爆乳无码一区二区三区| 亚洲图片制服诱惑| 国精一区二区三区| 国产精品视频一区二区三区四| 精品三级av在线导航| 亚洲欧洲日韩综合二区| 野花国产精品入口| 亚洲综合20p| 国产丝袜美腿一区二区三区| 久久久全国免费视频| 欧美私模裸体表演在线观看| 蜜臀久久精品久久久久| xx视频.9999.com| 欧美人与性动交xxⅹxx| 国产 高清 精品 在线 a| 97精品视频| 少妇高清精品毛片在线视频| 大陆成人av片| 农村黄色一级片| 欧美伊人久久久久久久久影院 | 久久精品国产2020观看福利| 国产欧美一区二区三区精品酒店| 99在线首页视频| 91麻豆精品国产91久久久平台 | 成人午夜电影网站| 91高清免费观看| 欧美色成人综合| 狠狠狠综合7777久夜色撩人| 亚州成人av在线| 大香伊人久久精品一区二区| 不卡中文字幕在线| 美女视频一区二区| 国产一级久久久久毛片精品| 欧美日韩国产一区二区| 成人无码一区二区三区| 欧美成年人在线观看| 国产精品1区在线| 在线观看免费91| 秋霞电影一区二区| 日韩一级av毛片| 91久久精品国产91性色tv| 男操女在线观看| 日韩免费不卡av| 一区二区三区日本久久久| 久久精品免费一区二区| av高清久久久| 国产一级精品视频| 亚洲成人中文字幕| а√在线天堂官网| 狠狠干一区二区| 国产日韩欧美高清免费| 国产又爽又黄无码无遮挡在线观看| 香蕉加勒比综合久久| 日本高清视频www| 欧美影院久久久| 免费av一区二区三区四区| 北条麻妃在线一区| 日本一区二区三区dvd视频在线| 日韩电影在线观看一区二区| 国产香蕉精品视频一区二区三区| 全球最大av网站久久| 亚洲a∨一区二区三区| 激情久久五月天| 超碰在线国产97| 亚洲国产成人91精品| 日韩大片免费观看| 色播五月综合| 国产美女精品在线| 日韩免费视频网站| 亚洲美女中文字幕| 韩国精品视频在线观看| 国产资源第一页| 99re热这里只有精品视频| 黄色一级视频免费看| 在线视频日本亚洲性| 国产免费av国片精品草莓男男| 国产91沈先生在线播放| 99精品视频一区二区| 国模私拍一区二区| 久久国产精品久久国产精品| 国产精品传媒| 99视频在线免费| 亚洲乱码中文字幕| 少妇av在线播放| 国产精品网红福利| 黄色成人精品网站| 非洲一级黄色片| 日韩一区二区三区电影在线观看| jizzjizz中国精品麻豆| 日韩理论片在线观看| 国产精品888| 中文字幕免费高清网站| 欧美成人在线网站| 精品国产aⅴ| 真实乱偷全部视频| 日本久久电影网| 亚洲wwwww| 亚洲精品久久久久久一区二区| 国产成人一区二区精品非洲| 波多野结衣影片| 久久久久久亚洲精品| 99精品一区| 在线免费看黄视频|