思考の木をLangChainのChainで実装
はじめに
思考の木 (Tree of thoughts : ToT) は、Princeton 大学と Google DeepMindがこちらの論文で発表した、LLMとヒューリスティック探索を組み合わせたアルゴリズムで、Googleが開発中のマルチモーダルな生成AI Geminiに実装されるようです。
簡単にToT (Tree of Thoughts) の思考過程に触れます。
通常のCoT(Chain of Thoughts)方式では、LLMは問題解決に向けて直線的に思考を進めるため、途中で何か誤りが生じてもその誤った基準に沿って進む傾向があります。
それに対して、ToT(Tree of Thoughts)方式では、LLMが思考の各段階で自身の評価を行い、非効率的なアプローチを早期に止めて別の手法に切り替えます。
LangChainのChainで実装するにあたり以下の動画の投稿者のプロンプトを利用させていただきました。
処理を簡単に説明すると、幅広くアイデアを出した後に、個別のアイデアを評価し、深掘りした上で、もっとも成功の見込みがあるものを選びます。
実装
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
PromptTemplateにTree of thoughtsのプロンプトを定義し、ステップごとにチェーンを実装します。
template ="""
Step1 :
私は{input}に関連する問題を抱えています。3つの異なる解決策を考えてもらえますか?{perfect_factors}など、さまざまな要因を考慮してください。
A:
"""
prompt = PromptTemplate(
input_variables=["input","perfect_factors"],
template = template
)
chain1 = LLMChain(
llm=ChatOpenAI(temperature=0, model="gpt-4"),
prompt=prompt,
output_key="solutions"
)
template ="""
Step 2:
提案された3つの解決策のそれぞれについて、その可能性を評価してください。長所と短所、初期に必要な努力、実装の難易度、潜在的な課題、および予想される結果を考慮してください。これらの要因に基づいて、各オプションに成功の確率と信頼レベルを割り当ててください。
{solutions}
A:"""
prompt = PromptTemplate(
input_variables=["solutions"],
template = template
)
chain2 = LLMChain(
llm=ChatOpenAI(temperature=0, model="gpt-4"),
prompt=prompt,
output_key="review"
)
template ="""
Step 3:
各解決策について、思考プロセスを深めてください。潜在的なシナリオ、実装戦略、必要なパートナーシップやリソース、および潜在的な障害をどのように克服するかを生成してください。また、予想外の結果が生じた場合の対処法も考慮してください。
{review}
A:"""
prompt = PromptTemplate(
input_variables=["review"],
template = template
)
chain3 = LLMChain(
llm=ChatOpenAI(temperature=0, model="gpt-4"),
prompt=prompt,
output_key="deepen_thought_process"
)
template ="""
Step 4:
評価とシナリオに基づいて、解決策を成功の見込みが高い順にランク付けしてください。各ランキングの根拠を提供し、各解決策に対する最終的な意見や考慮事項を提供してください。各解決策の先頭にランク(順位)を記載してください。
{deepen_thought_process}
A:"""
prompt = PromptTemplate(
input_variables=["deepen_thought_process"],
template = template
)
chain4 = LLMChain(
llm=ChatOpenAI(temperature=0, model="gpt-4"),
prompt=prompt,
output_key="ranked_solutions"
)
「SequentialChain」を使って4つのチェーンを繋げます。一つ前のチェーンの出力が次のチェーンの入力となっています。
from langchain.chains import SequentialChain
overall_chain = SequentialChain(
chains=[chain1, chain2, chain3, chain4],
input_variables=["input", "perfect_factors"],
output_variables=["ranked_solutions"],
verbose=True
)
print(overall_chain({"input":"人類が火星に移住するための", "perfect_factors":"地球と火星の距離は非常に遠く、定期的な物資補給が難しい"}))
{
"input": "人類が火星に移住するための",
"perfect_factors": "地球と火星の距離は非常に遠く、定期的な物資補給が難しい",
"ranked_solutions": {
"ランク1": {
"solution": "火星での自給自足システムの確立",
"長所": "長期的には最も経済的で持続可能な解決策。火星での生活を維持するための直接的な方法。",
"短所": "高い初期投資と技術的な困難。火星の環境での食料生産や酸素生成など、まだ解決すべき課題が多い。",
"初期に必要な努力": "火星での生活に必要な資源を生産するための技術とシステムの開発。",
"実装の難易度": "高度。新たな技術と知識が必要。",
"潜在的な課題": "技術的な困難、火星の厳しい環境、初期投資の高さ。",
"予想される結果": "火星での持続可能な生活の確立。",
"成功の確率": "中程度",
"信頼レベル": "中程度"
},
"ランク2": {
"solution": "地球と火星間の物資補給ルートの確立",
"長所": "火星での生活に必要な物資を定期的に供給できる。火星での生活を維持するための直接的な方法。",
"短所": "高コスト。物資補給のたびに大量の燃料と時間が必要。",
"初期に必要な努力": "宇宙船の設計と製造、補給ルートの計画、物資のパッケージングと保管方法の開発。",
"実装の難易度": "中程度。既存の技術を応用することが可能。",
"潜在的な課題": "資金調達、物資の適切なパッケージングと保管、火星への安全な着陸。",
"予想される結果": "火星での生活が維持できるようになる。",
"成功の確率": "高程度",
"信頼レベル": "高程度"
},
"ランク3": {
"solution": "地球からの人間の移住を最小限に抑える",
"長所": "地球と火星間の物資補給の必要性を減らすことができる。",
"短所": "人間の火星探査と植民地化の目標とは一致しない。",
"初期に必要な努力": "移住計画の見直し、ロボットやAIの開発。",
"実装の難易度": "中程度。既存の技術を応用することが可能。",
"潜在的な課題": "人間の火星探査の目標との一致、ロボットやAIの開発と実装。",
"予想される結果": "物資補給の必要性の減少。",
"成功の確率": "中程度",
"信頼レベル": "中程度"
}
}
最後に
思考の木をプロンプトに利用するだけでなく、Agentの思考過程に導入することで、ツールの選択やプランニングの精度が改善できそうと思いました。