코드베이스를 질의 가능한 지식 그래프로: Graphify-Labs/graphify v0.9.92의 tree-sitter 파이프라인·EXTRACTED/INFERRED 엣지·에이전트 훅 심층 해부

코딩 에이전트가 낯선 저장소에 들어가면 제일 먼저 하는 일은 대개 같다. grep으로 이름을 찾고, 파일을 하나씩 열고, 같은 파일을 세션마다 다시 읽는다. 컨텍스트 창은 그 사이에 원문 코드로 채워진다. Graphify-Labs/graphify는 이 순서를 뒤집자는 프로젝트다. 먼저 저장소 전체를 지식 그래프(노드=클래스·함수·모듈·문서 개념, 엣지=호출·임포트·상속·참조)로 한 번 만들어 두고, 에이전트는 원문 대신 그 그래프에 query·path·explain을 던진다. 코드 부분은 tree-sitter AST로 로컬에서 결정적으로 파싱하므로 API 키도 LLM 호출도 필요 없다. 오늘(2026-10-20) GitHub Trending Python 일간 8위(오늘 +751 stars)에 올랐고, 저장소를 만든 지 6개월 반 만에 12만 9천 스타를 넘겼다.

Graphify 한눈에: 소스·문서·SQL을 노드와 엣지로 바꾸고, 에이전트는 원문 대신 그래프에 query·path·explain을 던진다. 실선은 소스에 명시된 EXTRACTED, 점선은 해석으로 이은 INFERRED
Graphify 한눈에: 소스·문서·SQL을 노드와 엣지로 바꾸고, 에이전트는 원문 대신 그래프에 query·path·explain을 던진다. 실선은 소스에 명시된 EXTRACTED, 점선은 해석으로 이은 INFERRED

이 글은 “그래프로 바꿔 준다”는 홍보 문구를 실무자 관점에서 뜯어본다. ① 7단계 파이프라인과 모듈 경계, ② EXTRACTED/INFERRED/AMBIGUOUS 신뢰도 체계와 graph.json 스키마의 함정, ③ 코드가 어디까지 로컬에 머물고 무엇이 LLM으로 나가는지라는 데이터 경계, ④ Claude Code 훅·지시 파일·MCP 서버라는 세 가지 통합 방식, ⑤ 자체 벤치마크를 어떻게 읽어야 하는지. 그리고 박스(리눅스 VM, 8 vCPU)에서 PyPI 공식 패키지 graphifyy 0.9.92를 격리된 HOME에 설치해 FastAPI 저장소를 API 키 없이 그래프로 만들고, 질의·MCP·훅 동작까지 직접 재 봤다. 모든 수치는 2026-10-20 11:50~11:56 KST 실측이거나 저장소·PyPI·GitHub API에서 확인한 값이다.

한눈에 보기: 오늘 기준 스냅숏

항목 값
저장소 github.com/Graphify-Labs/graphify (생성 2026-04-04 00:49 KST) · 기본 브랜치 v8 · 홈페이지 graphify.com · 문서 docs.graphify.com
라이선스 Apache-2.0 (0.9.25, 2026-07-22에 MIT에서 전환). 전환 이전 기여분은 MIT로도 유효하며 LICENSE-MIT·NOTICE에 보존
최신 버전 v0.9.92 — GitHub Release 2026-10-17 02:57 KST, PyPI graphifyy 0.9.92(wheel 1,694,048 B) 같은 시각 게시. 마지막 커밋 86c57be(10-17 02:32 KST)
GitHub 지표 129,237 stars · 12,462 forks · 열린 이슈+PR 1,567건 (API 11:52 KST)
Trending Python 일간 #8(+751). 같은 날 전체 일간 상위권은 ai-job-search·opencode·ai-memory·ComfyUI·ruflo 순
스택 Python ≥3.10 · NetworkX · tree-sitter 0.25 + 언어 문법 25종 기본 의존(선택 extra로 약 40개 언어) · rapidfuzz · numpy
패키지명 주의 PyPI 이름은 graphifyy(y 두 개), 명령어는 graphify. README가 “다른 graphify* 패키지는 무관”이라고 명시
사업 구조 오픈소스 CLI + 상용 Graphify Cloud(상시 그래프·크로스 레포·형식 검증, 14일 체험). README 배지 기준 Y Combinator S26

