<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 我為什么放棄了 LangChain?(2)

我為什么放棄了 LangChain?(2)

發(fā)布人:機器之心 時(shí)間:2023-07-24 來(lái)源:工程師 發(fā)布文章
我查看了 LangChain 文檔,它也回饋了我


讓我來(lái)做個(gè)演示,更清楚地說(shuō)明為什么我放棄了 LangChain。
當開(kāi)發(fā)菜譜檢索聊天機器人(它也必須是一個(gè)有趣 / 詼諧的聊天機器人)時(shí),我需要結合上面第三個(gè)和第四個(gè)例子中的元素:一個(gè)可以運行 Agent 工作流的聊天機器人,以及將整個(gè)對話(huà)持久化到內存中的能力。在查找了一些文檔后,我發(fā)現需要使用對話(huà)式 Agent 工作流。
關(guān)于系統提示工程的一個(gè)標注是,它不是一個(gè)備忘錄,而且對于從 ChatGPT API 中獲得最佳效果是絕對必要的,尤其是當你對內容和 / 或語(yǔ)音有限制的時(shí)候。
上一個(gè)示例中,演示的系統提示「以下是人類(lèi)和人工智能之間的友好對話(huà)...... 」實(shí)際上是過(guò)時(shí)的,早在 InstructGPT 時(shí)代就已經(jīng)使用了,在 ChatGPT 中的效果要差得多。它可能預示著(zhù) LangChain 相關(guān)技巧中更深層次的低效,而這些低效并不容易被注意到。
我們將從一個(gè)簡(jiǎn)單的系統提示開(kāi)始,告訴 ChatGPT 使用一個(gè)有趣的聲音和一些保護措施,并將其格式化為 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()),
我們還將使用一個(gè)玩具矢量存儲,該存儲由來(lái)自 recipe_nlg 數據集的 1000 個(gè)食譜組成,并使用 SentenceTransformers 編碼為 384D 矢量。為了實(shí)現這一點(diǎn),我們創(chuàng )建了一個(gè)函數來(lái)獲取輸入查詢(xún)的最近鄰,并將查詢(xún)格式化為 Agent 可以用來(lái)向用戶(hù)展示的文本。這就是 Agent 可以選擇使用的工具,或者只是返回正常生成的文本。
def similar_recipes(query):    query_embedding = embeddings_encoder.encode(query)    scores, recipes = recipe_vs.get_nearest_examples("embeddings", query_embedding, k=3)    return recipesdef 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
你會(huì )注意到這個(gè) Recipe ID,這與我的用例相關(guān),因為在最終應用中向終端用戶(hù)顯示的最終結果需要獲取 Recipe 元數據(照片縮略圖、URL)。遺憾的是,沒(méi)有簡(jiǎn)單的方法保證模型在最終輸出中輸出食譜 ID,也沒(méi)有方法在 ChatGPT 生成的輸出之外返回結構化的中間元數據。
將 get_similar_recipes 指定為一個(gè)工具是很簡(jiǎn)單的,盡管你需要指定一個(gè)名稱(chēng)和描述,這實(shí)際上是一種微妙的提示工程,因為 LangChain 可能會(huì )因為指定的名稱(chēng)和描述不正確而無(wú)法選擇一個(gè)工具。


