MongoDB Vector Search와 RAG PART 1
Source: Dev.to
RAG란 무엇인가?
Retrieval‑augmented generation (RAG)은 대형 언어 모델(LLM)이 새로운 정보를 검색하고 통합할 수 있게 하는 기술입니다. RAG는 컨텍스트 데이터를 LLM에 제공하여 보다 정확하고 근거가 있는 답변을 생성합니다.
RAG에서 벡터 검색이 중요한 이유
전통적인 키워드 검색은 질의가 모호하거나, 패러프레이즈되었거나, 의미적으로 풍부할 때 한계가 있습니다. 벡터 검색은 텍스트를 고차원 임베딩으로 표현하여 문자 그대로의 단어가 아니라 의미를 인코딩함으로써 이 문제를 해결합니다.
임베딩
문서와 사용자 질의를 고차원 벡터로 변환하여 의미를 포착합니다.
인덱싱
이 벡터들을 사용해 HNSW, IVF‑Flat, PQ와 같은 근사 최근접 이웃(ANN) 구조를 구축하여 효율적인 유사도 검색을 가능하게 합니다.
검색
입력된 질의를 임베딩하고 인덱스된 벡터와 비교해 의미적 유사도가 가장 높은 결과를 반환합니다.
예시 시나리오
소스
- Source 1 – “Hono는 웹 표준 위에 구축된 빠르고 가벼운 JavaScript 프레임워크입니다. 낮은 오버헤드, 엣지‑친화적 실행, 최소한의 API 표면에 중점을 둡니다.”
- Source 2 – “Elysia는 Bun‑에 최적화된 웹 프레임워크로 강력한 타입 지정, 스키마 검증, 뛰어난 성능을 제공합니다. 개발자 친화적인 ergonomics를 갖춘 확장 가능한 HTTP 서비스를 구축하도록 설계되었습니다.”
- Source 3 – “Express는 최소주의적이며 널리 채택된 Node.js 프레임워크입니다. 단순성, 방대한 생태계, 유연한 미들웨어 모델 덕분에 REST API 구축에 흔히 사용됩니다.”
사용자 질의
JavaScript로 백엔드 서비스를 구축하고, Bun 런타임과 더 잘 통합하려면 어떻게 해야 할까요?
이 질의가 임베딩될 때, 생성된 벡터는 백엔드 서비스, API 개발, HTTP 프레임워크, JavaScript 서버‑사이드 기술과 같은 개념을 나타냅니다.
일반적인 임베딩 모델(Voyage, OpenAI, HuggingFace 등)은 512에서 3072 차원의 벡터를 생성합니다. 예시 벡터:
[
0.0182, -0.0925, 0.0441, 0.0107, -0.0713, 0.1234, -0.0089, 0.0562,
-0.0041, 0.0977, 0.0229, -0.0335, 0.1412, -0.0611, 0.0054, 0.0883,
-0.0122, 0.0745, -0.1099, 0.0671, 0.0144, -0.0528, 0.0995, -0.0173,
0.0811, -0.0442, 0.0368, 0.1210, -0.0075, 0.0932, -0.0661, 0.0152,
0.0473, -0.0891, 0.1329, 0.0287, -0.0174, 0.0721, -0.0554, 0.1012,
0.0069, -0.0312, 0.1184, -0.0251, 0.0526, 0.0048, -0.0903, 0.1301,
0.0110, -0.0782, 0.0433, 0.0271, -0.0622, 0.0999, -0.0148, 0.0711,
0.0835, -0.0222, 0.0579, -0.0384
]
벡터 검색은 인덱스를 사용해 이 질의 벡터와 소스에서 생성된 벡터를 비교합니다. 유사도 검색을 통해 질의 의도와 의미적으로 가장 가까운 소스를 검색하고 반환합니다.
검색 결과
[
{
"text": "Elysia는 Bun‑에 최적화된 웹 프레임워크로 강력한 타입 지정, 스키마 검증, 뛰어난 성능을 제공합니다. 개발자 친화적인 ergonomics를 갖춘 확장 가능한 HTTP 서비스를 구축하도록 설계되었습니다.",
"score": 0.91
},
{
"text": "Express는 최소주의적이며 널리 채택된 Node.js 프레임워크입니다. 단순성, 방대한 생태계, 유연한 미들웨어 모델 덕분에 REST API 구축에 흔히 사용됩니다.",
"score": 0.78
},
{
"text": "Hono는 웹 표준 위에 구축된 빠르고 가벼운 JavaScript 프레임워크입니다. 낮은 오버헤드, 엣지‑친화적 실행, 최소한의 API 표면에 중점을 둡니다.",
"score": 0.61
}
]
MongoDB Atlas Vector Search를 사용하는 이유
MongoDB Atlas Vector Search는 벡터 유사도, 메타데이터 필터링, 문서 저장을 하나의 통합 시스템으로 제공합니다. 벡터 데이터베이스와 운영 데이터베이스를 별도로 운영하는 대신, Atlas에서는 임베딩, 원본 문서, 애플리케이션 데이터를 나란히 보관할 수 있습니다. 이는 두 시스템을 동기화해야 하는 오버헤드를 없애고, 지연 시간을 줄이며, 아키텍처를 단순화합니다.
RAG 파이프라인에서는 이것이 중요합니다. 원본 소스, 임베딩, 그리고 태그, 타임스탬프, 접근 규칙, 버전 등과 같은 컨텍스트 메타데이터를 모두 한 곳에 저장하고, 한 번의 라운드 트립으로 전체를 조회할 수 있기 때문입니다.
MongoDB Vector Search 작동 방식
MongoDB는 임베딩을 다른 필드와 마찬가지로 숫자 배열 형태로 컬렉션에 저장합니다. 해당 필드에 벡터 검색을 활성화하면 Atlas는 빠른 의미 유사도 조회를 위해 최적화된 ANN 인덱스를 구축합니다.

