Baby-AGIなるAI連動型の推論システムを評価してみた

2023年04月17日 月曜日


【この記事を書いた人】
とみ(とみーとも言う)

地方拠点の一つ、九州支社に所属しています。サーバ・ストレージを中心としたSI業務に携わってましたが、現在は技術探索・深堀業務を中心に対応しています。 2018年に難病を患ったことにより、定期的に入退院を繰り返しつつ、2023年には男性更年期障害の発症をきっかけに、トランスジェンダーとしての道を歩み始めてます。

「Baby-AGIなるAI連動型の推論システムを評価してみた」のイメージ

名前がアツいよね。

BabyとはいえAGI(Artificial General Intelligence:汎用人工知能の略。男性の頭が薄くなるのはAGA。)。
実はこうした実行計画・調査・追加調査事項の抽出といったタスク管理を含めた総合的な動作をNLPモデルに行わせつつ、本来はn-CTXと呼ばれるインプットレイヤーのトークン数しか情報が入れられない環境下でも長期記憶を持たせて適切な回答をさせるようなものが増えました。今回、その中でも仕組みがわかりやすく作られていた https://yoheinakajima.com/task-driven-autonomous-agent-utilizing-gpt-4-pinecone-and-langchain-for-diverse-applications/ に示されています、BabyAGIなるものを試してみることにしました。

Githubだとこちらです。

なお、記憶関係の情報をストックするためのベクトルDBなるものの準備が必要です。BabyAGIはPineconeというサービスを使用しています。
https://app.pinecone.io/ にアクセスしてみてください。動かすにはここでアカウントを作って最低限Freeプランが使えるようにする必要があります。その他動作させるまでに必要な事項はBabyAGIのGitHubリポジトリを参照するとよいでしょう。

処理を追いかけてみた結果としては

メインルーチンの処理を追いかけてみると、こんなつくりになってました。

処理全体を追いかけるとこんな感じ

入力する質問文はObjectiveという変数で定義され、この質問文をベースにGPT-Completion処理を行ってタスクを「抽出」します。

*****OBJECTIVE*****

[今年のWBCにおける日本優勝の勝因として考えられることを述べよ]

*****TASK LIST*****

1: Develop a task list

*****NEXT TASK*****

1: Develop a task list

*****TASK RESULT*****

1. Analyze the success rate of Japan's opponents in hitting against off-speed pitches, such as changeups and curveballs, during the WBC.
2. Identify the frequency and success rate of Japan's usage of off-speed pitches during the WBC.
3. Evaluate Japan's defensive strategy and identify any key factors that contributed to their successful defense during the WBC.
4. Analyze Japan's situational pitching decisions and identify any patterns or strategies that contributed to their success in crucial moments during the WBC.
5. Evaluate the performance of Japan's bullpen and identify any key contributors to their success during the WBC.
6. Analyze the impact of Japan's team chemistry and mental toughness on their success in the WBC.
7. Identify any key players or individual performances that contributed to Japan's success in the WBC.
8. Evaluate the impact of Japan's coaching staff and their strategic decisions on their success in the WBC.

こうして出てきたタスクリストに従い、優先順位を整理したうえで一つ一つタスク処理をしながら、新たに疑問が生まれた場合は新規タスクを追加しつつ質問と回答をChat-Completion処理を通じて行わせていくという形になってました。ペーパーではGPT-4が前提になってましたが、GPT-3.5-Turboでも十分動いてくれます。ただ、n-CTX長が短いのか、途中で途切れたりというのが結構ありましたので、精度はいまいちかもしれず、確かにGPT-4で実行したほうが最適なのかもしれません。

エージェントの命はプロンプト

このBabyAGIでは厳密には4種類のエージェントがいます。

  • 文字列とベクトル間の変換処理を担うContextAgent
  • タスクの優先順位を設定するPrioritization Agent
  • タスクの作成を行うTask Creation Agent
  • 実際に質問に対する回答を要求するExecute Agent

Context Agent

Context AgentはベクトルDBであるPineConeというサービスとプログラムの間に立って、GPT-3の埋め込みモデルの最新版であるtext-embedding-ada-002-v2を使って文字・単語の内容をベクトル化したりその逆のことをしたりします。ベクトルDBとかベクトル化とかそんな話が挙がってきましたので、まずはこれについて説明します。

知識データベースとしてベクトルDBを使用する

