1. 外部データの取得とRAGの役割
LLMの学習データに含まれない独自の外部知識を活用するためには、検索拡張生成(RAG)が不可欠です。RAGのプロセスでは、外部から情報を取得し、それをプロンプトに組み込んで回答生成を行います。この仕組みの中核をなすのがドキュメントの読み込みと分割処理です。
2. Document Loadersによるデータ取り込み
LangChainは、ローカルのファイルシステムからクラウドストレージ、ウェブサイトに至るまで、100種類以上のデータソースに対応したローダーを提供しています。これらはlangchain_community.document_loaders経由で利用可能です。読み込まれたデータは、テキスト内容とメタデータ(ソースパスなど)を保持したDocumentオブジェクトとして扱われます。
テキストファイルの読み込み
from langchain_community.document_loaders import TextLoader
# 指定したパスからテキストを読み込み、Documentオブジェクトへ変換
loader = TextLoader("data/sample.txt")
documents = loader.load()
print(documents[0].page_content)
JSONデータの解析
JSONLoaderを使用すると、jqクエリを用いて特定のフィールドのみを効率的に抽出できます。JSONL形式(改行区切りのJSON)を扱う場合はjson_lines=Trueを指定します。
from langchain_community.document_loaders import JSONLoader
# jqスキーマで抽出対象を指定
loader = JSONLoader(
file_path="data/records.json",
jq_schema=".items[].message",
text_content=False
)
data = loader.load()
3. Text Splitterによるドキュメントの最適化
読み込んだ長大なテキストをLLMのコンテキストウィンドウに収める、あるいは検索精度を高めるためには、ドキュメントを適切な粒度に分割する必要があります。langchain.text_splitterモジュールが提供するツール群を活用します。
RecursiveCharacterTextSplitterの活用
推奨される手法はRecursiveCharacterTextSplitterです。これは["\n\n", "\n", " ", ""]といった区切り文字を優先順位に従って使用し、段落や文のまとまりを維持しながら再帰的に分割を行います。
from langchain.text_splitter import RecursiveCharacterTextSplitter
# チャンクサイズとオーバーラップ(重複部分)の設定
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
length_function=len
)
with open("document.md", "r") as file:
content = file.read()
split_docs = splitter.create_documents([content])
適切なチャンクサイズとオーバーラップ幅を設定することで、情報の分断を防ぎつつ、モデルが文脈を把握しやすい形式へ変換することが可能になります。