テキスト分割、埋め込み、ベクトル保存

LangChain による検索拡張生成(RAG)

Meri Nova

Machine Learning Engineer

検索用データの準備

ドキュメントを読み込み中。

LangChain による検索拡張生成(RAG)

検索用データの準備

ドキュメントを分割中。

LangChain による検索拡張生成(RAG)

検索用データの準備

ドキュメントのチャンクを埋め込み。

LangChain による検索拡張生成(RAG)

検索用データの準備

ドキュメントのチャンクを保存。

LangChain による検索拡張生成(RAG)

検索用データの準備

RAG開発ワークフローで分割ステップを強調。

LangChain による検索拡張生成(RAG)

chunk_size

理想的なチャンクサイズは中間。大きすぎると検索が遅く解釈が難しく、小さすぎると文脈不足。

chunk_overlap

  • 境界をまたいで情報を含める

2つのチャンクが重なる領域を強調。

LangChain による検索拡張生成(RAG)

CharacterTextSplitter

from langchain_text_splitters import CharacterTextSplitter

text = """Machine learning is a fascinating field.\n\nIt involves algorithms and models that can learn from data. These models can then make predictions or decisions without being explicitly programmed to perform the task.\nThis capability is increasingly valuable in various industries, from finance to healthcare.\n\nThere are many types of machine learning, including supervised, unsupervised, and reinforcement learning.\nEach type has its own strengths and applications."""
text_splitter = CharacterTextSplitter( separator="\n\n", chunk_size=100, chunk_overlap=10 )
LangChain による検索拡張生成(RAG)

CharacterTextSplitter

chunks = text_splitter.split_text(text)

print(chunks) print([len(chunk) for chunk in chunks])
['Machine learning is a fascinating field.',
 'It involves algorithms and models that can learn from data. These models can...',
 'There are many types of machine learning, including supervised, unsupervised...']

[40, 260, 155]
  • 文脈が欠ける場合あり
  • chunk_sizeを超える場合あり
LangChain による検索拡張生成(RAG)

RecursiveCharacterTextSplitter

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(

separators=["\n\n", "\n", " ", ""],
chunk_size=100, chunk_overlap=10
)
LangChain による検索拡張生成(RAG)

RecursiveCharacterTextSplitter

chunks = splitter.split_text(text)

print(chunks)
print([len(chunk) for chunk in chunks])
['Machine learning is a fascinating field.',
 'It involves algorithms and models that can learn from data. These models ...',
 'or decisions without being explicitly programmed to perform the task.',
 'This capability is increasingly valuable in various industries, from ...',
 'There are many types of machine learning, including supervised, ...',
 'learning.',
 'Each type has its own strengths and applications.']
[40, 98, 69, 91, 95, 9, 49]
LangChain による検索拡張生成(RAG)

ドキュメントの分割

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("research_paper.pdf")
documents = loader.load()

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

chunks = splitter.split_documents(documents)
LangChain による検索拡張生成(RAG)

ドキュメントの分割

print(chunks)

print([len(chunk.page_content) for chunk in chunks])
[Document(metadata={'source': 'Rag Paper.pdf', 'page': 0}, page_content='...'),
 Document(metadata={'source': 'Rag Paper.pdf', 'page': 0}, page_content='...'),
 Document(metadata={'source': 'Rag Paper.pdf', 'page': 0}, page_content='...')]

[928, 946, 921,...]
LangChain による検索拡張生成(RAG)

埋め込みと保存

埋め込みと保存の工程を強調。

LangChain による検索拡張生成(RAG)

埋め込みとは?

文が埋め込みモデルに入力される。

LangChain による検索拡張生成(RAG)

埋め込みとは?

埋め込みモデルがテキストを数値ベクトルに変換。

LangChain による検索拡張生成(RAG)

埋め込みとは?

what_are_embeddings3.jpg

LangChain による検索拡張生成(RAG)

埋め込みとは?

what_are_embeddings4.jpg

LangChain による検索拡張生成(RAG)

チャンクの埋め込みと保存

  • 次で埋め込みと保存: OpenAIChromaDB
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

embedding_model = OpenAIEmbeddings(
    api_key=openai_api_key,
    model="text-embedding-3-small"
)


vector_store = Chroma.from_documents( documents=chunks, embedding=embedding_model )
LangChain による検索拡張生成(RAG)

Passons à la pratique !

LangChain による検索拡張生成(RAG)

Preparing Video For Download...