질의가 들어오면 Atlas는 임베딩된 입력(보통 애플리케이션이나 LLM 워크플로를 통해)을 사용해 질의 벡터를 인덱스된 벡터와 비교하고, 거리(또는 유사도)가 가장 작은 문서를 반환합니다.
MongoDB Atlas에서 벡터 검색 인덱스 만들기
MongoDB Atlas에서 벡터 검색을 사용하려면 임베딩을 저장하는 필드에 벡터 인덱스를 정의합니다. 이 인덱스는 Atlas가 ANN 그래프(HNSW)를 어떻게 구성하고 어떤 유사도 메트릭을 사용할지 알려줍니다.
인덱스 정의
{
"mappings": {
"dynamic": false,
"fields": {
"embedding": {
"type": "knnVector",
"dimensions": 1536,
"similarity": "cosine"
}
}
}
}
embedding– 각 문서가 벡터 표현을 저장하는 필드.dimensions– 사용 중인 임베딩 모델의 차원 수와 일치해야 합니다.similarity– 검색 시 거리 계산 방법을 정의합니다(예: 코사인).
벡터 검색 질의
{
"$vectorSearch": {
"index": "frameworks_vector_index",
"path": "embedding",
"queryVector": [/* query embedding values */],
"numCandidates": 50,
"limit": 3
}
}
Atlas는 queryVector를 사용해 HNSW 그래프를 탐색하고, 설정된 유사도 메트릭에 따라 가장 가까운 노드를 찾아 상위 결과를 반환합니다.
핵심 요구 사항: 저장된 문서와 들어오는 질의 모두에 동일한 임베딩 모델을 사용해야 합니다. 모델이나 버전을 혼용하면 벡터 호환성이 깨지고 유사도 검색 성능이 저하됩니다.
결론
이 개요에서는 RAG, 벡터 검색, MongoDB Atlas가 실무 워크플로에서 어떻게 결합되는지를 살펴보았습니다. 앞으로 더 깊은 RAG 아키텍처, 벡터 인덱싱 전략, 하이브리드 검색 등에 대한 내용을 다룰 예정이니 기대해 주세요.