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

大模型ReAct框架——打造AI Agent的代碼實(shí)現(xiàn)——基于LLM + Function Call構(gòu)建Agent 原創(chuàng)

發(fā)布于 2024-8-28 07:22
瀏覽
0收藏

“ Agent通過大模型的推理和規(guī)劃,使得大模型真正實(shí)現(xiàn)類似人類的能力”

AI Agent也就是AI智能體,是通過把大模型作為“大腦”,通過利用大模型的推理和規(guī)劃能力,然后調(diào)用外部工具來完成復(fù)雜任務(wù)的一種方式。

簡單來說,Agent就是一種讓大模型自己思考和分析問題,選擇合適的工具,最終解決問題的一種方法,其背后原理就來自于ReAct。

ReAct是Reasoning And Acting的縮寫,意思是LLM可以根據(jù)邏輯推理(Reson),構(gòu)建完整系列行動(Act),從而達(dá)到期望目標(biāo)。

LLM的靈感來源于人類和推理之間的協(xié)同關(guān)系,人類根據(jù)這種協(xié)同關(guān)系學(xué)習(xí)新的知識,做出決策,然后執(zhí)行。

什么是ReAct框架?


??https://developer.aliyun.com/article/1241363??

從本質(zhì)上來說,智能體的作用就是模仿人類的思維和處理復(fù)雜問題的方式。


大模型ReAct框架——打造AI Agent的代碼實(shí)現(xiàn)——基于LLM + Function Call構(gòu)建Agent-AI.x社區(qū)

基于LLM 和 Function Call實(shí)現(xiàn)Agent

ReAct的作用就是協(xié)同LLM和外部的信息獲取,與其它功能交互,如果說LLM模型是大腦,那么ReAct框架就是這個(gè)大腦的手腳和五官。

下面我們就用代碼來實(shí)現(xiàn)一個(gè)簡單的具有自主規(guī)劃功能的Agent,需要的東西也很簡單:

Python開發(fā)環(huán)境 python 版本用到3.12.1 版本沒有強(qiáng)制要求


支持Function Call 工具的大模型(可以是自己部署的大模型或者第三方模型)。
使用第三方模型需要自己申請并獲取其API-KEY,代碼中還用到了tavily搜索,這個(gè)也需要自己去申請。

下圖是Agent根據(jù)任務(wù)要求輸出的結(jié)果,任務(wù)要求是 

請幫我制定一份理財(cái)計(jì)劃,你可以通過網(wǎng)絡(luò)搜索的方式來收集一定的參考資料,并把最終的計(jì)劃內(nèi)容寫入到理財(cái)計(jì)劃.txt文件中

大模型ReAct框架——打造AI Agent的代碼實(shí)現(xiàn)——基于LLM + Function Call構(gòu)建Agent-AI.x社區(qū)

Agent實(shí)現(xiàn)的核心有三點(diǎn)

  1. 大模型的質(zhì)量
  2. 外部工具集
  3. 提示詞的質(zhì)量

大模型的質(zhì)量問題直接影響到Agent表現(xiàn)的好壞,推理能力強(qiáng),知識豐富的大模型會表現(xiàn)更好。

而外部工具集就是提供給大模型使用的工具可以根據(jù)不同的業(yè)務(wù)場景提供不同的工具集(API)。如果使用一些第三方API可能需要自己申請,比如百度或谷歌搜索,高德和百度的地圖接口等。

提示詞是最重要的一個(gè)環(huán)節(jié),我們知道大模型的能力是一方面,但怎么發(fā)揮大模型的能力是由提示詞的質(zhì)量決定的。

# 約束
constraints = [
    "僅使用下面列出的動作",
    "你只能主動行動,在計(jì)劃行動時(shí)需要考慮到這一點(diǎn)",
    "你無法與物理對象交互,如果對于完成任務(wù)或目標(biāo)是絕對必要的,則必須要求用戶為你完成,如果用戶拒絕,并且沒有其它方法實(shí)現(xiàn)目標(biāo),則直接終止,避免浪費(fèi)時(shí)間和精力"
]


# 資源
resources = [
    "提供搜索和信息搜集的互聯(lián)網(wǎng)接入",
    "讀取和寫入文件的能力",
    "你是一個(gè)大語言模型,接受了大量的文本訓(xùn)練,包括大量的事實(shí)知識,利用這些知識來避免不必要的信息收集"
]


