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

基于Agent的金融問答系統(tǒng):代碼重構(gòu) 原創(chuàng)

發(fā)布于 2024-11-25 10:28
瀏覽
0收藏

前言

在上一章??【項(xiàng)目實(shí)戰(zhàn)】基于Agent的金融問答系統(tǒng):前后端流程打通??,我們已經(jīng)完成了金融問答系統(tǒng)的前后端搭建,形成了可用的Demo。本章,我們將介紹代碼重構(gòu)的過程,并介紹一些優(yōu)化點(diǎn)。

代碼重構(gòu)簡介

在開啟本章介紹之前,請(qǐng)?jiān)试S我花點(diǎn)時(shí)間啰嗦兩句,聊一聊代碼重構(gòu)的哪些事兒。

在過去經(jīng)歷的項(xiàng)目中,代碼重構(gòu)很少被人重視。看著像??一樣的代碼(抱歉爆粗口,我所經(jīng)歷的一些項(xiàng)目包括我自己曾經(jīng)寫的代碼,回看確實(shí)像??一樣),它們并沒有被好好清理,然后我們?cè)??上面不斷加需求,導(dǎo)致需求迭代越來越難,Bug越來越多...

這種事情現(xiàn)在每天還在不斷地發(fā)生著,所以我決定有必要聊一聊代碼重構(gòu)。

什么是代碼重構(gòu)

代碼重構(gòu)是指對(duì)現(xiàn)有代碼進(jìn)行修改,以改善其結(jié)構(gòu)、可讀性和可維護(hù)性,而不改變其外部行為。重構(gòu)的主要目的是提高代碼質(zhì)量,使其更易于理解和擴(kuò)展。

代碼重構(gòu)的目的

? 提高可讀性:使代碼更易于理解,便于團(tuán)隊(duì)成員快速上手。

? 增強(qiáng)可維護(hù)性:降低后續(xù)修改和擴(kuò)展的難度,減少潛在的錯(cuò)誤。

? 優(yōu)化性能:在不改變功能的情況下,提升代碼的執(zhí)行效率。

? 消除重復(fù)代碼:通過抽象和重用,減少冗余,提高代碼的整潔性。

代碼重構(gòu)的重要性

據(jù)統(tǒng)計(jì),不好的代碼會(huì)占用更多開發(fā)的時(shí)間。

基于Agent的金融問答系統(tǒng):代碼重構(gòu)-AI.x社區(qū)

代碼重構(gòu)的難點(diǎn)

通過代碼重構(gòu)提升代碼質(zhì)量既然如此重要,那么為什么很少有項(xiàng)目開展呢?

究其原因,可能有三點(diǎn):

? 第一種:沒有精力重構(gòu)。開發(fā)工程師經(jīng)常性被老板或者產(chǎn)品牽著鼻子走,完成一個(gè)需求接著一個(gè)新的需求,所以很少開展重構(gòu)工作。這種情況在技術(shù)性為導(dǎo)向的項(xiàng)目還好,在以產(chǎn)品或市場(chǎng)為導(dǎo)向的項(xiàng)目中,尤其嚴(yán)重。

? 第二種:沒有重構(gòu)的思維。很多的開發(fā)工程師沒有重構(gòu)的思維甚至想法,他們以完成需求交付為目的,需求交付了也就代表他的工作結(jié)束了。

我曾經(jīng)與谷歌回來的一位朋友有次交流,我們探討的內(nèi)容是:為什么國內(nèi)的研發(fā)人員代碼質(zhì)量意識(shí)薄弱?他說其中一個(gè)很重要的原因是:硅谷的很多從業(yè)者,是因?yàn)闊釔郏瑹釔劬幊獭釔奂夹g(shù),所以視自己寫的代碼為一件藝術(shù)品,力求精益求精;而國內(nèi)有很多從業(yè)者,是因?yàn)樯妫且驗(yàn)樽鲩_發(fā)給錢多,是一份養(yǎng)家糊口的一份工作而已,因?yàn)槿鄙贌釔郏越徊盍耸录纯伞?duì)此,我深以為然。 ? 第三種:沒有重構(gòu)的方法論。雖然我們很像做重構(gòu),但是重構(gòu)工作就像修復(fù)一輛越開越慢的車子,如果沒有科學(xué)的方法,有可能出現(xiàn)拆了重裝之后,反而多了幾個(gè)螺絲的問題,這會(huì)讓老板更加恐怖。

