AI

RAG 와 백터 DB(ChromaDB) 이해하

recording or reCoding 2026. 5. 4. 15:23

ChromaDB는 RAG 시스템에서 가장 많이 쓰이는 벡터 데이터베이스 중 하나로, “텍스트를 의미 기반 숫자 벡터로 바꿔 저장하고 검색하는 DB”다.

핵심 개념은 3가지로 정리된다.

1) Embedding 기반 저장

  • 텍스트, 이미지 등을 숫자 벡터로 변환
  • 이 벡터는 “의미”를 압축한 표현
  • 단순 키워드가 아니라 의미 유사도를 기준으로 비교 가능

2) Semantic Search (의미 검색)

  • 사용자의 질문도 embedding으로 변환
  • DB에 저장된 벡터들과 거리 계산 (cosine 등)
  • 가장 “의미가 가까운 문서”를 찾아 반환

즉 단어 일치 검색 이 아니라  의미 유사도 검색 이다.

3) RAG에서의 역할

RAG 구조는 결국 이렇게 동작한다:

질문 → embedding 변환 → vector DB 검색 → 관련 문서 반환 → LLM에게 context로 전달 → 답변 생성

즉 ChromaDB는 LLM이 “외부 지식 검색”을 하는 부분을 담당한다.

4) ChromaDB 특징

  • 로컬에서도 사용 가능 (경량)
  • embedding 자동 생성 기능 있음
  • document + embedding + metadata 같이 저장
  • 필터링 가능 (조건 검색)
  • RAG 실험/프로토타입에 많이 사용

 

마지막 정리 

 

RAG(Retrieval-Augmented Generation)는 기존의 LLM이 가진 한계를 보완하기 위한 구조로, 외부 데이터 검색 기능을 결합해 답변의 정확도를 높이는 방식이다. LLM은 기본적으로 학습된 데이터 범위 안에서만 답변을 생성하기 때문에 최신 정보나 특정 도메인 지식에서는 한계가 존재한다. RAG는 이 문제를 해결하기 위해 질문이 들어오면 먼저 외부 저장소에서 관련 정보를 검색하고, 그 결과를 LLM의 입력(context)으로 함께 제공해 답변을 생성하도록 만든 구조다. 즉 단순히 프롬프트를 “잘 만드는 기술”이 아니라, 검색 시스템과 생성 모델을 결합한 아키텍처라고 보는 것이 정확하다.

 

이때 중요한 역할을 하는 것이 벡터 데이터베이스다. 대표적으로 ChromaDB 같은 시스템은 문서를 그대로 저장하는 것이 아니라, embedding 모델을 이용해 문장을 의미를 담은 숫자 벡터로 변환한 뒤 저장한다. 이렇게 변환된 벡터는 단어 자체가 아니라 “의미의 위치”를 나타내기 때문에, 키워드가 정확히 일치하지 않아도 의미적으로 유사한 문서를 찾을 수 있다. 사용자의 질문 역시 동일하게 벡터로 변환되고, 데이터베이스에 저장된 벡터들과 거리 계산을 통해 가장 의미가 가까운 데이터를 찾아 반환한다.

이 과정에서 ChromaDB는 단순 저장소가 아니라 “의미 기반 검색 엔진” 역할을 한다. 텍스트, 벡터, 메타데이터를 함께 저장할 수 있고, 검색 시에는 cosine similarity 같은 방식으로 유사도를 계산해 가장 관련성 높은 문서를 반환한다. 이렇게 찾아낸 문서는 LLM에게 추가 context로 전달되고, LLM은 이를 기반으로 최종 답변을 생성한다.

 

정리하면 RAG는 LLM이 외부 지식을 검색해 활용할 수 있도록 만든 구조이고, 벡터 데이터베이스는 그 검색을 의미 기반으로 수행하기 위해 필요한 핵심 인프라다. ChromaDB는 이 역할을 수행하는 대표적인 경량 벡터 데이터베이스로, embedding 기반 검색을 통해 LLM이 더 정확하고 근거 있는 답변을 생성할 수 있도록 돕는다.

 

 

