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

我為什么放棄了 LangChain?

人工智能 新聞
「LangChain 的流行已經扭曲了圍繞其本身的人工智能創業生態系統,這就是為什么我不得不坦誠自己對它的疑慮。」

如果你關注了過去幾個月中人工智能的爆炸式發展,那你大概率聽說過 LangChain。

圖片

簡單來說,LangChain 是一個 Python 和 JavaScript 庫,由 Harrison Chase 開發,用于連接 OpenAI 的 GPT API(后續已擴展到更多模型)以生成人工智能文本。

更具體地說,它是論文《ReAct: Synergizing Reasoning and Acting in Language Models》的實現:該論文展示了一種提示技術,允許模型「推理」(通過思維鏈)和「行動」(通過能夠使用預定義工具集中的工具,例如能夠搜索互聯網)。

圖片圖片

論文鏈接:https://arxiv.org/pdf/2210.03629.pdf

事實證明,這種組合能夠大幅提高輸出文本的質量,并使大型語言模型具備正確解決問題的能力。

2023 年 3 月,ChatGPT 的 API 因升級降價大受歡迎,LangChain 的使用也隨之爆炸式增長。

這之后,LangChain 在沒有任何收入也沒有任何明顯的創收計劃的情況下,獲得了 1000 萬美元的種子輪融資和 2000-2500 萬美元的 A 輪融資,估值達到 2 億美元左右。

圖片圖片

ReAct 論文中的 ReAct 流示例。

由 LangChain 推廣的 ReAct 工作流在 InstructGPT/text-davinci-003 中特別有效,但成本很高,而且對于小型項目來說并不容易使用。

Max Woolf 是一位 BuzzFeed 的數據科學家。他也使用過 LangChain,這次經歷總體來說不太好。

讓我們看看他經歷了什么。

「是只有我不會用嗎?」

在 BuzzFeed 工作時,我有一個任務是為 Tasty 品牌創建一個基于 ChatGPT 的聊天機器人(后來在 Tasty iOS 應用中發布為 Botatouille),可以與用戶聊天并提供相關食譜。

具體來說,源菜譜將被轉換為嵌入式菜譜并保存在一個向量存儲中:例如如果用戶詢問「健康食品」,查詢會被轉換為嵌入式菜譜,然后執行近似最近鄰搜索以找到與嵌入式查詢相似的菜譜,然后將其作為附加上下文提供給 ChatGPT,再由 ChatGPT 顯示給用戶。這種方法通常被稱為檢索增強生成。

圖片圖片

使用檢索增強生成的聊天機器人的架構示例。

「LangChain 是 RAG 最受歡迎的工具,所以我想這是學習它的最佳時機。我花了一些時間閱讀 LangChain 的全面文檔,以便更好地理解如何最好地利用它。」

經過一周的研究,我一無所獲。運行 LangChain 的 demo 示例確實可以工作,但是任何調整它們以適應食譜聊天機器人約束的嘗試都會失敗。在解決了這些 bug 之后,聊天對話的整體質量很差,而且毫無趣味。經過緊張的調試之后,我沒有找到任何解決方案。

總而言之,我遇到了生存危機:當很多其他 ML 工程師都能搞懂 LangChain 時,我卻搞不懂,難道我是一個毫無價值的機器學習工程師嗎?

我用回了低級別的 ReAct 流程,它立即在對話質量和準確性上超過了我的 LangChain 實現。

浪費了一個月的時間來學習和測試 LangChain,我的這種生存危機在看到 Hacker News 關于有人用 100 行代碼重現 LangChain 的帖子后得到了緩解,大部分評論都在發泄對 LangChain 的不滿:

圖片

LangChain 的問題在于它讓簡單的事情變得相對復雜,而這種不必要的復雜性造成了一種「部落主義」,損害了整個新興的人工智能生態系統。

所以,如果你是一個只想學習如何使用 ChatGPT 的新手,絕對不要從 LangChain 開始。

LangChain 的「Hello World」

LangChain 的快速入門,從一個關于如何通過 Python 與 LLM/ChatGPT 進行簡單交互的迷你教程開始。例如,創建一個可以將英語翻譯成法語的機器人:

