How to Use LangChain Text Splitter

この記事は、LangChain Text Splittersの使い方について包括的なガイドを提供し、大きなドキュメントを効果的に細かいチャンクに分割してさまざまな自然言語処理タスクに利用する方法を解説しています。

Anakin AIを無料で利用開始

How to Use LangChain Text Splitter

Start for free
目次

LangChainテキストスプリッターは、大きなドキュメントをより管理しやすいチャンクに分割するための強力なツールです。このプロセスは、特に入力サイズの制限がある大きな言語モデルで作業する場合や、テキストをより小さな、より焦点を絞ったユニットで処理する必要がある自然言語処理のタスクにおいて重要です。この包括的なガイドでは、LangChainが提供するさまざまなテキスト分割技術とそれらをプロジェクトで効果的に実装する方法について説明します。

💡
制限なしでClaude 3.5 Sonnetを試してみたいですか?

あらゆるAIモデルにアクセスできるAIプラットフォームを探していますか?一つの価格でオールインワンのタグが付いた?

それなら、Anakin AIは絶対に見逃せません!

Anakin AIは、ワークフローの自動化に役立つオールインワンのプラットフォームで、使いやすいNo Code App Builderで強力なAIアプリを作成できます。 Llama 3ClaudeGPT-4Uncensored LLMsStable Diffusionを使用して、数分で夢のようなAIアプリを構築できます。!

LangChainテキストスプリッターの理解

LangChainテキストスプリッターは、セマンティックな意味をできるだけ保持しながらテキストドキュメントをより小さいセグメントに分割するように設計されています。これは、言語モデルのトークン制限を超える大きなドキュメントを扱う場合や、より小さい、より焦点を絞ったテキスト単位でテキストを処理する必要がある場合に特に役立ちます。

なぜLangChainテキストスプリッターを使用するのですか?

  • トークン制限のある言語モデルへのテキストの準備
  • 情報検索のためのより焦点を絞った関連するテキストの作成
  • 下流の自然言語処理タスクのパフォーマンスの向上
  • テキスト処理パイプラインでの文脈と統一性の維持

LangChainテキストスプリッターのタイプ

LangChainでは、さまざまなタイプのテキストスプリッターを提供しています。それぞれに独自の強みと使用方法があります。主なタイプと使用方法を見てみましょう。

LangChainテキストスプリッターのCharacter Text Splitter

Character Text Splitterは、テキストを指定された文字または文字列に基づいて分割する最もシンプルな形式のテキストスプリッターです。

Character Text Splitterの使用方法は次のとおりです:

from langchain.text_splitter import CharacterTextSplitter

text = """ここに長いテキストが入ります。複数の段落にわたる場合があります。"""

splitter = CharacterTextSplitter(
    separator="\n\n",
    chunk_size=1000,
    chunk_overlap=200
)

chunks = splitter.split_text(text)
print(f"チャンクの数: {len(chunks)}")
print(f"最初のチャンク: {chunks[0][:100]}...")

この例では、テキストを改行(\n\n)で分割しています。各チャンクは約1000文字で、チャンク間のオーバーラップは200文字です。

LangChainテキストスプリッターのRecursive Character Text Splitter

Recursive Character Text Splitterは、より洗練された方法でテキストを分割し、一連の文字に基づいて分割を試みます。

Recursive Character Text Splitterの使用方法は次のとおりです:

from langchain.text_splitter import RecursiveCharacterTextSplitter

text = """ここに長いテキストが入ります。複数の段落にわたる場合があります。"""

splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
    separators=["\n\n", "\n", " ", ""]
)

chunks = splitter.split_text(text)
print(f"チャンクの数: {len(chunks)}")
print(f"最初のチャンク: {chunks[0][:100]}...")

このスプリッターは、最初に改行2つで分割し、次に改行1つ、次にスペース、最後に必要に応じて個々の文字で分割するように試みます。

LangChainテキストスプリッターのToken Text Splitter

Token Text Splitterは、文字ではなくトークンの数に基づいてテキストを分割する場合に便利です。これは、トークンベースの制限を持つ特定の言語モデルで作業する場合に特に役立ちます。

Token Text Splitterの使用方法は次のとおりです:

from langchain.text_splitter import TokenTextSplitter

text = """ここに長いテキストが入ります。複数の段落にわたる場合があります。"""

splitter = TokenTextSplitter(
    chunk_size=100,
    chunk_overlap=20,
    encoding_name="cl100k_base"  # これはGPT-4で使用されるエンコーディングです
)

chunks = splitter.split_text(text)
print(f"チャンクの数: {len(chunks)}")
print(f"最初のチャンク: {chunks[0][:100]}...")

このスプリッターは、各チャンクが約100トークンを持ち、チャンク間に20トークンのオーバーラップがあることを確保します。

LangChainテキストスプリッターの高度なテクニック

基本的な部分を理解したので、LangChainテキストスプリッターのいくつかの高度なテクニックと使用例を説明します。

LangChainテキストスプリッターでのMarkdownの処理

