🦙 LlamaIndex 0.9 : 理解 : ロードと LlamaHub (翻訳/解説)
翻訳 : クラスキャット セールスインフォメーション
作成日時 : 12/09/2023 (v0.9.12)
* 本ページは、LlamaIndex の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
🦙 LlamaIndex 0.9 : 理解 : ロード
選択した LLM がデータ上で作用できる前にそれをロードする必要があります。LlamaIndex がこれを行なう方法は、Reader とも呼ばれるデータコネクタを通して行われます。データコネクタは様々なデータソースからデータを取り込み、データを Document オブジェクトにフォーマットします。Document はデータ (現在はテキスト、将来的には画像と音声) とそのデータに関するメタデータのコレクションです。
SimpleDirectoryReader を使用したロード
使用するに最も簡単な reader は SimpleDirectoryReader で、これは与えられたディレクトリのすべてのファイルからドキュメントを作成します。それは LlamaIndex に組み込まれていて、マークダウン, PDFs, Word ドキュメント, PowerPoint デッキ, 画像, 音声と動画を含む様々なフォーマットを読むことができます。
from llama_index import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()
LlamaHub からの Reader の使用
データを取得可能な多くの場所があるので、それらはすべて組み込みではありません。代わりに、データコネクタのレジストリ, LlamaHub からそれらをダウンロードします。
このサンプルでは、LlamaIndex は DatabaseReader というコネクタをダウンロードしてインストールします、これは SQL データベースに対してクエリーを実行し、結果のすべての行を Document として返します :
from llama_index import download_loader
DatabaseReader = download_loader("DatabaseReader")
reader = DatabaseReader(
scheme=os.getenv("DB_SCHEME"),
host=os.getenv("DB_HOST"),
port=os.getenv("DB_PORT"),
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASS"),
dbname=os.getenv("DB_NAME"),
)
query = "SELECT * FROM users"
documents = reader.load_data(query=query)
LlamaHub には利用可能な数百のコネクタがあります!
ドキュメントのインデックス作成
通常は、この時点でロードを完了してインデックス作成に進むことができます。インデックスは .from_documents() メソッドを持ち、これは Document オブジェクトの配列を受け取りそれらを正しく解析してチャンクに分割します。けれども、どのようにドキュメントが分割されるか、より大きな制御を望む場合があるかもしれません。
ドキュメントをノードに解析する
内部的には、インデクサー (indexers) は Document を Node オブジェクトに分割します、これは Document に類似していますが (それらはテキストとメタデータを含みます)、親 Document への関係性を持ちます。
テキストが分割される方法は、返される結果の精度と関連性の点からアプリケーションのパフォーマンスに大きな効果を与える可能性があります。デフォルトは単純なテキストドキュメントに対しては上手く機能しますので、データがどのようなものかに依存して、ドキュメントが分割されるデフォルトの方法を変更することを望む場合があるかもしれません。
この例では、ドキュメントをロードしてから、カスタム chunk_size と chunk_overlap (1024 と 20 がデフォルト) で設定構成された SimpleNodeParser を作成します。それからノードパーサーを ServiceContext に割り当ててそれをインデクサーに渡します :
from llama_index import SimpleDirectoryReader, VectorStoreIndex, ServiceContext
from llama_index.text_splitter import SentenceSplitter
documents = SimpleDirectoryReader("./data").load_data()
text_splitter = SentenceSplitter(chunk_size=512, chunk_overlap=10)
service_context = ServiceContext.from_defaults(text_splitter=text_splitter)
index = VectorStoreIndex.from_documents(
documents, service_context=service_context
)
Tip : 思い出してください、ServiceContext は LlamaIndex の多くのパートに渡される configuration データの単純なバンドルです。
You can learn more about customizing your node parsing
ノードを直接作成して渡す
望む場合、ノードを直接作成してノードのリストをインデクサーに直接渡すことができます :
from llama_index.schema import TextNode
node1 = TextNode(text="", id_="")
node2 = TextNode(text="", id_="")
index = VectorStoreIndex([node1, node2])
ドキュメントからノードを直接作成する
IngestionPipeline を使用して、ノードがどのように作成されるかより多くの制御を持つことができます :
from llama_index import Document
from llama_index.text_splitter import SentenceSplitter
from llama_index.ingestion import IngestionPipeline
# create the pipeline with transformations
pipeline = IngestionPipeline(
transformations=[
SentenceSplitter(chunk_size=25, chunk_overlap=0),
]
)
# run the pipeline
nodes = pipeline.run(documents=[Document.example()])
You can learn more about the IngestionPipeline here.
ドキュメントのカスタマイズ
ドキュメントを作成するとき、クエリーステージで使用できる有用なメタデータをアタッチすることもできます。ドキュメントに追加されるメタデータは、そのドキュメントから作成されるノードにコピーされます。
document = Document(
text="text",
metadata={"filename": "", "category": ""},
)
More about this can be found in customizing Documents.
🦙 LlamaIndex 0.9 : 理解 : LlamaHub
データコネクタは LlamaHub 🦙 を通して提供されます。LlamaHub は、任意の LlamaIndex アプリケーション (+ エージェント・ツール、及び Llama Packs) に簡単にプラグインできる、オープンソースのデータコネクタのレジストリを含みます。
使用パターン
Get started with:
from llama_index import download_loader
GoogleDocsReader = download_loader("GoogleDocsReader")
loader = GoogleDocsReader()
documents = loader.load_data(document_ids=[...])
組み込みコネクタ : SimpleDirectoryReader
SimpleDirectoryReader. .md, .pdf, .jpg, .png, .docx, そして音声と動画タイプを含む広範囲のファイルタイプの解析をサポートできます。それは LlamaIndex の一部として直接利用可能です :
from llama_index import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()
利用可能なコネクタ
LlamaHub を直接ブラウズして利用可能な数百のコネクタを参照できます、以下を含みます :
- Notion (NotionPageReader)
- Google Docs (GoogleDocsReader)
- Slack (SlackReader)
- Discord (DiscordReader)
- Apify アクター Web をクロールし、Web ページをスクレイピングし、テキストコンテンツを抽出し、.pdf, .jpg, .png, .docx を含むファイルをダウンロードできます。
以上