로컬 시맨틱 검색을 위한 AI 대화용 fastembed와 LanceDB

한 개발자가 클라우드 의존성이나 API 키 없이 368K개의 메시지를 처리하는 AI 대화 기록용 로컬 시맨틱 검색 시스템을 구현했습니다. 이 프로젝트는 CPU 기반 임베딩을 위해 BAAI/bge-small-en-v1.5 모델과 fastembed를 사용하며, 서버 프로세스 없이 단일 디렉토리로 운영되는 벡터 저장소로 LanceDB를 활용합니다.
기술 스택
- 임베딩: BAAI/bge-small-en-v1.5 모델(384차원)과 fastembed
- 벡터 저장소: LanceDB - 단일 디렉토리, 서버 프로세스 없음, 추가 작업에 용이
- 수집: JSONL 세션 기록(Claude Code, 모든 채팅 내보내기)에서 가져옴
- 임베딩 성능: M4 CPU에서 약 500 docs/sec
주요 구현 세부사항
개발자는 4개월 간의 반복 과정에서 몇 가지 실용적인 교훈을 얻었습니다:
- 선택적 임베딩: 초기 버전은 모든 메시지를 임베딩하여 신호 대 잡음비를 감소시켰습니다. 현재 구현에서는 사용자 메시지와 실질적인 내용이 있는 어시스턴트 메시지만 임베딩하며("물론, 여기 코드입니다"와 같은 응답은 건너뜀), 벡터 수를 60% 줄이면서 검색 품질을 향상시켰습니다.
- 청킹 전략: 고정 크기 청크에서 대화 턴 기반 청크로 전환함으로써 검색 관련성이 크게 개선되었습니다. 모델 선택(nomic-embed-text, bge-large, all-MiniLM 시도)은 청킹 방식에 비해 미미한 차이만 보였습니다.
- LanceDB 장점: 개발자는 LanceDB가 "개인 규모에서는 어리석을 정도로 저평가되었다"고 평가했습니다 - 서버 없음, Docker 없음, 단순히 새 벡터를 즉시 추가할 수 있는 디렉토리만으로 과도하게 설계된 pgvector 설정을 대체했습니다.
- 재임베딩 워크플로: 384차원의 bge-small-en-v1.5 모델은 cron 작업으로 시간 단위 재임베딩을 수행할 만큼 충분히 빠릅니다. M2 하드웨어에서 117K 벡터의 전체 재인덱싱은 약 4분이 소요됩니다.
성능 지표
- 수집된 총 메시지: 407K
- 인덱싱된 벡터: 87K
- 검색 지연 시간(p50): 117K 벡터 기준 12ms
- 전체 재인덱싱 시간: 약 4분(M2)
- 저장 공간: 디스크 상 약 180MB
- 필요한 API 키: 0
이 프로젝트는 MIT 라이선스 하에 오픈 소스로 제공되며 github.com/mordechaipotash/brain-mcp에서 확인할 수 있습니다. 설치 방법은 pipx install brain-mcp && brain-mcp setup입니다.
📖 Read the full source: r/LocalLLaMA
👀 See Also

AIDA: AI 기반 침투 테스트를 위한 오픈소스 플랫폼
AIDA는 MCP 연결을 통해 Docker 컨테이너에 완전한 침투 테스트 환경을 제공하는 오픈소스 플랫폼입니다. 최신 버전은 40GB Exegol 요구 사항을 필수 보안 도구를 포함한 1GB 용량의 맞춤형 컨테이너로 대체했습니다.

Ruflo: 다중 AI 에이전트를 팀으로 운영하는 오픈소스 플랫폼
Ruflo는 복잡한 작업을 팀으로 협력하는 여러 AI 에이전트를 함께 실행할 수 있는 오픈소스 플랫폼입니다. 이전에는 Claude Flow로 알려졌으며, 작업을 여러 부분으로 나누어야 하는 워크플로우를 조정하는 데 도움을 줍니다.

개발자가 Claude AI가 50개 한도를 초과하는 규칙을 무시하는 문제에 대한 해결책을 공유합니다.
한 개발자가 Claude Code, Cursor, Codex와 공유 규칙 세트를 사용하며 특정 제한 사항을 발견했습니다: 규칙 수가 약 50개를 넘어서면 Claude가 프론트엔드 작업 중에 규칙을 조용히 무시하기 시작했습니다. 이 문제는 너무 많은 관련 없는 컨텍스트가 시스템을 압도하는 데서 비롯된 것으로 보입니다.

로컬 LLM을 클로드 코드 서브에이전트로 사용하여 컨텍스트 사용량 줄이기
개발자가 Claude Code를 사용하여 LM Studio의 API를 통해 로컬 LLM에 작업을 위임하는 방법을 공유하며, 파일 내용을 Claude의 컨텍스트에서 제외합니다. 이 접근 방식은 로컬에서 파일을 읽고 요약을 반환하기 위해 도구 호출을 사용하는 약 120줄의 Python 스크립트를 활용합니다.