0Pricing
Learn AI with Python · レッスン

ドキュメントの読み込み、分割、埋め込み

PyPDFLoader、RecursiveCharacterTextSplitter、OpenAIEmbeddings、埋め込み戦略について学習します。

「ドキュメントの読み込み、分割、埋め込み」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。

RAGの取り込みパイプライン

LLMがドキュメントに基づいて回答できるようにするには、まずドキュメントを読み込み、分割し、埋め込みに変換する必要があります。このレッスンでは、すべてのRetrieval-Augmented Generationシステムの基盤となる、取り込みパイプラインについて学びます。

pip install langchain-community pypdf langchain-openai

PDFの読み込み

PyPDFLoaderはPDFを読み込み、ページごとに1つのDocumentオブジェクトを持つリストを返します。各Documentには、テキストを表すpage_contentと、出典やページ番号を表すmetadataがあります。

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("handbook.pdf")
docs = loader.load()
print(len(docs), "pages")

ドキュメントを分割する理由

ページ全体では、埋め込みに変換したりプロンプトに収めたりするには大きすぎることがよくあります。分割によってテキストを小さなチャンクに分けると、適切に埋め込みへ変換でき、検索時にもページ全体ではなく関連する箇所だけを取得できます。

RecursiveCharacterTextSplitter

推奨される分割器はRecursiveCharacterTextSplitterです。まず段落、次に文、最後に単語の境界で分割しようとするため、単語の途中で切断するのではなく、意味的なまとまりを保ったチャンクを作成できます。

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)

chunk_sizeとchunk_overlap

chunk_sizeはチャンクあたりの最大文字数を設定し、chunk_overlapは隣接するチャンク間で一部のテキストを重複させて、境界でコンテキストが失われないようにします。1000/200の設定は、一般的な開始点です。

chunks = splitter.split_documents(docs)
print(len(chunks), "chunks")
print(chunks[0].page_content[:120])

チャンクサイズの調整

小さなチャンクは検索の精度が高くなりますが、周辺のコンテキストを取りこぼす可能性があります。大きなチャンクはコンテキストを保てる一方、関連性が薄まり、より多くのトークンが必要になります。チャンクサイズの10~20%程度のオーバーラップを設定するのがよい初期値です。

埋め込みとは

埋め込みとは、テキストを意味を捉えた固定長の数値ベクトルに変換することです。似たテキストは近いベクトルになります。これにより、キーワードではなく意味的な類似度で検索できます。

OpenAIEmbeddings

OpenAIEmbeddingsを使って埋め込みを作成します。text-embedding-3-smallモデルは安価で効果的です。embed_queryは1つの文字列を、embed_documentsはリストを埋め込みに変換します。

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector = embeddings.embed_query("How do I reset my password?")
print(len(vector))  # 1536

バッチの埋め込み

すべてのチャンクをまとめて埋め込みに変換します。各チャンクはベクトルになり、後で高速な類似度検索のためにベクトルデータベースへ保存します。

texts = [c.page_content for c in chunks]
vectors = embeddings.embed_documents(texts)
print(len(vectors), "vectors of dim", len(vectors[0]))

埋め込みコストの見積もり

埋め込みにはトークン単位で料金が発生します。すべてのチャンクの合計トークン数を見積もり、1Kトークンあたりの料金を掛けて計算します。埋め込みの前に数えておくと、大規模なコーパスで予想外の料金が発生するのを防げます。

import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
total = sum(len(enc.encode(c.page_content)) for c in chunks)
price_per_1k = 0.00002
print("tokens:", total, "cost $:", total / 1000 * price_per_1k)

パイプラインの概要

取り込みの流れは、ドキュメントを読み込み、重複を含むチャンクに分割し、各チャンクをベクトルに埋め込み、次のレッスンでそれらを保存する、というものです。ここでの適切なチャンク分割とコスト意識が、RAGシステム全体の品質と料金を左右します。

理解度チェック

ドキュメント取り込みの理解度を確認しましょう。

振り返り:読み込み、分割、埋め込み

PyPDFLoaderでドキュメントを読み込み、chunk_sizeとchunk_overlapを指定したRecursiveCharacterTextSplitterでチャンクに分割し、OpenAIEmbeddingsでチャンクをベクトルに変換しました。また、大規模なコーパスを処理する前に、トークン単位で埋め込みコストを見積もる方法も学びました。

よくある質問

「ドキュメントの読み込み、分割、埋め込み」レッスンは無料ですか?

はい。「ドキュメントの読み込み、分割、埋め込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。

「ドキュメントの読み込み、分割、埋め込み」で何を学びますか?

PyPDFLoader、RecursiveCharacterTextSplitter、OpenAIEmbeddings、埋め込み戦略について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn AI with Pythonを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「ドキュメントの読み込み、分割、埋め込み」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn AI with Pythonレッスンでコードを書いて実行できますか?

はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. LangChainのアーキテクチャとLCEL
  2. ドキュメントの読み込み、分割、埋め込み
  3. ベクトルストア:ChromaとFAISS
  4. RAG Q&Aシステムをエンドツーエンドで構築する
← Learn AI with Pythonに戻る