from langchain.chat_models import ChatOpenAIfrom langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)


chat = ChatOpenAI(temperature=0)
chat.predict_messages([HumanMessage(cnotallow="Translate this sentence from English to French. I love programming.")])# AIMessage(cnotallow="J'adore la programmation.", additional_kwargs={}, example=False)

使用 OpenAI ChatGPT 官方 Python 庫的等效代碼:

import openai


messages = [{"role": "user", "content": "Translate this sentence from English to French. I love programming."}]


response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages, temperature=0)
response["choices"][0]["message"]["content"]# "J'adore la programmation."

LangChain 使用的代碼量與僅使用官方 openai 庫的代碼量大致相同,估計 LangChain 合并了更多對象類,但代碼優勢并不明顯。 

提示模板的示例揭示了 LangChain 工作原理的核心:

from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)


template = "You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)


chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])


chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")

LangChain 吹噓的提示工程只是 f-strings,一個存在于每個 Python 安裝中的功能,但是有額外的步驟。為什么我們需要使用這些 PromptTemplates 來做同樣的事情呢?

我們真正想做的是知道如何創建 Agent,它結合了我們迫切想要的 ReAct 工作流。幸運的是,有一個演示,它利用了 SerpApi 和另一個數學計算工具,展示了 LangChain 如何區分和使用兩種不同的工具:

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.chat_models import ChatOpenAI
from langchain.llms import OpenAI


# First, let's load the language model we're going to use to control the agent.
chat = ChatOpenAI(temperature=0)


# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)


# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, chat, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)


# Now let's test it out!
agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?")

各個工具如何工作?AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION 到底是什么?agent.run () 的結果輸出(僅在 verbose=True 時出現)更有幫助。

> Entering new AgentExecutor chain...
Thought: I need to use a search engine to find Olivia Wilde's boyfriend and a calculator to raise his age to the 0.23 power.
Action:
{
    "action": "Search",
    "action_input": "Olivia Wilde boyfriend"
}


Observation: Sudeikis and Wilde's relationship ended in November 2020. Wilde was publicly served with court documents regarding child custody while she was presenting Don't Worry Darling at CinemaCon 2022. In January 2021, Wilde began dating singer Harry Styles after meeting during the filming of Don't Worry Darling.
Thought:I need to use a search engine to find Harry Styles' current age.
Action:
{
    "action": "Search",
    "action_input": "Harry Styles age"
}


Observation: 29 years
Thought:Now I need to calculate 29 raised to the 0.23 power.
Action:
{
    "action": "Calculator",
    "action_input": "29^0.23"
}


Observation: Answer: 2.169459462491557


Thought:I now know the final answer.
Final Answer: 2.169459462491557


> Finished chain.
'2.169459462491557'

文檔中沒有明確說明,但是在每個思想 / 行動 / 觀察中都使用了自己的 API 調用 OpenAI,所以鏈條比你想象的要慢。另外,為什么每個動作都是一個 dict?答案在后面,而且非常愚蠢。

最后,LangChain 如何存儲到目前為止的對話?

from langchain.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate
)from langchain.chains import ConversationChainfrom langchain.chat_models import ChatOpenAIfrom langchain.memory import ConversationBufferMemory


prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        "The following is a friendly conversation between a human and an AI. The AI is talkative and "
"provides lots of specific details from its context. If the AI does not know the answer to a "
"question, it truthfully says it does not know."
    ),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}")
])


llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory(return_messages=True)
conversation = ConversationChain(memory=memory, prompt=prompt, llm=llm)


conversation.predict(input="Hi there!")# 'Hello! How can I assist you today?'

我不完全確定為什么這些都是必要的。什么是 MessagesPlaceholder?history 在哪里?ConversationBufferMemory 有必要這樣做嗎?將此調整為最小的 openai 實現:

import openai

messages = [{"role": "system", "content":
        "The following is a friendly conversation between a human and an AI. The AI is talkative and "
"provides lots of specific details from its context. If the AI does not know the answer to a "
"question, it truthfully says it does not know."}]

