ANTIGRAVITY LABEN
記事一覧/AIツール
AIツール/2026-03-26上級

Antigravity で構築する RAG パイプライン — ベクトル検索 × LLM で社内ナレッジを即座に活用する

RAG(Retrieval-Augmented Generation)の設計から実装まで、Antigravity を活用してベクトル検索パイプラインを構築する上級チュートリアル。Embedding 生成、ChromaDB 連携、プロンプト最適化、本番運用のベストプラクティスを網羅。

rag8vector-search3embeddingllm3antigravity436ai-tools15chromadbadvanced19

プレミアム記事

取り組みの背景 — RAG の概念を整理しつつ、なぜ今必要なのか

LLM(大規模言語モデル)は汎用的な知識を持っていますが、自社固有の情報——社内ドキュメント、API仕様書、ナレッジベース、顧客対応履歴——には対応できません。ファインチューニングは高コストで、データが更新されるたびに再学習が必要です。

RAG(Retrieval-Augmented Generation) はこの課題を解決するアーキテクチャです。ユーザーの質問に関連するドキュメントをベクトル検索で取得し、その情報をコンテキストとして LLM に渡すことで、正確で最新の回答を生成します。

ここで扱うのはAntigravity の AI 支援を最大限に活用しながら、RAG パイプラインをゼロから構築する方法を解説します。対象読者は、Python の基礎知識があり、LLM アプリケーションの開発に取り組みたいエンジニアです。なお、プロンプトの書き方に不安がある方は先にAntigravity プロンプトエンジニアリング上級ガイドを読んでおくと、RAG のプロンプト設計がスムーズになります。

RAG アーキテクチャの全体設計

RAG システムは大きく3つのフェーズで構成されます。

インジェストフェーズ(データ取り込み)

ドキュメントを読み込み、適切なサイズのチャンクに分割し、Embedding モデルでベクトル化してデータベースに格納します。

# Antigravity で生成した RAG インジェストパイプライン
# document_ingestor.py
 
import os
from pathlib import Path
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import (
    DirectoryLoader,
    TextLoader,
    PyPDFLoader,
    UnstructuredMarkdownLoader,
)
from langchain_google_genai import GoogleGenerativeAIEmbeddings
import chromadb
from chromadb.config import Settings
 
# --- 設定 ---
CHROMA_PERSIST_DIR = "./chroma_db"
COLLECTION_NAME = "company_knowledge"
CHUNK_SIZE = 800       # トークン数ではなく文字数
CHUNK_OVERLAP = 200    # チャンク間のオーバーラップ
 
def load_documents(source_dir: str) -> list:
    """複数形式のドキュメントを一括読み込み"""
    loaders = {
        "**/*.txt": TextLoader,
        "**/*.md": UnstructuredMarkdownLoader,
        "**/*.pdf": PyPDFLoader,
    }
    documents = []
    for glob_pattern, loader_cls in loaders.items():
        loader = DirectoryLoader(
            source_dir,
            glob=glob_pattern,
            loader_cls=loader_cls,
            show_progress=True,
        )
        documents.extend(loader.load())
    return documents
 
def chunk_documents(documents: list) -> list:
    """ドキュメントを意味的に適切なサイズに分割"""
    splitter = RecursiveCharacterTextSplitter(
        chunk_size=CHUNK_SIZE,
        chunk_overlap=CHUNK_OVERLAP,
        separators=["\n## ", "\n### ", "\n\n", "\n", "。", ".", " "],
        length_function=len,
    )
    return splitter.split_documents(documents)
 
def create_embeddings_and_store(chunks: list):
    """Embedding を生成し ChromaDB に格納"""
    # Gemini の Embedding モデルを使用
    embeddings = GoogleGenerativeAIEmbeddings(
        model="models/text-embedding-004",
        google_api_key=os.getenv("GOOGLE_API_KEY"),
    )
 
    client = chromadb.PersistentClient(
        path=CHROMA_PERSIST_DIR,
        settings=Settings(anonymized_telemetry=False),
    )
 
    # コレクションを作成(既存の場合はリセット)
    collection = client.get_or_create_collection(
        name=COLLECTION_NAME,
        metadata={"hnsw:space": "cosine"},  # コサイン類似度
    )
 
    # バッチ処理で効率的に格納
    batch_size = 100
    for i in range(0, len(chunks), batch_size):
        batch = chunks[i:i + batch_size]
        texts = [chunk.page_content for chunk in batch]
        metadatas = [chunk.metadata for chunk in batch]
        ids = [f"doc_{i + j}" for j in range(len(batch))]
 
        # Embedding 生成
        vectors = embeddings.embed_documents(texts)
 
        collection.add(
            ids=ids,
            documents=texts,
            embeddings=vectors,
            metadatas=metadatas,
        )
        print(f"  格納完了: {i + len(batch)}/{len(chunks)} チャンク")
 
    print(f"✅ 全 {len(chunks)} チャンクを ChromaDB に格納しました")
 
# --- 実行 ---
if __name__ == "__main__":
    docs = load_documents("./knowledge_base")
    print(f"📄 {len(docs)} ドキュメントを読み込みました")
 
    chunks = chunk_documents(docs)
    print(f"✂️  {len(chunks)} チャンクに分割しました")
 
    create_embeddings_and_store(chunks)

期待される出力:

📄 47 ドキュメントを読み込みました
✂️  312 チャンクに分割しました
  格納完了: 100/312 チャンク
  格納完了: 200/312 チャンク
  格納完了: 300/312 チャンク
  格納完了: 312/312 チャンク
✅ 全 312 チャンクを ChromaDB に格納しました

検索フェーズ(リトリーバル)

ユーザーの質問をベクトル化し、類似度の高いチャンクを検索します。ここでの精度が RAG 全体の品質を左右します。

生成フェーズ(ジェネレーション)

検索結果をプロンプトに組み込み、LLM が回答を生成します。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
RAG アーキテクチャの設計原則と構成要素を体系的に理解できる
Antigravity 上でベクトル検索パイプラインを構築し、社内データを即座にLLM回答に反映できる
本番運用で必要なチャンク戦略・リランキング・評価メトリクスの実装手法を習得できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

AIツール2026-03-30
Antigravity × カスタムAIチャットボット構築パイプライン — RAG・Function Calling・Streaming UIを統合した本格AIアシスタント開発ガイド
Antigravityを活用してRAG・Function Calling・Streaming UIを組み合わせた本格的なカスタムAIチャットボットを構築する方法を、設計から本番デプロイまで体系的に解説します。
AIツール2026-06-12
RAG の「それっぽいのに違う」回答を減らす — Gemma 4 × Antigravity で組む検索品質の評価ハーネス
RAG の回答が時々ズレる問題を数値に置き換える評価ハーネスの作り方。30問のゴールデンデータセット、recall@5・MRR・nDCG の実装、Gemma 4 による忠実性審査、pytest の回帰テストまで、ローカル環境の実測値と共に共有します。
AIツール2026-05-11
アーティストとして Antigravity を制作補助に3ヶ月使って見えてきたもの
アプリ開発と並行してアート活動を続ける個人クリエイターが、Antigravity をアート制作の周辺作業に3ヶ月使った記録。創作そのものではなく『作品を世に出す作業』のどこを委ね、どこは手放さなかったか。委譲の判断軸を正直にまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →