「RAGって名前は聞いたことあるけど、実際に作るとなると何から始めればいいの…?」そんな疑問を持っている方、多いんじゃないでしょうか。
今回は、Pythonを使ってRAG(Retrieval-Augmented Generation)システムをゼロから構築するシリーズの総まとめをお届けします。何をどの順番で作ったのか、ざっくりとした流れがつかめるはずです! 🎉
Contents
🔍 RAGシステムって何だっけ?

まず一言でいうと、RAGとは「AIが回答する前に、関連ドキュメントを検索して参照する仕組み」のことです。
イメージとしては、試験前にまず教科書を開いてから答えを書く感じですね。単に大規模言語モデルに問いかけるだけじゃなく、自社データや最新情報を検索して組み合わせることで、より精度の高い回答が得られます。
🛠️ シリーズで作ったもの・ざっくりまとめ
このシリーズでは、ブランクのPythonプロジェクトから始めて、以下のファイルを順番に作り上げました。
01_setup_db.py # pgvector テーブル+拡張機能のセットアップ
02_create_index.py # HNSWインデックスの作成(m=16, ef_construction=64)
03_ingest.py # ドキュメントをエンベディングしてDBに格納
04_search.py # ベクトル類似度検索の実装
05_rag.py # 検索結果をLLMに渡してRAG応答を生成
ポイントをまとめるとこんな感じです👇
- ✅ pgvector:PostgreSQLでベクトルデータを扱うための拡張機能
- ✅ HNSWインデックス:高速なベクトル近傍探索のアルゴリズム
- ✅ エンベディング:テキストを数値ベクトルに変換して意味的な検索を可能にする処理
💡 実際のRAG検索コード(シンプル版)
検索のキモとなる部分を、シンプルなコードで確認しておきましょう。
import psycopg2
from openai import OpenAI
client = OpenAI()
def embed(text: str) -> list[float]:
"""テキストをベクトルに変換する"""
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def search(query: str, top_k: int = 3):
"""クエリに近いドキュメントをベクトルDBから検索する"""
query_vec = embed(query)
conn = psycopg2.connect("postgresql://localhost/ragdb")
cur = conn.cursor()
# pgvectorの<->演算子でコサイン距離を計算
cur.execute("""
SELECT content, 1 - (embedding <-> %s::vector) AS score
FROM documents
ORDER BY embedding <-> %s::vector
LIMIT %s
""", (query_vec, query_vec, top_k))
results = cur.fetchall()
conn.close()
return results
# 使い方
results = search("Pythonで非同期処理をするには?")
for content, score in results:
print(f"スコア: {score:.3f} | {content[:80]}...")
ここが重要です👇
<->演算子がpgvectorのコサイン距離計算。SQLだけで類似検索ができます- スコアを1から引くことで「距離」を「類似度」に変換しています
- HNSWインデックスがあることで、大量データでも高速に検索できますよ
🚀 次のステップは?
基礎システムが完成したら、次はこんな発展もできます。
- 📄 PDFやWebページのチャンキング(長文を分割して精度を上げる)
- 🔄 ハイブリッド検索(ベクトル検索+全文検索の組み合わせ)
- 🎨 StreamlitやFastAPIでUI・APIを追加してアプリ化する
- 🧠 再ランキング(Reranker)で検索精度をさらに向上させる
まとめ
RAGシステムは「検索 × 生成」のシンプルな組み合わせで成り立っています。pgvector+HNSWインデックス+OpenAIエンベディングという構成を押さえておくと、応用の幅がぐっと広がりますよ。
「むずかしそう」と感じていた方も、ステップを追えば必ず作れます。ぜひ自分のデータで試してみてください 🙌一緒に学んでいきましょう!