本章,我將試圖以這個(gè)金融問答系統(tǒng)為例,簡單介紹一些代碼重構(gòu)的原則、方法。

代碼重構(gòu)的過程

1、搭建測(cè)試框架以及用例集

在開展代碼重構(gòu)前,我們要搭建好一個(gè)便于回歸測(cè)試的測(cè)試框架,通過邊重構(gòu)邊回歸的方式,可以快速定位問題所在,以此降低問題排查的成本。

我們?cè)赼pp目錄下,已經(jīng)創(chuàng)建了一個(gè)test_framework.py中,繼續(xù)補(bǔ)充測(cè)試用例集,例如:

基于Agent的金融問答系統(tǒng):代碼重構(gòu)-AI.x社區(qū)

在大廠中,回歸測(cè)試一般會(huì)使用單元測(cè)試框架(如pytest)來進(jìn)行執(zhí)行,由于本例中我們的方法較為簡單,所以就沒有使用pytest。

2、消滅代碼中的壞味道

2.1、統(tǒng)一管理配置相關(guān)內(nèi)容

在之前實(shí)現(xiàn)的RAG管理模塊中,有很多的配置是硬編碼寫在代碼初始化中的,例如:

# 原始的rag.py
class RagManager:
    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()

我們可以將所有的配置相關(guān)抽取到一個(gè)settings.py中,然后在使用的代碼中通過引用settings.py來進(jìn)行配置。

# setttings.py

"""
Chroma向量數(shù)據(jù)庫使用時(shí)的相關(guān)的配置
"""
# 默認(rèn)的ChromaDB的服務(wù)器類別
CHROMA_SERVER_TYPE ="http"
# 默認(rèn)本地?cái)?shù)據(jù)庫的持久化目錄
CHROMA_PERSIST_DB_PATH ="chroma_db"

CHROMA_HOST = os.getenv("CHROMA_HOST","localhost")
CHROMA_PORT =int(os.getenv("CHROMA_PORT",8000))
CHROMA_COLLECTION_NAME ="langchain"

說明:

  • 為了有別于變量的命名,對(duì)于配置我們使用大寫的變量名,例如:CHROMA_HOST、CHROMA_PORT等。

# 重構(gòu)的rag.py
import settings


classRagManager:
def__init__(self,
                 vector_db_class=ChromaDB,  # 默認(rèn)使用 ChromaDB
                 db_config=None,  # 數(shù)據(jù)庫配置參數(shù)
                 llm=None, embed=None,
                 retriever_cls=SimpleRetrieverWrapper, **retriever_kwargs):
        self.llm = llm
        self.embed = embed
        logger.info(f'初始化llm大模型:{self.llm}')
        logger.info(f'初始化embed模型:{self.embed}')

# 如果沒有提供 db_config,使用默認(rèn)配置
if db_config isNone:
            db_config ={
"chroma_server_type": settings.CHROMA_SERVER_TYPE,
"host": settings.CHROMA_HOST,
"port": settings.CHROMA_PORT,
"persist_path": settings.CHROMA_PERSIST_DB_PATH,
"collection_name": settings.CHROMA_COLLECTION_NAME
}
            logger.info(f'初始化向量數(shù)據(jù)庫配置:{db_config}')

# 創(chuàng)建向量數(shù)據(jù)庫實(shí)例
        self.vector_db = vector_db_class(**db_config, embed=self.embed)
        self.store = self.vector_db.get_store()

說明:

? 上述代碼中通過import settings,在使用配置時(shí)通過settings.CHROMA_SERVER_TYPE、settings.CHROMA_HOST等來引用。

2.2、處理參數(shù)過長的問題

在原始代碼中,隨著我們的需求迭代,在創(chuàng)建RAG時(shí)需要傳入多個(gè)的參數(shù),例如:

? chroma_server_type

? host

? port

? persist_path

? collection_name

如果按照原來的方法寫函數(shù),那么函數(shù)的參數(shù)列表就會(huì)非常長,如下:


RagManager(chroma_server_type="http", host="localhost", port=8000, persist_path="chroma_db", collection_name="langchain",llm , embed)

對(duì)于這種參數(shù)的問題,我們可以通過使用字典來處理,如下:


