내 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을 쓴 이유는 별도 인덱스 서버 없이 파일 하나로 배포·백업이 끝나기 때문이다.
- [방법 1]: git 저장소의 문서/코드/커밋 메시지를 각각 레코드로 뽑아
- 분석 및 해결 프로세스 (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.