🦜️🔗LangChain : モジュール : 検索 – ドキュメント変換 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/02/2023
* 本ページは、LangChain の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
🦜️🔗 LangChain : モジュール : 検索 – ドキュメント変換
INFO : 組み込みのドキュメント変換とサードパーティ・ツールの統合のドキュメントについては 統合 にアクセスしてください。
ドキュメントをロードしたら、アプリケーションにより良く適合するようにそれらを変換したい場合が多いです。最も単純な例は、長いドキュメントをモデルのコンテキストウィンドウに収まる小さいチャンクに分割したい場合です。LangChain は多くの組み込みドキュメント変換を持ちます、これらはドキュメントの分割、連結、フィルタリングそしてそれ以外の操作を簡単にします。
テキスト・スプリッター
テキストの長いピースを扱いたい場合、そのテキストをチャンクに分割することが必要です。これは単純に見えますが、ここには多くの潜在的な複雑さがあります。理想的には、テキストの意味的に関連するピースを一緒に保持したいでしょう。「意味的に関連する」が意味するものはテキストの種類に依存するかもしれません。このノートブックはそれを行なう幾つかの方法を紹介します。
高いレベルでは、テキスト・スプリッターは以下のように機能します :
- テキストを小さい、意味論的に意味のあるチャンクに分割する (多くの場合センテンス)。
- (ある関数により測定される) 特定のサイズに到達するまでこれらの小さいチャンクをより大きいチャンクに結合し始めます。
- そのサイズに到達したら、そのチャンクをそれ自身のテキストのピースとして作成してから、(チャンク間のコンテキストを保持するために) オーバーラップと共に新しいテキストのチャンクを作成し始めます。
つまり、それに沿ってテキストスプリッターをカスタマイズできる 2 つの異なる軸があります :
- テキストをどのように分割するか
- チャンクサイズをどのように測定するか
テキストスプリッターで始める
デフォルトの推奨テキストスプリッターは RecursiveCharacterTextSplitter です。このテキストスプリッターは文字のリストを受け取ります。それは最初の文字上での分割に基づいてチャンクを作成しようとしますが、任意のチャンクが大き過ぎれば次の文字に移動します、等々。デフォルトでは分割しようとする文字は [“\n\n”, “\n”, ” “, “”] です。
どの文字上で分割できるかの制御に加えて、幾つかの他のことも制御できます :
- length_function: チャンクの長さがどのように計算されるか。デフォルトは文字数を単にカウントしますが、ここでトークンカウンターを渡すこともかなり一般的です。
- chunk_size: チャンクの最大サイズ (length 関数で測定されます)。
- chunk_overlap: チャンク間の最大オーバーラップ。
チャンク間の連続性を維持するためにある程度のオーバーラップを持つのが良い可能性があります (e.g. スライディング・ウインドウを行なう)。
- add_start_index: メターデータで元のドキュメント内の各チャンクの開始位置を含めるか否か。
# This is a long document we can split up.
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
# Set a really small chunk size, just to show.
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and' metadata={'start_index': 0} page_content='of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans.' metadata={'start_index': 82}
その他の変換 :
冗長なドキュメントのフィルタリング, ドキュメントの翻訳, メタデータの抽出, 等
ドキュメント上で、単純にテキストを分割するのではない、多くの変換を実行することができます。EmbeddingsRedundantFilter を使用して、類似ドキュメントを識別して冗長性をフィルタリングすることができます。doctran のような統合により、ドキュメントをある言語から別のものに翻訳したり、希望のプロパティを抽出してメタデータに追加したり、会話的なダイアログをドキュメントの Q/A 整形セットに変換するようなことができます。
以上