Django × pgvector でRAGを自前構築する
専用のベクトルDBを契約せず、すでに動いているPostgreSQLにpgvectorを入れてRAGを組む構成。次元数が後から変えられない理由、e5系のプレフィックス、HNSWとIVFFlatの選び分け、しきい値をギャップで切る方法、そして最も重い「埋め込みモデルを差し替える日」の入れ替え手順まで、Djangoの実コードで解説します。
専用のベクトルDBを契約せず、すでに動いているPostgreSQLにpgvectorを入れてRAGを組む構成。次元数が後から変えられない理由、e5系のプレフィックス、HNSWとIVFFlatの選び分け、しきい値をギャップで切る方法、そして最も重い「埋め込みモデルを差し替える日」の入れ替え手順まで、Djangoの実コードで解説します。
ベクトル検索は「意味が近いか」しか見ていないため、閲覧権限のない文書も平気で返してきます。社内RAGが本番直前に必ずぶつかるこの壁を、Django+pgvectorの事前フィルタでどう塞ぐか。後フィルタが破綻する理由、絞り込むと件数が足りなくなるHNSWの罠、そして実装後も残る3つの漏洩経路まで書きます。