db_config = {
"chroma_server_type": settings.CHROMA_SERVER_TYPE,
"host": settings.CHROMA_HOST,
"port": settings.CHROMA_PORT,
"persist_path": settings.CHROMA_PERSIST_DB_PATH,
"collection_name": settings.CHROMA_COLLECTION_NAME,
}
RagManager(vector_db_class=ChromaDB, db_config=db_config, llm=self.llm, embed=self.embed)

說明:

? db_config是一個(gè)字典,可以包含多個(gè)配置參數(shù),例如:chroma_server_type、host、port、persist_path、collection_name等。

? db_config中的參數(shù)可以通過**關(guān)鍵字來解包,從而傳入到函數(shù)中。

? RagManager 的初始化函數(shù)中,通過**關(guān)鍵字來解包db_config,從而傳入到ChromaDB的初始化函數(shù)中。

2.3、減少重復(fù)代碼

在【項(xiàng)目實(shí)戰(zhàn)】基于Agent的金融問答系統(tǒng):RAG檢索模塊初建成中,我們?cè)鴮?shí)現(xiàn)了一個(gè)pdf_processor.py, 該函數(shù)主要的工作是:


def process_pdfs(self)# 處理pdf文件
defprocess_pdfs_group(self, pdf_files_group)# 分組處理pdf文件
defload_pdf_files(self)# 加載pdf文件
defload_pdf_content(self, pdf_path)# 讀取pdf文件內(nèi)容
defsplit_text(self, documents)# 分割讀取到的文本
definsert_docs_chromadb(self, docs, batch_size)  # 向向量數(shù)據(jù)庫中插入數(shù)據(jù)

如果我們要將PDF文件給ElasticSearch服務(wù)里,那么這個(gè)過程大部分實(shí)現(xiàn)邏輯都是一樣的,只是插入的對(duì)象不同,一個(gè)是向向量數(shù)據(jù)庫中插入,一個(gè)是向elasticsearch中插入。

這種情況下,

? 不好的做法:復(fù)制上述代碼到一個(gè)新的函數(shù)中,然后將最后一步insert_docs_chromadb()改為insert_docs_elasticsearch(),這樣會(huì)導(dǎo)致代碼重復(fù)。

? 較好的做法:對(duì)上述的插入過程進(jìn)行重構(gòu),將插入函數(shù)通過函數(shù)類來調(diào)用,通過一個(gè)參數(shù)vector_db_class來決定插入向量數(shù)據(jù)庫還是ElasticSearch。

重構(gòu)后的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.vector_db importVectorDB
from rag.elasticsearch_db importTraditionDB
from utils.logger_config importLoggerManager
logger =LoggerManager().logger
classPDFProcessor:
def__init__(self, directory, db_type='vector', **kwargs):
"""
初始化 PDF 處理器
:param directory: PDF 文件所在目錄
:param db_type: 數(shù)據(jù)庫類型 ('vector' 或 'es')
:param kwargs: 其他參數(shù)
"""
self.directory = directory  # PDF 文件所在目錄
self.db_type = db_type  # 數(shù)據(jù)庫類型
self.file_group_num = kwargs.get('file_group_num',20)# 每組處理的文件數(shù)
self.batch_num = kwargs.get('batch_num',6)# 每次插入的批次數(shù)量
self.chunksize = kwargs.get('chunksize',500)# 切分文本的大小
self.overlap = kwargs.get('overlap',100)# 切分文本的重疊大小
logger.info(f"""
初始化PDF文件導(dǎo)入器:
配置參數(shù):
- 導(dǎo)入的文件路徑:{self.directory}
- 每次處理文件數(shù):{self.file_group_num}
- 每批次處理樣本數(shù):{self.batch_num}
- 切分文本的大小:{self.chunksize}
- 切分文本重疊大小:{self.overlap}
""")
根據(jù)數(shù)據(jù)庫類型初始化相應(yīng)的客戶端
if db_type =='vector':
self.vector_db = kwargs.get('vector_db')# 向量數(shù)據(jù)庫實(shí)例
self.es_client =None
logger.info(f'導(dǎo)入的目標(biāo)數(shù)據(jù)庫為:向量數(shù)據(jù)庫')elif db_type =='es':
self.vector_db =None
self.es_client = kwargs.get('es_client')# Elasticsearch 客戶端
logger.info(f'導(dǎo)入的目標(biāo)數(shù)據(jù)庫為:ES數(shù)據(jù)庫')else:
raiseValueError("db_type must be either 'vector' or 'es'.")
defload_pdf_files(self):
這部分代碼未做修改,具體內(nèi)容省略
defload_pdf_content(self, pdf_path):
這部分代碼未做修改,具體內(nèi)容省略
defsplit_text(self, documents):
這部分代碼未做修改,具體內(nèi)容省略
defprocess_pdfs(self):
這部分代碼未做修改,具體內(nèi)容省略
definsert_docs(self, docs, insert_function, batch_size=None):
"""
將文檔插入到指定的數(shù)據(jù)庫,并顯示進(jìn)度
:param docs: 要插入的文檔列表
:param insert_function: 插入函數(shù)
:param batch_size: 批次大小
"""
if batch_size isNone:
batch_size = self.batch_num
logging.info(f"Inserting {len(docs)} documents.")
    start_time = time.time()
    total_docs_inserted =0

    total_batches =(len(docs)+ batch_size -1)// batch_sizewith 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]
