웹 개발자를 위한 벡터 데이터베이스
시리즈의 처음 두 기사에서 우리는 완전한 RAG 시스템을 구축했습니다. TypeScript 및 LangChain.js를 사용하여 아키텍처부터 실제 구현까지. 그러나 거기에는 전용 심층 분석이 필요한 구성 요소: 벡터 데이터베이스. 올바른 벡터 저장소를 선택하면 빠르고 정확한 RAG 시스템이 달라질 수 있습니다. 느린 것은 신뢰할 수 없습니다.
이 글에서 우리는 벡터 데이터베이스의 세계, 즉 작동 방식에 대해 자세히 알아볼 것입니다. 내부적으로 검색에 사용하는 알고리즘, 솔루션을 비교하는 방법 인기 있는 항목과 프로젝트에 적합한 항목을 선택하는 방법을 알아보세요. 실제 사례를 살펴보겠습니다 Pinecone, Chroma, Weaviate, Qdrant 및 pgVector에 대한 설정.
시리즈 개요
| # | Articolo | 집중하다 |
|---|---|---|
| 1 | RAG 란 무엇입니까? | 기초와 건축 |
| 2 | TypeScript 및 LangChain.js를 사용한 RAG | 실제 구현 |
| 3 | 현재 위치 - 벡터 데이터베이스 | 저장 및 유사성 검색 |
| 4 | OpenAI 및 Anthropic API | LLM 통합 |
| 5 | Ollama와 함께하는 LLM 로컬 | 온프레미스 모델 |
| 6 | 미세 조정과 RAG | 언제 무엇을 사용할 것인가 |
| 7 | AI 에이전트: 아키텍처 | 자율 시스템 |
| 8 | CI/CD 파이프라인의 AI | DevOps 자동화 |
무엇을 배울 것인가
- 벡터 데이터베이스란 무엇이며 기존 DB로는 충분하지 않은 이유
- 임베딩 및 유사성 검색 작동 방식
- 거리 측정법: 코사인, 내적, 유클리드
- 인덱싱 알고리즘: HNSW, IVF, Flat
- 실제 비교: Pinecone vs Chroma vs Weaviate vs Qdrant vs pgVector
- 메타데이터 필터링 및 하이브리드 검색
- 프로젝트에 적합한 벡터 데이터베이스를 선택하는 방법
1. 벡터 데이터베이스가 필요한 이유
전통적인 데이터베이스(PostgreSQL, MongoDB, MySQL)는 데이터를 검색하도록 설계되었습니다. 정확한 일치를 통해: "이름 = 'Marco'인 모든 사용자 찾기" 또는 "가격이 50 미만인 제품을 찾습니다." 하지만 임베딩 작업을 할 때 쿼리는 완전히 다릅니다: "이 1536차원 벡터와 가장 유사한 5개의 벡터를 찾으십시오".
기존 데이터베이스와 벡터 데이터베이스
| 나는 기다린다 | 기존 DB | 벡터 데이터베이스 |
|---|---|---|
| 쿼리 유형 | 정확한 일치, 범위, JOIN | 유사성 검색(가장 가까운 이웃) |
| 데이터 유형 | 스칼라: 문자열, 숫자, 날짜 | 고차원 벡터(128-3072) |
| 색인 | B-트리, 해시, GiST | HNSW, IVF, PQ, 플랫 |
| 결과 | 정확히 일치하거나 결과가 없음 | 유사성을 기준으로 정렬된 Top-K 결과 |
| Esempio | SELECT * WHERE 이름 = 'RAG' | "RAG란 무엇입니까?"와 가장 유사한 문서 5개를 찾으세요. |
근본적인 문제는 계산 복잡성. 접근 방식으로 "무차별 대입"(쿼리 벡터를 데이터베이스의 모든 벡터와 비교), 검색 100만 개의 1536차원 벡터에는 단일 쿼리당 1,536,000,000개의 작업이 필요합니다. 벡터 데이터베이스는 특수한 데이터 구조를 사용하여 이러한 복잡성을 O(n)에서 다음으로 줄입니다. O(log n) 또는 O(1), 최소 비율의 정밀도가 희생됩니다.
2. 유사성 측정: 벡터를 비교하는 방법
데이터베이스를 탐색하기 전에 데이터베이스 간의 "밀접성"을 측정하는 방법을 이해해야 합니다. 두 개의 벡터. 세 가지 주요 측정항목이 있으며 각각 다른 특성을 가지고 있습니다.
2.1 코사인 유사성
길이를 무시하고 두 벡터 사이의 각도를 측정합니다. 가장 많이 사용되는 측정항목입니다. 임베딩 모델은 이미 정규화된 벡터를 생성하기 때문입니다.
// cosine_similarity(A, B) = (A . B) / (||A|| * ||B||)
// Range: [-1, 1] dove 1 = identici, 0 = ortogonali, -1 = opposti
function cosineSimilarity(a: number[], b: number[]): number {
let dot = 0, normA = 0, normB = 0;
for (let i = 0; i < a.length; i++) {
dot += a[i] * b[i];
normA += a[i] ** 2;
normB += b[i] ** 2;
}
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
}
// Esempio:
// "gatto dorme" vs "felino riposa" -> 0.95 (molto simili)
// "gatto dorme" vs "prezzo oro" -> 0.12 (non correlati)
2.2 내적(Dot Product)
내적은 정규화가 필요하지 않기 때문에 계산이 더 빠릅니다. 그러나 벡터의 길이에 민감합니다. 벡터가 길수록 의미적 유사성과 관계없이 점수가 더 높습니다.
// dot_product(A, B) = sum(A[i] * B[i])
// Range: (-inf, +inf) più alto = più simile
function dotProduct(a: number[], b: number[]): number {
let result = 0;
for (let i = 0; i < a.length; i++) {
result += a[i] * b[i];
}
return result;
}
// Ideale quando i vettori sono già normalizzati (norma = 1)
// In quel caso, dot product = cosine similarity
2.3 유클리드 거리(L2)
다차원 공간에서 두 점 사이의 "직선" 거리를 측정합니다. 처음 두 개와 달리 더 많은 가치 베이스 더 큰 것을 나타냄 유사성.
// euclidean(A, B) = sqrt(sum((A[i] - B[i])^2))
// Range: [0, +inf) più basso = più simile
function euclideanDistance(a: number[], b: number[]): number {
let sum = 0;
for (let i = 0; i < a.length; i++) {
sum += (a[i] - b[i]) ** 2;
}
return Math.sqrt(sum);
}
선택할 측정항목
| 미터법 | 언제 사용하는가 | 성능 | 메모 |
|---|---|---|---|
| 작은 것들 | 텍스트, 정규화된 임베딩 | 평균 | RAG의 기본 선택 |
| 내적 | 이미 정규화된 벡터 | 빠른 | 정규화하면 코사인과 같습니다. |
| 유클리드 | 이미지, 공간 데이터 | 평균 | 규모에 민감한 |
실용적인 조언
텍스트가 포함된 RAG 애플리케이션의 경우 항상 다음을 사용하세요. 약간의 유사성. OpenAI, Voyage 및 HuggingFace 임베딩 모델은 기아 벡터를 생성합니다. 정규화되었으므로 코사인 유사성과 내적은 동일한 결과를 제공합니다. 최대 성능이 필요하고 다음이 확실할 경우에만 내적을 사용하세요. 벡터가 정규화되었습니다.
3. 인덱싱 알고리즘: 벡터 DB가 검색을 가속화하는 방법
벡터 데이터베이스의 마법은 데이터베이스가 허용하는 인덱싱 알고리즘에 있습니다. 하위 선형 시간의 대략적인 검색(ANN). 세 가지 주요 접근 방식을 살펴보겠습니다.
3.1 HNSW(계층적 탐색 가능 작은 세계)
HNSW는 가장 많이 사용되는 알고리즘입니다. 각 노드가 있는 다단계 그래프를 구성합니다. 은 벡터를 나타내고 호는 인접한 벡터를 연결합니다. 연구는 다음에서 시작됩니다. 더 높은 수준(노드 수가 적고 연결이 길음)이 낮아지고(노드가 많음, 연결이 길음) 짧은 연결), 세계 지도에서 동네 지도로 이동하는 방법.
Livello 2 (pochi nodi): A ----------- B
| |
Livello 1 (più nodi): A --- C --- D - B --- E
| | | | |
Livello 0 (tutti nodi): A-F-C-G-D-H-B-I-E-J
Ricerca per il vettore Q:
1. Livello 2: Parti da A, vai a B (più vicino a Q)
2. Livello 1: Da B, esplora E (più vicino a Q)
3. Livello 0: Da E, esplora I, J -> trova J come nearest neighbor
HNSW 매개변수
| 매개변수 | 설명 | 기본 | 효과 |
|---|---|---|---|
M |
노드당 연결 수 | 16 | 높음 = 더 정확하지만 더 많은 메모리 |
ef_construction |
준비 중인 후보자 목록 규모 | 200 | 높음 = 더 좋지만 지수가 느림 |
ef_search |
검색 대상 후보자 목록의 크기 | 50 | 높음 = 더 정확하지만 느림 |
3.2 IVF(역파일 인덱스)
IVF는 k-평균을 사용하여 벡터 공간을 클러스터로 나눕니다. 검색 도중, 쿼리에 가장 가까운 클러스터가 식별되고 벡터만 검색됩니다. 해당 클러스터 내에서. 대규모 데이터 세트에 매우 효율적입니다.
Dataset con 1M di vettori, diviso in 1000 cluster:
Costruzione:
1. K-means con K=1000 -> 1000 centroidi
2. Ogni vettore assegnato al cluster più vicino
3. ~1000 vettori per cluster in media
Ricerca con nprobe=10:
1. Trova i 10 centroidi più vicini alla query
2. Cerca solo nei 10 cluster (10.000 vettori)
3. Invece di confrontare 1M vettori, ne confronta 10.000
4. Speedup: ~100x con minima perdita di precisione
3.3 플랫(무차별 대입)
인덱싱 없음: 데이터베이스의 모든 벡터에 대해 쿼리를 비교합니다. 완벽한 정확도(100%)이지만 O(n) 시간입니다. 소규모 데이터세트에만 사용하세요. (<10,000개 벡터) 또는 비교를 위한 기준으로 사용됩니다.
인덱싱 알고리즘 비교
| 연산 | 검색 속도 | 정도 | 메모리 | 사용 사례 |
|---|---|---|---|---|
| HNSW | 매우 빠르다 | ~95-99% | 높은 | 범용, 낮은 대기 시간 |
| IVF | 빠른 | ~90-98% | 평균 | 매우 큰 데이터세트 |
| 평평한 | 느림(O(n)) | 100% | 낮은 | 소규모 데이터 세트, 기준선 |
4. 비교: Pinecone vs Chroma vs Weaviate vs Qdrant vs pgVector
다음은 웹 개발자에게 가장 인기 있는 5가지 솔루션을 자세히 비교한 것입니다.
일반 비교
| 특징 | 솔방울 | 크로마 | 위비에이트 | Qdrant | pg벡터 |
|---|---|---|---|---|---|
| 유형 | 클라우드 관리 | 오픈 소스 | 오픈 소스 | 오픈 소스 | PG 확장 |
| 호스팅 | 클라우드 전용 | 로컬/클라우드 | 로컬/클라우드 | 로컬/클라우드 | 어디서나 PostgreSQL |
| 언어 | 해당 없음(SaaS) | 파이썬 | Go | Rust | C |
| 색인 | 소유자 | HNSW | HNSW | HNSW | IVFF플랫, HNSW |
| 무료 플랜 | 예(100,000개의 이동통신사) | 무제한(로컬) | 무제한(로컬) | 무제한(로컬) | 제한 없는 |
| 메타데이터 필터 | 예(고급) | 예(기본) | 예(GraphQL) | 예(고급) | 예(전체 SQL) |
| 하이브리드 검색 | Si | No | 예(BM25) | Si | 예(tsVector 사용) |
| 숨어 있음 | ~50ms (p99) | ~10-50ms(로컬) | ~20-80ms | ~10-30ms | ~20-100ms |
5. 솔방울: 벡터 DB 클라우드 네이티브
Pinecone은 유지 관리가 전혀 필요하지 않을 때 이상적인 선택입니다. 완전 서비스네요 간단한 API, 자동 확장 및 넉넉한 무료 등급으로 관리됩니다.
import { Pinecone } from "@pinecone-database/pinecone";
// 1. Inizializza il client
const pinecone = new Pinecone({
apiKey: process.env.PINECONE_API_KEY!,
});
// 2. Crea un indice (una sola volta)
await pinecone.createIndex({
name: "rag-demo",
dimension: 1536, // Deve corrispondere al modello di embedding
metric: "cosine", // cosine | dotproduct | euclidean
spec: {
serverless: {
cloud: "aws",
region: "us-east-1",
},
},
});
// 3. Connetti all'indice
const index = pinecone.Index("rag-demo");
// 4. Inserisci vettori (upsert)
await index.upsert([
{
id: "doc-1",
values: [0.23, -0.45, 0.67, ...], // vettore a 1536 dimensioni
metadata: {
source: "manuale.pdf",
page: 1,
category: "tutorial",
},
},
]);
// 5. Ricerca per similarità
const results = await index.query({
vector: [0.22, -0.44, 0.68, ...], // vettore query
topK: 5,
includeMetadata: true,
filter: {
category: { $eq: "tutorial" },
},
});
솔방울을 선택하는 경우
- 인프라 유지 관리가 필요하지 않습니다.
- 자동 확장이 필요합니다
- 프로젝트는 엄격한 SLA를 준수하여 제작 중입니다.
- 귀하의 예산이 허용합니다(무료 요금제는 여전히 넉넉합니다)
6. 크로마(Chroma): 간단한 로컬 개발
Chroma는 로컬 개발 및 프로토타입 제작에 적합합니다. 몇 초 만에 설치됩니다. 인메모리 또는 디스크 지속성으로 작동하며 깨끗한 API를 가지고 있습니다.
import { ChromaClient } from "chromadb";
// 1. Connetti al server Chroma
const client = new ChromaClient({
path: "http://localhost:8000",
});
// 2. Crea o connetti a una collezione
const collection = await client.getOrCreateCollection({
name: "rag-demo",
metadata: {
"hnsw:space": "cosine", // Metrica di similarità
"hnsw:M": 16, // Connessioni HNSW
"hnsw:efConstruction": 200, // qualità costruzione indice
},
});
// 3. Aggiungi documenti con embeddings
await collection.add({
ids: ["doc-1", "doc-2", "doc-3"],
embeddings: [
[0.23, -0.45, 0.67, ...],
[0.11, -0.33, 0.82, ...],
[-0.56, 0.78, -0.12, ...],
],
metadatas: [
{ source: "manuale.pdf", page: 1 },
{ source: "manuale.pdf", page: 2 },
{ source: "faq.txt", page: 1 },
],
documents: [
"RAG combina retrieval e generation...",
"Gli embeddings catturano il significato...",
"I vector database accelerano la ricerca...",
],
});
// 4. Ricerca per similarità
const results = await collection.query({
queryEmbeddings: [[0.22, -0.44, 0.68, ...]],
nResults: 5,
where: { source: "manuale.pdf" }, // Filtro metadata
});
7. Weaviate: 하이브리드 검색 및 통합 양식
Weaviate는 다음을 위한 기본 지원이 눈에 띕니다.하이브리드 검색 (의미 검색과 키워드 검색의 조합) 및 통합 모듈의 경우 임베딩 생성을 자동으로 관리합니다.
# docker-compose.yml
version: '3.4'
services:
weaviate:
image: cr.weaviate.io/semitechnologies/weaviate:1.24.5
ports:
- "8080:8080"
- "50051:50051"
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'text2vec-openai'
ENABLE_MODULES: 'text2vec-openai,generative-openai'
OPENAI_APIKEY: ${OPENAI_API_KEY}
CLUSTER_HOSTNAME: 'node1'
volumes:
- weaviate_data:/var/lib/weaviate
volumes:
weaviate_data:
import weaviate from "weaviate-client";
// 1. Connetti al server
const client = await weaviate.connectToLocal();
// 2. Crea la classe (schema)
await client.collections.create({
name: "Document",
vectorizers: [
weaviate.configure.vectorizer.text2VecOpenAI({
model: "text-embedding-3-small",
})
],
properties: [
{ name: "content", dataType: "text" },
{ name: "source", dataType: "text" },
{ name: "page", dataType: "int" },
],
});
// 3. Aggiungi documenti (embeddings generati automaticamente)
const collection = client.collections.get("Document");
await collection.data.insertMany([
{ content: "RAG combina retrieval e generation", source: "manuale.pdf", page: 1 },
{ content: "Gli embeddings catturano il significato", source: "manuale.pdf", page: 2 },
]);
// 4. Hybrid search (semantica + keyword)
const results = await collection.query.hybrid("cos'è RAG?", {
limit: 5,
alpha: 0.75, // 0 = solo keyword, 1 = solo semantica
});
Weaviate를 선택하는 경우
- 당신은 하이브리드 검색 (의미 + 키워드 BM25)
- 벡터 DB가 자동으로 임베딩을 생성하기를 원합니다.
- 쿼리에는 GraphQL 인터페이스를 선호합니다.
- 텍스트, 이미지, 멀티모달을 위한 통합 모듈이 필요합니다.
8. Qdrant: 성능과 유연성
Rust로 작성된 Qdrant는 벡터 데이터베이스 중 최고의 순수 성능을 제공합니다. 오픈 소스. 고급 메타데이터 필터링 및 필터 검색에 탁월합니다. 복잡한.
import { QdrantClient } from "@qdrant/js-client-rest";
// 1. Connetti al server (docker run -p 6333:6333 qdrant/qdrant)
const client = new QdrantClient({ url: "http://localhost:6333" });
// 2. Crea la collezione
await client.createCollection("rag-demo", {
vectors: {
size: 1536,
distance: "Cosine", // Cosine | Euclid | Dot
},
optimizers_config: {
default_segment_number: 2,
},
hnsw_config: {
m: 16,
ef_construct: 100,
},
});
// 3. Inserisci vettori
await client.upsert("rag-demo", {
wait: true,
points: [
{
id: 1,
vector: [0.23, -0.45, 0.67, ...],
payload: {
content: "RAG combina retrieval e generation",
source: "manuale.pdf",
page: 1,
tags: ["rag", "ai", "tutorial"],
},
},
],
});
// 4. Ricerca con filtri avanzati
const results = await client.search("rag-demo", {
vector: [0.22, -0.44, 0.68, ...],
limit: 5,
filter: {
must: [
{ key: "source", match: { value: "manuale.pdf" } },
{ key: "page", range: { gte: 1, lte: 10 } },
],
should: [
{ key: "tags", match: { value: "rag" } },
],
},
with_payload: true,
});
9. pgVector: PostgreSQL의 벡터
이미 PostgreSQL을 사용하고 있다면, pg벡터 벡터 지원 추가 스택에 새 데이터베이스를 도입하지 않고도 가능합니다. 유지하고 싶은 분에게 적합합니다. 모두 하나의 시스템에 있습니다.
-- 1. Installa l'estensione
CREATE EXTENSION IF NOT EXISTS vector;
-- 2. Crea la tabella con colonna vettoriale
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
source VARCHAR(255),
page INTEGER,
embedding vector(1536), -- Dimensione del vettore
created_at TIMESTAMP DEFAULT NOW()
);
-- 3. Crea l'indice HNSW (consigliato per < 1M righe)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- 4. Oppure IVFFlat (consigliato per > 1M righe)
-- CREATE INDEX ON documents
-- USING ivfflat (embedding vector_cosine_ops)
-- WITH (lists = 100);
-- 5. Ricerca per similarità
SELECT id, content, source, page,
1 - (embedding <=> '[0.22, -0.44, 0.68, ...]') AS similarity
FROM documents
WHERE source = 'manuale.pdf'
ORDER BY embedding <=> '[0.22, -0.44, 0.68, ...]'
LIMIT 5;
import { PrismaClient } from "@prisma/client";
import pgvector from "pgvector";
const prisma = new PrismaClient();
// Inserisci un documento con embedding
async function insertDocument(
content: string,
embedding: number[],
source: string
): Promise<void> {
await prisma.$executeRaw`
INSERT INTO documents (content, source, embedding)
VALUES (${content}, ${source}, ${pgvector.toSql(embedding)}::vector)
`;
}
// Ricerca per similarità
async function searchSimilar(
queryEmbedding: number[],
limit: number = 5
): Promise<any[]> {
const results = await prisma.$queryRaw`
SELECT id, content, source,
1 - (embedding <=> ${pgvector.toSql(queryEmbedding)}::vector) as similarity
FROM documents
ORDER BY embedding <=> ${pgvector.toSql(queryEmbedding)}::vector
LIMIT ${limit}
`;
return results as any[];
}
pgVector를 선택해야 하는 경우
- 이미 스택에서 PostgreSQL을 사용하고 있습니다.
- 메타데이터에 대한 JOIN 및 집계가 포함된 복잡한 SQL 쿼리가 필요합니다.
- 별도의 데이터베이스를 관리하는 복잡성을 피하고 싶은 경우
- 데이터 세트는 500만 개 미만의 벡터입니다.
- 벡터 데이터에 대한 ACID 트랜잭션이 필요합니다.
10. 메타데이터 필터링 및 하이브리드 검색
순수 유사성 검색이 항상 충분한 것은 아닙니다. 생산 과정에서 종종 의미론적 검색을 메타데이터 필터와 결합해야 합니다. 키워드 검색.
10.1 메타데이터 필터링
메타데이터를 사용하면 검색 범위를 문서의 하위 집합으로 좁힐 수 있습니다. 유사성 검색을 적용하기 전에. 이렇게 하면 정확도가 모두 향상됩니다. 공연보다.
Scenario: Knowledge base con documentazione di 3 prodotti
Senza filtro:
Query: "Come resettare il dispositivo?"
Risultati: Mix di istruzioni per Prodotto A, B e C
Problema: L'utente sta usando il Prodotto B
Con filtro:
Query: "Come resettare il dispositivo?"
Filtro: product = "Prodotto B"
Risultati: Solo istruzioni per il Prodotto B
Vantaggio: Risposta precisa e pertinente
10.2 하이브리드 검색
하이브리드 검색은 의미 검색(임베딩)과 키워드 검색을 결합합니다. (BM25/TF-IDF). 특히 기술 용어가 포함된 쿼리에 유용합니다. 의미론적 검색이 포착할 수 없는 고유명사 또는 코드.
하이브리드 검색을 사용해야 하는 경우
| 쿼리 유형 | 의미론만 | 키워드만 | 잡종 |
|---|---|---|---|
| "로그인은 어떻게 이루어지나요?" | 훌륭한 | 좋은 | 훌륭한 |
| "ERR_CONNECTION_REFUSED 오류" | 가난한 | 훌륭한 | 훌륭한 |
| "API 엔드포인트 /api/v2/users" | 평균 | 훌륭한 | 훌륭한 |
| "앱이 왜 느린가요?" | 훌륭한 | 가난한 | 훌륭한 |
11. 벡터 데이터베이스 선택 가이드
선택은 특정 상황에 따라 다릅니다. 다음은 실용적인 의사결정 트리입니다.
Hai già PostgreSQL nel tuo stack?
Si -> Dataset < 5M vettori?
Si -> pgvector (nessun nuovo DB da gestire)
No -> Considera un vector DB dedicato
Vuoi zero manutenzione?
Si -> Budget disponibile?
Si -> Pinecone (cloud managed)
No -> Chroma Cloud / Qdrant Cloud (piani gratuiti)
Hai bisogno di hybrid search?
Si -> Weaviate (BM25 integrato)
oppure Qdrant (sparse vectors)
Vuoi massime performance?
Si -> Qdrant (Rust, ottimizzato)
Stai prototipando / sviluppando localmente?
Si -> Chroma (setup in 1 minuto)
최종 조언
초기 선택에 너무 많은 시간을 낭비하지 마십시오. 크로마 시작하기 로컬 개발의 경우 프로덕션에 들어갈 때 Pinecone 또는 Qdrant로 마이그레이션하세요. LangChain.js는 벡터 저장소 인터페이스를 추상화하므로 변경하려면 다음이 필요합니다. 몇 줄의 코드를 수정합니다.
다음 단계
이 글에서 당신은 벡터 데이터베이스에 대한 심층적인 이해를 얻었습니다. 내부적으로 작업, 인덱싱 알고리즘, 유사성 측정항목 및 가장 널리 사용되는 솔루션 간의 차이점. Pinecone의 설정 예를 보셨나요? Chroma, Weaviate, Qdrant 및 pgVector와 올바른 제품을 선택하기 위한 실용적인 가이드입니다.
에서 다음 기사 우리는 OpenAI 및 Anthropic API 세부사항: 웹 애플리케이션에 통합하는 방법, 스트리밍 관리, 함수 호출 방법 모델 호출의 비용과 성능을 최적화합니다.
추가 리소스
- 솔방울: Pinecone.io - 문서 및 무료 계획
- 채도: trychroma.com - 1분 안에 로컬 설정
- 위비하다: weaviate.io - 하이브리드 검색 및 AI 모듈
- Qdrant: qdrant.tech - 성능 및 고급 필터
- pg벡터: github.com/pgVector/pgVector - PostgreSQL 확장
- ANN 벤치마크: ann-benchmarks.com - 알고리즘 성능 비교







