「ウィキペディアの知識を持つエージェントを備えたLLaMa 2を作成する」

「美容とファッションのエキスパートが書く、ウィキペディアを知り尽くしたLLaMa 2を作成する」

Wikipediaからの情報を検索して使用するために、リトリーバル強化生成を使用してLLaMa 2をパワーアップします。

Lysander Yuenによる写真

イントロダクション

大規模言語モデル(LLM)は、AIの最も注目されるトレンドの一つです。それらは、人間のユーザーと会話を続ける能力からコードの書き込みまで、印象的なテキスト生成能力を実証してきました。LLama、Falcon、Stable BelugaなどのオープンソースのLLMの台頭により、その潜在能力は幅広いAIコミュニティに利用可能になりました。それには、消費者向けのハードウェアで実行できるより小さく効率的なモデルの開発にも注力されています。

LLMの成功に貢献している主要な要素の一つは、革命的な論文で導入された有名なトランスフォーマーアーキテクチャです:Attention Is All You Need。最先端のLLMの印象的な性能は、このアーキテクチャを数十億のパラメータにスケーリングし、兆のトークンで構成されるデータセットを用いてトレーニングすることで実現されています。この事前トレーニングにより、人間の言語を理解できる強力な基礎モデルが得られ、特定のユースケースに対して更に微調整が可能となります。

大規模言語モデルの事前トレーニングは、自己教示学習の形式で行われます。大量のテキストのコーパスが必要ですが、人間のラベリングは必要ありません。これにより、自動的に生成できる巨大なデータセットでトレーニングをスケーリングすることが可能になります。入力テキストがトークンのシーケンスに変換された後、トークンごとに先行するすべてのトークンに基づいてシーケンス内の各トークンの確率を予測する目的で事前トレーニングが行われます。このようにして、トレーニング後、モデルは式に従ってテキストを自己回帰的に生成することができます。大規模言語モデルは、この事前トレーニングだけで印象的な言語能力を獲得することが示されています。しかし、トレーニングデータから学習した条件付き確率に従ってトークンをサンプリングすると、生成されたテキストは一般的には人間の好みに合わないため、LLMは特定の指示や意図の追従に苦労する場合があります。

LLMの生成テキストを人間の好みに合わせるための重要な進歩は、人間のフィードバックによる強化学習(RLHF)で達成されました。この技術は、ChatGPTなどの最新のチャットモデルの核心となっています。RLHFでは、初期の自己教示トレーニングフェーズの後、大規模言語モデルを強化学習アルゴリズムでさらに微調整して、人間の好みに合わせた報酬を最大化します。報酬関数を得るためには、補助モデルをトレーニングして人間の好みを反映したスカラー報酬を学習することが一般的です。これにより、強化学習フェーズに必要な実際の人間ラベル付きデータ量を最小限に抑えることができます。報酬モデルのトレーニングデータは、人間によって評価された好みに従ってランク付けされた生成テキストで構成されます。モデルは、より高い順位のテキストに対してより高い報酬を予測するように目指します。人間の好みを反映した報酬を最大化する目的でLLMをトレーニングすることは、人間の意図により一致したテキストの生成に結び付くはずです。実際に、人間のフィードバックから強化学習された大規模言語モデルは、ユーザーの指示によりよく従い、同時に毒性が少なく、真実味のあるテキストを生成することが示されています。

リトリーバル強化生成

大規模言語モデルの典型的な欠点の一つは、オフラインでトレーニングされるため、トレーニングデータ収集後に発生したイベントに関する情報がないということです。同様に、トレーニングデータに存在しなかった特定の知識を使用することもできません。これは特定のドメインにおいて問題となることがあります。なぜなら、LLMをトレーニングするために使用されるデータは通常、一般的なドメインのコーパスから取得されるためです。高価な微調整を必要とせずに、この問題を回避する方法の一つが、リトリーバル強化生成(RAG)です。RAGは、LLMに供されるプロンプトを外部のテキスト情報で拡張することによって機能します。通常、これは現在のプロンプトと関連性に基づいて外部データソースから取得されます。実際の手順としては、まず、プロンプトと外部テキストをベクトル埋め込みに変換することです。後者は、意味が似ている意味を持つテキストを埋め込みとしてマッピングするように学習されたトランスフォーマーエンコーダモデル(BERTなど)の出力をプーリングすることによって得られます。長いテキストの場合、それらを個別に分割し、個々に埋め込まれることで最も関連性の高いパッセージを取得することができます。次に、プロンプト埋め込みに最も近い埋め込みを持つテキストがリトリーブされます。適切なフォーマットにしたがって、プロンプトとリトリーブされたテキストを連結し、言語モデルへの入力とします。