insert_function(batch)# 調(diào)用傳入的插入函數(shù)
total_docs_inserted +=len(batch)計(jì)算并顯示當(dāng)前的TPM
elapsed_time = time.time()- start_timeif elapsed_time >0:
tpm =(total_docs_inserted / elapsed_time)*60
pbar.set_postfix({"TPM":f"{tpm:.2f}"})
pbar.update(1)definsert_to_vector_db(self, docs):
"""
將文檔插入到 VectorDB
"""
self.vector_db.add_with_langchain(docs)
definsert_to_elasticsearch(self, docs):
"""
將文檔插入到 Elasticsearch
"""
self.es_client.add_documents(docs)
defprocess_pdfs_group(self, pdf_files_group):
讀取PDF文件內(nèi)容
pdf_contents =[]for pdf_path in pdf_files_group:
讀取PDF文件內(nèi)容
documents = self.load_pdf_content(pdf_path)將documents 逐一添加到pdf_contents
pdf_contents.extend(documents)將文本切分成小段
docs = self.split_text(pdf_contents)if self.db_type =='vector':
將文檔插入到 VectorDB
self.insert_docs(docs, self.insert_to_vector_db)elif self.db_type =='es':
將文檔插入到 Elasticsearch
self.insert_docs(docs, self.insert_to_elasticsearch)else:
raiseValueError("db_type must be either 'vector' or 'es'.")

說明:

? 在類的初始化函數(shù)中,我們通過一個(gè)參數(shù)vector_db來連接對(duì)應(yīng)的數(shù)據(jù)庫實(shí)例,同時(shí)傳入db_type告知PDF處理器需要操作的數(shù)據(jù)庫類型。

? 在處理PDF文件時(shí),我們通過參數(shù)db_type來決定插入向量數(shù)據(jù)庫還是ElasticSearch。

? 在插入文檔 insert_docs 中,根據(jù)上一步驟傳入的 insert_function 來調(diào)用具體的插入函數(shù):如果是插入向量數(shù)據(jù)庫,則傳入的函數(shù)為self.insert_to_vector_db,那么調(diào)用時(shí)也會(huì)調(diào)用 insert_to_vector_db ;如果是插入ElasticSearch,則傳入的函數(shù)為self.insert_to_elasticsearch,那么調(diào)用時(shí)會(huì)調(diào)用 insert_to_elasticsearch 。

2.4、使用靜態(tài)掃描工具優(yōu)化代碼風(fēng)格

我們可以使用靜態(tài)掃描工具對(duì)代碼進(jìn)行風(fēng)格優(yōu)化,如Pylint、Flake8等,一般情況下PyCharm中會(huì)自帶這些工具。

具體方法:

  1. 啟動(dòng)PyCharm
  2. 打開工程時(shí),選擇app目錄
  3. 打開任意.py文件后,右上角會(huì)有靜態(tài)掃描問題提示(如下圖)
  4. 根據(jù)靜態(tài)掃描的問題,進(jìn)行代碼風(fēng)格修正(常見代碼風(fēng)格問題請(qǐng)見附錄部分)


基于Agent的金融問答系統(tǒng):代碼重構(gòu)-AI.x社區(qū)

3、回歸測(cè)試