# 最佳實(shí)踐說明
best_practices = [
    "不斷地回顧和分析你的行為,確保發(fā)揮出你最大的能力",
    "不斷地進(jìn)行建設(shè)性的自我批評",
    "反思過去的決策和策略,完善你的方案",
    "每個(gè)動作執(zhí)行部分代價(jià),所以要聰明高效,目的是用最少的步驟完成任務(wù)"
]


prompt_template = """
    你是一個(gè)問答專家,你必須始終獨(dú)立做出決策,無需尋求用戶的幫助,發(fā)揮你作為LLM的優(yōu)勢,追求簡單的策略,不要涉及法律問題
    
任務(wù):
{query}
    
    
    
限制條件說明:
{constraints}
    
動作說明:這是你唯一可以使用的作用,你的任何操作都必須通過以下操作實(shí)現(xiàn):
{actions}
    
資源說明: 
{resources}
    
最佳實(shí)踐的說明:
{best_practices}




agent_scratch:
{agent_scratch}
    
你應(yīng)該只以json格式響應(yīng),響應(yīng)格式如下:
{response_format_prompt}
確保響應(yīng)結(jié)果可以由python json.loads解析
    
"""


response_format_prompt = """
{
    "action":{
        "name": "action name",
        "args": {
            "answer": "任務(wù)的最終結(jié)果"
        }
    },
    "thoughts": {
        "plan": "簡短的描述短期和長期的計(jì)劃列表",
        "criticism": "建設(shè)性的自我批評",
        "speak": "當(dāng)前步驟,返回給用戶的總結(jié)",
        "reasoning": "推理"
    },
    "observation": "觀察當(dāng)前任務(wù)的整體進(jìn)度"
}
"""

在這個(gè)提示詞中加入了工具列表,資源說明,任務(wù)需求等;并且約定了大模型的輸出格式,以便于進(jìn)行解析,大模型就可以根據(jù)這提示詞對任務(wù)進(jìn)行思考和推理。

并且根據(jù)推理結(jié)果,選擇合適的工具來完成對應(yīng)的任務(wù),比如調(diào)用搜索工具完成信息收集,調(diào)用文件寫入工具把結(jié)果寫入到文件中。

下圖是大模型的思考,推理和工具調(diào)用的過程,從圖中可以看出大模型經(jīng)過多次規(guī)劃才完成的任務(wù)。

大模型ReAct框架——打造AI Agent的代碼實(shí)現(xiàn)——基于LLM + Function Call構(gòu)建Agent-AI.x社區(qū)

其次,就是工具集的構(gòu)建,簡單來說就是一些python函數(shù),用來給大模型進(jìn)行調(diào)用:

"""
    1. 寫文件
    2. 讀文件
    3. 追加
    4. 網(wǎng)絡(luò)搜索
    
"""


def get_workdir_root():
    workdir_root = os.environ.get("WORKDIR_ROOT", './data/llm_result')
    return workdir_root


WORKDIR_ROOT = get_workdir_root()


def read_file(filename):


    if not os.path.exists(filename):
        return f"{filename} not exist, please check file exist before read"


    with open(filename, "r") as f:
        return "\n".join(f.readline())




def append_to_file(filename, content):
    filename = os.path.join(WORKDIR_ROOT, filename)


    if not os.path.exists(filename):
        return f"{filename} not exist, please check file exist before read"


    with open(filename, 'a') as f:
        f.write(content)


    return "append content to file success"


def write_to_file(filename, content):
    filename = os.path.join(WORKDIR_ROOT, filename)


    if not os.path.exists(WORKDIR_ROOT):
        os.makedirs(WORKDIR_ROOT)


    with open(filename, 'w') as f:
        f.write(content)


    return "write content to file success"


def search(query):
    tavily = TavilySearchResults(max_results=5)


    try:
        ret = tavily.invoke(input=query)


        """
            ret:
            [{
                "content": "",
                "url": ""
            }]
        """
        print("搜索結(jié)果", ret)
        content_list = [obj["content"] for obj in ret]
        return "\n".join(content_list)
    except Exception as err:
        return "search err: {}".format(err)


