
MRKL(Multi-Round Knowledge Loop)システムの実現方法理解し、ChatGPTを自社のためにカスタマイズする方法とは(第一回:理論編)
驚きとともに
LangChainのプロジェクトを見つけ、チュートリアルでコードを打ち込んでみて大変驚いたのがMRKL(Multi-Round Knowledge Loop)システムの仕組みでした。こんな問いにChatGPTが答えることができます。
現在の日本の首相の年齢から現在のフランスの首相の年齢を引いたらいくつですか?
(答えは章末にあります)
ChatGPTがビジネスで使いづらい点は、データが最新ではないところで、刻々と日々変化するデータには対応できないことでした。ビジネス的にChaptGPTのようなLLM(large language model)のモデルが更新されるのを1年待つなんてことは現実的ではないです。
またファインチューニングは以前に解説しましたが、自社のデータが膨大にあることと、目的がしっかりしていれば(時間的)コストをかけてチューニングをしていくことで対応可能かもしれません。
しかしこれも、自社のデータが更新されるたびに毎日ファインチューニングするということも、現実的ではないのではないでしょうか。
これを解決する方法が、さまざまなアクションを組み合わせてChatGPTを活用することで、最新のデータにも対応して回答精度をあげる方法です。
どうやって実現しているのかLangChainプロジェクトのコードを探索してみましょう。
探索することで、自社で実現したいことへの応用が可能となるかもしれません。
長い旅になりますが、お付き合いいただければと思います。
最終ゴールでは素晴らしい景色が見えていることでしょう。
(答えは:4歳)
> Entering new AgentExecutor chain...
I need to find out the age of the current Japanese and French Prime Ministers
Action: Search
Action Input: "age of current Japanese Prime Minister"params
Observation: 65歳
Thought: Now I need to find out the age of the current French Prime Minister
Action: Search
Action Input: "age of current French Prime Minister"params
Observation: 61歳
Thought: I now know the final answer
Final Answer: 4歳
理論編1:MRKL(Multi-Round Knowledge Loop)
理論が面倒くさいと感じる方は、この部分を飛ばしていただいても構いません。しかし、コンセプトを理解すれば、自社の課題に適用できるヒントが見つかるかもしれません。MRKL(Multi-Round Knowledge Loop)システムは、AIエージェントが複数のツールやアプローチを組み合わせてタスクを解決するための枠組みです。このシステムは、エージェントが最適な戦略を選択し、複数回の試行を通じて情報を収集・活用することで、より効果的な解決策を見つけることができるよう設計されています。MRKLシステムは、一般的なAIエージェントの実装に対する有望なアプローチです。
例えば、皆さんも経験されていると思いますが、初めての分野の知識を得る際には、検索結果でわからない専門用語がたくさん出てきます。その言葉をさらに検索し、その結果を検討し、さらに検索を繰り返しながら理解を深めていくことがあります。この過程で検索ワードを工夫し、最終的な結果を得ることができます。つまり、考察と検索(行動)を繰り返して理解を深めていくのです。
現在の日本の首相の年齢から現在のフランスの首相の年齢を引いたらいくつですか?
この問いを調べるために以下のタスクに分解できますね。カッコの中身は気にしないでください。後でわかりますので。
まず問いがあります。問いは「現在の日本の首相の年齢から現在のフランスの首相の年齢を引いたらいくつですか?」(Question)
Googleで未知の情報を調べるために検索ワードを考えます(Thought)
現在の日本とフランスの首相の年齢を知る必要がある
検索ワードは「現在の日本の首相の年齢」(Action Input)
さらに検索ワードは「現在のフランス首相の年齢」(Action Input)
検索を実行します「現在の日本の首相の年齢」(Action)
結果は65歳でした(obsabation)
検索を実行します「現在のフランス首相の年齢」(Action)
結果は61歳でした(obsabation)
日本の首相の年齢とフランスの首相の年齢の差分を計算する必要があります(Thought)
計算します(Action)
結果は4でした(obsabation)
答えは4歳です (final)
このようにMRKL(Multi-Round Knowledge Loop)システムは、ChatGPTが情報をもとに次のアクションを考え、結果を評価し、次のアクションを考えるというプロセスを繰り返すことで回答精度を上げる方法論です。考察(Thought)、観察(Observation)、行動(Action)のサイクルを繰り返すことで、回答精度が向上するとされています。このアプローチは、論文により回答精度が向上することが示されています。本文はわかりやすさを重視していますので、正確な情報は論文より確認いただければと思います。
Title: Multi-Round Knowledge Loop Systems arXiv: https://arxiv.org/pdf/2205.00445.pdf
理論編2:プロンプトコーディング
ChatGPTを活用するためには、プロンプトコーディングの知識が必要です。プロンプトとは、ChatGPTに投げかける質問のことです。ChatGPTから精度の高い回答を得るためには、人間に質問するのと同様に、質問力が重要です。質問の仕方に関する研究が進められています。例えば、以下のように役割の指定や回答の形式を細かく設定することが可能です。
あなたは、英語の先生です。これから私の英語を英語教師として文法を指摘して下ださい。
回答のフォーマットは以下のようにします。
あなたの英語:{入力分}
訂正後の英文:{英文例}
文法の解説:{解説1000文字以内}
重要な点は、質問や回答が定型化されていることです。質問や回答が定型化されていれば、プログラムで文字列を処理することが容易になり、解析が可能となります。
実装方法のコンセプト
考察とアクションの組み合わせ、そしてプロンプトコーディングが、これを実現するための中心的なコンセプトとなります。
まず必要なのはプロンプトだ
プロンプトは案外シンプルなものです。
#
#出来上がったプロンプト
#
Answer the following questions as best you can.
You have access to the following tools:\n\n
Search: A search engine. Useful for when you need to answer questions about current events. Input should be a search query.\n
Calculator: Useful for when you need to answer questions about math.\n\n
Use the following format:\n\n
Question: the input question you must answer\n
Thought: you should always think about what to do\n
Action: the action to take, should be one of [Search, Calculator]\n
Action Input: the input to the action\n
Observation: the result of the action\n
... (this Thought/Action/Action Input/Observation can repeat N times)\n
Thought: I now know the final answer\n
Final Answer: the final answer to the original input question\n\n
Begin!\n\n
Question: 現在の日本の首相の年齢から現在のフランスの首相の年齢を引いたらいくつですか? 計算してください\nThought:')
ツールが使えることをChatGPTへ伝える
You have access to the following tools:\n\n
Search: A search engine. Useful for when you need to answer questions about current events. Input should be a search query.\n
Calculator: Useful for when you need to answer questions about math.\n\n
ここでは重要なことを説明しています。まず、以下のツールがどのように使えるのかを伝えています。
Search:A search engine. Useful for when you need to answer questions about current events. Input should be a search query.
(Search:検索エンジンです。時事問題に関する質問に答える必要があるときに便利です。入力は、検索クエリである必要があります。)
重要なポイントは以下です
Searchというツール名
ダブルコロン(:)の前にツール名が必ず記載されています。そしてユースケースを伝えています。
(時事問題に関する質問に答える必要があるときに便利です)入力形式を指定しています。
(入力は、検索クエリである必要があります)
入力は検索クエリでと伝えるだけでGoogleなどで使える半角スペース区切りの単語単位での検索クエリを作成してもらえます。
これによってChatGPTは時事問題に関するものは、Searchツールを使うことを考えるようになります。
進め方とフォーマットを伝える
Use the following format:\n\n
Question: the input question you must answer\n
Thought: you should always think about what to do\n
Action: the action to take, should be one of [Search, Calculator]\n
Action Input: the input to the action\n
Observation: the result of the action\n
Question:質問内容を記載します
Thought:何をすべきかを常に考える必要がある
アクションを考えるように指示していますAction: 実行するアクションは、 [Search, Calculator]のいずれかである必要があります
アクション名が出てきました。これはツール名と同じです。ここは重要なポイントです。ChatGPTからActionの指示が出る際には[Search,Calculator]のキーワードが出力されます。Action Input: アクションへの入力
Searchの場合は指示されたクエリ形式で入力します。例えば「東京 渋谷」などですObservation:Actionの結果です
単にアクションの結果が表示されます
... (this Thought/Action/Action Input/Observation can repeat N times)\n
Thought: I now know the final answer\n
Final Answer: the final answer to the original input question
(this Thought/Action/Action Input/Observation can repeat N times)
Thought/Action/Action Input/ObservationはN回繰り返すことができます。と書いています。これはAPI料金や答えが出ない場合の打ち切りなどでNを指定することも可能ということになりますThought:回答が判明したら下記に進みます
Final Answer:最終的な回答をします
Begin!\n\n
Question: 現在の日本の首相の年齢から現在のフランスの首相の年齢を引いたらいくつですか? 計算してくだい\nThought:')
ここで質問を開始します。
Begin!の後に質問が記載されています。
質問の形式はすでに指定した形式[Question:]からスタートするものから入力しています。
最後に次のタスクを促す[Thought:]で締めくくらています。
Actionの実装方法は、もうわかりましたね
プロンプトの構造を見てきました。フォーマットは一定のものであることがわかります。フォーマットが定型化されているので、Actionを実装するにあたり、ChatGPTから返却される回答の内容を、正規表現などで取り出すことが可能となります。
今回はSearchかCalculatorというキーワードがActionのトリガーになります。Searchの場合はChatGPTが作成した検索クエリをGoogleなどで検索をするツールを実装することでAcitonを実現します。
実行結果例の検証
> Entering new AgentExecutor chain...
I need to find out the age of the current Japanese and French Prime Ministers
Action: Search
Action Input: "age of current Japanese Prime Minister"params
Observation: 65歳
Thought: Now I need to find out the age of the current French Prime Minister
Action: Search
Action Input: "age of current French Prime Minister"params
Observation: 61歳
Thought: I now know the final answer
Final Answer: 4歳
実行結果を見てみましょう。
Action:Search
Action:Searchで検索ツールを使って検索することを考えました。
Action Input:age of current Japanese Prime Minister
検索クエリをChatGPTが作成しました
ここで、実際にはGoogleなどで検索するツールが実行され、検索を実行します。検索の実行は当然ChatGPTが実行するわけではありません。
ChatGPTの回答であるAction:Searchを文中で見つけ、実行する仕組みが必要です。
Observation: 65歳
結果から年齢65歳を得ました
指定したように Thought/Action/Action Input/Observationは繰り返す事が可能です。
Thought: I now know the final answer
Final Answer: 4歳
最後には結論が得られました。
次回につづく
いかがでしたでしょうか。私は想像していたよりも、単純な実装で実現できることに驚きました。プロンプトコーディングと文字列の操作だけで、高度に見える処理ができていますね。次回は、さらに実装について詳しく掘り下げます。特に、自分の思い通りのAgentを実装する方法について理解できるようになりたいと-思っています。
(次回はこちらです)