문제
Cursor, Claude 같은 AI 코딩 어시스턴트는 지금 열려 있는 파일만 본다. 코드베이스 전체 구조 — 어떤 심볼이 어디서 정의되고 누가 그것을 호출하는지 — 를 모른 채 답을 만든다. 이를 해결하는 기존 대안들은 코드베이스를 클라우드로 전송해 인덱싱한다. 클라우드 인덱싱이 금지된 보안 민감 환경에서는 선택지가 아니다.
amdb는 이 전제를 뒤집는다. 스캔, 심볼 추출, 벡터 임베딩까지 전 과정이 로컬 머신에서 끝난다.
설계
파이프라인은 init 한 번, generate 반복이다.
amdb init: 코드베이스를 스캔해 Tree-sitter로 AST를 파싱하고 심볼을 추출한다. 지원 언어는 Rust, Python, JavaScript, TypeScript, C, C++, C#, Go, Java, Ruby, PHP, HTML, CSS, JSON, Bash 16종. 추출된 심볼과 관계는 SQLite(rusqlite)에 저장하고, fastembed로 로컬 벡터 임베딩을 만들어 벡터 DB를 구축한다. 파일 단위 작업은 rayon으로 병렬화했다.amdb generate: 저장된 심볼·관계·벡터를 조합해 LLM에 붙여넣을 압축 컨텍스트 마크다운을 생성한다.amdb daemon: 파일 변경을 실시간 감시해 DB를 증분 업데이트한다. 저장할 때마다 다시init을 돌릴 필요가 없다.
설치는 crates.io 한 줄이면 된다. GitHub Releases 바이너리와 Docker 이미지(ghcr.io)로도 배포한다.
cargo install amdb핵심 구현
focus 모드 — 하이브리드 검색
--focus에 자연어 질의를 주면 관련 심볼만 골라 컨텍스트를 좁힌다. 검색은 두 단계다: 심볼 이름 exact match를 먼저 시도하고, 없으면 fastembed 벡터 유사도 검색으로 넘어간다. 식별자를 정확히 알면 정확하게, 개념만 알면 의미로 찾는다.
amdb generate --focus "login authentication jwt"call graph depth 제어
focus로 잡은 심볼에서 호출 그래프를 몇 단계까지 따라갈지 --depth로 제어한다. --depth 0은 매칭된 심볼 자체만, 값을 올리면 호출하고 호출되는 이웃 심볼까지 컨텍스트에 포함한다.
amdb generate --focus "authenticate" --depth 0
amdb generate --focus "authenticate" --depth 1
amdb generate --focus "authenticate" --depth 2daemon — 증분 업데이트
amdb daemontokio 기반 데몬이 파일 시스템 이벤트를 감시하다가 변경된 파일만 다시 파싱해 SQLite와 벡터 인덱스를 갱신한다.
결과
v0.3.0 기준, amdb 자신의 Rust 모듈 30개를 대상으로 한 자기분석 벤치마크(tiktoken cl100k_base 토크나이저):
- 컨텍스트 토큰 91.5% 절감
- 핵심 파일 94.2% 압축 (11~18배)
- 파일 검색 정밀도 96.7%
- LLM API 토큰 비용 약 12배 절감
현재 버전은 0.7.0, 라이선스는 MIT다.