取り込みとは、ソース文書から情報を解析し、後で検索できるように検索スペースに埋め込むことができるようにするプロセスです。これはプレーン・テキストにとっては単純なプロセスですが、ソース文書が非「テキスト」形式である場合、複雑さになります。例えば、Microsoft WordやPDFの場合や、およびヘッダーとフッターの繰り返し、複数の列のテキスト、表などの複雑な書式が含まれている場合です。
このセクションでは、これらの課題の克服に役立つヒント、テクニック、アクセラレーター、資産のポイントをご紹介します。
技術者以外のユーザーの場合、ドキュメントは比較的シンプルで、watsonx Orchestrateを使用したノーコードのソリューションが必要です。
技術系ユーザーで、関連するドキュメントが比較的単純で、Watson Discoveryにアクセスできる場合は、そこから始めてください。Watson Discoveryは、コーディングの必要性が最小限で抑えられ、使いやすい優れたUIを備えています。複雑な文書の場合は、watson discoveryを使用して文書の特定の部分に注釈を付けて抽出できます。RAGバックエンド・パイプラインで使用することも、フロントエンドで文書内の段落の正確な位置を取得してテキストを強調表示することもできます。
ただし、Watson Discoveryには制限があります。文書が50MBを超えると、Watson Discoveryにロードすることができません。文書が複雑すぎる場合(例:ネストされたテーブル形式や不規則なテーブル形式が含まれる場合、Watson Discoveryは文書構造全体を把握できない場合があります。このような場合は、オープンソース・ライブラリーを使用してカスタム・データ取り込みパイプラインを実装することをお勧めします。
オープンソース・ライブラリーに関しては、LangChainとLlamaIndexはデータ取り込み機能の点で非常に似ています。しかし、ドキュメンテーションおよびベクトル・データベースやその他のアプリケーションとの統合の点で、LangChainの方がLlamaIndexよりも使いやすいでしょう。LangChainとLlamaIndexの両方には、Documentオブジェクトをある状態から別の状態に変換できるヘルパー関数があるため、LangChainとLlamaIndexの切り替えは、パイプラインのどの時点でも行うことができます。
以下のメモには、複雑なテーブルと、あるエンゲージメント中にテストされたさまざまなアプローチを含む、ドキュメントの取り込みについて得られたいくつかの教訓が含まれています。一部の観察はエンゲージメントごとに異なる場合がありますが、ネストされたテーブルや複雑なテーブルを含むドキュメントを含むエンゲージメントでは、結論のほとんどが類似するはずです。
Watson Discoveryは50MBを超える文書をサポートしていません。元の文書がWord形式であることが原因でサイズが大きくなっている場合、Watson Discoveryを使用するために元のWord文書をPDFに変換する必要があります。ただし、このアプローチを使用すると、特に複雑な表やネストされた表の場合に、Watson Discoveryは表形式を適切にキャプチャできないことがあります。
Watson Discoveryを使用した取り込みでは、事前トレーニングされたモデルと、DiscoveryのSmart Document Understandingを通じて手動で数ページに注釈を付けることによってトレーニングされたユーザー・モデルとの2つの異なるアプローチをテストできます。ここでは、複雑なネストされたテーブルを含むエンゲージメントの1つに対する、これら2つのアプローチから得られた教訓について説明します。
Watson Discoveryの結果は、複雑で入れ子になった表については後述する他のカスタム・ライブラリーほど正確ではありませんでしたが、その結果にはページ番号やテキストの座標などの多くのメタデータが含まれており、UIの強調表示に役立つメタデータが多数含まれていました。このメタデータは、検索中に追加のフィルターを追加したり、特定のHTMLセクションに基づいてドキュメントを分割したりする場合に非常に役立ちます。
PyMuPDFライブラリーははるかに高速で、特に大規模なデータに対してより正確な結果をもたらします。50.6 MBのデータセットに次の2つの関数を使用すると、LangChainのPypdfLoaderでは0.366秒かかるのに対し、PyMuPDFでは0.131秒でした。したがって、大きなファイルの場合や、ドキュメントの各セクションを個別のセクションとして抽出したくない場合は、PyMuPdfライブラリーを使用します。
def pdf_to_text(path: str,テーブル構造を保つため、抽出されたHTML(非構造化ライブラリーを使用)からテーブル要素をLLM(長いテーブル用のMixtralはコンテキストサイズのため良い選択肢である)にインプットし、プロンプトを作成してテーブルを要約するか、フュー・ショット学習を使用して、テーブルを大規模言語モデルにより理解しやすくなると考える形式にテーブルを変換します。
camelotやtabulaなどの他のテーブル・リーダー・ライブラリーもテストされましたが、これらのライブラリーは複雑なテーブルに対しては非構造化ほど正確ではなく、また文書内のテーブルを検知するため、大規模言語に渡す意味のあるチャンクを作成するには、より多くの前処理が必要になる可能性があります。
結論として、Watson Discoveryは、ドキュメントを取り込み、UIの構築(例えば、文章を強調表示するため)に役立つ多くの追加メタデータを取得するための簡単かつ迅速な方法ですが、「非構造化」ライブラリー(LlamaIndexとLangChainの両方にラッパーがある)は、Discoveryと比較して、ドキュメント内の複雑なテーブルをより正確にキャプチャできました。したがって、両方のアプローチを組み合わせると、ドキュメント内に複雑なテーブルを含むプロジェクトには役立ちます。
グラフィカル・ユーザー・インターフェースなしの取り込みは、技術的なエクスペリエンスと知識が必要であるため、ビジネス・ユーザーにとっては難しい場合があります。watsonx Orchestrateは、ドラッグ・アンド・ドロップ式のユーザー・インターフェース(UI)を備えており、ビジネス・ユーザーのフラストレーションを軽減します。青いアップロード・ボタンをクリックすると、ドキュメントをwatsonx Discovery(別名Elasticsearch)に直接アップロード、保管する機能を開始します。
これにより、ユーザーはドキュメントをElasticsearchに直接アップロードして、独自のカスタム・ナレッジ・ベースを作成できます。
ドキュメントをwatsonx Discoveryに直接取り込む代わりに、watsonx Orchestrateを通じてwatson Discoveryに接続することもできます。Watson Discoveryを介してデータを取り込む方法の詳細については、以下をご覧ください。
取り込みに使用できるその他の内部ツールのうちの1つが、Watson Discoveryです。Watson Discoveryは単なる取り込みツールではなく、非構造化データを取り込み、正規化、強化、検索できます。以下の画像は、Watson Discoveryのコア・コンポーネントと機能を示しています。
上記のとおり、Watson Discoveryの中核機能の1つは、JSON、HTML、PDF、Wordなどのさまざまな形式で構造化および非構造化データを取り込み、Smart Document Understandingを実行することです。
環境内にWatson Discoveryがプロビジョニングされている場合は、最初にプロジェクトを作成し、次にローカル・ストレージまたはオブジェクト・ストレージ・バケットなどのクラウドの場所からデータをアップロードできるコレクションを作成すると、ドキュメントを簡単に取り込むことができます。
コレクションを作成したら、ハンバーガー・メニューの「コレクションの管理」タブに移動し、「アイデンティティー・フィールド」で、ドキュメントの処理に使用する方法を選択できます。
選択肢は3つあります。
すべての文書が処理されるまでには時間がかかる場合があります。その後、Watson Discovery APIを使用して、コード内でデータを読み取り、使用できます。
以下は、APIを使用してコレクションからデータを読み取る方法を示すサンプル・コードです。
from langchain.docstore.document import DocumentWatson Discoveryでプロジェクトを作成する場合、Webクロールをスケジュールして、指定されたURLから情報を取得できます。必要なのは、データ・ソースを選択する際にWeb Crawlを選択し、URLとCrawlスケジュールを指定することだけです。
その後、前述の手順を実行してコレクションを管理し、APIを使用してコレクションからデータを読み取ることができます。Watson DiscoveryでWeb Crawlを設定する方法の詳細については、こちらの動画をご覧ください。
詳細と機能については、Watson Discoveryの開発者向けページを参照してください。
Deep Searchは、IBM Researchの取り込み用オープンソースのツールキットです。Deep Searchは、最先端のAI手法を活用して、大量の文書コレクションを継続的に収集、変換、強化、リンクします。公開PDFドキュメントと専有PDFドキュメントの両方に使用できます。
Deep Searchは、非構造化PDFドキュメントを構造化されたJSONファイルに、正確かつ簡単に変換します。知識抽出を自動化できるだけでなく、独自の基本モデルや大規模言語モデルを微調整することもできます。
Deep Searchの詳細についてはこちらでご覧いただけます。
Deep Searchは、非構造化ライブラリーやその他のオープンソース・ライブラリーの代わりに複雑なドキュメントを読み取るための優れた内部ツールです。Pythonノートブックとしてさまざまな種類の例を含む、リポジトリーには非常に優れたドキュメンテーションもあります。
Deep Searchは、JSON形式のPDFから表を抽出する際に、適切な成果を提供します。
テストでは、CIPPの部分的なPDFドキュメントを使用しました。これには3つのページが含まれており、それぞれに表データが表示されています。この場合、RAGの最高のパフォーマンスは、Deep Searchを使用して表をJSON形式に抽出し、PDFを直接使用するのではなく、Watson Discovery / watsonx Discoveryで使用するためにHTMLに変換することで、Deep SearchなしでPDFをHTMLに変換するか、Watson Discovery / watsonx DiscoveryでDeep SearchのJSONのみを使用することで達成します。Watson Discoveryは、表の間違ったセルから間違った答えを選択する場合もありますが、それよりも速いことがわかり、また、同じケースで、Watson Discoveryは表のグリッド内の正確な答えを特定できることがわかりました。
IBM Datacapは、文書とデータ・キャプチャーのための包括的なソリューションで、データとドキュメント画像の高速かつ正確でコスト効率の高いスキャン、分類、認識、検証、エクスポートを提供します。ドキュメントをキャプチャし、関連データを抽出し、それを下流のビジネスプロセスに統合します。
Datacapは、紙文書をスキャナー、多機能プリンター、またはモバイルデバイスから取得し、電子文書をファイルシステム、ファックス、またはEメールサーバーからインポートします。行やにじみ、境界線の傾き補正や削除などの画像処理機能でデータ抽出を強化します。
Datacapは、光学式文字認識(OCR)、手書きのインテリジェント文字認識(ICR)、マークの光学式マーク認識(OMR)、バーコード読み取りを使用して、データを効率的に抽出します。
インストールと使用方法の詳細については、IBM Datacapのドキュメンテーションを参照してください。
LangChainは、LangChainのDocumentオブジェクトとしてソースからデータをロードするさまざまなタイプのドキュメントローダーをサポートしています。Documentオブジェクトは、パイプラインの後でチャンク化や取得に簡単に使用できるテキストとそれに関連付けられたメタデータです。
現在、LangChainはディレクトリー全体、または次のようなさまざまな種類のファイルをロードするローダーをサポートしています。
これらのローダーは、Pythonの数行で使用できます。例えば、PDFを読み込むには、次のコードを使用できます。
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("example_data/layout-parser-paper.pdf")
pages = loader.load_and_split()
これらのローダーの使用方法については、LangChainのドキュメンテーションを参照してください。
上記のリンクに記載されているローダー以外にも、Eメール、Github、Googleドライブなどの特定のアプリケーションから直接データを読み込むことができる追加のローダーがあります。さまざまなローダーのリストはこちらで確認できます。
複雑な構造、形式、テーブルを持つドキュメントがある場合は、LangChainの非構造化ローダーを使用できます。これらのローダーは内部で、複雑なドキュメント(PDF、MSWord、Power Pointなどさまざまなフォーマット)や、ドキュメントをさまざまなコンポーネントに分解するのに最適なライブラリーの一つである非構造化ライブラリーを使用しています:LangChain UnstructuredLoader
LangChainと同様に、LlamaIndexはさまざまなタイプのローダーもサポートしています。LlamaIndexを使用してデータをロードする簡単な方法の1つは、SimpleDirectoryReaderを使用することです。SimpleDirectoryReaderは次のタイプをサポートしています。
次のコード・スニペットを使用して、SimpleDirectoryLoaderを使用できます。
from llama_index.core import SimpleDirectoryReader reader = SimpleDirectoryReader(input_dir="path/to/directory") documents = reader.load_data()
また、特定の拡張機能を追加して、ディレクトリーからそれらの拡張機能のみを読み取ることもできます。
SimpleDirectoryReader( input_dir="path/to/directory", required_exts=[".pdf", ".docx"] )
LlamaIndex Loaderの使用方法の詳細については、ドキュメンテーションを参照してください。
また、Huggingfaceと同様に、独自のカスタムローダーを作成したり、llamahub.aiで他の人のカスタムローダーを使用したりすることもできます。
ただし、LlamaIndexの欠点の1つは、LangChainと比較して、ドキュメンテーションとコミュニティー・サポートがLangChainほど優れていないため、コードのデバッグが困難になる可能性があることです。
複雑なドキュメントを読み込む場合には、非構造化ライブラリーを直接使用することもできます。非構造化ライブラリーは、テーブルの読み取りと解析に非常に優れています。
非構造化ライブラリーはLangChainとLlamaIndexの両方のラッパーでもサポートされており、Documentオブジェクトを自動的に作成して返すため、将来のRAGパイプラインでは使いやすい可能性があります。ただし、プロジェクトでさらなるカスタマイズが必要で、代わりに非構造化ライブラリーを直接使用したい場合は、次のドキュメントを参照してください:Unstructured。