Markdownドキュメントで作業する場合、ヘッダー構造を保持しながらテキストを分割したい場合があります。そのためのMarkdownHeaderTextSplitterをLangChainが提供しています。

使用方法は次のとおりです:

from langchain.text_splitter import MarkdownHeaderTextSplitter

markdown_text = """
# メインヘッダー

## サブヘッダー1
サブヘッダー1のコンテンツ

## サブヘッダー2
サブヘッダー2のコンテンツ

### ネストされたサブヘッダー
ネストされたコンテンツ
"""

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_text)

for split in md_header_splits:
    print(f"ヘッダー: {split.metadata['Header 1']}")
    print(f"コンテンツ: {split.page_content[:50]}...")
    print()

このアプローチにより、コンテンツを分割しながらMarkdownドキュメントの階層構造を維持できます。

LangChainテキストスプリッターでのコードの分割

コードを扱う場合、その構造を保ったまま分割したい場合があります。LangChainでは、この目的に特化した言語固有のスプリッターを提供しています。

Pythonコードスプリッターの使用例です:

from langchain.text_splitter import RecursiveCharacterTextSplitter, Language

python_code = """
def hello_world():
    print("Hello, World!")

class MyClass:
    def __init__(self):
        self.value = 42

    def get_value(self):
        return self.value

if __name__ == "__main__":
    hello_world()
    obj = MyClass()
    print(obj.get_value())
"""

python_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.PYTHON,
    chunk_size=50,
    chunk_overlap=0
)

code_chunks = python_splitter.split_text(python_code)

for i, chunk in enumerate(code_chunks):
    print(f"チャンク {i+1}:")
    print(chunk)
    print()

このスプリッターは、関連するコードブロックをまとめて保持し、コードスニペットの処理と解析が容易になります。

LangChainテキストスプリッターのベストプラクティス

LangChainテキストスプリッターを最大限に活用するためには、次のベストプラクティスを考慮してください:

  1. データタイプに適したスプリッターを選択します(例:Markdownの場合はMarkdownHeaderTextSplitterを使用します)。
  2. チャンクサイズを調整して、コンテキストの保存とモデルへの入力制限の間の最適なバランスを見つけます。
  3. 適切なオーバーラップを使用して、チャンク間のコンテキストを維持します。
  4. スプリッティングの戦略を決定する際に、ダウンストリームのタスクを考慮します。
  5. スプリッティングがエラーを導入したり重要な情報を失ったりしないように、常に出力を検証します。

LangChainテキストスプリッターを他のLangChainコンポーネントと統合する

LangChainテキストスプリッターは、他のLangChainコンポーネントと組み合わせて強力なNLPパイプラインを作成するためによく使用されます。ドキュメントローダーや言語モデルと組み合わせて使用する例を紹介します:

from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

# ドキュメントのロード
loader = TextLoader('path/to/your/document.txt')
document = loader.load()

# ドキュメントの分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(document)

# 埋め込みを作成し、ベクターデータベースに格納
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)

# 検索型QAチェーンの作成
qa_chain = RetrievalQA.from_chain_type(
    llm=OpenAI(),
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

# チェーンを使用して質問に答える
query = "このドキュメントの主なトピックは何ですか?"
response = qa_chain.run(query)
print(response)

この例では、テキストの分割が大きなワークフローにどのように組み込まれるかを示しており、効率的なドキュメントの処理と質問応答機能を実現しています。

LangChainテキストスプリッターの一般的な問題のトラブルシューティング

LangChainテキストスプリッターを使用する際には、いくつかの一般的な問題が発生することがあります。いくつかのトラブルシューティングのヒントを紹介します:

  1. チャンクが大きすぎるか小さすぎる場合は、chunk_sizeパラメータを調整してください。
  2. チャンク間のコンテキストが失われている場合は、chunk_overlapを増やしてください。
  3. 分割がドキュメントの構造に従っていない場合は、別のスプリッタータイプを試すか、separatorsリストを調整してください。
  4. コードや特殊なテキストで予期しない結果が得られる場合は、言語固有のスプリッターを使用してください。

結論

LangChainテキストスプリッターは、さまざまなNLPタスクにテキストデータを準備するための多目的で強力なツールです。利用可能な異なるスプリッタータイプと、それらを効果的に使用する方法を理解することにより、言語モデルアプリケーションのパフォーマンスを大幅に向上させることができます。データタイプに適したスプリッターを選択し、パラメータを実験し、常に結果を検証することを忘れないでください。練習を重ねることで、テキスト分割をLangChainワークフローに継ぎ込むことができ、効率的かつ効果的な自然言語処理を実現できるようになります。

💡
制限なしでClaude 3.5 Sonnetを試してみたいですか?

あらゆるAIモデルにアクセスできるAIプラットフォームを探していますか?一つの価格でオールインワンのタグが付いた?

それなら、Anakin AIは絶対に見逃せません!

Anakin AIは、ワークフローの自動化に役立つオールインワンのプラットフォームで、使いやすいNo Code App Builderで強力なAIアプリを作成できます。 Llama 3ClaudeGPT-4Uncensored LLMsStable Diffusionを使用して、数分で夢のようなAIアプリを構築できます。!