精品欧美一区二区三区在线观看 _久久久久国色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??


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
標簽
收藏
回復
舉報
回復
相關推薦
经典三级一区二区| 黄色小视频在线免费观看| 女同性一区二区三区人了人一| 欧美高清你懂得| 97超碰在线视| 青青色在线视频| 精品午夜一区二区三区在线观看| 欧美大片在线影院| 亚洲久久久久久久| 日韩激情综合| 日韩欧美极品在线观看| 在线日韩av永久免费观看| 亚洲国产精品欧美久久| 美女黄网久久| 欧美大片va欧美在线播放| 好吊日免费视频| 国产一区二区av在线| 一本一道综合狠狠老| 日本福利视频网站| 亚乱亚乱亚洲乱妇| 91免费看`日韩一区二区| 国产日韩欧美夫妻视频在线观看 | 2024国产精品| 97人人澡人人爽| 高潮无码精品色欲av午夜福利| 香蕉久久网站| 一区二区在线免费视频| 日本国产在线视频| 国产亚洲精aa在线看| 欧美图片一区二区三区| 国产极品尤物在线| 四虎影视成人| 亚洲视频免费观看| 婷婷五月色综合| 香蕉视频黄在线观看| 国产精品一区二区三区乱码| 国产精品成人一区二区三区吃奶| 国产午夜福利一区二区| 亚洲国产一成人久久精品| 国产一区二区三区网站| 人妻无码一区二区三区| 国产精品宾馆| 精品国精品国产| 黑人巨大猛交丰满少妇| 亚洲伊人精品酒店| 在线电影国产精品| 男人午夜视频在线观看| 欧美激情福利| 欧美福利一区二区| 蜜桃福利午夜精品一区| 96视频在线观看欧美| 欧美日韩精品免费观看视频| 网站一区二区三区| 国产精品字幕| 欧美日韩你懂得| 日韩av自拍偷拍| 亚洲一区二区小说| 日韩欧美一区在线观看| 国产女主播在线播放| 51精品国产| 亚洲国产黄色片| 成年人网站免费看| 国产中文精品久高清在线不| 亚洲色图综合久久| 日韩av片在线免费观看| 99视频精品全部免费在线视频| 色偷偷888欧美精品久久久| 可以免费看av的网址| 国产精品成久久久久| 麻豆国产精品va在线观看不卡 | 色乱码一区二区三区网站| 中文字幕日韩精品在线观看| 来吧亚洲综合网| 欧美女人交a| 777777777亚洲妇女| 中文字幕一区二区人妻视频| 蜜乳av一区二区| 91成人理论电影| 四虎影院在线域名免费观看| 久久久久久久久蜜桃| 午夜一区二区三视频在线观看| 欧美被日视频| 亚洲午夜免费视频| 亚洲免费av一区二区三区| 人人精品久久| 欧美精品一区二区三区在线| 亚洲最大成人网站| 亚洲免费二区| 8050国产精品久久久久久| 波多野结衣爱爱| 国产精品一区一区三区| 麻豆精品视频| 黄色片网站在线观看| 亚洲国产另类精品专区| 在线免费av播放| 亚洲欧洲国产精品一区| 精品一区二区三区三区| 女人18毛片毛片毛片毛片区二 | 992tv在线成人免费观看| 无码人妻aⅴ一区二区三区有奶水| 毛片av一区二区| 国产一区二区三区四区hd| 91xxx在线观看| 亚洲午夜在线视频| 中文字幕第100页| 久久九九热re6这里有精品| 中文字幕日韩高清| 国产又大又黄又粗| 国产成人免费视频网站 | 亚洲一区二区三区四区av| 国产精品三级| 久久久久久久亚洲精品| 一级淫片免费看| 91丨九色丨黑人外教| 免费看av软件| 欧美精品资源| 亚洲男女自偷自拍图片另类| 青娱乐国产精品| 蜜桃视频在线一区| 欧美一区二区三区在线免费观看| 婷婷av在线| 欧美日韩情趣电影| 人妻一区二区视频| 9色国产精品| eeuss一区二区三区| 午夜小视频在线| 日本二三区不卡| 久久人妻少妇嫩草av无码专区| 亚洲有吗中文字幕| 国产日韩在线一区| 成人福利在线| 色狠狠桃花综合| 午夜一区二区三区免费| 亚洲无线视频| 99国产在线观看| 在线视频中文字幕第一页| 欧美日韩一区二区欧美激情| 新91视频在线观看| 久久久999| 欧美精品国产精品久久久 | 国产精品十八以下禁看| 国产在线三区| 日本久久一区二区三区| 国产精品一区二区入口九绯色| 日韩香蕉视频| 精品国产乱码久久久久久郑州公司| sm国产在线调教视频| 欧美日韩在线观看一区二区 | 一道本在线免费视频| 精品国产乱码久久久久久蜜坠欲下 | 免费又黄又爽又猛大片午夜| av电影在线观看完整版一区二区| 91视频 - 88av| silk一区二区三区精品视频| 久精品免费视频| 午夜精品久久久久久久第一页按摩| 亚洲同性gay激情无套| 亚洲天堂av一区二区三区| 91成人精品视频| av日韩免费电影| 高清电影在线免费观看| 亚洲黄色在线观看| 日韩特级黄色片| 国产欧美综合在线观看第十页| www黄色在线| 日韩毛片视频| 99视频在线| 黄毛片在线观看| 亚洲网站在线看| 91亚洲欧美激情| 玉足女爽爽91| 在线观看国产免费视频| 视频一区二区欧美| 在线观看欧美亚洲| 哺乳一区二区三区中文视频| 午夜精品久久久久久久久久久久| 日本在线视频1区| 欧美三电影在线| 少妇影院在线观看| 97国产一区二区| 亚洲天堂网一区| 欧美高清日韩| 欧美成人一区二区在线| 日韩黄色碟片| 97视频在线观看视频免费视频| 韩国免费在线视频| 91精品综合久久久久久| 国产网站在线看| 中文字幕欧美激情一区| 无码av免费精品一区二区三区| 国产视频亚洲| 日本不卡一区二区三区四区| 欧美黑人巨大videos精品| 国产精品国产三级国产aⅴ9色| 黄色av电影在线播放| 亚洲精品久久久一区二区三区 | 涩涩网在线视频| 日韩有码视频在线| 天堂а√在线8种子蜜桃视频| 欧美日韩一区二区三区免费看| 国产极品在线播放| 国产精品久久久久一区| 国产精品手机在线观看| 麻豆视频一区二区| 激情五月宗合网| 一区二区影视| 日韩影视精品| 欧亚精品一区| 444亚洲人体| 深夜视频一区二区| 2018国产精品视频| 污污影院在线观看| 中文字幕精品视频| 亚洲aⅴ在线观看| 欧美不卡视频一区| 一级黄在线观看| 色狠狠桃花综合| 影音先锋亚洲天堂| 亚洲一级片在线观看| 182在线观看视频| 久久久亚洲国产美女国产盗摄| wwwww在线观看| 国产综合色在线| the porn av| 免费在线观看不卡| 国产第一页视频| 亚洲久久一区| 台湾无码一区二区| 在线一区免费| 黄色高清视频网站| 99久久综合| 亚洲日本欧美在线| 成人久久综合| 天堂av一区二区| 国产一区二区三区天码| 日本一区二区不卡高清更新| 欧美自拍视频| 久久99热只有频精品91密拍| 国产96在线亚洲| 国产精品一区二区三区免费观看| 欧美午夜在线播放| 亚洲free性xxxx护士hd| 国产亚洲高清一区| 亚洲一区二区自拍| 日韩在线精品强乱中文字幕| 91精品国产自产在线| 日本成人一区二区| 91色在线观看| 天堂av一区| 俄罗斯精品一区二区三区| 精品国产亚洲一区二区三区在线 | 中文字幕国产一区| 99久久99久久精品免费| 国产精品毛片a∨一区二区三区| 日本少妇xxxxx| 国产精品久久久久婷婷二区次| 国产3级在线观看| 亚洲欧洲综合另类在线| 欧美日韩在线视频免费| 一区二区三区在线免费观看| 黄色一级视频免费观看| 亚洲成av人片在线观看| 日韩精品视频免费看| 精品国产成人av| 亚洲中文一区二区| 欧美日韩精品电影| 精品人妻一区二区三区含羞草| 日韩你懂的在线观看| 亚洲精品国产手机| 国产视频在线一区二区| 成人亚洲综合天堂| 欧美成人黑人xx视频免费观看| 成人女同在线观看| 欧美有码在线视频| 国产精品久久久久久吹潮| 亚洲在线观看视频网站| 精品丝袜久久| 亚洲制服欧美久久| 黄色成人av网站| 亚洲三级视频网站| 国产高清不卡一区| 91成年人网站| 亚洲激情网站免费观看| 久久久久久久久久久久久av| 欧美色精品在线视频| 亚洲精品国产片| 在线观看国产欧美| 超碰97免费在线| 国产精品一区二区三区成人| 一区二区免费| 亚洲国产精品久久久久婷婷老年 | 欧美极品美女电影一区| 625成人欧美午夜电影| 国产精品一区二区久久国产| 日韩欧美中文在线观看| 日本午夜一区二区三区| 国内精品久久久久国产盗摄免费观看完整版| 国产黄页在线观看| 国产一区 二区 三区一级| 人人妻人人藻人人爽欧美一区| 亚洲麻豆国产自偷在线| 久久99国产综合精品免费| 日韩一区二区三区电影在线观看| av女名字大全列表| 欧美成人午夜激情视频| 国产精品videossex撒尿| 国产区一区二区三区| 99久久婷婷国产综合精品电影√| 久久精品免费一区二区| 国产综合色产在线精品 | 亚洲精品少妇30p| 久久久精品毛片| 亚洲高清在线观看| caoporm免费视频在线| 国产精品黄页免费高清在线观看| a看欧美黄色女同性恋| 一区不卡字幕| 日本午夜一区二区| 国产三级国产精品| 亚洲一区二区欧美日韩| 国产在成人精品线拍偷自揄拍| 亚洲欧美成人一区二区在线电影| 蜜桃传媒在线观看免费进入| 96sao精品视频在线观看| 精品久久91| 美女福利视频在线| 99免费精品视频| 久久免费播放视频| 欧美一级片在线观看| 亚洲xxxxxx| 国产欧美在线播放| 色综合天天爱| jizzzz日本| 欧美韩国日本不卡| 欧美特级黄色片| 亚洲网站在线播放| 欧美日韩国产网站| 午夜精品区一区二区三| 日本不卡视频在线观看| 鲁丝一区二区三区| 在线精品国精品国产尤物884a| 青青视频在线观| 国产成人精品午夜| 精品视频亚洲| 亚洲欧美日本一区二区三区| 国产精品色一区二区三区| 日韩国产亚洲欧美| 综合136福利视频在线| 成人综合网站| 午夜啪啪免费视频| 国产一区高清在线| 日韩欧美中文字幕视频| 日韩精品最新网址| a级片在线免费| 久久久久高清| 日韩精品国产精品| 国产又粗又猛又爽又黄的视频四季| 欧美亚洲尤物久久| 免费a级毛片在线播放| 91成人理论电影| 99riav1国产精品视频| 欧美熟妇一区二区| 欧美性感一类影片在线播放| 日本美女高清在线观看免费| 91久久精品国产91性色| 国产精品mm| www.自拍偷拍| 欧美日韩精品高清| 都市激情久久综合| 日韩精品一区二区三区外面| 毛片av一区二区三区| 久久久久亚洲av无码专区| 日韩精品在线视频| 国产成人精品一区二区三区视频| 亚洲第一精品区| 99久久国产综合色|国产精品| 五月婷婷六月婷婷| 久久精品国产免费观看| jizzjizzjizz欧美| 久久国产色av免费观看| 亚洲色图在线看| 色呦呦中文字幕| 国产精品九九九| 欧美韩日精品| 亚洲久久久久久久| 欧美一区二区三区日韩视频| 川上优av中文字幕一区二区| 色狠狠久久av五月综合| 国产成人午夜99999| 7799精品视频天天看| 欧美成年人视频| 综合亚洲色图| 欧美色图校园春色| 色8久久精品久久久久久蜜| 污视频免费在线观看| 亚洲丰满在线| 99精品黄色片免费大全| 国产精品久久久久久免费免熟 | 懂色aⅴ精品一区二区三区| 久久男人资源站|