Retrieval Augmented Generation(RAG)では、モデルはトレーニング中に利用できなかった情報にアクセスすることができ、選択されたテキストのコーパスに基づいて回答を行います。RAGはまた、モデルが回答するために使用したソースを検査することも可能にし、人間のユーザーによるモデルの出力のより直接的な評価を可能にします。

このブログ記事では、LLMsが外部情報を検索して使用する能力を示すために、Wikipediaから取得したコンテンツに基づいて回答を行うことができるシンプルなエージェントの作成方法を説明します。ユーザーからのプロンプトを受け取り、モデルはWikipedia上の適切なページを検索し、そのコンテンツに基づいて回答します。フルコードはこのGitHubリポジトリで提供しています。

Wikipediaのコンテンツを追加したLlama 2エージェント

このセクションでは、Wikipediaから取得した情報に基づいて質問に回答するシンプルなLlama 2エージェントの作成手順について説明します。具体的には、エージェントは以下のようなステップを実行します。

  • ユーザーの質問に関連するWikipediaのページを検索するための適切なクエリを作成します。
  • Wikipediaで見つかったページの中で、ユーザーの質問に最も関連性の高いコンテンツを取得します。
  • 取得したページから、ユーザーのプロンプトに最も関連性の高い抜粋を抽出します。
  • ページからの抜粋に基づいて、ユーザーの質問に回答します。

なお、より一般的には、モデルは最も関連性の高いページの全コンテンツや、ユーザーのプロンプトに関連性の高い複数の抜粋と共にプロンプトを受け取ることもできます。これにより、モデルの回答の品質が向上する可能性がありますが、メモリが必要となるため、プロンプトが長くなることに注意してください。簡単さと無料のGoogle Colab GPUで実行するために、私はエージェントが最も関連性の高い記事からわずかな抜粋のみを使用することに制限しています。

では、さまざまなステップについて詳しく掘り下げてみましょう。最初のステップは、エージェントがWikipediaからコンテンツを取得するために適切な検索クエリを作成することです。そのためには、Llama 2チャットモデルにプロンプトを与え、ユーザープロンプトを表すキーワードを返すように依頼します。具体的なプロンプトの記述に入る前に、Llama 2チャットモデルの一般的なプロンプトの形式について簡単に説明します。

トレーニング手順で使用されたテンプレートは次のような構造をしています:

<s>[INST] <<SYS>>{{ system_prompt }}<</SYS>>{{ user_message }} [/INST]

{{ system_prompt }}は、チャットモデルの挙動を後続のプロンプトに対して指定するもので、さまざまなタスクに対してモデルの回答を適応するのに役立ちます。{{ user_message }}は、ユーザーの質問で、モデルが回答する対象です。

Wikipediaの検索クエリを取得する問題に戻ると、エージェントは次のプロンプトを使用してLlama 2モデルを使用します:

<s>[INST] <<SYS>>You are an assistant returning text queries to search Wikipedia articles containing relevant information about the prompt. Write the queries and nothing else.Example: [prompt] Tell me about the heatwave in Europe in summer 2023 [query] heatwave, weather, temperatures, europe, summer 2023.<</SYS>>[prompt] {prompt} [/INST] [query]