tools_info = [
    {
        "name": "read_file",
        "description": "read file from agent generate, should write file before read.",
        "args": [
            {
                "name": "filename",
                "type": "string",
                "description": "read file name"
            }
        ]
    },
    {
        "name": "append_to_file",
        "description": "append llm content to file, should write file before read.",
        "args": [
            {
                "name": "filename",
                "type": "string",
                "description": "file name"
            },
            {
                "name": "filename",
                "type": "string",
                "description": "append to file content"
            }
        ]
    },
{
        "name": "write_to_file",
        "description": "write llm content to file",
        "args": [
            {
                "name": "filename",
                "type": "string",
                "description": "file name"
            },
            {
                "name": "filename",
                "type": "string",
                "description": "write to file content"
            }
        ]
    },
    {
        "name": "search",
        "description": "this is a search engine, you can gain additional knowledge though this search engine when you are unsure of what large model return",
        "args": [
            {
                "name": "query",
                "type": "string",
                "description": "search query to lookup"
            }
        ]
    },
    {
        "name": "finish",
        "description": "完成用戶目標(biāo)",
        "args": [{
            "name": "answer",
            "type": "string",
            "description": "最后的目標(biāo)結(jié)果"
        }]
    }
]


tools_map = {
    "read_file": read_file,
    "append_to_file": append_to_file,
    "write_to_file": write_to_file,
    "search": search
}


def gen_tools_desc():
    tools_desc = []
    for idx, t in enumerate(tools_info):
        args_desc = []
        for info in t['args']:
            args_desc.append({
                "name": info['name'],
                "description": info["description"],
                "type": info['type']
            })
        args_desc = json.dumps(args_desc, ensure_ascii=False)
        tool_desc = f"{idx + 1}. {t['name']}: {t['description']}, args: {args_desc}"
        tools_desc.append(tool_desc)


    tools_prompt = "\n".join(tools_desc)
    return tools_prompt

最后兩個(gè)就是大模型的調(diào)用模塊和業(yè)務(wù)的解析模塊,大模型的調(diào)用模塊相對比較簡單,這里就不仔細(xì)說了,感興趣的可以直接看代碼。

解析模塊說簡單也簡單,說復(fù)雜也復(fù)雜;因?yàn)楫?dāng)前的功能比較簡單,因此只需要使用大模型本身的能力即可,然后完成對大模型每次思考和規(guī)劃數(shù)據(jù)的解析即可。

而如果后續(xù)需要開發(fā)更加復(fù)雜的業(yè)務(wù)功能,比如說金融行業(yè)的投資分析,需要非常復(fù)雜的業(yè)務(wù)分析等環(huán)節(jié),這時(shí)只依靠大模型本身的能力就不行了。

比如說,由于大模型在垂直領(lǐng)域的表現(xiàn)不佳,直接使用可能會帶來幻覺等問題;還有就是Agent的記憶模塊,在大量的復(fù)雜業(yè)務(wù)分析中,需要增加外部存儲模塊來記錄歷史記憶功能,這樣才能更好地完成復(fù)雜的任務(wù)處理。

"""
todo:
環(huán)境變量的設(shè)置
工具的引入
prompt模板
模型的初始化
"""


# 初始化模型
mp = ModelProvider()


# 解析大模型的響應(yīng)
def parse_thoughts(response):
    try:
        thoughts = response.get("thoughts")
        observation = response.get("observation")


        plan = thoughts.get("plan")
        reasoning = thoughts.get("reasoning")
        criticism = thoughts.get("criticism")
        prompt = f"plan: {plan}\n reasoning: {reasoning}\n criticism: {criticism}\nobservation: {observation}"
        print("thoughts: ", prompt)
        return prompt
    except Exception as err:
        print("parse thoughts err: {}".format(err))
        return "".format(err)


