Connect with us

人工知能

LlamaIndex: カスタムデータを簡単にLLMアプリケーションに追加する

mm
LlamaIndex

大規模言語モデル(LLM)であるOpenAIのGPTシリーズは、多様な公開データでトレーニングされており、テキスト生成、要約、質問回答、計画などで優れた能力を示しています。しかし、これらのモデルをカスタム、プライベート、または独自のデータとシームレスに統合する方法については、頻繁に質問されます。企業や個人は、Notion、Slack、Salesforceなどのアプリケーションや、個人ファイルに格納されている独自のカスタムデータで溢れています。これらのデータをLLMで利用するために、いくつかの方法が提案され、実験されてきました。Fine-tuningは、そのようなアプローチの1つであり、特定のデータセットからの知識を組み込むために、モデルの重みを調整することを含みます。しかし、このプロセスは容易なものではなく、データの準備に多大な労力が必要であり、最適化プロセスも難しく、機械学習の専門知識が必要です。また、大規模なデータセットを扱う場合、コストの影響も大きくなります。コンテキスト学習は、代替手段として登場しました。入力とプロンプトを工夫して、LLMに正確な出力を生成するために必要なコンテキストを提供することを優先します。このアプローチにより、広範なモデルの再トレーニングの必要性が軽減され、プライベートデータを統合するためのより効率的でアクセスしやすい手段が提供されます。しかし、このアプローチには、ユーザーのスキルと専門知識、特にプロンプトエンジニアリングの専門知識に依存するという欠点があります。また、コンテキスト学習は、特に専門的または技術的なデータを扱う場合、ファインチューニングほど正確または信頼性が高いとは限りません。モデルの事前トレーニングは、インターネットテキストの広範な範囲に対して行われるため、特定のジャーゴンやコンテキストを理解することを保証するものではなく、不正確または無関係な出力につながる可能性があります。これは、プライベートデータがニッチなドメインまたは業界から来た場合に特に問題です。また、1つのプロンプトで提供できるコンテキストの量は限られており、タスクの複雑さが増加すると、LLMのパフォーマンスが低下する可能性があります。さらに、提供されたプロンプト内の情報が機密性の高い可能性があるため、プライバシーとデータセキュリティも課題です。コミュニティがこれらのテクニックを探求するにつれて、LlamaIndexのようなツールが注目されています。LlamaIndexは、Jerry Liuによって開始されました。Liuは、Uberの元研究科学者です。GPT-3を実験していた際、Liuは、プライベートデータ、たとえば個人ファイルを扱うモデルの限界に気づきました。この観察が、オープンソースプロジェクトLlamaIndexの始まりとなりました。この取り組みは、投資家の注目を集め、最近のシードラウンドで850万ドルを調達しました。LlamaIndexは、カスタムデータでLLMを拡張することを容易にし、事前トレーニングされたモデルとカスタムデータのユースケースの間のギャップを埋めます。LlamaIndexを使用すると、ユーザーはLLMで独自のデータを活用し、個別の洞察とともに知識の生成と推論を解放できます。ユーザーは、LLMに自分のデータをシームレスに提供し、知識の生成と推論が深く個別化された環境を作り出すことができます。LlamaIndexは、コンテキスト学習の限界を解決することで、データのやり取りに対してよりユーザーフレンドリーでセキュアなプラットフォームを提供し、機械学習の専門知識が限られている場合でも、ユーザーがプライベートデータでLLMの全潜在能力を活用できるようにします。

高レベル概念と洞察

1. Retrieval Augmented Generation (RAG):

RAGは、LLMをカスタムデータと結合してモデルの出力の精度を高めるために設計された2段階のプロセスです。このプロセスは、以下の段階で構成されます。

  • インデックス作成段階: この段階では、知識ベースの作成の基礎が整えられます。
  • クエリ段階: この段階では、知識ベースが検索され、LLMがクエリに回答するのを支援するために関連するコンテキストが抽出されます。