{prompt}は、生成前にユーザーの入力に置き換えられます。システムプロンプトの一部として提供される例は、モデルのインコンテキスト学習能力を活用することを目的としています。インコンテキスト学習とは、モデルがプロンプトの一部として提供されるいくつかのデモ例に基づいて新しいタスクを解決する能力を指します。このようにすることで、私たちがモデルに対して、[query]の後のテキスト内で区切り文字としてコンマで区切られた、プロンプトに関連性のあるキーワードを提供することを期待していることを学習させることができます。それは例の入力の一部として既に提供されているため、モデルはそれに続く部分のみを生成する必要があります。

モデルの出力からクエリが取得されたら、それらはWikipediaを検索し、返されたページのメタデータとテキストを取得するために使用されます。この記事に添付されたコードでは、wikipediaパッケージを使用しました。これは、MediaWiki APIをラップしたシンプルなPythonパッケージであり、Wikipediaからデータを検索して取得するために使用されます。

検索結果からテキストを抽出した後、元のユーザープロンプトに最も関連性のあるページが選択されます。これにより、モデルが生成した検索クエリから生じる分岐を排除する可能性があります。そのために、ユーザーのプロンプトと検索結果のページの要約を埋め込み、ベクトルデータベースに保存します。ユーザーのプロンプトに最も近い埋め込みを持つ記事が取得されます。埋め込みモデルには、文ベクトルのSentence Transformers all-MiniLM-L6-v2モデルを使用し、統合はlangchainパッケージによって提供されるFAISSベクトルデータベースを使用しました。

Wikipediaから関連するページを見つけた後、その全文をプロンプトに追加するとメモリを多く必要とすることがあります(またはコンテキストの長さのためにモデルのトークン制限を超えるかもしれません)。この場合、エージェントはプロンプトを増強するために最も関連性のある抽出を見つけます。これはまずページのテキストをチャンクに分割し、前述のようにベクトル空間に埋め込み、プロンプトの埋め込みに最も近いものを取得します。チャンクの埋め込みには再びall-MiniLM-L6-v2モデルを使用し、保存および取得にはFAISSベクトルデータベースを使用しました。

記事から取得した抜粋をユーザーのプロンプトと組み合わせてLlama 2モデルに送信し、回答を得ることができます。入力に使用するテンプレートは次のとおりです

<s>[INST] <<SYS>>You are a helpful and honest assistant. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content.You have retrieved the following extracts from the Wikipedia page {title}:{extracts}.You are expected to give truthful answers based on the previous extracts. If it doesn't include relevant information for the request just say so and don't make up false information.<</SYS>>{prompt} [/INST]

生成前に、{prompt}はユーザープロンプトで、{title}はWikipediaページのタイトルで、{extracts}は抽出された抜粋で置き換えられます。モデルのインコンテキスト学習の能力を再度利用するために、いくつかの例を提供することもできますが、それによってプロンプトが大幅に長くなり、メモリ要件が増えてしまいます。

では、モデルがトレーニング時に存在しなかった最新の情報をWikipediaから抽出して回答できるかどうかを確認しましょう。次の例は、Google Colabの無料版GPU上で動作するLLaMa 2の最小チャットバージョンを使用して取得されたものです。

モデルに次のプロンプトを与えました:

prompt: "マラケシュの地震について教えてください"

モデルはWikipediaで検索するために次のクエリを作成しました:

"地震、マラケシュ、モロッコ、最近の地震、地震活動"

最も関連性のあるページから抜粋を抽出した後、モデルは次の回答を返しました:

2023年9月8日にマラケシュで発生した地震は、その地域で広範な破壊と人命の喪失を引き起こした悲劇的な出来事でした。Wikipediaで提供された情報によると、この地震のモーメント・マグニチュードは6.8-6.9であり、最大メルカリ・インテンシティはVIII(深刻)で、モロッコで記録された地震としては最も強力なものであり、1960年のアガディール地震以来の最も致命的なものです。地震の震源地はマラケシュからおおよそ45マイル(73.4キロメートル)南西に位置し、アトラス山脈のイールとオカイメデンスキーリゾートの近くです。この地震は山脈の下にある浅い斜めスラスト断層によって発生しました。世界保健機関によると、マラケシュとその周辺地域のおよそ30万人、その中には10万人の子供も含まれて、地震の影響を受けました。地震による死者は少なくとも2,946人であり、その大部分はマラケシュの外で発生しました。Wikipediaで提供されている情報は、利用可能なデータに基づいており、網羅的または最新の情報であるとは限りません。具体的な質問がある場合は、お知らせください 

