LangChain / RAG / Vector DBs · レッスン

ドキュメントメタデータの扱いとフィルタリング

ドキュメントのメタデータを付与・拡充・フィルタリングし、RAG パイプラインの検索対象を適切なソースに絞り込む方法を学びます。

レッスン 4/413 ステップ

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

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

Why Metadata Matters

Every document chunk in LangChain carries a page_content string and a metadata dictionary. While the content feeds the embedding model, metadata drives filtering, attribution, and traceability.

  • Source file or URL
  • Page number or section
  • Author, date, language

The Document Object

A LangChain Document is a lightweight container. You can construct one directly and pass any JSON-serializable values in metadata.

from langchain_core.documents import Document

doc = Document(
    page_content="Annual revenue grew 12%.",
    metadata={"source": "report.pdf", "page": 4, "year": 2025}
)
print(doc.metadata["source"])

Automatic Metadata from Loaders

Most loaders inject metadata for free. A PyPDFLoader adds source and page, while a WebBaseLoader adds the URL and page title.

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("handbook.pdf")
pages = loader.load()
print(pages[0].metadata)
# {"source": "handbook.pdf", "page": 0}

Enriching Metadata After Load

You often need to add fields the loader does not know about, like a category or tenant id. Iterate and mutate the dictionary.

for d in pages:
    d.metadata["department"] = "finance"
    d.metadata["sensitive"] = False
print(pages[0].metadata["department"])

Metadata Survives Splitting

When you split documents, the splitter copies the parent metadata onto each child chunk. This means filters set before splitting still apply afterward.

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(chunk_size=200)
chunks = splitter.split_documents(pages)
print(chunks[0].metadata["source"])

Filtering at Retrieval Time

Vector stores accept a filter argument so you only search the relevant slice. This is faster and reduces irrelevant matches.

results = vectorstore.similarity_search(
    "vacation policy",
    k=3,
    filter={"department": "hr"}
)

Self-Query Retrieval

A SelfQueryRetriever lets the LLM translate a natural-language query into both a semantic search and a metadata filter automatically.

You describe the metadata schema once, and the model decides when to filter.

Cleaning Noisy Metadata

Loaders sometimes produce verbose or nested metadata that vector stores reject. Flatten or whitelist the keys you need.

def clean(d):
    keep = {"source", "page", "department"}
    d.metadata = {k: v for k, v in d.metadata.items() if k in keep}
    return d

cleaned = [clean(d) for d in chunks]

Metadata for Citations

Storing the source and page lets you cite where an answer came from. After retrieval, format the metadata into a human-readable reference.

for r in results:
    src = r.metadata["source"]
    pg = r.metadata.get("page", "?")
    print(f"[{src} p.{pg}]")

Type Constraints

Many vector databases only allow scalar metadata values: strings, numbers, and booleans. Lists or dicts must be serialized to JSON strings or removed.

  • Good: {"page": 4}
  • Reject: {"tags": ["a","b"]}

A Practical Filter Pipeline

Combine enrichment, cleaning, and filtered search into one flow so every query is scoped to the correct subset of your corpus.

docs = PyPDFLoader("policy.pdf").load()
for d in docs:
    d.metadata["region"] = "EU"
chunks = splitter.split_documents(docs)
# index chunks, then:
vectorstore.similarity_search("data retention", filter={"region": "EU"})

Quick Check

Test your understanding of metadata handling.

Recap

You learned to work with document metadata:

  • Loaders auto-add fields like source and page
  • Enrich and clean metadata for filtering and citations
  • Metadata propagates through splitting
  • Use filter or a self-query retriever to scope searches
無料で開始

AI チューターと学ぶ LangChain / RAG / Vector DBs — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
12
レッスン
48

よくある質問

「ドキュメントメタデータの扱いとフィルタリング」レッスンは無料ですか?

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

「ドキュメントメタデータの扱いとフィルタリング」で何を学びますか?

ドキュメントのメタデータを付与・拡充・フィルタリングし、RAG パイプラインの検索対象を適切なソースに絞り込む方法を学びます。 ブラウザで直接実行するハンズオンコードでLangChain / RAG / Vector DBsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

LangChain / RAG / Vector DBsを始めるのに経験は必要ですか?

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

「ドキュメントメタデータの扱いとフィルタリング」レッスンにはどのくらい時間がかかりますか?

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

このLangChain / RAG / Vector DBsレッスンでコードを書いて実行できますか?

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

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

  1. 多様なドキュメント形式の読み込み
  2. テキスト分割戦略を理解する
  3. ドキュメント分割のカスタマイズ
  4. ドキュメントメタデータの扱いとフィルタリング
← LangChain / RAG / Vector DBsに戻る