通常、ChatGPTに代表されるようなGPT系AIはChatGPTでチャットボットを作る-OpenAI純正APIの利用にて述べたように、すべての前提情報、質問を1つの枠に詰め込む必要があり、GPT自身が学習してないデータの補填はそこから行わなければなりませんし、その情報を使いたければ投げる都度必ずその投入情報の中に前提情報として詰め込んであげる必要があります。つまり一時的に補填する情報を人工知能は覚えてくれません。これは、現在のニューラルネットワーク及びDeepLearningの構造上の問題であり、これ自体をどうこうすることでそれを改善するのはなかなか難しいものがあります。

そこで、別途DBを作成して保存し、質問文字列の内容に合わせてそのデータを取り出してContextに盛り込めば、ユーザに向けた最適な解を投げることができるのではないか?というときにベクトルDBが役に立ちます。

ちょっと違う手段ではありますが、過去投稿したChatGPTを使ったチャットボットには、会話履歴だけを保存するRDB(PostgreSQL)を作成し、クッキーIDをキーにしてユーザを識別、そのユーザが過去に会話した履歴を最新から10件ほど取得してチャットボットの会話に役立てるといったことをしていましたが、さらに広範囲の利用を考えるのであればベクトルDBの方が楽です。

ベクトルDBとのかかわり方さて、上の図で示してるように、OpenAI GPTにおいて、モデルごとにトークン量が変動するのはなぜ?で取り扱った話のように、何か知識をベクトルDBに保存する際はまず、Tokernizerを通じて文字列をトークン化します。そしてそのトークン化した文字列をEmbedding処理というものを行い、多次元ベクトルの塊にしていきます。この塊に変換してくれるのがtext-embedding-ada-002-V2というGPT-3系の最軽量モデルから派生したとても優秀なモデルです。この辺りの処理は内製することも可能なのですが、やはり大きなベクトル情報に変換するため、それなりのGPUが必要になってくるのですが、そうしたものを安価にAPIを通じてササッと変換してくれるため、このモデルを利用するケースが多いのかなと思います。

そのまま文字をツッコんだらいいじゃん?そしたら一々AI使わずに済むのに・・・と思うのも無理はありませんよね。確かにベクトルの変換と戻しには、実はContextをCompletion処理において実装する段階では全く関与しておらず、その前段階で処理が閉じてるんです。
でもこちらの方が単純にできるんです。その理由はずばり「検索が楽」であることにつきます。

ベクトル近似度を用いた検索のおいしいところ

例えば何か質問文を投げる、じゃぁ知識DBから関連しそうな情報を取り出す・・となった際、いったいどうやって質問文から関連しそうなデータをSELECTしますか?形態素解析をして、必要単語がそろう文字列を検出しますか?でもそれで必要な情報ってそろうでしょうか?

実はEmbeddingという処理を行うことですべての情報が数値化されるわけなんですが、以前から申し上げてるような「その文章の雰囲気・質問意図」といった、文章に含まれる「イメージ」そのものをキーにして検索することが可能になります。つまり、雰囲気というとっても抽象的な概念を用いて検索することができるようになるのです。そして、検索時はそのイメージの「類似度」を使います。つまり完全一致させる必要はなく、「多分これで合ってるんじゃない?」というのを確率的に出し、その候補を確率値と共に応答します。それによって、開発者はどの情報までをContextに盛り込むかを選択できますし、AIに対して多彩な回答を行わせることが可能になります。これが、ベクトルDBを知識DBとして使用する大きな理由です。

というわけで、PineConeはベクトル化された文字列情報を保存することで、所謂「人工知能向けの辞書」を形成します。人工知能は原則ベクトルを使用して文章を読取、内容の雰囲気(文脈)をつかみ、そして応答文を作成します。そのため、文章の意図にちゃんと沿ったものを人工知能に検索させたい場合、ベクトル情報をベースにしたほうがいろいろとやりやすいのです。

これ以外のエージェントはすべてChat-Completion処理をコアにしたプロンプトエンジニアリングを駆使して作られています。各エージェントに設定されているプロンプトテンプレートを以下の通り記載します。

Task Creation Agent

Task Creation Agentのプロンプトテンプレート

タスクを作らせるエージェントですが、単純に答えを求めるのではなく、既存タスクと重複しないように目的を達成するための中間地点ともいえるべき質問内容をGPTモデルにひねり出してもらう作りになっています。要は目的に達成するため必要となるような情報を分解して、解決策を模索してるようなものと思えばよいのではないでしょうか。