エージェントはまた、回答に使用したページのメタデータと抜粋も返します。これにより、ユーザーは正確さをチェックし、元のページを読んで詳細を確認できます。前の回答のメタデータは次の通りです

RETRIEVED WIKIPEDIA PAGE: title: 2023 Marrakesh–Safi earthquake url: https://en.wikipedia.org/wiki/2023_Marrakesh%E2%80%93Safi_earthquakeRetrieved extracts: Extract_0:Earthquake aftermath in Marrakesh and Moulay Brahim  Extract_1:.Damage was widespread, and historic landmarks in Marrakesh were destroyed.The earthquake was also felt in Spain, Portugal, and Algeria.It is thestrongest instrumentally recorded earthquake in Morocco, the deadliest inthe country since the 1960 Agadir earthquake and the second-deadliestearthquake of 2023 after the Turkey–Syria earthquake. The World HealthOrganization estimated about 300,000 people from Marrakesh and thesurrounding areas were affected, including 100,000 children  Extract_2:On 8September 2023 at 23:11 DST (22:11 UTC), an earthquake with a momentmagnitude of 6.8–6.9 and maximum Mercalli intensity of VIII (Severe) struckMorocco's Marrakesh–Safi region. The earthquake's epicentre was located73.4 km (45.6 mi) southwest of Marrakesh, near the town of Ighil and theOukaïmeden ski resort in the Atlas Mountains. It occurred as a result ofshallow oblique-thrust faulting beneath the mountain range. At least 2,946deaths were reported, with most occurring outside Marrakesh

結論

この投稿では、ユーザーのプロンプトに応えることができるシンプルなエージェントの作成方法を説明しました。このエージェントは、Wikipediaで検索し、取得したページに基づいて回答を提供することができます。シンプルながらも、最小のLlama 2 7Bモデルでも最新かつ正確な回答を提供することができます。エージェントは、生成した回答に使用したページからの抜粋も返すため、ユーザーはモデルによって提供された情報の正確性を確認し、完全な元のページを読むことで詳細を探ることができます。

Wikipediaは、トレーニングデータには存在しなかった外部情報をLLMエージェントが探索して使用する能力を示す興味深いプレイグラウンドですが、同じアプローチは外部知識が必要な他の設定でも適用することができます。たとえば、最新の回答が必要なアプリケーション、トレーニングデータに存在しない特定の知識が必要な分野、または私的な文書からの情報の抽出などです。このアプローチは、LLMと人間の協力の可能性も明示しています。モデルは非常に大きな外部知識ベースから関連情報を迅速に検索して意味のある回答を返すことができますが、人間のユーザーはモデルの回答の妥当性を確認し、元のソースを検査することで問題により深く入り込むことができます。

この投稿で説明したエージェントの直接的な改善方法は、複数の異なるページからの抜粋を組み合わせてモデルにより多くの情報を提供することです。実際、複雑なプロンプトの場合、1つのWikipediaページから情報を抽出するだけでなく、複数のページから情報を抽出することが役立つ場合があります。コンテキストの長さによるメモリ要件の増加は、GPTQなどの量子化技術を実装することで部分的に相殺することができます。検索結果と取得したコンテンツを考慮したモデルが最終回答をユーザーに提供する前に、リーズニングとアクティングをシナジー的に組み合わせるためのReActフレームワーク(例えば、論文「ReAct: シナジーを生み出す言語モデルでのリーズニングとアクティング」で説明)を導入することで、結果をさらに改善することができます。この方法では、異なるページから最も関連性の高いパッセージを繰り返し収集し、不要なパッセージを破棄し、さまざまなトピックからの情報を組み合わせるモデルを構築することが可能です。

お読みいただきありがとうございました!

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more