在進(jìn)行上面每一步重構(gòu)時(shí),都需要使用test_framework.py進(jìn)行回歸測(cè)試,確保重構(gòu)后的代碼沒有引入新的錯(cuò)誤。

由于本項(xiàng)目重構(gòu)細(xì)節(jié)的內(nèi)容非常多,不能一一列舉,重構(gòu)后的內(nèi)容請(qǐng)查看Gitee或者Github倉庫的代碼。

?

本文轉(zhuǎn)載自公眾號(hào)一起AI技術(shù) 作者:Dongming

原文鏈接:??https://mp.weixin.qq.com/s/L3oBKllE7SiqdzBAwTXEiQ??

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
日韩激情毛片| 国产高清中文字幕在线| 免费人成精品欧美精品| 日韩在线不卡视频| 国产成人精品综合久久久久99 | 亚洲国产综合在线观看| 国产精品麻豆99久久久久久| 成人妇女免费播放久久久| 黄色一级片中国| 亚洲涩涩av| 欧美一区二区三区四区视频| 久久视频这里有精品| 91精品专区| 成人91在线观看| 国产精品激情av在线播放| 日本一区二区视频在线播放| 91成人短视频| 色天使色偷偷av一区二区| 曰韩不卡视频| 性高潮久久久久久久久久| 热久久免费视频| 97精品欧美一区二区三区| 调教驯服丰满美艳麻麻在线视频| 99亚洲乱人伦aⅴ精品| 在线中文字幕一区| 亚洲精品久久久久久久蜜桃臀| 国产精品天堂| av在线不卡网| 91精品国产99久久久久久红楼| 91麻豆精品在线| 亚洲精品裸体| 另类专区欧美制服同性| 久久精品—区二区三区舞蹈| 美女福利一区| 日韩欧美一二三四区| 国产野外作爱视频播放| 成人香蕉视频| 欧美日韩国产一区中文午夜| 无颜之月在线看| 久操视频在线| 国产精品久久久久影院色老大| 免费中文日韩| 水蜜桃在线免费观看| 国产香蕉在线观看| 精品亚洲免费视频| 国产精品久久国产精品99gif| 日本亚洲欧美在线| 欧美日韩一区二区三区四区在线观看| 亚洲乱亚洲乱妇无码| 国产视频精品视频| 亚洲国产一区二区三区网站| 4438x亚洲最大成人网| 99re精彩视频| 懂色aⅴ精品一区二区三区| 色av成人天堂桃色av| 啊啊啊一区二区| 极品在线视频| 精品福利一区二区| 欧美大片在线播放| 国产夫妻在线| 欧美日韩中国免费专区在线看| 国产精品自拍合集| 国模雨婷捆绑高清在线| 亚洲一区二区三区美女| 久久婷婷久久| 午夜精品一区二区三区在线视频| 懂色av.com| 亚洲国产专区| 2021久久精品国产99国产精品| 国产女同在线观看| 亚洲综合不卡| 国产精品日韩欧美| 一级黄色片免费看| 国产精品中文字幕日韩精品| 99在线国产| 色呦呦视频在线| 久久综合99re88久久爱| 欧日韩一区二区三区| av在线播放网| 亚洲视频在线一区二区| 久久www视频| 擼擼色在线看观看免费| 91国偷自产一区二区开放时间 | 伊人久久在线| 欧美性色综合网| 不用播放器的免费av| av综合网页| 亚洲欧美国产一本综合首页| 黄色激情小视频| 欧美久久99| 啪一啪鲁一鲁2019在线视频| 中文字幕视频二区| 丰满放荡岳乱妇91ww| 欧美少妇一区| av免费网站在线观看| 无码av免费一区二区三区试看| 日本在线观看a| www.成人| 亚洲免费小视频| 亚洲 欧美 变态 另类 综合| 在线日韩欧美| 国产一区视频在线播放| 天堂av资源网| 亚洲欧洲日产国码二区| 国产精品333| 欧美经典影片视频网站| 亚洲免费成人av电影| 黑人操日本美女| 欧美亚洲一区二区三区| 91夜夜未满十八勿入爽爽影院| 天天色天天操天天射| 亚洲欧洲国产专区| avav在线看| eeuss国产一区二区三区四区| 中文字幕精品—区二区| 久久精品国产亚洲AV无码男同| 免费的国产精品| 国产偷久久久精品专区| 里番在线观看网站| 色综合天天综合狠狠| 无套白嫩进入乌克兰美女| 精品国产欧美日韩| 97在线精品视频| 成 人 免费 黄 色| 中文字幕日韩一区二区| 性生交免费视频| 欧美网色网址| 久久久久免费精品国产| jizz中国少妇| 国产精品久久福利| 国产视频一区二区三区在线播放| 国产一级成人av| 欧美成人免费全部观看天天性色| 中文字幕av久久爽| 久久亚洲精品国产精品紫薇| aa视频在线播放| 精品一区二区三区中文字幕视频 | 日韩高清一级片| 久久66热这里只有精品| 欧美男男video| 日韩一级黄色片| 国产精品免费人成网站酒店| 老色鬼精品视频在线观看播放| 日韩高清av| 伊人久久高清| 亚洲人成在线观看网站高清| 成人在线免费看视频| av在线这里只有精品| 日韩国产一级片| 精品人人人人| 国产69久久精品成人| 神马午夜一区二区| 婷婷开心久久网| 天天插天天射天天干| 亚洲欧美激情诱惑| 欧美久久久久久久| 欧美最新精品| 色久欧美在线视频观看| 91好色先生tv| 亚洲欧美韩国综合色| 999热精品视频| 欧美视频成人| 精品蜜桃传媒| 神马电影网我不卡| 中文字幕亚洲无线码在线一区| 亚洲午夜激情视频| 亚洲免费观看高清在线观看| 农村末发育av片一区二区| 黄色亚洲大片免费在线观看| 激情一区二区三区| 色香欲www7777综合网| 在线一区二区日韩| 国产精品永久久久久久久久久| 亚洲人精品午夜| 欧美熟妇精品一区二区蜜桃视频| 国产日韩一区二区三区在线| 欧美中日韩一区二区三区| 热久久久久久| 久久久久久久999精品视频| 性感美女视频一二三| 欧美亚洲一区三区| 欧美被狂躁喷白浆精品| 91性感美女视频| 三级a三级三级三级a十八发禁止| 亚洲色图网站| 国产在线一区二区三区四区| av激情成人网| 欧美www在线| 亚洲欧美丝袜中文综合| 欧美日韩一区精品| 国产精品成人aaaa在线| 欧美国产日产图区| 韩国三级在线看| 美女视频一区免费观看| 先锋影音男人资源| 精品一区三区| 99在线热播| 成人福利一区二区| 久久久久久久久久久91| 91社区在线| 亚洲精品成人av| 国产精品毛片一区视频播 | 国产精品久久久久久福利一牛影视| 下面一进一出好爽视频| 老司机亚洲精品| 91国在线高清视频| 成人羞羞动漫| 国产一区二区免费电影| 91成人app| 日韩av色综合| 国模私拍视频在线播放| 日韩有码视频在线| 毛片免费在线观看| 精品国产一区二区在线观看| 亚洲无码久久久久| 日韩欧美有码在线| 国产一级视频在线观看| 综合欧美亚洲日本| 国产一二三四五区| 97精品电影院| 又色又爽又黄18网站| 黑人精品欧美一区二区蜜桃| 97xxxxx| 亚洲调教视频在线观看| 日韩 欧美 自拍| 成人激情在线| 欧美乱偷一区二区三区在线| 精品成人自拍视频| 91丝袜脚交足在线播放| 91九色成人| 国产精品入口尤物| 亚洲mmav| 青青久久aⅴ北条麻妃| aa视频在线观看| 欧美黄色片视频| 在线中文字幕电影| 久久亚洲欧美日韩精品专区| 日本在线播放| 中文欧美日本在线资源| 阿v免费在线观看| 亚洲天堂第二页| 黄色影院在线播放| 国产亚洲欧美一区| 国产三级在线观看| 伊人男人综合视频网| 韩国免费在线视频| 这里只有精品视频在线| 触手亚洲一区二区三区| 中文字幕日韩电影| 在线播放毛片| 久久中文字幕在线视频| av在线下载| 欧美精品久久久久久久久| 欧美人与禽性xxxxx杂性| 久久久久免费精品国产| 日本三级一区| 国产精品电影观看| 久久亚洲精品爱爱| 国产三级精品网站| 玖玖精品在线| 91在线免费网站| 成人高潮a毛片免费观看网站| 国产精品区一区| 丝袜av一区| 日韩中文字幕一区| 国产精品成人av| 国产尤物av一区二区三区| 一区在线免费| 超碰影院在线观看| 久久精品国产一区二区三区免费看 | 久久人人97超碰人人澡爱香蕉| 亚洲理论电影片| 日韩欧美视频一区二区三区四区| 成人羞羞动漫| 99er在线视频| 男人的天堂亚洲在线| 91福利国产成人精品播放| 国产乱码精品一区二区三| 国产chinese中国hdxxxx| 国产欧美日韩在线| 欧美日韩免费一区二区| 欧美日韩国产在线看| 亚洲图片小说视频| 亚洲第一精品福利| 成年人视频在线观看免费| 欧美巨猛xxxx猛交黑人97人| 日韩欧美一中文字暮专区| 国产乱人伦真实精品视频| 日韩在线成人| 欧洲精品一区色| 欧美jizzhd精品欧美巨大免费| 国产精品久久..4399| 日日夜夜精品视频天天综合网| 日本中文字幕在线不卡| 久久综合av免费| 欧美黑人一级片| 在线免费观看一区| 丰满少妇被猛烈进入| 日韩中文字幕av| 九色porny视频在线观看| 国产日韩精品视频| 最新亚洲精品| 国产亚洲黄色片| 日韩av在线播放中文字幕| 国产又粗又猛大又黄又爽| 国产欧美视频一区二区三区| 久久精品国产av一区二区三区| 欧美日韩国产一级片| 人成在线免费视频| 欧美国产视频一区二区| 青青青国产精品| 日韩高清av| 国产美女一区| 一级黄色免费视频| 自拍偷拍国产亚洲| 午夜视频网站在线观看| 亚洲精品mp4| 欧美家庭影院| 91中文字幕一区| 欧美hentaied在线观看| 免费高清在线观看免费| 成人av网站在线| 青青操国产视频| 777欧美精品| 9色在线观看| 国产精品成人播放| 亚洲裸色大胆大尺寸艺术写真| 可以看毛片的网址| 国产成人小视频| 9999热视频| 制服丝袜亚洲色图| 午夜激情在线观看| 国产精品久久婷婷六月丁香| 一区二区美女| 各处沟厕大尺度偷拍女厕嘘嘘| 成人动漫在线一区| 久草视频精品在线| 欧美成人精品3d动漫h| 成人在线app| 成人中文字幕在线观看 | 日韩一区二区高清视频| 国产最新精品免费| 成人在线观看小视频| 欧美久久免费观看| 日本美女高清在线观看免费| 国产精品人人做人人爽| 久久理论电影| 日本精品一区在线| 伊人开心综合网| 亚洲国产成人一区二区| 欧美激情亚洲国产| 国内露脸中年夫妇交换精品| 男人日女人视频网站| 91在线观看高清| 无码人妻丰满熟妇奶水区码| 国产亚洲综合久久| 少妇精品视频在线观看| 欧美日韩在线免费观看视频| 黄一区二区三区| 国产女人被狂躁到高潮小说| 欧美xxxxxxxxx| 高清在线视频不卡| 欧美日韩一区二区视频在线| 全部av―极品视觉盛宴亚洲| 国产尤物在线播放| 亚洲第一av网| 欧美电影免费观看高清完整| 亚洲视频小说| 国产成人精品www牛牛影视| 精品小视频在线观看| 亚洲精品自拍第一页| 精品123区| 日本美女爱爱视频| 不卡av电影在线播放| 无码人妻一区二区三区线| 精品国产一区二区三区久久| 欧美视频二区欧美影视| 日本少妇高潮喷水视频| 国产午夜精品久久久久久免费视| 国产又粗又猛又黄| 欧美激情亚洲激情| 欧洲grand老妇人| 少妇欧美激情一区二区三区| 欧美日韩一二三四五区| 在线观看免费版| 动漫美女被爆操久久久| 老司机精品视频网站| 欧美三根一起进三p| 国产亚洲xxx| 一区二区免费| 欧美精品成人网| 亚洲综合激情另类小说区| 国产一区电影| 成人综合电影| 蜜臀av性久久久久蜜臀av麻豆| 久久精品无码人妻| 最近2019中文免费高清视频观看www99| 97精品久久| 第一区免费在线观看| 欧美性xxxx极品hd满灌|