# ── RAG 임베딩/검색 의존성 (services/rag.py 전용, 무거움) ────────────────────── # 설계 확정 전제(MEMORY_KNOWLEDGE_PERSONA_DESIGN §0.1): BGE-M3(dense+sparse 단일모델) # + pgvector(HNSW cosine) + 하이브리드 + Anthropic Contextual Retrieval + BGE-reranker-v2-m3. # # ⚠️ 이 파일의 의존성은 *무겁다*(torch ~2GB). app.main / app.services.rag 의 import 는 # 이게 없어도 통과해야 한다(rag.py 가 FlagEmbedding/torch 를 함수 내부 지연 import). # 런타임 검색/인덱싱을 실제로 돌릴 때만 설치 필요. 미설치 시 rag.NotConfigured → 503. # # 설치: pip install -r requirements-rag.txt (base requirements.txt 위에 추가) # 임베딩 + 리랭커 (BGE-M3 dense/sparse/colbert + bge-reranker-v2-m3 단일 패키지) # ⚠️ 버전 핀(2026-06-26 실검증): FlagEmbedding 1.4.x(신규 리라이트)는 BGEM3FlagModel 로드 시 # `XLMRobertaModel.__init__() got an unexpected keyword argument 'dtype'` 로 깨진다. # 1.2.11 + transformers 4.44.2 조합에서 BGE-M3 정상 로드/인코딩(dense dim=1024) 확인. FlagEmbedding==1.2.11 # BGE-M3 백엔드(transformers/torch). FlagEmbedding 1.2.11 과 정합하는 transformers 핀. torch>=2.1 transformers==4.44.2 # (선택) sentence-transformers — 보조 임베딩/유틸. FlagEmbedding 만으로도 BGE-M3 동작. sentence-transformers>=2.7 # DB pgvector 코덱(선택) — db.py 가 텍스트 캐스트($1::vector)로 우회하므로 미설치도 동작. # 바이너리 코덱 등록(register_vector) 시 성능↑. 붙이면 rag._vector_literal 대신 list 직접 바인딩 가능. pgvector>=0.2.5