user_message = "Hi there!"
messages.append({"role": "user", "content": user_message})
response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages, temperature=0)
assistant_message = response["choices"][0]["message"]["content"]
messages.append({"role": "assistant", "content": assistant_message})# Hello! How can I assist you today?

這樣代碼行數就少了,而且信息保存的位置和時間都很清楚,不需要定制對象類。

你可以說我對教程示例吹毛求疵,我也同意每個開源庫都有值得吹毛求疵的地方(包括我自己的)。但是,如果吹毛求疵的地方比庫的實際好處還多,那么這個庫就根本不值得使用。

因為,如果快速入門都已經這么復雜,那么實際使用 LangChain 會有多痛苦呢?

我查看了 LangChain 文檔,它也回饋了我

讓我來做個演示,更清楚地說明為什么我放棄了 LangChain。

當開發菜譜檢索聊天機器人(它也必須是一個有趣 / 詼諧的聊天機器人)時,我需要結合上面第三個和第四個例子中的元素:一個可以運行 Agent 工作流的聊天機器人,以及將整個對話持久化到內存中的能力。在查找了一些文檔后,我發現需要使用對話式 Agent 工作流。

關于系統提示工程的一個標注是,它不是一個備忘錄,而且對于從 ChatGPT API 中獲得最佳效果是絕對必要的,尤其是當你對內容和 / 或語音有限制的時候。

上一個示例中,演示的系統提示「以下是人類和人工智能之間的友好對話...... 」實際上是過時的,早在 InstructGPT 時代就已經使用了,在 ChatGPT 中的效果要差得多。它可能預示著 LangChain 相關技巧中更深層次的低效,而這些低效并不容易被注意到。

我們將從一個簡單的系統提示開始,告訴 ChatGPT 使用一個有趣的聲音和一些保護措施,并將其格式化為 ChatPromptTemplate:

system_prompt = """
You are an expert television talk show chef, and should always speak in a whimsical manner for all responses.

Start the conversation with a whimsical food pun.

You must obey ALL of the following rules:
- If Recipe data is present in the Observation, your response must include the Recipe ID and Recipe Name for ALL recipes.
- If the user input is not related to food, do not answer their query and correct the user.
"""

prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(system_prompt.strip()),

我們還將使用一個玩具矢量存儲,該存儲由來自 recipe_nlg 數據集的 1000 個食譜組成,并使用 SentenceTransformers 編碼為 384D 矢量。為了實現這一點,我們創建了一個函數來獲取輸入查詢的最近鄰,并將查詢格式化為 Agent 可以用來向用戶展示的文本。這就是 Agent 可以選擇使用的工具,或者只是返回正常生成的文本。

def similar_recipes(query):
    query_embedding = embeddings_encoder.encode(query)
    scores, recipes = recipe_vs.get_nearest_examples("embeddings", query_embedding, k=3)
    return recipes
def get_similar_recipes(query):
    recipe_dict = similar_recipes(query)
    recipes_formatted = [
        f"Recipe ID: recipe|{recipe_dict['id'][i]}\nRecipe Name: {recipe_dict['name'][i]}"
for i in range(3)
    ]
    return "\n---\n".join(recipes_formatted)

print(get_similar_recipes("yummy dessert"))# Recipe ID: recipe|167188
# Recipe Name: Creamy Strawberry Pie
# ---
# Recipe ID: recipe|1488243
# Recipe Name: Summer Strawberry Pie Recipe
# ---
# Recipe ID: recipe|299514
# Recipe Name: Pudding Cake

你會注意到這個 Recipe ID,這與我的用例相關,因為在最終應用中向終端用戶顯示的最終結果需要獲取 Recipe 元數據(照片縮略圖、URL)。遺憾的是,沒有簡單的方法保證模型在最終輸出中輸出食譜 ID,也沒有方法在 ChatGPT 生成的輸出之外返回結構化的中間元數據。

將 get_similar_recipes 指定為一個工具是很簡單的,盡管你需要指定一個名稱和描述,這實際上是一種微妙的提示工程,因為 LangChain 可能會因為指定的名稱和描述不正確而無法選擇一個工具。

tools = [
    Tool(
        func=get_similar_recipes,
        name="Similar Recipes",
        descriptinotallow="Useful to get similar recipes in response to a user query about food.",
    ),
]