Prioritization Agent

Prioritization Agentのプロンプトテンプレート

もともと存在したタスクリストの内容において、一旦その内容をクリーニングして優先順位を振りなおす処理をGPTに要求しています。ここでも本来の目的であるObjectiveは必ず組み込まれています。ある意味タスクリストのレビュー役ですね。

Execution Agent

Execution Agent

Execution Agentの内容は非常にシンプルです。ちょうど以前チャットボットのアマテラスお嬢様を作った時のFew-shotプロンプトのつくりに似てるのかなぁという気がします。つまりは本当の意味でのQA部分ですね。ここでContextがベクトルDBより抽出され、Text-Embedding-Ada-002-V2で文字列に変換された状態で{context}内に保存されます。{task}部分にはタスクリスト内の調査事項が記載され、そのレスポンスを要求するという形になります。
ここでもObjectiveがしっかり存在し、目的を忘れないように作り込まれています。

動作結果

実際にやらせた内容を転載してみました。

開始序盤

処理の実行を開始すると、まずOBJECTIVEという見出しで入力したメッセージに始まり、そこからタスクリストの生成が始まります。
最初はDevelop a task listだけだったのですが、その処理を通じて8つのタスクが誕生しました。次にはこの順序が並び代わり、1番のタスクが開始されていきます。

$ ./babyagi.py ["今年のWBCにおける日本優勝の勝因として考えられることを述べよ"]

*****OBJECTIVE*****

[今年のWBCにおける日本優勝の勝因として考えられることを述べよ]

*****TASK LIST*****

1: Develop a task list

*****NEXT TASK*****

1: Develop a task list

*****TASK RESULT*****

1. Analyze the success rate of Japan's opponents in hitting against off-speed pitches, such as changeups and curveballs, during the WBC.
2. Identify the frequency and success rate of Japan's usage of off-speed pitches during the WBC.
3. Evaluate Japan's defensive strategy and identify any key factors that contributed to their successful defense during the WBC.
4. Analyze Japan's situational pitching decisions and identify any patterns or strategies that contributed to their success in crucial moments during the WBC.
5. Evaluate the performance of Japan's bullpen and identify any key contributors to their success during the WBC.
6. Analyze the impact of Japan's team chemistry and mental toughness on their success in the WBC.
7. Identify any key players or individual performances that contributed to Japan's success in the WBC.
8. Evaluate the impact of Japan's coaching staff and their strategic decisions on their success in the WBC.

中盤

答えが見つかると、今度その結果から新しくタスクリストに追加するネタがないか?という処理がTask Completion Agentによって行われ、あればTASK LISTに追加されます。その後リストの順序整理が行われた後、NEXT TASKとして1番のタスクから処理が始まります。これが、ちょっと意地悪な表現をすると「BabyAGIの気が済むまで繰り返され続ける」と言う感じになります。

*****NEXT TASK*****

1: Investigate the role of Japan's starting pitchers in their success during the WBC.

*****TASK RESULT*****

Based on my analysis of Japan's success during the WBC, I can confirm that their starting pitchers played a crucial role in their victory. Japan's pitchers were consistently dominant throughout the tournament, allowing only a few runs in each game and setting the tone for the team's overall success. The starting pitchers displayed exceptional control, accuracy, and strategic thinking, which allowed them to neutralize the opposing teams' offenses and put their own team in a position to win. Additionally, Japan's pitching coach was instrumental in developing and implementing a winning pitching strategy that took advantage of the strengths of the team's pitchers. Overall, Japan's starting pitchers were one of the primary reasons for their success at the WBC this year.

*****TASK LIST*****

1: Investigate the impact of Japan's offensive performance during the WBC and its impact on their success.
2: Analyze the role of Japan's fielding and base running in their success during the WBC.
3: Evaluate the impact of Japan's batting order and strategy on their success during the WBC.
4: Investigate the influence of Japan's team morale and motivation on their success during the WBC.
5: Analyze the role of Japan's scouting and preparation for opponents in

*****NEXT TASK*****

1: Investigate the impact of Japan's offensive performance during the WBC and its impact on their success.

*****TASK RESULT*****

Based on the analysis of the previous tasks, Japan's success during the WBC can be attributed to their starting pitchers, team culture, and pitching strategy. However, their offensive performance also played a significant role in their success.

