# RAG를 통한 LLM 정확도 향상(2) - BizSpring BLOG

> RAG를 통한 LLM 정확도 향상(2) 2024년 12월 23일 2025년 01월 08일 테크 지난번 글에서 RAG의 의미와 간단한 예시에 대해서 알아보았습니다. RAG은 LLM 모델이 관련된 정보를 활용해 추론하게 해 정확도를 높이는 역할을 합니다. 이전 글 보기: RAG를

## 핵심 요약
- RAG 파이프라인에서 관련 정보를 저장·검색하기 위해 벡터 데이터베이스를 활용하는 방법을 다룬 후속 글입니다.
- 벡터 데이터베이스는 데이터를 고정 차원의 수치(벡터) 형태로 저장해 비정형 데이터 저장과 유사성 검색에 유리합니다.
- SQLite3 기반의 ChromaDB를 docker-compose로 구성하고 python으로 연결하는 실습 과정을 예시로 설명합니다.
- 문서를 임베딩해 collection에 저장하고, 사용자의 질의(query)를 임베딩해 유사 문서를 검색하는 코드를 소개합니다.
- 다음 글에서는 Spring AI를 활용한 코드 통합 RAG 구현을 다룰 예정임을 예고합니다.

# RAG를 통한 LLM 정확도 향상(2)

2024년 12월 23일 2025년 01월 08일
테크

지난번 글에서 RAG의 의미와 간단한 예시에 대해서 알아보았습니다. RAG은 LLM 모델이 관련된 정보를 활용해 추론하게 해 정확도를 높이는 역할을 합니다.

이전 글 보기: RAG를 통한 LLM 정확도 향상(1)

이번 글에서는 간단한 예시에서 좀 더 나아가 벡터 데이터베이스를 활용해 데이터를 임베딩 벡터로 저장하고 활용하는 파이프 라인 구성 중 벡터 데이터베이스 대해서 알아보겠습니다.

## RAG 파이프라인

지난번 글에서 RAG은 일반적으로 아래와 같은 구조를 가진다고 설명했습니다.

RAG 구조

사용자의 입력이 들어왔을 때 RAG 서버는 관련된 정보를 찾고 정보를 바탕으로 LLM 모델을 통해 데이터를 생성 후 사용자에게 반환하는 과정을 거칩니다.

지난번 글에서는 관련된 정보를 메모리 상의 배열로 단순히 저장했지만, 이번에는 벡터 데이터 베이스를 활용해 임베딩 벡터의 형태로 데이터를 저장하고 사용하는 RAG 파이프 라인을 구성해 보겠습니다.

## Vector Database

벡터 데이터베이스는 정보를 벡터의 형태로 저장하는 데이터베이스 입니다. 기존의 관계형 데이터 베이스와 달리 벡터 데이터베이스는 데이터를 고정된 차원을 가지는 수치의 형태로 저장합니다.

벡터 데이터베이스의 장점

이미지, 비디오와 같은 비정형/반정형 데이터의 저장에 유리

연속된 공간에 수치 형태로 저장되어 효육적인 유사성 검색이 능

벡터 데이터는 데이터 사이의 연관성을 추론하는데 높은 강점을 가집니다.

### Chroma DB

벡터 데이터베이스에서 사용할 수 있는 옵션은 몇 가지가 있으나 이번 글에서는 SQLite3 기반의 ChromaDB를 사용해 벡터 데이터베이스를 구현하겠습니다.

# docker-compose
version: "3.8"
services:
chromadb:
image: ghcr.io/chroma-core/chroma:0.5.20
container_name: chromadb
ports:
- "8000:8000"
volumes:
- C:/chromaDb:/chroma/chroma
environment:
IS_PERSISTENT: "TRUE"
ANONYMIZED_TELEMETRY: "TRUE"
restart: always

# python package
pip install chroma

도커 이미지가 정상적으로 실행되면 “C:/chromaDb” 폴더에 chroma.splite3 파일이 생성되었을 것 입니다.

이어서 파이썬 코드를 작성해 보겠습니다.

import uuid
import chromadb
from chromadb.utils import embedding_functions
import os
from typing import Dict

class ChromaDbImpl:
def __init__(self, collection_name: str):
self._config = {
"host": os.getenv("CHROMA_HOST"),
"port": int(os.getenv("CHROMA_PORT"))
}
self.client = chromadb.HttpClient(**self._config)
self.collection = self.client.get_or_create_collection(collection_name)
self.embedding_function = embedding_functions.DefaultEmbeddingFunction()

ChromaDB는 host와 port를 이용해 데이터베이스에 연결합니다.

Http 요청을 사용하는 클라이언트를 사용합니다.

임베딩 벡터를 생성하기 위한 방법에는 ChromaDB의 기본 임베딩 함수를 사용하겠습니다. DefaultEmbeddingFunction은 실제로 임베딩 값을 생성하지는 않습니다. 벡터 임베딩으로 저장하기 위해서는 임베딩 모델을 사용해야 합니다.

문서 추가

def add_document(self, documents: list[str]) -> Dict[str, str]:
embeddings = self.embedding_function(documents)
ids = [str(uuid.uuid4()) for _ in range(len(documents))]
metadatas = [{"index": i, "version": 1.0} for i in range(len(documents))]
self.collection.add(
documents=documents,
embeddings=embeddings,
metadatas=metadatas,
ids=ids
)

