チャンク分割、埋め込み生成、類似検索の流れ

LangChainにおけるRAG(Retrieval-Augmented Generation)アーキテクチャの「チャンク分割、埋め込み生成、類似検索の流れ」は、外部ドキュメントを活用した生成(回答)を実現するための重要なステップです。以下にその一連の流れを詳しく説明します。


1. チャンク分割(Chunking)

概要:

大きなドキュメント(PDF、HTML、Markdownなど)を扱う場合、そのままLLMに渡すとトークン制限を超えてしまいます。そこで、文書を小さな単位(チャンク)に分割します。

使用するモジュール:

LangChainでは、TextSplitterクラス(例: RecursiveCharacterTextSplitter, TokenTextSplitterなど)を使用します。

目的:

  • LLMが処理可能なサイズに抑える

  • セマンティックな意味の区切りを保ちながら分割する(文・段落単位)

処理例:

python
from langchain.text_splitter import RecursiveCharacterTextSplitter splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100) chunks = splitter.split_documents(documents)

2. 埋め込み生成(Embedding Generation)

概要:

分割された各チャンクに対して「意味的なベクトル表現」を生成します。これが埋め込み(embedding)です。

使用するモジュール:

LangChainでは、OpenAIEmbeddings, HuggingFaceEmbeddingsなどの埋め込みモデルを利用可能です。

目的:

  • チャンクを意味に基づいて比較可能にする

  • 後続の類似検索で重要な役割を果たす

処理例:

python
from langchain.embeddings import OpenAIEmbeddings embedding_model = OpenAIEmbeddings() vector_store.add_documents(chunks, embedding=embedding_model)

3. 類似検索(Similarity Search / Retrieval)

概要:

ユーザーからのクエリに対して、そのクエリを埋め込みベクトルに変換し、チャンク群の中から意味的に最も近いものを検索します。

使用するモジュール:

  • ベクトルストア:FAISS, Chroma, Weaviate, Pineconeなど

  • インタフェース:VectorStoreRetriever

目的:

  • クエリに関連する文脈情報を取得する

  • 検索結果をLLMに渡して回答生成に利用する

処理例:

python
retriever = vector_store.as_retriever(search_type="similarity", k=3) relevant_docs = retriever.get_relevant_documents(query)

補足:この一連の流れをLangChainでどう組み立てるか

LangChainでは以下のような順で構築します。

  1. DocumentLoaderでファイル読み込み

  2. TextSplitterでチャンク分割

  3. Embeddingsでベクトル化

  4. VectorStoreへ登録

  5. Retrieverとして類似検索可能な状態に

  6. RetrievalQAConversationalRetrievalChainでLLMと連携して回答生成


まとめ

フェーズ 処理内容 使用クラス/モジュール
チャンク分割 文書を小さく分割(意味を保ったまま) TextSplitter(例:RecursiveCharacterTextSplitter
埋め込み生成 各チャンクをベクトルに変換 Embeddings(例:OpenAIEmbeddings
類似検索 クエリに意味的に近いチャンクを検索 VectorStoreRetriever

この処理パイプラインによって、LangChainは大規模な文書から意味的に関連する情報を取り出し、高精度な回答生成を行うことが可能になります。

ChatGPT4o 生成日:2025/06/12