왜 지금 트렌딩인가: 하루 한 번 꼴의 릴리스

Graphify는 “에이전트 토큰 비용”이라는 이번 가을 개발자 커뮤니티의 공통 화두 한가운데에 있다. 같은 날 Trending에 컨텍스트 압축(headroom), 장기 기억(ai-memory), 에이전트 하네스(ruflo)가 함께 올라와 있는데, Graphify는 그중 “읽기 자체를 줄이는” 쪽이다. 저장소 활동도 매우 빠르다. 최근 8개 릴리스가 약 일주일에 몰려 있고, 0.9.92 한 번에 커뮤니티 PR 23건이 들어갔다.

버전 게시(KST) 메모
0.9.85 10-11 06:32 —
0.9.86 10-12 05:22 —
0.9.87 10-12 23:16 —
0.9.88 10-13 07:19 릴리스 노트 5,461자로 이번 주 최대
0.9.89 10-13 19:43 —
0.9.90 10-14 07:17 —
0.9.91 10-15 07:17 —
0.9.92 10-17 02:57 JS/TS·Python·Go·Rust·Solidity 호출 해석·ID 충돌 수정, MCP 병렬 엣지 보존, GRAPHIFY_BACKEND 명시 선택·비활성 스위치, post-rewrite 훅 추가, AST 캐시 스키마 상향(업그레이드 후 첫 빌드는 전체 재추출)
운영 관점 한 줄: 0.9.x에서 거의 매일 패치가 나가고 AST 캐시 스키마도 수시로 바뀐다. 팀 단위로 graph.json을 커밋해 공유한다면 버전을 고정(graphifyy==0.9.92)하고 올릴 때는 한 번에 같이 올리는 편이 안전하다.

저장소 구조: 라이브러리 + 호스트별 스킬 본문

ARCHITECTURE.md의 첫 문장이 구조를 요약한다. “graphify는 파이썬 라이브러리가 뒷받침하는 Claude Code 스킬이다. 스킬은 라이브러리를 조율하고, 라이브러리는 단독으로도 쓸 수 있다.” 실제 트리를 보면 그 말대로 파이썬 패키지와 에이전트별 스킬 마크다운이 한 패키지에 같이 들어 있다.

