ReAct
これ何?わかりやすく
このとき、推論で使用する情報はモデル内部のもの(モデルが学習済みのもの)に限られた。
一方で、人間が推論を行うときは、自分の知識だけで、本やウェブで検索した情報をもとにすることも多い。
それと全く同じことを LLM にさせる手法がReAct。
Reason (判断理由 ≒思考・推論) +Action(行動)を、交互に繰り返すプロンプトテクニック。
下図のように、必要なGroundingをGPTに考えさせて、動的にタスクを実行することができる。 https://scrapbox.io/files/6585784d67d1a1002313074b.png
・「今から野球を始めるんだけど、おすすめの野球用具一式を教えて」と質問する。
・するとバックエンドプログラムが受け取りつつ、まずはWeb検索を走らせる。
・クエリ化をして、「初心者 野球用具 一覧」と検索し、その結果(バットとボールなど)を持ってくる。
・次に、次に何をするのか判断して、GPTが決める。
・例えば、社内の商品DBや検索エンジンに初心者向けの情報を取りにく。そしてその結果を返す。
このように、 単純に聞かれたものを検索して答えるのではなく
商品情報を受け取った上で、回答させるクエリに応じて、何をすべきなのかを判断して、GPTが回答を変えた
という振る舞いができるようなプロンプティングをReActとよぶ
GPTに目的達成のための必要なタスクを検討・認識させ(Reasoning)、外部APIへのアクセスなどの行動(Action)をさせる。
その結果をプロンプトに付与することで、回答の正確性をより強化することができる。
ReActを派生した動き
ReActの考え方をベースとした派生として、
Amazon BedrockのAgent for Bedrock 機能がある。
どちらも外部 API やデータソースと生成 AI を連携させて、タスクを実行する仕組み。
ReActプロンプトの書き方
ChatGPTに3段階のプロセスを踏んだ回答をさせる
初期の推論(Thought )
必要な行動の考察(Action )
最終的な見解(Observation)
地球温暖化の原因と対策について教えて
Thought :
Action :
Observation :
https://scrapbox.io/files/6584fc9538d3400023ba15d4.png
https://scrapbox.io/files/6584fcb9ee4dac002229edc5.png
ステップバイステップと組み合わせても良い
code:markdown
地球温暖化の対策は?
回答形式は下記とします。
"""
Thought: <目的を達成するために必要なことを考え記載>
Action: <ステップバイステップで回答して>
Observation: <アクションの結果得られた知見を記載>
"""
動的に必要なGroundingを考えさせるReActプロンプトの例
あなたはスポーツ用品メーカーの商品購入検討アシスタントです。
複数のツールを利用しながらスポーツ用品に関するユーザの疑間を
解決することを求められます。
ツールは以下の3種類が与えられます。
・Search: Web検索の実行ができる
・Lookup: 商品情報DBの参照ができる
・calculate: 数値計算ができる
ユーザからは下記形式で質問が与えられます。
"""
Question: <ユーザの問い>
Thought: <目的を達成するために必要なことを考え記載>
Action: <Thoughtを踏まえツール名を記載>
Action input: <アクション実行時に必要となるインプット情報>
Observation: <アクションの結果得られた知見>
"""
回答形式は下記とします。
"""
Thought: <目的を達成するために必要なことを考え記載>
Action: <Thoughtを踏まえツール名を記載。無ければ無記載>
Action input: <アクション実行時に必要となるインプット情報>
Result: <Actionの内容が無記載であれば結論を書く>
"""
結果:
Bingで外部検索をして、必要な商品と値段を教えてくれた。
https://scrapbox.io/files/65857cf38d775b0022ee24f5.png
https://scrapbox.io/files/658581bcfe64430024cfc54f.png
ReActのようなバックエンドの処理を自動化するライブラリ
これらのライブラリでは、ReActの考え方が活用されている
こういうReActをやって、最終的には動的なタスク認識も含めてできるようなかたちになるんですが、今のを全部組んでいると大変だということで、そこのバックエンドの処理をある程度自動化してくれるというか、よろしくやってくれるツールとしていくつかライブラリが出てきています。
1つはけっこう有名ですが、「LangChain」と呼ばれるライブラリです。LangChainのライブラリはReActみたいに動的な実行だけじゃなくて、例えばプロンプトのテンプレート機能であったり、プロンプトを覚えていくメモリ機能みたいなところも含めて全般的に提供してくれる、非常に便利なツールになっています。
このLangChainを使ってあげると、ReActを自動化する「Agent」と呼ばれる機能みたいなところに、さまざまな先端機能が実装されるかたちになります。
それからあとは、「Semantic Kernel」。これはマイクロソフトがOSSとして最近発表したものです。やれることはLangChainと似たようなかたちにはなってくるんですが、Planner機能でAgent機能と同じようなパイプライン生成も可能になっています。
LangChainで行われていること
https://scrapbox.io/files/65c590c1402eae0024c73518.png