벡터 검색 — 임베딩 기반 의미 검색
벡터 검색 — 임베딩 기반 의미 검색
Convex 벡터 검색은 제공된 벡터와 유사한 문서를 찾는 기능이에요. 보통 임베딩(텍스트·이미지·오디오의 숫자 표현)을 사용해 RAG 챗봇, 추천, 의미 검색 같은 AI 앱에 유용한 컨텍스트를 LLM에 전달해요.
설정 (벡터 인덱스)
스키마의 테이블에 .vectorIndex(...)를 추가해요.
foods: defineTable({
description: v.string(),
cuisine: v.string(),
embedding: v.array(v.float64()),
}).vectorIndex("by_embedding", {
vectorField: "embedding",
dimensions: 1536,
filterFields: ["cuisine"],
}),
검색 (action 안에서만)
벡터 검색은 Convex action에서만 가능해요. 3단계로 진행돼요.
export const similarFoods = action({
args: { descriptionQuery: v.string() },
handler: async (ctx, args) => {
const embedding = await embed(args.descriptionQuery); // 1. 임베딩 생성
const results = await ctx.vectorSearch("foods", "by_embedding", {
vector: embedding, limit: 16,
filter: (q) => q.eq("cuisine", "French"),
}); // 2. 유사 문서 검색
// 3. 필요 정보 로드
},
});
요점
- 반환은
_id와_score(-1~1)만 — 원본 문서는 별도 로드 - 검색은 항상 관련성 순, 코사인 유사도 기반 근사 최근접 이웃(ANN)
- 필터는 가능한 한
vectorSearch에 넣어 성능을 지켜요 - 벡터·필터 필드는 점으로 구분된 경로(
properties.name)로 중첩 문서도 지정 가능