Japan had a strong batting lineup that consistently produced runs throughout the tournament. They scored a total of 44 runs in 9 games, averaging almost 5 runs per game. This offensive output helped to relieve pressure on their pitching staff and allowed them to play with more confidence.

In addition to their overall run production, Japan's ability to come through in clutch situations was also a key factor in their success. They had several walk-off wins and were able to score runs late in games to secure victories.

Overall, Japan's offensive performance was a crucial component of their success during the WBC. Their ability to consistently score runs and come through in clutch situations helped to complement their strong pitching and team culture, ultimately leading to their championship victory.

*****TASK LIST*****

1: Analyze the role of Japan's scouting and preparation for opponents in their success during the WBC.
2: Evaluate the impact of Japan's batting order and strategy on their success during the WBC.
3: Investigate the influence of Japan's team morale and motivation on their success during the WBC.
4: Examine the impact of Japan's bullpen on their success during the WBC.
5: Investigate the role of Japan's coaching staff on their success during the WBC.

終盤

およそ10分程度経過したころ、表示更新が止まりました。

Overall, Japan's batting order and strategy played a critical role in their success during the WBC. By carefully selecting their lineup and adopting a versatile approach to hitting, they were able to consistently generate offense and put pressure on opposing pitchers. This, in turn, allowed their strong pitching and defense to shine, ultimately leading to their victory in the tournament.

*****TASK LIST*****

1: Investigate the influence of Japan's team morale and motivation on their success during the WBC.
2: Examine the impact of Japan's bullpen on their success during the WBC.
3: Investigate the role of Japan's coaching staff on their success during the WBC.
4: Analyze the role of Japan's starting pitchers in their success during the WBC.
5: Examine the role of Japan's defense in their success during the WBC.
6: Investigate the

*****NEXT TASK*****

1: Investigate the influence of Japan's team morale and motivation on their success during the WBC.

*****TASK RESULT*****

Based on the analysis of Japan's success during the WBC, it can be inferred that team morale and motivation played a significant role in their victory. Japan's team culture, pitching strategy, and batting order were all factors that contributed to their success. However, their ability to maintain a high level of team morale and motivation throughout the tournament was a key factor in their overall success. Japan's players exhibited a strong sense of unity and determination, which helped them overcome challenges and perform at a high level. Additionally, their coaching staff played an important role in fostering a positive team environment, which helped to boost morale and motivation. Overall, Japan's success in the WBC can be attributed to a combination of factors, including their team culture, pitching strategy, batting order, and team morale and motivation.

この状態で更新されないまま10分程度さらに放置しましたが、PineConeに対するAPIアクセスもOpenAIに対するAPIアクセスも発生しなかったので、どうやら気が済んだ状態となっているようで、どうやらこれがファイナルアンサーっぽいです。

最後のTASK RESULTを日本語に訳すとこうなりました。

WBCでの日本の成功を分析した結果、チームの士気とモチベーションが勝利に大きく貢献したことが推測される。日本のチーム文化、投手戦略、打順はすべて成功に貢献した要因であった。しかし、大会期間中、チームの士気とモチベーションを高いレベルで維持できたことが、勝利の重要な要因であった。日本の選手たちは強い団結力と決意を示し、それが困難を克服して高いパフォーマンスを発揮することにつながった。また、コーチングスタッフは、前向きなチーム環境の醸成に重要な役割を果たし、士気とモチベーションを高めるのに貢献した。 WBCでの日本の成功は、チーム文化、投手戦略、打順、チームの士気やモチベーションなど、さまざまな要因が絡み合って生まれたと言えるでしょう。

具体的にどの選手がすごかったとか出てこなかったのは、おそらくは外部検索を行ってない影響だと思います。ベクトルDB側に何かしらの現在の情報を埋め込めばある程度改善される可能性はありますが、おそらくは2021年9月時点の情報だけでGPTが勝負してるのではないかと推察しています。実際に活用する際はベクトルDB側に何らかの情報を蓄積させておく必要がある、もしくはBing-SearchやGoogle CSEといった仕組みで最新情報を拾いに行くスキームが必要になるでしょう。

それでも、ZeroshotやStuffing方式によるFew-shotよりも良い内容が返ってきているように思えます。

プロンプトエンジニアリングへの依存度は確実に上がっている