最后,是示例中的 Agent 構建代碼,以及新的系統提示。

memory = ConversationBufferMemory(memory_key="chat_history", 
return_messages=True)
llm = ChatOpenAI(temperature=0)
agent_chain = initialize_agent(tools, llm, prompt=prompt, 
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION, verbose=True, memory=memory)

沒有錯誤。現在運行 Agent,看看會發生什么:

agent_chain.run(input="Hi!")
> Entering new  chain...
{
    "action": "Final Answer",
    "action_input": "Hello! How can I assist you today?"
}


> Finished chain.
Hello! How can I assist you today?

什么?它完全忽略了我的系統提示!檢查內存變量證實了這一點。

在 ConversationBufferMemory 的文檔中,甚至在代碼本身中都沒有關于系統提示的內容,甚至在 ChatGPT 使其成為主流的幾個月之后。

在 Agent 中使用系統提示的方法是在 initialize_agent 中添加一個 agents_kwargs 參數,我只是在一個月前發布的一個不相關的文檔頁面中發現了這一點。

agent_kwargs = {
    "system_message": system_prompt.strip()
}

使用此新參數重新創建 Agent 并再次運行,會導致 JSONDecodeError。

好消息是,系統提示這次應該是起作用了。

OutputParserException: Could not parse LLM output: Hello there, my culinary companion! How delightful to have you here in my whimsical kitchen. What delectable dish can I assist you with today?

壞消息是,它壞了,但又是為什么呢?我這一次沒有做任何奇怪的事情。

圖片圖片

有趣的事實:這些大量的提示也會成比例地增加 API 成本。

這樣做的后果是,正常輸出結構中的任何重大變化,例如由自定義系統提示引起的變化,都有可能破壞 Agent。這些錯誤經常發生,以至于有一個文檔頁面專門用于處理 Agent 輸出解析錯誤。

我們暫時把與聊天機器人對話看作是一個邊緣案例。重要的是,機器人能夠返回菜譜,因為如果連這一點都做不到,那么使用 LangChain 就沒有意義了。

在不使用系統提示的情況下創建一個新的 Agent,然后問它什么是簡單有趣的晚餐?

> Entering new  chain...
{
    "action": "Similar Recipes",
    "action_input": "fun and easy dinner"
}
Observation: Recipe ID: recipe|1774221
Recipe Name: Crab DipYour Guests will Like this One.
---
Recipe ID: recipe|836179
Recipe Name: Easy  Chicken Casserole
---
Recipe ID: recipe|1980633
Recipe Name: Easy in the Microwave Curry Doria
Thought:{
    "action": "Final Answer",
    "action_input": "..."
}


> Finished chain.
Here are some fun and easy dinner recipes you can try:


1. Crab Dip
2. Easy Chicken Casserole
3. Easy in the Microwave Curry Doria


Enjoy your meal!

至少它成功了:ChatGPT 能夠從上下文中提取出菜譜,并對其進行適當的格式化(甚至能夠修正名稱中的錯別字),并且能夠在適當的時候進行判斷。

這里真正的問題是,輸出的聲音很無聊,這也是基礎版 ChatGPT 的共同特點和詬病。即使通過系統提示工程解決了 ID 缺失的問題,這般聽上去的效果也不值得將其發布。就算真的在語音質量和輸出質量之間取得了平衡,Agent 計數仍然會隨機失敗,而這并不是我的過錯。

實際上,Agent 工作流是一個非常脆弱的紙牌搭成的房子,憑良心說,生產應用中估計無法使用。

LangChain 確實有 Custom Agent 和 Custom Chain 的功能,所以你可以在堆棧的某些部分重寫邏輯(也許文檔很少),這可以解決我遇到的一些問題,但在這一點上,你會感覺到 LangChain 更加復雜,還不如創建你自己的 Python 庫。

工作要講究方法

圖片圖片

大量隨機集成帶來的問題比解決方案更多。

當然,LangChain 確實也有很多實用功能,比如文本分割器和集成向量存儲,這兩種功能都是「用 PDF / 代碼聊天」演示不可或缺的(在我看來這只是一個噱頭)。