ChromaDB v2는 벡터 데이터와 메타데이터를 저장하고 검색하는 벡터 데이터베이스로 현재 공식 자바 SDK 보다는 커뮤니티 주도 SDK나 REST API 기반의 호출이 주를 이룹니다. 아래 내용은 REST API 구조와 이를 자바에서 RestTemplate 또는 HttpClient로 호출하는 형식을 기준으로 정리한 자료입니다.

 

ChromaDB v2 주요 API 구성

ChromaDB API는 크게 Collection 관리와 데이터 처리를 위한 CRUD 단계로 나뉩니다.

  1. Collection 관리 ChromaDB의 데이터는 Collection 단위로 격리되어 관리됩니다.
  2. 조회: 전체 컬렉션 목록을 가져옵니다.
  3. 생성: 새로운 이름의 컬렉션을 생성하거나 기존 것을 가져옵니다.
  4. 삭제: 특정 이름의 컬렉션을 제거합니다.
  5. CRUD 작업 Create: 문서, 메타데이터, 벡터 임베딩을 추가합니다. Read: 고유 ID를 통해 특정 데이터를 조회하거나 쿼리를 통해 유사한 벡터를 검색합니다. Update: 특정 ID의 문서 내용이나 메타데이터를 수정합니다. Delete: 특정 ID를 가진 데이터를 컬렉션에서 삭제합니다.

JAVA 호출 코드 구현 예시

자바 환경에서 표준적인 HTTP 통신을 사용하여 ChromaDB v2 서버와 통신하는 코드 구조입니다.

1. Collection 생성 및 관리

컬렉션을 정의하고 생성하는 단계입니다.

public class ChromaCollectionManager {
    private final String baseUrl = "http://localhost:8000/api/v2";
    private final RestTemplate restTemplate = new RestTemplate();

    public void createCollection(String collectionName) {
        String url = baseUrl + "/collections";
        Map<String, String> request = new HashMap<>();
        request.put("name", collectionName);
        request.put("get_or_create", "true");
        
        restTemplate.postForEntity(url, request, String.class);
    }
}

2. 데이터 추가 (Create)

임베딩과 메타데이터를 포함한 데이터를 컬렉션에 삽입합니다.

public void addDocument(String collectionId, String id, List<Double> embedding, String document) {
    String url = baseUrl + "/collections/" + collectionId + "/add";
    Map<String, Object> request = new HashMap<>();
    request.put("ids", Collections.singletonList(id));
    request.put("embeddings", Collections.singletonList(embedding));
    request.put("documents", Collections.singletonList(document));
    
    restTemplate.postForEntity(url, request, String.class);
}

3. 유사도 검색 (Read/Query)

입력된 벡터와 가장 가까운 데이터를 찾아 반환합니다.

public String queryVector(String collectionId, List<Double> queryEmbedding, int nResults) {
    String url = baseUrl + "/collections/" + collectionId + "/query";
    Map<String, Object> request = new HashMap<>();
    request.put("query_embeddings", Collections.singletonList(queryEmbedding));
    request.put("n_results", nResults);
    
    return restTemplate.postForObject(url, request, String.class);
}

4. 데이터 수정 및 삭제 (Update & Delete)

특정 ID를 대상으로 정보를 갱신하거나 제거합니다.

public void deleteDocument(String collectionId, String id) {
    String url = baseUrl + "/collections/" + collectionId + "/delete";
    Map<String, Object> request = new HashMap<>();
    request.put("ids", Collections.singletonList(id));
    
    restTemplate.postForEntity(url, request, String.class);
}

요약 정보

데이터 흐름은 컬렉션 생성 후 임베딩 모델을 통해 생성된 벡터값을 ChromaDB 서버로 전송하는 방식으로 진행됩니다. 자바 애플리케이션에서는 JSON 객체를 맵핑하여 POST 요청을 보내는 것이 핵심이며 반환되는 결과값에서 문서와 거리(distance) 값을 추출하여 사용합니다. v2 API는 경로 구조가 간결해졌으며 대량의 벡터를 배치(Batch)로 처리할 때 성능 이점이 있습니다.