# GUARDiA 벡터 데이터베이스 제안서 > **서버**: zio-server (zioinfo.co.kr) | **작성일**: 2026-05-30 --- ## 1. 벡터 DB 비교 | DB | 설치 | 메모리 | 영속성 | REST API | 한국어 | GUARDiA 적합성 | |----|------|--------|--------|---------|--------|--------------| | **ChromaDB** | pip | 낮음 | 파일 기반 | ❌ (Python) | ✅ | ⭐ 1순위 | | **Qdrant** | Docker | 중간 | 볼륨 | ✅ | ✅ | ⭐ 2순위 | | FAISS | pip | 낮음 | 없음(메모리) | ❌ | ✅ | 빠른 검색 | | Weaviate | Docker | 높음 | 볼륨 | ✅ | ✅ | 대규모 용 | | Milvus | Docker | 높음 | 볼륨 | ✅ | ✅ | 엔터프라이즈 | --- ## 2. 최종 선택: ChromaDB ### 선택 이유 - **설치 간편**: `pip install chromadb` 한 줄 - **서버 RAM 절약**: 7.8GB RAM 환경에 최적 - **Python 직접 통합**: GUARDiA FastAPI와 완벽 연동 - **로컬 파일 영속**: 별도 서비스 불필요 - **Ollama 임베딩 연동**: `nomic-embed-text` 온프레미스 임베딩 ### 설치 및 설정 ```bash # 설치 /opt/guardia/venv/bin/pip install chromadb langchain-chroma # 디렉터리 mkdir -p /opt/guardia/vectordb ``` ### GUARDiA 연동 코드 ```python import chromadb from chromadb.config import Settings # 클라이언트 초기화 client = chromadb.PersistentClient( path="/opt/guardia/vectordb", settings=Settings(anonymized_telemetry=False) ) # 컬렉션 생성 collection = client.get_or_create_collection( name="guardia_kb", metadata={"hnsw:space": "cosine"} ) # 문서 추가 collection.add( documents=["서버 재시작 절차: systemctl restart guardia"], metadatas=[{"type": "kb", "category": "deployment"}], ids=["kb-001"] ) # 유사도 검색 results = collection.query( query_texts=["guardia 서비스 재시작하는 방법"], n_results=3 ) ``` --- ## 3. 2순위: Qdrant (Docker) RAM이 충분하거나 REST API가 필요한 경우 추천합니다. ```bash docker run -d --name qdrant \ -p 6333:6333 \ -v /opt/guardia/qdrant:/qdrant/storage \ qdrant/qdrant ``` --- ## 4. GUARDiA 코드베이스 학습 계획 ### 학습 데이터 소스 | 소스 | 내용 | 문서 수 예상 | |------|------|------------| | `/opt/guardia/app/routers/*.py` | API 라우터 코드 | ~70개 | | `/opt/guardia/app/core/*.py` | 비즈니스 로직 | ~38개 | | `/opt/guardia/app/models.py` | 데이터 모델 | 1개 (대용량) | | `/opt/guardia/app/static/` | UI 코드 | ~20개 | | `C:/GUARDiA/manual/*.md` | 운영 문서 | ~32개 | ### 임베딩 스크립트 ```python # /opt/guardia/app/scripts/embed_codebase.py from langchain_community.document_loaders import DirectoryLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_ollama import OllamaEmbeddings from langchain_chroma import Chroma loader = DirectoryLoader("/opt/guardia/app", glob="**/*.py", loader_cls=TextLoader, loader_kwargs={"encoding": "utf-8"}) docs = loader.load() splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) chunks = splitter.split_documents(docs) embeddings = OllamaEmbeddings( model="nomic-embed-text", base_url="http://localhost:11434" ) vectordb = Chroma.from_documents( chunks, embeddings, persist_directory="/opt/guardia/vectordb", collection_name="guardia_codebase" ) print(f"임베딩 완료: {len(chunks)}개 청크") ``` --- *GUARDiA ITSM v2.0.0 | (주)지오정보기술 | 2026-05-30*