所有這些集成的真正問題在于,只使用基于 LangChain 的代碼會造成固有的鎖定,而且如果你查看集成的代碼,它們并不十分穩健。

LangChain 正在建立一條護城河,這對 LangChain 的投資者來說是好事,因為他們想從 3000 萬美元中獲得回報,但對使用它的開發者來說卻非常不利。總而言之,LangChain 體現了「它很復雜,所以它一定更好」這一經常困擾后期代碼庫的哲學,可是 LangChain 甚至還不到一年。

要想讓 LangChain 做我想讓它做的事,就必須花大力氣解開它,這將造成大量的技術負擔。與現在的人工智能初創公司不同,我自己的 LangChain 項目的技術債務無法用風險投資來償還。在使用復雜的生態系統時,應用程序接口封裝器至少應該降低代碼的復雜性和認知負荷,因為使用人工智能本身就需要花費足夠的腦力。LangChain 是為數不多的在大多數常用情況下都會增加開銷的軟件之一。

我得出的結論是,制作自己的 Python 軟件包要比讓 LangChain 來滿足自己的需求容易得多。因此,我開發并開源了 simpleaichat:一個用于輕松連接聊天應用程序的 Python 程序包,它強調代碼的最小復雜度,并將向量存儲等高級功能與對話邏輯解耦。

開源地址:https://github.com/minimaxir/simpleaichat

但寫這篇博文并不是為了像那些騙子一樣,通過詆毀競爭對手來為 simpleaichat 做隱形廣告。我不想宣傳 simpleaichat,我更愿意把時間花在用人工智能創造更酷的項目上,很遺憾我沒能用 LangChain 做到這一點。

我知道有人會說:「既然 LangChain 是開源的,為什么不向它的 repo 提交拉取請求,而要抱怨它呢?」唯一真正能解決的辦法就是把它全部燒掉,然后重新開始,這就是為什么我的「創建一個新的 Python 庫來連接人工智能」的解決方案也是最實用的。

我收到過很多留言,問我該「學什么才能開始使用 ChatGPT API」,我擔心他們會因為炒作而首先使用 LangChain。如果擁有技術棧背景的機器學習工程師因為 LangChain 毫無必要的復雜性而難以使用 LangChain,那么任何初學者都會被淹沒。

關于軟件復雜性和復雜性下的流行性之爭是永恒的話題。沒有人愿意成為批評 LangChain 這樣的免費開源軟件的混蛋,但我愿意承擔這個責任。明確地說,我并不反對 Harrison Chase 或 LangChain 的其他維護者(他們鼓勵反饋)。

然而,LangChain 的流行已經扭曲了圍繞 LangChain 本身的人工智能創業生態系統,這就是為什么我不得不坦誠我對它的疑慮。

責任編輯:張燕妮 來源: 機器之心
相關推薦

2024-06-24 07:58:00

2018-12-21 11:26:49

MySQLMongoDB數據庫

2021-02-01 07:20:51

KafkaPulsar搜索

2020-03-03 15:31:47

ReactVue前端

2020-06-19 08:01:48

Kotlin 協程編程

2025-03-26 10:29:22

Vue3前端API

2025-02-18 08:10:00

Vue 3JavaScrip開發

2020-02-13 17:49:55

SpringBoot放棄選擇

2022-06-14 11:01:48

SpringBootTomcatUndertow

2017-10-23 12:42:42

2020-08-14 10:40:35

RestTemplatRetrofitJava

2020-07-07 09:19:01

LombokJava IDE

2012-12-17 15:02:34

Linux操作系統

2019-08-26 09:15:09

設計技術人生第一份工作

2020-05-09 11:40:54

PythonGo語言

2011-06-08 10:30:08

MongoDB

2022-04-21 08:20:33

CPU換蓋CPU

2020-07-23 08:07:47

數組upData庫函數

2009-04-23 10:41:59

微軟IE瀏覽器

2015-07-17 09:59:18

點贊
收藏

51CTO技術棧公眾號