def agent_execute(query, max_request_time=10):
    cur_request_time = 0
    # 大模型記憶 包括短期記憶和長期記憶
    chat_history = []
    # agent 反思 規(guī)劃等
    agent_scratch = ''
    while cur_request_time < max_request_time:
        cur_request_time += 1
        """
            如果返回結(jié)果達(dá)到預(yù)期,則直接返回
        """
        # 提示詞模板
        """
            prompt包含的功能:
            1. 任務(wù)描述
            2. 工具描述
            3. 用戶的輸入user_msg
            4. assistant_msg
            5. 限制
            6. 給出更好實(shí)踐的描述
        """
        prompt = gen_prompt(query, agent_scratch)


        start_time = time.time()
        print("--------------------------{}, 開始調(diào)用大模型LLM------------".format(cur_request_time), flush=True)


        # 調(diào)用大模型 直接返回json格式數(shù)據(jù)
        """
            sys_prompt:
            user_msg, assistant, history
        """


        if cur_request_time < 3:
            print("prompt: ", prompt)


        # response = call_llm()


        response = mp.chat(prompt, chat_history=chat_history)
        end_time = time.time()
        print("--------------------------{}, 調(diào)用大模型結(jié)束,耗時(shí):{}---------------".format(cur_request_time, end_time-start_time), flush=True)


        if not response or not isinstance(response, dict):
            print("調(diào)用大模型錯(cuò)誤, 即將重試: ", response)
            continue


        """
        大模型返回格式約定
            response: 
            {
                "action":{
                    "name": "action name",
                    "args": {
                        "args name": "args values"
                    }
                },
                "thoughts": {
                    "text": "thought",
                    "plan": "plan",
                    "criticism": "criticism",
                    "speak": "當(dāng)前步驟,返回給用戶的總結(jié)",
                    "reasoning": ""
                }
            }
        """




        action_info = response.get("action")
        action_name = action_info.get("name")
        action_args = action_info.get("args")
        print("當(dāng)前action name: ", action_name, action_args)


        if action_name == "finish":
            final_answer = action_args.get("answer")
            print("final_answer: ", final_answer)
            break


        observation = response.get("observation")


        try:
            """
                action_name 到函數(shù)的映射, map -> { action_name: func }
                
            """
            # todo: tools_map 的實(shí)現(xiàn)
            # tools_map = {}
            func = tools_map.get(action_name)
            call_func_result = func(**action_args)


        #  { action_name: func }
        except Exception as err:
            print("調(diào)用工具異常: ", err)
            call_func_result = "{}".format(err)
        agent_scratch = agent_scratch + "\n:observation:{}\n execute action result: {}".format(observation, call_func_result)


        # 由于大模型沒有記憶功能,因此需要把大模型之前的輸入和輸出加入到history中,這也是Agent四大塊中的記憶模塊 由于目前的業(yè)務(wù)并不復(fù)雜,因此不需要外部記憶模塊 如果業(yè)務(wù)比較復(fù)雜可能還需要外部模塊進(jìn)行存儲
        assistant_msg = parse_thoughts(response)


        chat_history.append([user_prompt, assistant_msg])


    if cur_request_time == max_request_time:
        print("很遺憾,本次任務(wù)失敗")
    else:
        print("恭喜你,任務(wù)完成")


def main():
     # 支持用戶多次交互 最大規(guī)劃次數(shù)設(shè)置為10次 當(dāng)超過10次時(shí) 則說明任務(wù)失敗 用戶可以根據(jù)自己的情況進(jìn)行調(diào)整
    max_request_time = 10
    while True:
        query = input("請輸入你的目標(biāo):")
        if query == "exit":
            return


        agent_execute(query, max_request_time=max_request_time)




if __name__ == "__main__":
    main()

最后,這里只是為了實(shí)現(xiàn)Agent的實(shí)現(xiàn)流程,并且由于大模型的質(zhì)量問題,也不能保證每次都能成功。

受限于大模型的性能問題,大模型在推理和規(guī)劃方面表現(xiàn)還不盡人意,因此怎么才能讓大模型更好實(shí)現(xiàn)復(fù)雜推理規(guī)劃是一個(gè)值得研究的問題。

里面主要涉及兩個(gè)第三方模塊,一個(gè)是第三方大模型的申請,個(gè)人使用的是阿里的通義千問;第二個(gè)是Travily的搜索接口,官網(wǎng)地址:https://app.tavily.com用戶也可以自己去申請或者使用其它搜索工具,比如百度搜索等。


Agent學(xué)習(xí)參考


??https://www.bilibili.com/video/BV1Sz421m7Rr?p=1&vd_source=f2f15e671adda1cc1e5512694f310ebd??

用戶可以在公眾號回復(fù):Agent源碼 獲取  用戶只需要在env文件中把參數(shù)改成自己的參數(shù),然后啟動agent_main.py文件即可。