基本、この手の課題抽出や課題整理といったスケジューリング機能は人がものすごく汗水を垂らしてロジックを考え、実装しているケースが多かったように思います。その重要度判別ってコンピュータにわからせるには非常に難しいものが以前はあったのです。ところが、そのあたりのかゆいところに手を届かせたのが大規模LLMなのかと思うと正直びっくりします。

だって英語でちょちょいと指示出したら勝手にやってくれるんだもの。こりゃ確かにエンジニア仕事減るんじゃない?とか言われても「ぐむむむ」となったりすることもないとは言い切れなくなっちゃったなーと感じています。大規模化することでファインチューニングは非常に難しくなってしまいましたが、このようにベクトルDBによる近傍探索(主にCos類似度が使われるっぽい)を応用した、「コンピュータ側の基準で近似性を判断させる」という仕組みは、長期記憶を持たせかつ記憶管理の主体をはっきりさせることができるという意味で、とても分かりやすく使いやすい機能なんだろうなと感じています。

私自身実はこれの原型ともいえる仕組みを作って知識の蓄え方などを調べているところです。この辺りの動かし方は最近OSSで話題に上がってるLangChainというライブラリが非常にうまいこと制御してくれています。(https://python.langchain.com/en/latest/index.html)RetrievalQAという仕組みを使ってQAボットを作ろうとしているのですが、Azure OpenAIとの相性が悪かったりでいろいろ苦労しながら進めているところです。

とある検索連動型QAロボット

しかしながら、自分自身がこうやってあくせくしてる間によそ様はさらに進化した代物をサラッと作ってOSS化してるわけで。自分がこの仕組みを普通に乗せたのも結局それを上回るOSSがごろごろ転がっていて秘匿するのがあほらしくなってきたからというのがあります(どうせ試作品の域だし)。いやはや、日々時計の針の回転速度が速くなっていき、下手すれば張りを止めようと指ツッコんだらその指がスパーンと切断されそうな勢いだなーとつくづく感じます。そして、正直なところ、プロダクトを発案・開発までしっかりできてる方々を非常に羨ましく思います。

ついでに:text-embedding-ada-002の取り扱いに困ってた皆様へ

なお、参考になればなのですが、2023/4/3時点までMicrosoft OpenAI Serviceは埋め込み用のAIモデルである text-embedding-ada-002-V2 がリリースされていませんでした。そのため、LangChainでtext-embedding-ada-002を使おうとしたときに正常に動作せずに頭を抱えた人が相当数いらっしゃったようです。私も昨日Microsoft Docsで突然修正されたドキュメント見てみたら、最近になってV2登場したんじゃないか!と気づいてコードを修正したら普通に動き出すという何とも言えない気持ちになっちゃう経験をしたところです。

既存でAdaをベースにしたモデルをデプロイしている場合、一度削除していただき、再度text-embedding-ada-002をデプロイしてみてください。その際、バージョンリストを開いてみると今まで見たことのなかった「2」がいます。こいつです。こいつじゃないとLangChain上のOpenAIEmbeddingクラスは正常に動きません。これは、OpenAI側の仕様として、OpenAIEmbeddingクラスで使用するモデルがV2を前提としているためです。

加えて注意が必要なのは、OpenAIEmbeddingクラスの引数に「chunk_size=1」が必要なことです。これはテキスト切り出しで使用するChunkのサイズとは異なり、どうやらAzure OpenAI Serviceに対して情報を送信するスロットルのような役割を果たすパラメータのようです。Microsoft側でこのスロットルには制限がかかっており、現状上限が1に設定されているとのことで、これに合わせる必要があるようです。その分、純正OpenAIのAPIを使用するよりもデータ変換速度が結構遅くなりますので、パフォーマンスの観点で少々懸念が出てきますね。

LangChainは進化が著しいプロダクトですので、仕様も今後ころころ変わると思います。同様に、Microsoft/OpenAIの仲はよいのか悪いのかよくわからないぐらい連動の仕方がよろしくなく、おいおい、君ら大丈夫か?って不安になりつつこうしたツールを活用し、効率化できるポイントを日々探し回ってる感じです。

とみ(とみーとも言う)

2023年04月17日 月曜日

地方拠点の一つ、九州支社に所属しています。サーバ・ストレージを中心としたSI業務に携わってましたが、現在は技術探索・深堀業務を中心に対応しています。 2018年に難病を患ったことにより、定期的に入退院を繰り返しつつ、2023年には男性更年期障害の発症をきっかけに、トランスジェンダーとしての道を歩み始めてます。

Related
関連記事