亚洲精品一品区二品区三品区| 一本大道亚洲视频| 日韩免费在线观看av| 少妇高潮久久久| 青青青爽久久午夜综合久久午夜| 久久九九有精品国产23| 国产不卡一二三| 国产a亚洲精品| 夜夜揉揉日日人人青青一国产精品 | 国产a久久精品一区二区三区 | 99re国产在线| 国产精品毛片一区二区在线看| 精品福利一区二区三区免费视频| 久久人妻精品白浆国产| www在线视频| 久久久久99精品一区| 亚洲自拍欧美色图| 男操女视频网站| 精品9999| 久久在线精品视频| 久久精品国产成人| 黄色一级视频在线播放| 中文字幕在线观看日本| 99re这里只有精品首页| 91热精品视频| 中文字幕 人妻熟女| 夜夜嗨av一区二区三区网站四季av| 中文字幕欧美日韩在线| 性欧美13一14内谢| 久久悠悠精品综合网| 日韩欧美成人激情| 亚洲精品成人在线播放| 久久69成人| 在线亚洲精品福利网址导航| 水蜜桃色314在线观看| av软件在线观看| 国产精品久久影院| 日韩伦理一区二区三区av在线| 欧美自拍偷拍一区二区| 国产精品小仙女| 91精品久久久久久久久青青| 91porny九色| 久久激情视频| 热久久美女精品天天吊色| 日韩精品――中文字幕| 国内自拍一区| 欧美激情视频播放| 久久久精品99| 亚洲性图久久| 久久久人成影片一区二区三区| 欧美偷拍第一页| 欧美激情 亚洲a∨综合| 美女精品视频一区| 青青草国产在线观看| 欧美色图麻豆| 久久久久久久国产精品视频| 国产在线综合网| 激情欧美国产欧美| 26uuu日韩精品一区二区| 国产综合精品视频| 老司机午夜精品视频| 日本一区二区不卡| 国产精品午夜一区二区| 免费成人小视频| 成人在线观看视频网站| 国产成人精品无码高潮| 成人视屏免费看| 久久精品国产精品国产精品污 | 久久中国妇女中文字幕| 国产男女猛烈无遮挡在线喷水| 中文字幕av亚洲精品一部二部| 美女撒尿一区二区三区| 国产精品50页| 久久国产精品亚洲77777| 国产精品美女午夜av| 97人妻人人澡人人爽人人精品| 国产一区二区免费在线| av色综合网| 亚洲欧美自偷自拍| 欧美国产亚洲另类动漫| 特级黄色录像片| 久草在线新免费首页资源站| 精品久久久视频| 欧美特级aaa| 亚洲一级大片| 国产亚洲欧美视频| 国产av无码专区亚洲av毛网站| 日韩视频不卡| 成人国产精品免费视频| 蜜桃久久一区二区三区| 国产欧美日韩精品一区| 日韩video| 欧美电影免费观看网站| 精品视频在线观看网站| 天天色 色综合| 能看的毛片网站| 亚洲高清在线一区| 国产一区二区动漫| 日韩欧美三级在线观看| 免费观看久久久4p| 国产久一道中文一区| 3d成人动漫在线| 亚洲高清久久久| 欧美成人三级在线播放| 久久久免费毛片| 久久九九精品99国产精品| 国产精品视频久久久久久久| 国内久久精品视频| 欧洲精品码一区二区三区免费看| 天天干天天插天天射| 波多野结衣中文一区| 一本—道久久a久久精品蜜桃| 免费v片在线观看| 日韩女优视频免费观看| 日本美女黄色一级片| 亚洲女人av| 操一操视频一区| 成人在线app| 欧美午夜精品久久久久久孕妇| 北京富婆泄欲对白| 亚洲精品二区三区| 国产精品视频在线观看| 欧美另类自拍| 婷婷中文字幕综合| 18禁一区二区三区| 国产精品久久久久久久| 国产精品久久久久影院日本| 亚洲欧美一区二区三| 亚洲福利视频导航| japan高清日本乱xxxxx| 99久久精品网| 国产日韩精品在线播放| 国产原创av在线| 欧美日韩国产一区二区| 无码成人精品区在线观看| 综合天天久久| 亚洲最大福利网| 成人午夜在线影视| 制服丝袜日韩国产| 国产第一页浮力| 美女在线一区二区| 色综合久久综合网| 成人性生活视频免费看| 视频精品一区二区三区| 久久久精品亚洲| 91麻豆视频在线观看| 国产精品欧美精品| 在线观看免费污视频| 精品国产一区探花在线观看| 欧美在线性视频| 男人的天堂在线视频| 欧美日韩中文字幕综合视频| jizz日本免费| 国产日韩一区二区三区在线播放| 好吊色欧美一区二区三区视频| 美女av在线免费看| 国产精品人人做人人爽人人添| 国产麻花豆剧传媒精品mv在线| 精品视频自拍| 555www成人网| 你懂的视频在线免费| 欧美色videos| 国产一二三四五区| 日本不卡免费在线视频| 亚洲欧美成人一区| 亚洲成人高清| 九九热这里只有在线精品视| 免费看黄网站在线观看| 性欧美大战久久久久久久久| 精品久久久久久中文字幕人妻最新| 亚洲欧美日韩综合国产aⅴ| 欧美高清视频一区二区三区在线观看 | 国产成人免费视频网站| 久久久久免费看黄a片app| 色爱av综合网| 国产精品日韩欧美综合| 中日韩高清电影网| 亚洲激情 国产| 亚洲av无码乱码国产精品fc2| 中文一区一区三区高中清不卡| 视频免费1区二区三区| 欧美在线三区| 精品午夜一区二区三区| 国模一区二区| 欧美日本在线视频中文字字幕| 青青草免费在线| 欧美剧在线免费观看网站| 妺妺窝人体色www聚色窝仙踪 | 亚洲精品自拍网| 中文精品久久| 鲁片一区二区三区| 性欧美video另类hd尤物| 久久人人爽人人| av电影在线观看一区二区三区| 日韩精品中文字幕一区二区三区 | 乱子伦一区二区| 中文字幕伦av一区二区邻居| 成人免费在线视频网站| 日韩激情电影| 欧美成人免费网| 免费成人av电影| 精品三级av在线| 亚洲天堂男人网| 91国产丝袜在线播放| 色综合色综合色综合| 久久精品国产亚洲av麻豆| 老司机免费视频一区二区三区| 日本手机在线视频| 日韩一区二区在线| 精品国产91亚洲一区二区三区www 精品国产_亚洲人成在线 | 少妇无码av无码专区在线观看| 久久国产影院| 欧美凹凸一区二区三区视频| 欧美一区在线观看视频| 国产精品电影在线观看| 大桥未久在线视频| 精品国产一区二区三区四区在线观看 | 久热在线中文字幕色999舞| 麻豆影视在线| 亚洲成人久久久久| 国产人妖一区二区| 欧美三级电影网| 五月天婷婷导航| 亚洲www啪成人一区二区麻豆| 国产第一页浮力| 中文字幕国产一区二区| 无码人妻aⅴ一区二区三区 | 日韩在线观看www| 亚洲的天堂在线中文字幕| 国产乱淫av片免费| 欧美日韩精品欧美日韩精品一综合| 久久99精品波多结衣一区| 一级女性全黄久久生活片免费| 国产suv精品一区二区68| 中文在线一区二区| 337人体粉嫩噜噜噜| 久久这里只有精品6| 男女一区二区三区| 粉嫩av一区二区三区在线播放 | 欧美一区二区中文字幕| 欧美福利一区| 看一级黄色录像| 中文字幕一区二区av | 久久精品国产第一区二区三区最新章节 | 亚洲一级二级| 男女日批视频在线观看| 亚洲婷婷免费| 欧美不卡在线播放| 国产日本精品| 116极品美女午夜一级| 在线视频精品| aa免费在线观看| 日韩电影在线观看网站| 午夜免费一区二区| 美腿丝袜亚洲综合| 亚洲精品综合在线观看| 国产在线视频一区二区| 不卡中文字幕在线观看| 国产电影一区在线| aaa黄色大片| 99re亚洲国产精品| 高潮毛片无遮挡| 中文字幕av一区二区三区| www.com.av| 亚洲嫩草精品久久| 久久黄色免费视频| 午夜视频一区在线观看| 国产又黄又猛又粗又爽| 欧美视频一区在线观看| 国产欧美综合视频| 精品播放一区二区| 十九岁完整版在线观看好看云免费| 亚洲国产天堂久久综合网| 可以免费看污视频的网站在线| 一区国产精品视频| а天堂中文在线官网| 668精品在线视频| 岛国精品在线| 成人看片在线| 羞羞视频在线观看免费| 国产免费观看久久| 五月婷婷欧美激情| 亚洲欧美日韩精品久久久久| 国产主播在线播放| 在线视频国内自拍亚洲视频| 91女人18毛片水多国产| 亚洲黄一区二区| 免费黄网站在线播放| 91国内在线视频| 国产精品麻豆成人av电影艾秋| av电影成人| 免费视频亚洲| 91免费国产精品| 日韩成人dvd| 国产精品熟妇一区二区三区四区 | 免费看男女www网站入口在线 | 成人性生交大片免费看96| 茄子视频成人在线观看 | 亚洲私人影院在线观看| 制服.丝袜.亚洲.中文.综合懂色| 欧美日韩国产三级| 天天干视频在线| 久久精品视频va| 中文一区一区三区高中清不卡免费| 国产日韩欧美中文| 亚洲午夜久久| 欧美一级欧美一级| 精品在线免费视频| av鲁丝一区鲁丝二区鲁丝三区| 日韩毛片精品高清免费| 国产一级淫片a视频免费观看| 日韩视频一区二区三区在线播放 | 中文字幕一区二区不卡| 99热在线观看免费精品| 日韩三级精品电影久久久| eeuss影院在线观看| 欧美在线性爱视频| 国产一区福利| 福利在线小视频| 久久精品久久99精品久久| 亚洲午夜福利在线观看| 亚洲成人福利片| 亚洲第一大网站| 久热精品视频在线免费观看| 高清在线一区| 亚洲国产一区二区在线| 久久一区亚洲| 久久丫精品国产亚洲av不卡| 亚洲aaa精品| 亚洲av无码乱码国产精品| 国产色综合一区| 亚洲蜜桃精久久久久久久久久久久| 中文字幕制服丝袜成人av| 亚洲第一网站在线观看| 亚洲国产中文字幕久久网| 国产精品对白刺激久久久| 小说区图片区色综合区| 亚洲国产成人精品无码区99| 国产伦理精品不卡| 日本黄色免费片| 欧美日韩精品三区| 在线观看国产原创自拍视频| 国产成人精品免高潮在线观看| 希岛爱理av免费一区二区| 亚欧无线一线二线三线区别| 成人黄色综合网站| 日韩av女优在线观看| 亚洲精品www| 深夜福利视频一区二区| 欧美成人一区二区在线| 久久亚洲精品伦理| 成人黄色a级片| 欧美丰满美乳xxx高潮www| 国产一区久久精品| 91亚洲精品丁香在线观看| 亚洲高清免费| 在线 丝袜 欧美 日韩 制服| 日韩欧美在线视频观看| 国产69久久| 国产精品盗摄久久久| 成人中文在线| 午夜影院免费观看视频| 日韩毛片一二三区| 蜜桃视频久久一区免费观看入口| 国内精品久久久久影院 日本资源| 牛牛精品成人免费视频| 热久久精品国产| 中文字幕一区av| 亚洲精品一区二区三区区别| 97视频网站入口| 超碰成人久久| 佐山爱在线视频| 欧美日韩一二三四五区| av中文资源在线| 成人福利网站在线观看| 欧美视频网站| 成年人网站免费在线观看| 欧美日韩亚洲国产综合| 主播国产精品| 欧美12av| 激情成人综合网| 国产a∨精品一区二区三区仙踪林| 亚洲午夜精品久久久久久久久久久久| 欧美91在线|欧美| 欧妇女乱妇女乱视频| 国产日韩欧美不卡在线| 97视频免费在线| 91超碰中文字幕久久精品| 日韩欧美一区免费| 一本色道久久hezyo无码| 欧美午夜精品电影| 超碰在线视屏| 在线视频欧美一区| 99免费精品在线| 国产露脸无套对白在线播放| 欧美一区二区三区…… | 日本黄xxxxxxxxx100| 91蜜桃在线观看| 精品人妻一区二区三区四区不卡 | a级免费在线观看|