LlamaIndexを使用したインデックス作成:

  • データコネクタ: データコネクタは、LlamaIndexへのデータのパスポートと考えることができます。さまざまなソースと形式からのデータをインポートし、それらをシンプルな「ドキュメント」表現にカプセル化するのに役立ちます。データコネクタは、LlamaHubというオープンソースリポジトリ内にあります。このリポジトリには、簡単な統合を可能にするデータローダーが含まれています。
  • ドキュメント/ノード: ドキュメントは、さまざまなデータタイプ(PDF、API出力、データベースエントリなど)を保持できる汎用的なスーツケースと考えることができます。一方、ノードは、ドキュメントのスニペットまたは「チャンク」で、メタデータと他のノードとの関係情報が付加されており、将来のデータの精密な抽出のための堅牢な基礎を提供します。
  • データインデックス: データのインジェスト後、LlamaIndexはデータを検索可能な形式にインデックス化するのを支援します。背後では、生のドキュメントを中間表現に分解し、ベクトル埋め込みを計算し、メタデータを推測します。インデックスのうち、VectorStoreIndexが最も一般的に使用されます。

LlamaIndexのインデックスの種類: 整理されたデータのキー

LlamaIndexには、さまざまなニーズとユースケースに対応するさまざまな種類のインデックスがあります。これらのインデックスの核心には、先ほど説明したノードがあります。LlamaIndexのインデックスとそのメカニズム、応用について詳しく見てみましょう。

1. リストインデックス:

  • メカニズム: リストインデックスは、ノードをシーケンシャルにリストのように配置します。入力データをノードにチャンク化した後、それらは線形的に配置され、シーケンシャルに、またはキーワード、埋め込みでクエリできるようになります。
  • 利点: このインデックスタイプは、シーケンシャルクエリが必要な場合に輝きます。LlamaIndexは、LLMのトークン制限を超える場合でも、入力データの全容を活用することを保証し、各ノードからテキストをスマートにクエリし、回答を精査しながら下方向に進みます。

2. ベクトルストアインデックス:

  • メカニズム: ここでは、ノードがベクトル埋め込みに変換され、ローカルまたはMilvusのような専用のベクトルデータベースに保存されます。クエリ時に、最も類似したtop_kノードがフェッチされ、レスポンスシンセサイザーにチャネル化されます。
  • 利点: ワークフローがベクトル検索によるテキストの類似性に依存する場合、たとえば意味的類似性を比較する場合、このインデックスを使用できます。

3. ツリーインデックス:

  • メカニズム: ツリーインデックスでは、入力データが、元のデータチャンク(葉ノード)から下向きに構築されたツリー構造に進化します。親ノードは、GPTを使用して葉ノードの要約として現れます。クエリ時、ツリーインデックスはルートノードから葉ノードまで移動したり、選択した葉ノードから直接回答を構築したりできます。
  • 利点: ツリーインデックスを使用すると、長いテキストチャンクのクエリがより効率的になり、さまざまなテキストセグメントからの情報の抽出が簡素化されます。

4. キーワードインデックス:

  • メカニズム: キーワードインデックスの核心は、キーワードからノードへのマップです。クエリ時に、キーワードがクエリから抽出され、対応するノードのみがスポットライトに照らされます。
  • 利点: 明確なユーザークエリがある場合、キーワードインデックスを使用できます。たとえば、ヘルスケア文書をCOVID-19に関連する文書のみに絞り込むことができます。

LlamaIndexのインストール

LlamaIndexをインストールするのは簡単なプロセスです。Pipから直接インストールするか、ソースからインストールすることができます。(システムにPythonがインストールされていることを確認するか、Google Colabを使用します。)

1. Pipからのインストール:

  • 次のコマンドを実行します: pip install llama-index
  • : インストール中に、LlamaIndexはNLTKやHuggingFaceなどのパッケージのローカルファイルをダウンロードして保存する場合があります。これらのファイルを保存するディレクトリを指定するには、環境変数「LLAMA_INDEX_CACHE_DIR」を使用します。

2. ソースからのインストール:

  • まず、LlamaIndexリポジトリをGitHubからクローンします: git clone https://github.com/jerryjliu/llama_index.git
  • クローン後、プロジェクトディレクトリに移動します。
  • Poetryが必要です。パッケージの依存関係を管理するために使用されます。
  • 次に、Poetryを使用して仮想環境を作成します: poetry shell
  • 最後に、コアパッケージの要件をインストールします: poetry install

LlamaIndexの環境設定