return {ids[i]: documents[i] for i in range(len(ids))}

documents를 임베딩하고 랜덤하게 생성된 uuid를 부여해 collection에 임베딩을 저장합니다.

MySQL Workbench에서 db 연결 후 쿼리를 실행했을 때 데이터가 저장된 것을 확인할 수 있습니다.

문서 검색

def search_docuemnt(self, query: str) -> list[str]:
# testing
result = self.collection.query(query_embeddings=self.embedding_function(query), n_results=1)
return result['ids']

사용자의 입력(query)를 동일하게 임베딩 벡터로 변환 후 유사한 문서를 검색합니다.

벡터 공간 상의 거리에 따라서 쿼리와 유사하다고 판단되는 문서들이 반환됩니다.

ChromaDB와 python을 활용해 벡터 데이터 베이스를 구성해 보았습니다. 벡터 데이터베이스를 활용하면 데이터 간 유사도를 바탕으로 검색이 가능하기 때문에 RAG를 쉽게 구현할 수 있는 장점이 있습니다.

다음 글에서는 코드 통합을 위한 Spring AI를 활용한 RAG 구현에 대해서 알아보겠습니다.

[References] – https://www.elastic.co/kr/what-is/vector-database – https://www.ibm.com/kr-ko/topics/vector-database

## Related Posts via Categories

구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험
AI가 React 앱을 직접 디버깅 – Agent 기반 디버깅
ChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간
AI 시대, 데이터도 설명이 필요합니다
MCP 클라이언트는 Authorization Server를 어떻게 찾는가: 공식 MCP TypeScript SDK와 VS Code 구현 비교
RAG 시대의 GEO: AI가 콘텐츠를 읽는 방식과 스키마의 진짜 역할
AI 에이전트로 웹 데이터 수집 가능 여부 자동 검증하기
GA4 Intraday 실시간 테이블, 대시보드 원천 데이터로 바로 사용할 수 있을까?
워크플로우 오케스트레이션 플랫폼 Temporal 알아보기
iOS 14.5부터 GA4까지, 환경 변화가 가져온 업무 폭증을 해결하는 실무 전략은…?

다음에 대해 검색하기...

최신 글 둘러보기

기존 SEO와 무엇이 같고 무엇이 다른가

콘텐츠가 답인 걸 모르는 사람은 없습니다 — 문제는 지속입니다

광고비를 늘리지 않고 매출을 늘린 회사들은 무엇을 했나

코호트로 비교하면 광고 예산 판단이 달라집니다

GEO를 위한 글쓰기를 위한 작은 노하우

(해외동향) 광고주가 광고플랫폼 리포트에서 자체 측정으로 옮겨가고 있다.

구글애즈가 정확검색·구문검색 키워드까지 AI 모드에 노출하기 시작했다 — 자동화 상품 없이 AI 답변 화면에 들어가는 첫 실험

AI가 React 앱을 직접 디버깅 – Agent 기반 디버깅

ChatGPT 광고가 픽셀·전환 API·맞춤 오디언스를 갖췄다 — 답변 화면이 측정 가능한 광고 매체가 되는 순간

마케팅 자동화, 무엇부터 자동화해야 할까?

출처: https://blog.bizspring.co.kr/%ed%85%8c%ed%81%ac/rag%ec%9d%84-%ed%86%b5%ed%95%9c-llm-%ec%a0%95%ed%99%95%eb%8f%84-%ed%96%a5%ec%83%812/

## FAQ
**Q. 벡터 데이터베이스가 기존 관계형 데이터베이스와 다른 점은 무엇인가요?**

A. 관계형 데이터베이스와 달리 벡터 데이터베이스는 데이터를 고정된 차원을 가지는 수치(벡터) 형태로 저장합니다. 이를 통해 이미지, 비디오 같은 비정형/반정형 데이터 저장에 유리하고, 연속된 공간에서 효율적인 유사성 검색이 가능합니다.

**Q. 이번 글에서는 어떤 벡터 데이터베이스를 사용했나요?**

A. SQLite3 기반의 ChromaDB를 사용했습니다. docker-compose로 ChromaDB 이미지를 실행하고 python의 chromadb 패키지를 설치해 구현했습니다.

**Q. ChromaDB의 DefaultEmbeddingFunction으로 실제 임베딩 값이 생성되나요?**

A. 아니요, 본문에 따르면 DefaultEmbeddingFunction은 실제로 임베딩 값을 생성하지 않습니다. 벡터 임베딩으로 저장하기 위해서는 별도의 임베딩 모델을 사용해야 합니다.

**Q. 문서 검색은 어떤 방식으로 이루어지나요?**

A. 사용자의 입력(query)을 동일하게 임베딩 벡터로 변환한 후, collection.query를 통해 유사한 문서를 검색합니다. 벡터 공간 상의 거리를 기준으로 쿼리와 유사하다고 판단되는 문서들이 반환됩니다.

**Q. 다음 글에서는 어떤 내용을 다루나요?**

A. 다음 글에서는 코드 통합을 위한 Spring AI를 활용한 RAG 구현에 대해서 다룰 예정이라고 안내하고 있습니다.

---
출처: https://bizspring.ai/kb/ref/web/blog-bizspring-co-kr/rag를-통한-llm-정확도-향상-2-bizspring-blog · 최종 갱신 2026-09-06T11:59:55.056789+00:00
