Post

내 git 히스토리를 코드 임베딩으로 의미 검색해보자

예전에 어떤 문제를 어떻게 풀었는지 정확한 단어가 기억나지 않을 때, git 히스토리를 임베딩으로 색인해 자연어로 찾아봤다

내 git 히스토리를 코드 임베딩으로 의미 검색해보자

내 git 히스토리를 코드 임베딩으로 의미 검색해보자

예전에 어떤 문제를 어떻게 풀었는지는 기억나는데, 그때 커밋 메시지나 함수명에 정확히 어떤 단어를 썼는지는 기억이 안 났다. grep으로는 못 찾아서 의미 기반 검색을 붙였다.

1. 서론 (Introduction)

  • 문제/상황 (Problem): 과거에 풀었던 문제를 다시 찾으려 해도 커밋 메시지나 함수명의 정확한 단어를 몰라 grep·검색으로 찾아지지 않았다.
  • 목적 (Purpose): git 저장소의 문서·코드·커밋 메시지를 각각 레코드로 뽑아 임베딩하고, 자연어 질문으로 의미 기반 검색을 한다.
  • 대상 (Target Audience): 자기 과거 작업 이력에서 정확한 키워드 없이 예전 해결책을 다시 찾고 싶은 개발자.

2. 방법 및 과정 (Methods & Process)

  • 배경 조사 및 데이터 (Data Collection): 다른 소스와 federation해서 실측한 3-DB 구성 중, 코드 저장소 쪽 문서 수는 3,527건이었다. 그 외 세부 벤치마크 수치는 아직 없다.

    doc_type레코드 단위
    doc문서(마크다운 등)
    code코드 파일/함수 단위
    commit커밋 메시지
  • 접근 방법 (Approach Methods):
    • [방법 1]: git 저장소의 문서/코드/커밋 메시지를 각각 레코드로 뽑아 doc_type=doc|code|commit 태그를 붙여 구분한다.
    • [방법 2]: 로컬 임베딩 모델로 각 레코드를 벡터화한 뒤 SQLite(sqlite-vec)에 저장해 자연어 질의로 KNN 검색한다. faiss가 아니라 sqlite-vec을 쓴 이유는 별도 인덱스 서버 없이 파일 하나로 배포·백업이 끝나기 때문이다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: git log 파싱, 로컬 임베딩 모델, sqlite-vec(vec0 가상 테이블) KNN.
    • 주요 단계: git log --format=... 파싱 $\rightarrow$ doc/code/commit 레코드 분리 $\rightarrow$ 임베딩 $\rightarrow$ sqlite-vec KNN 검색 $\rightarrow$ 결과 반환.
    • 결과 도출 및 검증: 정확한 리트리벌 벤치마크(precision@k 등) 수치는 아직 없다. 규모만 확인된 수치가 있다 — federation한 3-DB 실측에서 코드 저장소 쪽 문서 수는 3,527건. 원격 저장소를 연결하는 커넥터를 붙이는 과정에서는 토큰 기반 다운로드 인증이 계속 실패해, 토큰이 실패하면 비밀번호 기반 세션 로그인으로 자동 폴백하는 로직을 추가로 넣어야 했다. 호스팅마다(비트버킷·깃랩·깃허브처럼) 인증·API 방식이 달라, 한 커넥터로 흡수하는 데 생각보다 손이 많이 갔다.

3. 결과 (Results)

  • 분석 결과 요약: 자연어 질의로 정확한 커밋 해시나 함수명을 몰라도 관련 있어 보이는 커밋을 찾아낼 수 있었다(정성적 확인). 정량 벤치마크는 아직 없다는 점을 그대로 남긴다.

4. 인사이트 및 액션 (Insights & Action)

  • 인사이트 (Insight): grep은 정확한 단어를 알아야 찾아지지만, 의미 검색은 “그때 뭘 했더라” 같은 흐릿한 질문에도 답한다. 대신 임베딩이 약하면 검색 결과도 약하다 — 로컬 임베딩 모델의 품질이 그대로 검색 품질의 상한이 된다.
  • 실행 방안 (Action Plan): 검색 결과 상위 K개를 직접 열어보고 관련성을 사람이 판정해, 리트리벌 품질을 감이 아니라 수치로 남기는 게 다음 단계다.
  • 한 줄 결론 (Key Takeaway): 정확한 키워드를 몰라도 의미로 과거 커밋을 찾을 수 있다. 다만 임베딩 품질이 그대로 검색 품질이 된다. 샘플 코드
  • 다음 스텝 (Next Step): 지금은 커밋 메시지만 임베딩한다. diff 본문(실제 변경된 코드)까지 임베딩에 포함하면 “메시지는 부실한데 코드는 관련 있는” 커밋도 찾을 수 있을지가 남은 과제다.
This post is licensed under CC BY 4.0 by the author.