AIアプリのためのベクターデータベース:Pinecone vs pgvector vs Weaviate
セマンティック検索、RAGパイプライン、レコメンデーションシステムはすべてベクターストレージを必要とします。
主要な選択肢の比較と、それぞれを使うべきタイミングをまとめました。
ベクターデータベースとは?
厳密一致の代わりに、ベクターデータベースは高次元空間での
埋め込みベクトル間の距離を測ることで、似たアイテムを見つけます。
Query: '認証はどう扱えばいい?'
Embedding: [0.23, -0.41, 0.87, ...] (1536次元)
Nearest neighbors:
- '認証セットアップガイド'(距離:0.12)
- 'JWTトークン管理'(距離:0.18)
- 'OAuth2の実装'(距離:0.21)
オプション1:pgvector(PostgreSQL拡張)
すでにPostgreSQLを使っているなら、最も簡単な道です:
-- 拡張を有効化
CREATE EXTENSION vector;
-- 埋め込みをデータと一緒に保存する
ALTER TABLE documents ADD COLUMN embedding vector(1536);
-- 高速な類似検索用のインデックスを作成
CREATE INDEX documents_embedding_idx
ON documents USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
import OpenAI from 'openai'
import { db } from '@/lib/db' // Prismaまたはpgクライアント
const openai = new OpenAI()
async function searchDocuments(query: string, limit = 5) {
// クエリの埋め込みを生成
const { data } = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: query,
})
const queryEmbedding = data[0].embedding
// 類似ドキュメントを探す
const results = await db.$queryRaw`
SELECT id, title, content,
1 - (embedding <=> ${queryEmbedding}::vector) AS similarity
FROM documents
ORDER BY embedding <=> ${queryEmbedding}::vector
LIMIT ${limit}
`
return results
}
最適: すでにPostgreSQL上にあるアプリ、小規模データセット(<1Mベクトル)、緊密な予算。
オプション2:Pinecone(マネージド・スケーラブル)
npm install @pinecone-database/pinecone
import { Pinecone } from '@pinecone-database/pinecone'
const pc = new Pinecone({ apiKey: process.env.PINECONE_API_KEY! })
const index = pc.index('my-index')
// ベクトルをアップサート
await index.upsert([
{
id: 'doc-1',
values: embedding, // float[]
metadata: { title: 'Auth Guide', source: 'docs' },
},
])
返却形式: {"translated": "翻訳されたHTML"}// 類似するベクトルをクエリする
const results = await index.query({
vector: queryEmbedding,
topK: 5,
includeMetadata: true,
filter: { source: { $eq: 'docs' } }, // メタデータのフィルタリング
})
const docs = results.matches.map(m => ({
id: m.id,
score: m.score,
...m.metadata,
}))
おすすめ: 本番環境のAIアプリ、1M以上のベクトル、管理されたスケーリングが必要な場合。
RAGパイプラインを構築する
async function ragAnswer(question: string): Promise<string> {
// 1. 質問を埋め込む
const { data } = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: question,
})
// 2. 関連するチャンクを取得する
const relevant = await searchDocuments(data[0].embedding, 3)
// 3. コンテキストを構築する
const context = relevant
.map(doc => `[${doc.title}]
${doc.content}`)
.join('
')
// 4. コンテキストを使って回答を生成する
const completion = await openai.chat.completions.create({
model: 'gpt-4o-mini',
messages: [
{
role: 'system',
content: `このコンテキストに基づいて回答してください:
${context}`,
},
{ role: 'user', content: question },
],
})
return completion.choices[0].message.content!
}
チャンク分割戦略
function chunkDocument(text: string, chunkSize = 500, overlap = 50): string[] {
const words = text.split(' ')
const chunks: string[] = []
返却形式: {"translated": "翻訳されたHTML"}for (let i = 0; i < words.length; i += chunkSize - overlap) {
chunks.push(words.slice(i, i + chunkSize).join(' '))
if (i + chunkSize >= words.length) break
}
return chunks
}
比較
| 機能 | pgvector | Pinecone | Weaviate |
|---|---|---|---|
| セットアップ | 簡単(既存のPG) | 簡単(マネージド) | 中程度 |
| スケール | <1Mベクター | 無制限 | 無制限 |
| コスト | 無料 | 無料枠 + 有料 | セルフホストまたはマネージド |
| メタデータフィルター | SQL | 組み込み | GraphQL |
| ハイブリッド検索 | 限定的 | あり | あり |
SaaSにAI機能を組み込みますか? AI SaaS Starter Kit には、ストリーミング対応で事前設定された Claude/OpenAI API のルートが含まれています。お好みのベクターデータベースを追加してください。$99 の一回限り。
返却形式: {"translated": "翻訳されたHTML"}