此代碼只是用來學(xué)習(xí)使用,并不能完成復(fù)雜的業(yè)務(wù)邏輯,用戶如果想實(shí)現(xiàn)更加復(fù)雜的業(yè)務(wù)功能,則需要對提示詞和工具進(jìn)行添加和調(diào)整,比如做旅行規(guī)劃就需要添加地圖工具和酒店預(yù)定的API等。


本文轉(zhuǎn)載自公眾號AI探索時(shí)代 作者:DFires

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



?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請注明出處,否則將追究法律責(zé)任
標(biāo)簽
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
快播亚洲色图| 91成人性视频| 又黄又色的网站| 涩涩网在线视频| 中文字幕成人av| 99国产高清| xxxx.国产| 99久久99久久精品国产片果冰| 日韩欧美一区二区在线视频| 国产乱子伦农村叉叉叉| 在线免费黄色| zzijzzij亚洲日本少妇熟睡| 国产精品三级美女白浆呻吟| 精品视频一区二区在线观看| 精品一二三区| 亚洲国产第一页| 天堂在线一区二区三区| 亚洲人体视频| 亚洲一区二区在线观看视频| 日本高清不卡三区| 婷婷丁香花五月天| 国产一区二区免费在线| 国产98色在线| 久久免费精彩视频| 99成人在线视频| 亚洲欧洲xxxx| 欧美肉大捧一进一出免费视频| 巨大黑人极品videos精品| 精品久久久国产| 国产激情片在线观看| 国产二区视频在线观看| 97se亚洲国产综合自在线观| 91亚洲精品一区二区| 久久精品五月天| 99精品免费视频| 欧美激情欧美狂野欧美精品| 日韩在线观看免| 欧美亚洲国产精品久久| 亚洲精品乱码久久久久久金桔影视| 久久久久xxxx| 日本成人一区二区| 欧美日韩一级二级三级| 校园春色 亚洲色图| 在线最新版中文在线| 性久久久久久久久| 久久av综合网| 大香伊人久久| 亚洲综合色成人| 91视频 - 88av| 在线午夜影院| 亚洲精品免费一二三区| 女同性恋一区二区| 国产黄a三级三级三级av在线看| 欧美国产日本视频| 亚洲成人自拍视频| 婷婷视频在线| 亚洲同性gay激情无套| 亚洲一区二三| 国产成人l区| 夜夜爽夜夜爽精品视频| 性高湖久久久久久久久aaaaa| 好吊日av在线| 精品成人在线视频| www黄色av| gogo亚洲高清大胆美女人体| 色天使久久综合网天天| 五月婷婷深爱五月| 韩国理伦片久久电影网| 欧美精品 国产精品| 欧美高清精品一区二区| 57pao国产一区二区| 亚洲国产精品成人av| 黄色正能量网站| 精品免费av| 精品国产一区二区三区久久| 青青青在线免费观看| 极品中文字幕一区| 日本不卡高字幕在线2019| 这里只有久久精品视频| 狠狠狠色丁香婷婷综合激情| 99re6热在线精品视频播放速度| 亚洲国产精品久久久久久6q| 久久综合九色综合欧美亚洲| 天堂社区 天堂综合网 天堂资源最新版| √新版天堂资源在线资源| 自拍视频在线观看一区二区| 成人免费毛片在线观看| 欧美特大特白屁股xxxx| 欧美福利视频导航| 中文字幕无码人妻少妇免费| 精品国产一区二区三区久久久樱花| 中文字幕日本精品| 麻豆亚洲av成人无码久久精品| 一本久道久久综合狠狠爱| 国产成人精品视| 国产成人免费看一级大黄| av在线一区二区| 亚洲一区二区在线观| 电影k8一区二区三区久久| 91福利在线播放| 日本女人黄色片| 九九热爱视频精品视频| 欧美另类暴力丝袜| 蜜臀尤物一区二区三区直播| 国产精品一区二区在线观看网站 | 国产精品传媒麻豆hd| 欧美一区中文字幕| 日本高清www| 欧美不卡高清| 国产精品久久久久久久app| 性网爆门事件集合av| 中文字幕欧美国产| 国模吧无码一区二区三区| 国产精品久一| 一个人www欧美| 日韩 欧美 中文| 国产乱色国产精品免费视频| 日本一区高清不卡| 91九色在线看| 91精品国产综合久久精品| 亚洲国产天堂av| 亚洲区欧美区| 99影视tv| www久久日com| 欧美日韩国产精选| 一区二区伦理片| 国产日韩欧美一区在线| 999在线免费观看视频| 日本免费视频在线观看| 色94色欧美sute亚洲13| 北岛玲一区二区| 欧美激情综合| 亚洲一区国产精品| 免费观看在线黄色网| 在线观看亚洲专区| a级在线免费观看| 校园激情久久| 久久爱av电影| 国产拍在线视频| 欧美精品一区二区三区蜜桃视频 | 青青九九免费视频在线| 樱花草国产18久久久久| 亚洲精品在线视频播放| 欧美激情国产在线| 国产一区二区在线免费| 91吃瓜网在线观看| 欧美性猛片xxxx免费看久爱| 亚洲区免费视频| 久久国产欧美| 欧美精品久久| 播放一区二区| 在线观看欧美日韩| 亚洲性在线观看| 亚洲欧洲日韩av| 伦伦影院午夜理论片| 午夜视频一区| 国产一区二区三区四区hd| xxxx视频在线| 亚洲免费电影一区| 免费的毛片视频| 国产免费成人在线视频| 色噜噜狠狠永久免费| 国产精品久久久久久久免费观看 | 国产人成亚洲第一网站在线播放| 激情网站五月天| 亚洲亚洲免费| 国产精品久久999| 在线观看国产原创自拍视频| 欧美久久久久久久久中文字幕| 林心如三级全黄裸体| 激情综合色丁香一区二区| 国产 国语对白 露脸| 在线日韩成人| 日本精品视频在线播放| 在线播放毛片| 精品日韩欧美一区二区| 久久一区二区三区视频| 日本一区二区三区久久久久久久久不| 手机看片一级片| 欧美日韩一区二区三区四区在线观看 | 国产情侣第一页| 亚洲动漫精品| 成人黄色av播放免费| 欧美xxxx做受欧美88bbw| 亚洲激情在线观看视频免费| 国产精品午夜一区二区| 亚洲乱码中文字幕| 丰满圆润老女人hd| 狠狠久久亚洲欧美| 成人久久久久久久久| 亚洲成av人片乱码色午夜| 国模精品娜娜一二三区| 国产第一亚洲| 91精品国产高清| 国产超级va在线视频| 亚洲精品少妇网址| 国产ts变态重口人妖hd| 一本大道久久a久久综合婷婷| 天天爽天天爽天天爽| 成人爱爱电影网址| 国产九九热视频| 亚洲精品影院在线观看| 亚洲自拍偷拍二区| 日韩精品社区| 91九色对白| 成人看片在线观看| 久久免费国产视频| 欧美性天天影视| 亚洲欧洲日产国码av系列天堂| 国产999久久久| 欧洲在线/亚洲| 久久高清免费视频| 亚洲日本va在线观看| 伊人网在线视频观看| 国产成人自拍网| 天天综合网久久| 久久激情一区| 美女扒开大腿让男人桶| 91精品福利| 手机看片福利永久国产日韩| 美女视频亚洲色图| 91手机在线播放| 性欧美video另类hd尤物| 欧美在线视频网| jizz一区二区三区| 欧美精品在线播放| 欧美激情办公室videoshd| 亚洲人成在线观看| 亚洲日本在线播放| 日韩av在线资源| 三级小视频在线观看| 欧美成人aa大片| 99精品免费观看| 欧美剧情片在线观看| 国产微拍精品一区| 午夜伦理一区二区| 国产在线一区视频| 亚洲国产精品久久久久秋霞影院 | av每日在线更新| 亚洲新声在线观看| 欧美少妇另类| 亚洲精品自拍视频| 日韩精品系列| 亚洲精品一区二区网址| 天堂成人在线| 亚洲精品视频网上网址在线观看| 日韩中文字幕综合| 亚洲精品福利在线观看| 特黄aaaaaaaaa真人毛片| 日韩一区二区三区观看| 国产男男gay网站| 日韩女优电影在线观看| 亚洲国产成人一区二区| 欧美精品一区二区三区四区| 特黄aaaaaaaaa真人毛片| 亚洲第一精品夜夜躁人人躁| 深夜福利视频网站| 精品视频—区二区三区免费| 人成免费电影一二三区在线观看| 亚洲精品视频免费| av在线播放av| 久久久国产影院| 超碰在线中文字幕| 欧美综合在线观看| jvid一区二区三区| 91高跟黑色丝袜呻吟在线观看| 亚洲福利合集| 国产免费一区二区三区| 五月国产精品| 性欧美videosex高清少妇| 91精品秘密在线观看| 神马午夜伦理影院| 99国产精品私拍| 可以免费在线看黄的网站| 久久黄色级2电影| 日本中文字幕精品| 91首页免费视频| 蜜桃av乱码一区二区三区| 成人欧美一区二区三区1314| 久久精品国产亚洲AV无码麻豆| 欧美性猛交视频| 在线免费观看中文字幕| 日韩久久免费av| 欧美性孕妇孕交| 色噜噜狠狠狠综合曰曰曰88av| 日本电影在线观看| 日本高清视频一区| 欧美黄色一级| 日本不卡二区高清三区| 91精品电影| 情侣黄网站免费看| 国内外成人在线| 无套内谢大学处破女www小说| 国产精品美女久久久久久久| 久久久国产成人| 欧美性色综合网| 天天色综合久久| 久久精品亚洲热| 九九热线视频只有这里最精品| 99久久免费国| sdde在线播放一区二区| 国产成人永久免费视频| 免费看黄色91| 黄色av网址在线观看| 中文字幕制服丝袜成人av | 农村老熟妇乱子伦视频| 亚洲第一福利视频在线| 中文字幕第一页在线播放| 亚洲第一页自拍| 国产乱色在线观看| 国产a∨精品一区二区三区不卡| 日韩一区网站| 中文字幕一区二区中文字幕 | 国产精品wwwwww| 国产精品xxx在线观看| 一区二区三区偷拍| 老牛影视一区二区三区| 国产国语老龄妇女a片| 亚洲欧洲日韩在线| 中文字幕免费观看视频| 亚洲精品国产综合区久久久久久久| 91高清在线观看视频| 国产精品爽黄69天堂a| 蜜桃视频欧美| avav在线看| 成年人国产精品| 久久综合加勒比| 日韩免费电影网站| 国产丝袜在线| 成人精品网站在线观看| 欧美中文一区二区| 国产精彩免费视频| 久久综合久久久久88| 91av在线免费视频| 日韩精品高清视频| 嗯啊主人调教在线播放视频 | 欧美亚洲国产另类| 加勒比色综合久久久久久久久| 国产免费裸体视频| 成人性生交大片免费看中文| 538任你躁在线精品视频网站| 91麻豆精品国产91久久久使用方法 | 成人久久久精品乱码一区二区三区| 色老板免费视频| 777a∨成人精品桃花网| 成人日批视频| 91在线视频精品| 欧美a级在线| 久久久久久久久久久久国产精品| 亚洲美女淫视频| 午夜精品小视频| 国自在线精品视频| 亚洲精品一级二级三级| 国产成人精品视频ⅴa片软件竹菊| 99re热这里只有精品视频| 成人免费看片98欧美| 日韩激情片免费| 波多野结衣久久精品| 热re99久久精品国99热蜜月| 青青青伊人色综合久久| 羞羞在线观看视频| 欧美一区二区三区免费视频| 欧洲中文在线| 好吊妞www.84com只有这里才有精品| 亚洲日产国产精品| 精品人妻一区二区三区视频| 在线视频国内一区二区| 菠萝蜜视频国产在线播放| 国产精品加勒比| 老妇喷水一区二区三区| 日韩三级在线观看视频| 精品日产卡一卡二卡麻豆| 欧美亚洲日本精品| 亚洲精品一区二区三区樱花| 国产精品综合一区二区| 国产精品午夜影院| 日韩在线国产精品| 国产乱人伦丫前精品视频| 欧美日韩在线中文| 中文字幕一区视频| 欧美视频一二区| 国产精品青草久久久久福利99| 亚洲精品一区二区妖精| 中文字幕乱视频| 欧美视频一区二区在线观看| 日韩激情美女| 日本一区不卡| 风间由美性色一区二区三区| jizz国产在线观看| 欧美大成色www永久网站婷| 性欧美lx╳lx╳| 亚洲成人手机在线观看| 欧美午夜视频一区二区| h视频在线免费观看| 免费在线观看一区二区| 国产乱子轮精品视频| 一级成人黄色片| 欧美激情视频给我| 成人综合一区| 亚洲狠狠婷婷综合久久久久图片|