Tree of Thoughts 作為一種新的問題解決思路,相較於傳統的 Chain-of-Thought 方法,能有效提升 AI 在複雜問題上的表現。例如在 24 點遊戲中,ToT 將 GPT-4 的成功率從 4% 提升至 74%。LangChain 提供了 ToT 的實作範例,例如用於解決數獨問題,展現了其在實際應用中的潛力。回撥函式則提供監控和診斷應用程式問題的機制,讓開發者能深入瞭解 AI 的執行過程。LangChain 的回撥函式機制支援 LLM 啟動、新 Token 產生和 LLM 結束等事件的處理,並能透過自定義邏輯增強控制和監控能力。
Tree of Thoughts(ToT)- 人工智慧問題解決的新典範
在人工智慧領域中,尤其是在需要複雜規劃或搜尋能力的任務中,Tree of Thoughts(ToT)已經展現出其卓越的成果。以「24點遊戲」為例,傳統的GPT-4在使用chain-of-thought提示時,只能達到4%的成功率。相比之下,ToT方法則將這個數字提升到了令人印象深刻的74%。這種正規化轉變不僅限於遊戲領域,在創意寫作和迷你填字遊戲等領域也展示了其多樣化的應用潛力。
ToT的實作
LangChain的實作為我們提供了一個實際的例子,展示瞭如何將ToT方法付諸實踐。以數獨遊戲為例,目標是替換 wildcard 字元(*)為數字,並遵守數獨規則。這個過程不僅展示了ToT的應用,也體現了其在問題解決中的強大能力。
回撥函式(Callbacks)
LangChain的回撥函式(Callbacks)為我們提供了一種便捷的方式,來監控和診斷應用程式中的問題。透過使用回撥函式,我們可以在特定事件發生時觸發自定義的處理邏輯。BaseCallbackHandler類別是這個過程的基礎,它提供了一系列方法來處理不同階段的事件,例如LLM啟動、錯誤發生等。
回撥函式的應用
以下是回撥函式的一些應用範例:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Tree of Thoughts 思維樹探索AI問題解決新途徑
package "機器學習流程" {
package "資料處理" {
component [資料收集] as collect
component [資料清洗] as clean
component [特徵工程] as feature
}
package "模型訓練" {
component [模型選擇] as select
component [超參數調優] as tune
component [交叉驗證] as cv
}
package "評估部署" {
component [模型評估] as eval
component [模型部署] as deploy
component [監控維護] as monitor
}
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml
回撥函式的定義
class BaseCallbackHandler:
def on_llm_start(self, serialized, prompts, **kwargs):
# 執行LLM啟動時的邏輯
pass
def on_llm_new_token(self, token, **kwargs):
# 處理新token的邏輯
pass
def on_llm_end(self, response, **kwargs):
# 執行LLM結束時的邏輯
pass
圖表翻譯:
上述Plantuml圖表展示了回撥函式在LLM執行過程中的觸發順序。從LLM啟動開始,到LLM結束,每個階段都可以透過自定義的邏輯來處理。這種方式使得我們可以更好地控制和監控LLM的執行,從而提高整體的問題解決能力。
自主代理與工具:回呼函式的應用
在開發自主代理(Autonomous Agents)時,能夠定義和使用回呼函式(Callbacks)是非常重要的。這些回呼函式可以在特定事件發生時被觸發,例如工具啟動、結束或出現錯誤時。下面,我們將探討如何定義和使用這些回呼函式,以提高自主代理的功能和靈活性。
回呼函式的定義
首先,我們需要定義一些基本的回呼函式,這些函式將在特定事件發生時被呼叫。例如:
on_tool_start: 工具啟動時呼叫on_tool_end: 工具結束時呼叫on_tool_error: 工具出現錯誤時呼叫on_text: 收到任意文字時呼叫on_agent_action: 代理採取行動時呼叫on_agent_finish: 代理完成任務時呼叫
每個回呼函式都接受特定的引數,例如工具的輸入、輸出或錯誤資訊,這些引數可以用於進行進一步的處理或記錄。
全域回呼函式(Constructor Callbacks)
當我們在建構器中定義回呼函式時,這些函式將適用於該例項的所有呼叫。例如:
from langchain.agents import AgentExecutor
from langchain.callbacks import StdOutCallbackHandler
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
callbacks=[StdOutCallbackHandler()],
tags=['a-tag']
)
在這個例子中,StdOutCallbackHandler 將被應用於所有透過 agent_executor 執行的請求。這種方法非常適合需要對代理的所有操作進行監控或記錄的情況。
請求特定回呼函式(Request-Specific Callbacks)
另外,我們也可以在呼叫 invoke 方法時定義回呼函式。這允許我們為每個請求指定不同的回呼函式。例如:
from langchain.callbacks import StdOutCallbackHandler
from langchain.chains import LLMChain
from langchain_openai import OpenAI
llm = OpenAI()
prompt = PromptTemplate.from_template("What is 1 + {number} = ")
chain = LLMChain(llm=llm, prompt=prompt)
chain.invoke({"number": 2}, {"callbacks": [handler]})
在這種情況下,指定的回呼函式只會被應用於這個特定的請求。
說明與除錯工具
最後,verbose 引數是一個常用的工具,可以用於啟用或停用詳細的輸出和除錯資訊。透過設定 verbose=True,我們可以獲得更多關於代理操作的細節,這對於除錯和理解代理的行為非常有幫助。
何時使用哪種回呼函式?
- 建構器回呼函式:適合於需要對整個代理生命週期進行監控或記錄的情況。
- 請求特定回呼函式:適合於需要為每個請求指定不同的行為或處理邏輯的情況。
透過合理使用這些回呼函式,我們可以更好地控制和擴充套件自主代理的功能,從而提高整體系統的智慧化和自動化程度。
使用LangChain進行Token計數和非同步回撥
在與生成式AI模型互動時,能夠有效地計數Token是一項重要的功能,尤其是在需要追蹤請求使用情況的應用中。LangChain提供了一種簡單的方法來實作這一功能,並支援非同步回撥,以便在單個請求的輸出需要被串流到專用端點(如WebSocket)時使用。
啟用Verbose模式
雖然Verbose模式對於除錯和本地LLM開發很有用,但它可能會生成大量日誌。因此,在生產環境中應謹慎使用。
使用LangChain進行Token計數
要使用LangChain進行Token計數,您需要設定必要的模組並匯入相關函式。以下是基本步驟:
- 匯入必要模組:您需要匯入
asyncio模組和LangChain包中的相關函式。 - 建立ChatOpenAI模型:初始化一個
ChatOpenAI模型例項。 - 使用get_openai_callback上下文管理器:這個上下文管理器允許您在請求中計數Token。
示例程式碼
import asyncio
from langchain.callbacks import get_openai_callback
from langchain_core.messages import SystemMessage
from langchain_openai.chat_models import ChatOpenAI
# 建立ChatOpenAI模型
model = ChatOpenAI()
# 使用get_openai_callback上下文管理器
with get_openai_callback() as cb:
# 傳送請求
model.invoke([SystemMessage(content="My name is James")])
# 取得總Token數
total_tokens = cb.total_tokens
print(total_tokens)
支援非同步回撥
LangChain支援非同步執行,這意味著您可以同時執行多個請求。這對於需要處理多個任務的應用程式尤其有用。
示例程式碼:非同步回撥
# Async callbacks:
with get_openai_callback() as cb:
# 使用asyncio.gather同時執行多個請求
await asyncio.gather(
model.agenerate(
[
SystemMessage(content="Is the meaning of life 42?"),
SystemMessage(content="Is the meaning of life 42?"),
]
)
)
什麼是Diffusion模型?
Diffusion模型是一種生成模型,透過去除雜訊的過程來生成影像。它的工作原理是根據影像描述來調整神經網路權重,使其能夠從隨機雜訊中生成出匹配描述的影像。
從技術架構視角來看,Tree of Thoughts(ToT)作為一種新型問題解決正規化,相較於傳統的Chain-of-Thought提示方法,展現出顯著的效能提升,尤其在需要規劃和搜尋的複雜任務中。本文以24點遊戲和數獨遊戲為例,展示了ToT如何透過探索多種思考路徑,提升問題解決的成功率。LangChain的實作案例進一步闡明瞭ToT的應用方式,並透過回撥函式機制,提供了監控和診斷應用程式問題的便捷途徑,從工具啟動、結束到錯誤處理,皆可透過自定義邏輯進行控制,提升自主代理的靈活性和功能性。然而,ToT方法並非完美無缺,其計算複雜度和資源消耗仍需進一步最佳化。對於需要串流輸出到特定端點的應用,LangChain提供的非同步回撥和Token計數功能,能有效追蹤資源使用情況,但Verbose模式在生產環境中需謹慎使用,以免產生過多日誌。展望未來,ToT與自主代理的結合,以及在更廣泛領域的應用,將是重要的發展方向。隨著技術的持續演進,預期ToT將在解決更複雜的AI問題中扮演關鍵角色,並推動生成式AI模型的進一步發展。玄貓認為,ToT的出現標誌著AI問題解決正規化的重要轉變,值得深入研究和探索其潛力。