tools = [    Tool(        func=get_similar_recipes,        name="Similar Recipes",        description="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)

沒(méi)有錯誤?,F在運行 Agent,看看會(huì )發(fā)生什么:
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?
什么?它完全忽略了我的系統提示!檢查內存變量證實(shí)了這一點(diǎn)。
在 ConversationBufferMemory 的文檔中,甚至在代碼本身中都沒(méi)有關(guān)于系統提示的內容,甚至在 ChatGPT 使其成為主流的幾個(gè)月之后。
在 Agent 中使用系統提示的方法是在 initialize_agent 中添加一個(gè) agents_kwargs 參數,我只是在一個(gè)月前發(fā)布的一個(gè)不相關(guān)的文檔頁(yè)面中發(fā)現了這一點(diǎn)。


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

使用此新參數重新創(chuàng )建 Agent 并再次運行,會(huì )導致 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?

壞消息是,它壞了,但又是為什么呢?我這一次沒(méi)有做任何奇怪的事情。
圖片
有趣的事實(shí):這些大量的提示也會(huì )成比例地增加 API 成本。
這樣做的后果是,正常輸出結構中的任何重大變化,例如由自定義系統提示引起的變化,都有可能破壞 Agent。這些錯誤經(jīng)常發(fā)生,以至于有一個(gè)文檔頁(yè)面專(zhuān)門(mén)用于處理 Agent 輸出解析錯誤。
我們暫時(shí)把與聊天機器人對話(huà)看作是一個(gè)邊緣案例。重要的是,機器人能夠返回菜譜,因為如果連這一點(diǎn)都做不到,那么使用 LangChain 就沒(méi)有意義了。
在不使用系統提示的情況下創(chuàng )建一個(gè)新的 Agent,然后問(wèn)它什么是簡(jiǎn)單有趣的晚餐?


> Entering new  chain...{    "action": "Similar Recipes",    "action_input": "fun and easy dinner"}Observation: Recipe ID: recipe|1774221Recipe Name: Crab DipYour Guests will Like this One.---Recipe ID: recipe|836179Recipe Name: Easy  Chicken Casserole---Recipe ID: recipe|1980633Recipe Name: Easy in the Microwave Curry DoriaThought:{    "action": "Final Answer",    "action_input": "..."}
> Finished chain.Here are some fun and easy dinner recipes you can try:
1. Crab Dip2. Easy Chicken Casserole3. Easy in the Microwave Curry Doria
Enjoy your meal!
至少它成功了:ChatGPT 能夠從上下文中提取出菜譜,并對其進(jìn)行適當的格式化(甚至能夠修正名稱(chēng)中的錯別字),并且能夠在適當的時(shí)候進(jìn)行判斷。
這里真正的問(wèn)題是,輸出的聲音很無(wú)聊,這也是基礎版 ChatGPT 的共同特點(diǎn)和詬病。即使通過(guò)系統提示工程解決了 ID 缺失的問(wèn)題,這般聽(tīng)上去的效果也不值得將其發(fā)布。就算真的在語(yǔ)音質(zhì)量和輸出質(zhì)量之間取得了平衡,Agent 計數仍然會(huì )隨機失敗,而這并不是我的過(guò)錯。
實(shí)際上,Agent 工作流是一個(gè)非常脆弱的紙牌搭成的房子,憑良心說(shuō),生產(chǎn)應用中估計無(wú)法使用。
LangChain 確實(shí)有 Custom Agent 和 Custom Chain 的功能,所以你可以在堆棧的某些部分重寫(xiě)邏輯(也許文檔很少),這可以解決我遇到的一些問(wèn)題,但在這一點(diǎn)上,你會(huì )感覺(jué)到 LangChain 更加復雜,還不如創(chuàng )建你自己的 Python 庫。
工作要講究方法
圖片
大量隨機集成帶來(lái)的問(wèn)題比解決方案更多。
當然,LangChain 確實(shí)也有很多實(shí)用功能,比如文本分割器和集成向量存儲,這兩種功能都是「用 PDF / 代碼聊天」演示不可或缺的(在我看來(lái)這只是一個(gè)噱頭)。
所有這些集成的真正問(wèn)題在于,只使用基于 LangChain 的代碼會(huì )造成固有的鎖定,而且如果你查看集成的代碼,它們并不十分穩健。
LangChain 正在建立一條護城河,這對 LangChain 的投資者來(lái)說(shuō)是好事,因為他們想從 3000 萬(wàn)美元中獲得回報,但對使用它的開(kāi)發(fā)者來(lái)說(shuō)卻非常不利??偠灾?,LangChain 體現了「它很復雜,所以它一定更好」這一經(jīng)常困擾后期代碼庫的哲學(xué),可是 LangChain 甚至還不到一年。
要想讓 LangChain 做我想讓它做的事,就必須花大力氣破解它,這將造成大量的技術(shù)負擔。與現在的人工智能初創(chuàng )公司不同,我自己的 LangChain 項目的技術(shù)債務(wù)無(wú)法用風(fēng)險投資來(lái)償還。在使用復雜的生態(tài)系統時(shí),應用程序接口封裝器至少應該降低代碼的復雜性和認知負荷,因為使用人工智能本身就需要花費足夠的腦力。LangChain 是為數不多的在大多數常用情況下都會(huì )增加開(kāi)銷(xiāo)的軟件之一。

我得出的結論是,制作自己的 Python 軟件包要比讓 LangChain 來(lái)滿(mǎn)足自己的需求容易得多。因此,我開(kāi)發(fā)并開(kāi)源了 simpleaichat:一個(gè)用于輕松連接聊天應用程序的 Python 程序包,它強調代碼的最小復雜度,并將向量存儲等高級功能與對話(huà)邏輯解耦。
開(kāi)源地址:https://github.com/minimaxir/simpleaichat
但寫(xiě)這篇博文并不是為了像那些騙子一樣,通過(guò)詆毀競爭對手來(lái)為 simpleaichat 做****廣告。我不想宣傳 simpleaichat,我更愿意把時(shí)間花在用人工智能創(chuàng )造更酷的項目上,很遺憾我沒(méi)能用 LangChain 做到這一點(diǎn)。
我知道有人會(huì )說(shuō):「既然 LangChain 是開(kāi)源的,為什么不向它的 repo 提交拉取請求,而要抱怨它呢?」唯一真正能解決的辦法就是把它全部燒掉,然后重新開(kāi)始,這就是為什么我的「創(chuàng )建一個(gè)新的 Python 庫來(lái)連接人工智能」的解決方案也是最實(shí)用的。

我收到過(guò)很多留言,問(wèn)我該「學(xué)什么才能開(kāi)始使用 ChatGPT API」,我擔心他們會(huì )因為炒作而首先使用 LangChain。如果擁有技術(shù)棧背景的機器學(xué)習工程師因為 LangChain 毫無(wú)必要的復雜性而難以使用 LangChain,那么任何初學(xué)者都會(huì )被淹沒(méi)。
關(guān)于軟件復雜性和復雜性下的流行性之爭是永恒的話(huà)題。沒(méi)有人愿意成為批評 LangChain 這樣的免費開(kāi)源軟件的混蛋,但我愿意承擔這個(gè)責任。明確地說(shuō),我并不反對 Harrison Chase 或 LangChain 的其他維護者(他們鼓勵反饋)。
然而,LangChain 的流行已經(jīng)扭曲了圍繞 LangChain 本身的人工智能創(chuàng )業(yè)生態(tài)系統,這就是為什么我不得不坦誠我對它的疑慮。
原文鏈接:https://minimaxir.com/2023/07/langchain-problem/


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>