경로 역할
graphify/ 최상위 모듈 55개(.py) — detect·extract·build·cluster·analyze·report·export·serve·watch·hooks·dedup·cache·security 등. 패키지 전체 파이썬 약 87,300줄
graphify/extractors/ 언어별 추출기 37개 파일. 새 언어는 여기로 옮기는 중(MIGRATION.md), extract.py가 재수출
graphify/skill*.md Claude·Codex·OpenCode·Kilo·Aider·Copilot·Kiro·Pi·Devin 등 호스트별 스킬 본문 16종. 설치 시 SKILL.md로 복사
graphify/always_on/, skills/*/references/ CLAUDE.md·AGENTS.md에 주입되는 상시 규칙 블록과 필요할 때만 읽히는 참조 문서(점진적 공개)
graphify/pi/ Pi 코딩 에이전트용 네이티브 가드 확장(TypeScript, index.ts)
tests/ 437개 항목. ARCHITECTURE.md의 함수 시그니처 표를 테스트가 임포트해 문서 표류를 막는 구조
worked/ 실제 코퍼스 예제(httpx, karpathy-repos, mixed-corpus 등)와 결과물
CHANGELOG.md 532 KB, 버전 섹션 235개 — 0.x 시리즈의 속도를 그대로 보여 줌

파이프라인: 7단계, 코드에는 LLM이 없다

detect → extract → build → cluster → analyze → report → export 7단계. 코드는 tree-sitter AST로 로컬·결정적, 문서·PDF·이미지만 LLM 의미 패스로 나간다
detect → extract → build → cluster → analyze → report → export 7단계. 코드는 tree-sitter AST로 로컬·결정적, 문서·PDF·이미지만 LLM 의미 패스로 나간다

핵심 흐름은 detect() → extract() → build() → cluster() → analyze → report.generate() → export.to_*()다. 단계 사이에는 평범한 파이썬 dict와 NetworkX 그래프만 오간다. 단, 추출기 일부는 “현재 스캔 루트”라는 모듈 수준 상태에 기대고 있어 완전한 무상태는 아니라고 문서가 스스로 밝힌다(0.9.92에서 이 공유 방식을 정리하는 수정이 들어갔다).

단계 진입점 하는 일
detect detect(root) 파일을 code·docs·papers·images·video로 분류, .gitignore·.graphifyignore·.graphifyrc 반영
extract extract(paths, root=...) 코드: tree-sitter AST → 노드·엣지 + 2차 호출 그래프 패스(INFERRED calls). 문서·PDF·이미지: LLM 의미 패스. 영상·음성: faster-whisper 로컬 전사
build build(extractions) 스키마 검증(validate.py) 후 NetworkX 그래프. 중복 제거는 정규화 → MinHash/LSH → Jaro-Winkler → union-find
cluster cluster(G) Leiden(graspologic, [leiden] extra) 우선, 없으면 NetworkX Louvain으로 폴백. 너무 큰 커뮤니티는 분할, 응집도 점수 산출
analyze god_nodes, surprising_connections, find_import_cycles, graph_diff 단일 진입점 없이 분석 함수 묶음
report generate(...) GRAPH_REPORT.md: 갓 노드, 커뮤니티, 의외의 연결, 추천 질문
export to_json/html/obsidian/svg/graphml/canvas/cypher, to_wiki graph.json(질의용), graph.html(클릭 탐색), Obsidian 볼트, Neo4j·FalkorDB용 Cypher, 커뮤니티별 위키

설계상 가장 중요한 선택은 “임베딩·벡터 스토어를 쓰지 않는다”는 점이다. 검색은 질문 키워드로 시작 노드를 잡고 BFS/DFS로 이웃을 훑는 그래프 순회다. 덕분에 결과가 결정적이고 “왜 이 노드가 나왔는지”를 엣지로 설명할 수 있지만, 이름이 전혀 다른 개념 간의 의미 유사도는 문서 의미 패스가 만들어 준 semantically_similar_to 엣지가 없으면 잡지 못한다. 코드만 있는 저장소에서는 순수한 구조 그래프라는 뜻이다.

그래프 스키마와 신뢰도: 무엇을 믿을 수 있나

태그 의미 confidence 실무 해석
EXTRACTED 소스에 명시된 관계(임포트 문, 직접 호출, 클래스 상속) 1.0 그대로 신뢰
INFERRED 해석해서 이은 관계(2차 호출 해석, 타입 추론, 문서 의미 패스) 0.95 / 0.85 / 0.75 / 0.65 / 0.55 이산 등급 경로 질의 결과에 섞이면 원문 확인
AMBIGUOUS 불확실한 관계 — GRAPH_REPORT.md에 검토 대상으로 표시

graph.json은 NetworkX node-link 형식이며 graph.schema_version(현재 1)과 graph.graphify_version을 담는다. 함정이 하나 있다. 파일에는 "directed": false라고 적혀 있지만 모든 링크는 실제로 방향이 있고, source→target 순서가 곧 방향이다. 그래서 json_graph.node_link_graph()로 그냥 읽으면 무방향 그래프가 끝점 순서를 바꿔 방향 정보가 사라진다. 직접 파싱하는 도구를 만든다면 graphify.paths.load_node_link_graph()로 읽고 _src/_tgt 마커를 따라야 한다. CLI의 path가 기본으로 방향 탐색을 하고 JSON의 directed 플래그를 보지 않는 것도 같은 이유다.

데이터 경계: 무엇이 로컬에 남고 무엇이 나가나

입력 처리 외부 전송 비고
코드 tree-sitter AST, 로컬 없음 graphify extract --code-only는 완전 오프라인(박스에서 네트워크 네임스페이스 차단 상태로도 성공)
영상·음성 faster-whisper 로컬 전사 없음 extra 필요, 전사 프롬프트에 갓 노드를 시드로 사용
문서·PDF·이미지 LLM 의미 패스 있음 스킬 실행 시 어시스턴트의 모델, 헤드리스 실행 시 설정된 API 키로 전송
커뮤니티 이름 붙이기 LLM(선택) 있음(선택) --no-label이면 “Community N”으로 남음
질의 로그 ~/.cache/graphify-queries.log(JSONL) 없음 질문·노드 수·소요 시간 기록. GRAPHIFY_QUERY_LOG_DISABLE=1로 끔
텔레메트리 없음(README 명시) 없음 —

헤드리스 graphify extract는 설정된 키를 보고 백엔드를 자동 선택한다. 우선순위는 Gemini → Kimi → Claude → OpenAI → DeepSeek → Azure → Bedrock → Ollama이고, 자동 선택 시 어떤 환경 변수 때문에 그 제공자가 골라졌는지 출력한다. 셸에 여러 키가 깔려 있는 개발 머신이라면 “의도하지 않은 제공자로 문서가 나가는” 상황이 생길 수 있으니 GRAPHIFY_BACKEND로 명시하는 습관을 권한다. README는 Kimi(MOONSHOT_API_KEY)가 중국 Moonshot AI 서버로 간다는 점도 따로 경고한다. 데이터 거주성 요구가 있으면 GRAPHIFY_BACKEND=ollama, 아예 막으려면 GRAPHIFY_BACKEND=none이다.

설정 효과
GRAPHIFY_BACKEND=none 모든 LLM 백엔드 비활성(의미 추출, claude -p 라벨링 폴백 포함) — 코드 전용 그래프
GRAPHIFY_BACKEND=ollama 로컬 추론(OLLAMA_BASE_URL)
--backend openai + OPENAI_BASE_URL llama.cpp 등 OpenAI 호환 자체 서버로도 연결
--code-only 문서·PDF·이미지를 건너뛰고 코드만 색인
--mode deep INFERRED 엣지를 더 공격적으로 뽑는 의미 추출(비용·오탐 증가)
--token-budget N, --max-workers N 청크당 토큰 상한(기본 60,000), AST 추출 서브프로세스 수(기본 CPU 수)

에이전트에 붙이는 세 가지 방식

에이전트 통합 세 갈래: Claude Code·Gemini CLI의 PreToolUse 훅, Codex·Cursor·OpenCode의 지시 파일, 도구 10개짜리 graphify-mcp 서버. 훅은 모두 fail-open
에이전트 통합 세 갈래: Claude Code·Gemini CLI의 PreToolUse 훅, Codex·Cursor·OpenCode의 지시 파일, 도구 10개짜리 graphify-mcp 서버. 훅은 모두 fail-open

Graphify의 실질적인 가치는 그래프 생성보다 “에이전트가 실제로 그래프를 먼저 보게 만드는” 쪽에 있다. 방법은 플랫폼마다 다르다.

플랫폼 명령 설치되는 것 강제력
Claude Code graphify claude install CLAUDE.md 규칙 + .claude/settings.json에 PreToolUse 훅(Bash|Grep → hook-guard search, Read|Glob → hook-guard read, 타임아웃 10초) 훅(가장 강함)
Gemini CLI graphify gemini install GEMINI.md + BeforeTool 훅(항상 allow, 그래프가 있으면 안내 추가) 훅
Codex · OpenCode · Aider · Droid · Trae graphify <platform> install AGENTS.md에 query-first 규칙(OpenCode는 tool.execute.before 플러그인도) 지시 파일
Cursor graphify cursor install .cursor/rules/graphify.mdc(alwaysApply) 지시 파일
Pi graphify pi guard install read·grep·find 전에 hook-guard를 부르는 네이티브 확장(Pi 0.58.4+) 확장
MCP 클라이언트 전반 graphify-mcp graph.json stdio MCP 서버, 도구 10개. HTTP 전송은 옵트인이며 기본 127.0.0.1 바인드 도구

훅 쪽 구현은 꽤 신중하다. hook-guard는 표준 입력으로 도구 호출 JSON을 받아, 프로젝트 안에 신선한 그래프가 있을 때만 additionalContext로 “먼저 graphify query를 돌려라”라는 안내를 넣는다. 모든 예외는 fail-open(아무것도 출력하지 않고 통과)이고, 프로젝트 밖 파일 읽기는 무시하며, 그래프가 해당 파일보다 오래됐으면 “읽어도 된다”는 부드러운 안내로 낮춘다. 옵트인 --strict 모드에서만 세션당 첫 번째 원문 읽기를 permissionDecision: deny로 한 번 막는데, 최근 30분(GRAPHIFY_HOOK_STRICT_TTL, 기본 1800초) 안에 query·explain·path를 이미 돌렸다면 막지 않는다. 반대로 말하면 지시 파일 방식의 플랫폼에서는 “그래프를 먼저 보라”가 모델의 재량에 달려 있다.

설치와 기본 사용

# 설치 (uv 권장, PyPI 이름은 y 두 개)
uv tool install "graphifyy==0.9.92"        # 또는 pipx install graphifyy
graphify install                           # 감지된 어시스턴트에 스킬 등록 (--project 로 저장소 범위)

# 에이전트 안에서
/graphify .                                # 그래프 생성: graph.json, graph.html, GRAPH_REPORT.md

# 에이전트 없이(CI·스크립트) 코드만, 키 없이
GRAPHIFY_BACKEND=none graphify extract . --code-only
graphify cluster-only . --no-label         # 리포트·HTML 생성(LLM 라벨링 생략)

# 질의
graphify query "what connects auth to the database?" --budget 2000
graphify path "applications.py::FastAPI" "ModelField"
graphify explain "APIRouter"
graphify affected "solve_dependencies()" --depth 2
graphify god-nodes --top 10

# 유지
graphify update .                          # 코드 변경분 재추출(LLM 없음)
graphify hook install                      # post-commit/checkout/merge/rewrite 자동 재빌드
명령 동작 비고
query 질문 키워드로 시작 노드를 잡고 BFS(기본)/DFS 순회, --budget 토큰 상한(기본 2000) 0 응답 / 3 모호 / 4 없음
path A B 두 노드 사이 최단 경로(기본 방향 탐색) 이름이 여러 노드에 걸리면 추측하지 않고 후보 목록과 함께 3 반환
explain X 노드 출처(파일·줄), 커뮤니티, 차수, 연결 목록 같음
affected X 역방향 순회로 영향받는 노드(호출·임포트·상속 등 15종 관계) 변경 영향 분석·리뷰용
benchmark 전체 코퍼스 대비 질의당 토큰 추정 휴리스틱(아래 설명)
merge-graphs, global add 여러 저장소 그래프 병합, ~/.graphify/global-graph.json 크로스 레포 질의
prs PR 대시보드·커뮤니티 영향·충돌 위험, --triage는 LLM 사용 GitHub 연동

박스 스모크: FastAPI를 키 없이 그래프로

박스 스모크(v0.9.92, 격리 HOME, API 키 없음): FastAPI 패키지 52파일 2.1초·노드 980, 저장소 전체 1,176파일 11.8초, 질의 약 0.2초, MCP 도구 10개
박스 스모크(v0.9.92, 격리 HOME, API 키 없음): FastAPI 패키지 52파일 2.1초·노드 980, 저장소 전체 1,176파일 11.8초, 질의 약 0.2초, MCP 도구 10개

박스에서 다음 조건으로 실제로 돌렸다. 결과는 이 환경 한 번의 측정이며, 다른 하드웨어·저장소에서는 달라진다.

항목 값
환경 리눅스 VM 8 vCPU / 15 GiB, uv가 받은 CPython 3.12.15
설치 uv pip install graphifyy==0.9.92 → 별도 venv(기본 의존 약 31개 패키지, venv 160 MB, [mcp] 추가 후 208 MB)
격리 HOME·uv 캐시를 작업 폴더 안으로 격리, GRAPHIFY_BACKEND=none, GRAPHIFY_QUERY_LOG_DISABLE=1, API 키·로그인 없음
대상 fastapi/fastapi 얕은 클론(커밋 03002a0, 10-20 07:36 KST). ① 패키지 폴더 fastapi/: 코드 52개 파일·22,232줄 ② 저장소 전체: .py 1,176개
안 해 본 것 문서·PDF·이미지 의미 패스(LLM 필요), Leiden extra, Neo4j·FalkorDB 푸시, HTTP MCP, prs, Graphify Cloud, macOS·Windows
측정 시간 결과
extract --code-only (패키지 52파일) 2,108 ms 노드 980 · 엣지 2,585 · 커뮤니티 61. 18개 파일은 심볼 없음(__init__.py 등), 중복 10개 병합(정확 5·퍼지 5)
같은 작업, 네트워크 차단(unshare -n) 1,234 ms 성공 — 코드 경로에 네트워크 의존이 없음을 확인
재실행(변경 없음) 667 ms 52개 모두 캐시 적중, 재추출 0
cluster-only --no-label 1,809 ms GRAPH_REPORT.md 9,362 B, graph.html 약 962 KB, graph.json 약 886 KB. Louvain 폴백
엣지 구성(리포트) — EXTRACTED 88% · INFERRED 12%(301개, 평균 confidence 0.88) · AMBIGUOUS 0%
god-nodes 164 ms ModelField 43, APIRouter 39, Depends 38, Response 38, FastAPI 36
explain "APIRouter" ~0.2 s routing.py L2325, 연결 39개(메서드 EXTRACTED, DefaultPlaceholder uses INFERRED 등)
path "FastAPI" "ModelField" 177 ms exit 3 — FastAPI가 두 노드(클래스·패키지)에 걸려 후보 제시. applications.py::FastAPI로 지정하자 4홉 경로(176 ms)
query ... --budget 800 205 ms 257개 노드 발견, 32개만 출력하고 “잘렸다, 6,351로 올려라”라고 명시
저장소 전체(1,176 .py) 11,752 ms 노드 9,546 · 엣지 20,882 · 커뮤니티 725, graphify-out 26 MB
MCP stdio(graphify-mcp) init 1,088 ms 도구 10개: query_graph·get_node·get_neighbors·get_community·god_nodes·graph_stats·shortest_path·list_prs·get_pr_impact·triage_prs. get_node 1 ms

수치 외에 실무에 바로 의미 있는 관찰이 몇 가지 있었다.

관찰 내용 시사점
update와 extract --code-only의 결과가 다름 같은 폴더에서 graphify update를 돌리면 노드가 980 → 1,037로 늘었다. 늘어난 57개는 마크다운 제목 노드 47개(예: 패키지 안 .agents/skills/fastapi/SKILL.md)와 # TODO 주석 같은 rationale 노드 10개. --code-only는 문서를 통째로 건너뛰지만 update는 마크다운 구조를 LLM 없이 넣는다 CI에서 비교·diff를 한다면 한 가지 명령으로 통일
주석만 바꾸면 그래프는 그대로 routing.py 끝에 주석 한 줄 추가 → update가 “토폴로지 변화 없음, 출력 유지”로 끝남. 이후 그 파일 Read 훅은 “그래프가 STALE일 수 있다, 읽어도 된다”로 완화 의도된 동작. 위상 변화 기준이라 불필요한 재빌드가 없음
훅 출력 Grep 호출에 70 ms 만에 “MANDATORY: 먼저 graphify query”와 함께 solve_dependencies()의 위치 힌트를 주입. --strict는 직전 30분 안에 query를 돌린 상태라 거부하지 않았고, 같은 세션 두 번째 호출은 조용히 통과 도구 호출마다 파이썬 프로세스 1회(수십 ms) 비용
claude install --project가 만드는 것 CLAUDE.md, .claude/CLAUDE.md, .claude/settings.json(훅 2개), .claude/skills/graphify/SKILL.md(43,652 B) + references 8개 SKILL.md가 크다. 스킬 로드 시 컨텍스트 비용 고려
실행 위치 함정 types.py가 있는 FastAPI 패키지 폴더 안에서 graphify extract .를 돌리자 표준 라이브러리 types가 가려져 “Could not import runpy module”로 실패. 상위 폴더에서 경로를 넘기니 정상 stdlib 이름과 겹치는 파일이 있는 폴더에서는 밖에서 실행
내장 benchmark 49,000단어(약 65,333토큰) 대 질의당 평균 약 1,385토큰 = “47.2배 절감”(질문 5개, 39.2~185.6배) 답의 품질이 아니라 “읽는 양”의 추정치

벤치마크 주장은 어떻게 읽어야 하나

README 상단은 “LOCOMO recall@10 0.497, LLM 크레딧 0”을 내세운다. BENCHMARKS.md(마지막 갱신 2026-07-05)를 보면 측정 방식이 비교적 투명하게 적혀 있다. 모든 시스템을 같은 하네스·같은 모델(Kimi K2.6)·같은 예산으로 돌렸고, 채점 판정은 두 번째 판정자와 90.6% 일치(Cohen’s kappa 0.81)했다고 한다. 다만 실무자라면 아래 맥락을 함께 봐야 한다.

지표 Graphify 수치(저장소 공개값) 읽는 법
LOCOMO (n=300) recall@10 0.497 (mem0 0.048, supermemory 0.149, BM25 0.362) 대화형 장기 기억 데이터셋. 코드 탐색 능력과는 다른 과제
LOCOMO QA 정확도 45.3% (supermemory 49.7%, BM25 31.3%, mem0 27.3%) 정확도 자체는 1위가 아님. 강점은 ingest 비용(약 $1.40 대 $15.67)
LongMemEval-S (n=50) 76% (dense RAG와 동률) 표본 50개
ERPNext 크로스툴 (n=6) 핵심 사실 커버리지 82.0% (grep/read 기준선 70.8%) 약 100만 줄 실제 저장소지만 질문 6개. 방향성 확인용
그래프 빌드 비용 LLM 크레딧 0 코드 한정. 문서·이미지 의미 패스는 토큰 비용 발생
정리: 이 수치들은 프로젝트 자체 하네스에서 나온 값이고, 독립 재현 결과는 아직 찾기 어렵다. 도입 판단은 우리 저장소에서 “에이전트가 같은 질문에 몇 턴·몇 토큰을 쓰는가”를 Graphify 유무로 A/B 하는 편이 훨씬 정확하다. 내장 graphify benchmark의 “N배 절감”은 읽는 양의 비율일 뿐 답이 맞았는지는 재지 않는다.

비슷한 도구와의 비교

도구 방식 임베딩 강점 약점
Graphify tree-sitter AST → 지식 그래프(+문서 LLM 패스) 없음(그래프 순회) 코드 무료·결정적, 엣지마다 근거, 훅·MCP·20여 개 호스트 의미 유사도 약함, 0.x 고속 변경, 상용 클라우드 유도
Aider repo map tree-sitter 심볼 + 그래프 랭킹으로 요약 맵을 프롬프트에 주입 없음 가볍고 Aider에 내장 Aider 전용, 질의형 탐색 없음
Serena (LSP 기반 MCP) 언어 서버로 정의·참조 정밀 조회 없음 타입 해석이 정확(컴파일러 수준) 언어 서버 설치·기동 비용, 전역 구조 요약은 약함
Microsoft GraphRAG LLM으로 엔터티·관계 추출 → Leiden 커뮤니티 요약 선택 비정형 문서 코퍼스에 강함 인덱싱 자체가 LLM 비용, 코드 특화 아님
xerj (로컬 검색 엔진 + MCP) 코드·문서·로그를 한 바이너리로 색인·검색 BM25 등 검색 색인 빠른 전문 검색, 다양한 데이터 관계(호출·상속) 그래프가 목적이 아님
grep / ripgrep 문자열 검색 없음 설치 불필요, 항상 최신 구조 정보 없음, 컨텍스트 소비 큼

포지션을 한 줄로 말하면, Graphify는 “LSP만큼 정밀하진 않지만 grep보다 훨씬 구조적이고, GraphRAG와 달리 코드 색인에 돈이 들지 않는” 지점에 있다. 호출 해석이 2차 패스의 휴리스틱(INFERRED)이라 동적 디스패치·리플렉션·메타프로그래밍이 많은 코드에서는 엣지가 빠지거나 틀릴 수 있다. CHANGELOG의 수정 항목 대부분이 바로 이 호출 해석·ID 충돌 문제라는 점이 현재 성숙도를 보여 준다.

보안·라이선스·운영 리스크

주제 현황 실무 판단
라이선스 Apache-2.0(특허 허여·특허 보복 조항 포함). 0.9.25 이전 기여분은 MIT로도 이용 가능 사내 배포·수정 자유. NOTICE 유지 의무
상표 “graphify” 이름·로고는 Graphify Labs 상표. 파생 프로젝트는 비공식임을 README에 밝혀 달라고 요청 사내 포크 이름 지을 때 주의
패키지 사칭 공식은 graphifyy뿐. 비슷한 이름의 PyPI 패키지는 무관 설치 스크립트·요구사항 파일에 정확한 이름·버전 고정
프롬프트 인젝션 의미 패스에서 파일을 해시가 찍힌 <untrusted_source> 블록으로 감싸고 알려진 채팅 템플릿 토큰을 무력화. SECURITY.md 스스로 “불가능하게 만드는 게 아니라 회피가 필요하게 만드는 수준”이라고 표현 외부 문서·PDF를 넣을 때는 결과 그래프도 신뢰 경계 밖으로 취급
SSRF·다운로드 graphify add의 URL은 http/https만, 사설·루프백·메타데이터 IP 차단, 리다이렉트 재검증, 50 MB 상한 합리적인 기본값
MCP 서버 기본 stdio. HTTP는 옵트인이며 127.0.0.1 바인드(--host 0.0.0.0은 명시해야 함), 그래프 경로는 graphify-out 내부로 제한 원격 공개 시 앞단 인증 필수
훅의 상시 실행 모든 Grep·Read 직전에 graphify 바이너리를 PATH로 실행 PATH 오염 시 공격 표면. 절대 경로·고정 버전 권장
오픈코어 구조 README 곳곳에 Graphify Cloud 체험 유도, 크로스 레포·형식 검증은 상용 쪽 기능 로드맵이 상용 우선으로 갈 가능성을 염두

도입 체크리스트

단계 할 일 이유
1. 범위 먼저 --code-only + GRAPHIFY_BACKEND=none으로 코드 그래프만 만들어 가치 확인 외부 전송 0에서 시작
2. 버전 graphifyy==0.9.92처럼 고정, 팀 전체 동시 업그레이드 AST 캐시 스키마 변경 대비
3. 커밋 여부 graph.json을 커밋하면 PR마다 큰 diff가 생긴다(공식 지시 블록도 “churn으로 지적하지 말라”고 명시). 커밋 대신 CI 아티팩트도 고려 리뷰 소음 관리
4. 훅 Claude Code라면 훅 방식이 가장 효과적. strict는 팀 합의 후 fail-open이라 업무 중단 위험은 낮음
5. 모호성 같은 이름이 많은 코드베이스는 파일::심볼 표기를 에이전트 지시에 포함 path·explain exit 3 대응
6. 측정 같은 과제 10~20개로 Graphify 유무 A/B(턴 수·토큰·정답률) 자체 벤치마크 대신 우리 숫자
7. 문서 패스 의미 패스를 켤 땐 백엔드 명시, 민감 문서 제외(.graphifyignore) 데이터 거주성

정리

Graphify는 “에이전트가 grep하고 파일을 다시 읽는 비용”을 한 번 만든 구조 그래프로 대체하자는 도구다. 코드 부분은 tree-sitter로 로컬에서 결정적으로 처리되고, 모든 엣지에 EXTRACTED/INFERRED 근거가 붙으며, Claude Code에서는 PreToolUse 훅으로 에이전트의 탐색 순서 자체를 바꾼다. 박스에서 FastAPI 패키지(52파일)는 API 키 없이 2.1초 만에 노드 980·엣지 2,585 그래프가 됐고, 저장소 전체(1,176파일)도 11.8초면 끝났으며, 네트워크를 끊어도 같은 결과가 나왔다. 반면 이름이 겹치면 path가 추측 대신 거부하고, update와 extract --code-only의 결과 범위가 다르며, 벤치마크는 대부분 자체 하네스 수치라는 점도 확인했다. 지금 시점의 현실적인 사용법은 코드 전용·버전 고정으로 시작해, 우리 저장소에서 에이전트 턴과 토큰이 실제로 줄어드는지 직접 재 본 뒤 문서 패스와 strict 훅으로 넓혀 가는 것이다.