1. OpenAI設定:

  • デフォルトでは、LlamaIndexはOpenAIのgpt-3.5-turboをテキスト生成に、text-embedding-ada-002を抽出と埋め込みに使用します。
  • この設定を使用するには、OPENAI_API_KEYが必要です。OpenAIのウェブサイトに登録し、新しいAPIトークンを作成してください。
  • 基礎となる大規模言語モデル(LLM)をプロジェクトのニーズに応じてカスタマイズする柔軟性があります。LLMプロバイダーによっては、追加の環境キーとトークンが必要になる場合があります。

2. ローカル環境設定:

  • OpenAIを使用しない場合、LlamaIndexは自動的にローカルモデルに切り替わります。テキスト生成にはLlamaCPPllama2-chat-13B、抽出と埋め込みにはBAAI/bge-small-enを使用します。
  • LlamaCPPを使用するには、提供されたインストールガイドに従ってください。GPUをサポートするllama-cpp-pythonパッケージをインストールすることを確認してください。この設定では、CPUとGPUを合わせて約11.5GBのメモリを使用します。
  • ローカル埋め込みの場合、pip install sentence-transformersを実行します。このローカル設定では約500MBのメモリを使用します。

これらの設定により、環境をOpenAIの力やローカルモデルを使用するように簡単に調整できます。これは、プロジェクトの要件とリソースに合わせてカスタマイズできます。

シンプルなユースケース: LlamaIndexとOpenAIを使用したWebページのクエリ

ここでは、Webページから特定の洞察を抽出するために、LlamaIndexとOpenAIを使用する方法を示すシンプルなPythonスクリプトを紹介します。

 !pip install llama-index html2text 
 import os from llama_index import VectorStoreIndex, SimpleWebPageReader # 以下にOpenAIキーを入力します。 os.environ["OPENAI_API_KEY"] = "" # WebページのURLを入力します。 url = "http://www.paulgraham.com/fr.html" # URLをドキュメントにロードします(複数のドキュメントが可能です)。 documents = SimpleWebPageReader(html_to_text=True).load_data([url]) # ドキュメントからベクトルストアを作成します。 index = VectorStoreIndex.from_documents(documents) # クエリエンジンを作成して、質問を投げかけることができます。 query_engine = index.as_query_engine() # 以下に質問を入力し、回答を印刷します。 response = query_engine.query("Paulが資金を調達するための3つのベストアドバイスは何ですか?") print(response) 
 Paulが資金を調達するための3つのベストアドバイスは、 1. 最初に低い数字から始めること。 2. 可能であれば、利益を上げることを目指すこと。 3. 価値を最適化しないことです。 

Google Colab Llama Index Notebook

Google Colab Llama Index Notebook

このスクリプトでは、Webページから特定の情報を抽出するための強力なツールを作成しました。これは、LlamaIndexとOpenAIを使用してWebデータを照会することのできることのただ一例です。

LlamaIndex vs Langchain: 目的別の選択

LlamaIndexとLangchainの選択は、プロジェクトの目的によって決まります。インテリジェントな検索ツールを開発したい場合は、LlamaIndexが適しています。LlamaIndexは、データのスマートなストレージメカニズムとして優れています。一方、ChatGPTのようなシステムをプラグイン機能で作成したい場合は、Langchainが適しています。Langchainは、複数のChatGPTインスタンスやLlamaIndexをファシリテートし、さらに機能を拡張することで、マルチタスクエージェントの構築を可能にします。たとえば、Langchainを使用すると、Pythonコードを実行しながらGoogle検索を行うことができるエージェントを作成できます。簡単に言えば、LlamaIndexはデータ処理に優れていますが、Langchainはツールのオーケストレーションを担い、包括的なソリューションを提供します。

LlamaIndex Logo Artwork created using Midjourney

LlamaIndex Logo Artwork created using Midjourney

私は過去5年間、機械学習とディープラーニングの魅力的世界に没頭してきました。私の情熱と専門知識は、AI/MLに特に焦点を当てた50以上の多様なソフトウェアエンジニアリングプロジェクトに貢献することにつながりました。私の継続的な好奇心は、私がさらに探究したい分野である自然言語処理にも私を引き寄せました。