GitHub 이슈 분류를 위한 자기 최적화 Python AI 에이전트 구축
요약
GitHub 이슈를 자동으로 분류하고 우선순위를 지정하는 자기 최적화 Python AI 에이전트 구축 방법을 소개합니다. 임베딩, 벡터 검색, 피드백 루프를 활용하여 시간이 지남에 따라 스스로 학습하고 개선되는 시스템을 구현합니다.
핵심 포인트
- GitHub API와 PyGithub를 활용한 실시간 이슈 캡처
- 임베딩 및 벡터 DB를 통한 이슈의 의미론적 분석
- 인간의 피드백을 반영하여 성능을 개선하는 자기 최적화 루프 구현
- 키워드 매칭의 한계를 극복하는 문맥 이해형 에이전트 구축
GitHub 이슈는 오픈 소스 및 기업 소프트웨어 개발의 생명선입니다. 하지만 이를 효율적으로 분류(triage)하는 것은 여전히 지속적인 과제로 남아 있습니다. 특히 이슈 양이 유지 관리자를 압도할 수 있는 인기 있는 저장소(repository)의 경우 더욱 그렇습니다. 수동 분류는 시간이 많이 소요되고, 오류가 발생하기 쉬우며, 확장성이 떨어집니다.
**자기 최적화 AI 에이전트 (self-optimizing AI agents)**가 등장했습니다. 이는 GitHub 이슈를 분류하고 우선순위를 지정할 뿐만 아니라, 피드백으로부터 학습하고 시간이 지남에 따라 개선되는 자율 시스템입니다. 이 글에서는 지속적인 학습과 자기 최적화를 통해 GitHub 이슈 분류를 자동화하는 Python 기반 AI 에이전트를 구축해 보겠습니다.
다음 내용을 다룹니다:
- GitHub API 클라이언트 설정
- 의미론적 이슈 이해를 위한 임베딩 (embeddings) 및 벡터 검색 (vector search) 사용
- 자기 최적화 피드백 루프 (self-optimizing feedback loop) 구현
- 최소한의 인프라로 에이전트 배포
이것은 단순한 스크립트가 아닙니다. 상호작용할 때마다 더 똑똑해지는 프로덕션 준비 완료(production-ready) 시스템입니다.
1. 문제 이해: 기존의 분류 방식이 실패하는 이유
대부분의 GitHub 이슈 분류 도구는 다음 사항에 의존합니다:
- 키워드 매칭 (Keyword matching) (예: "bug" → "bug"로 라벨 지정)
- 규칙 기반 시스템 (Rule-based systems) (예: 제목에 "error"가 포함되면 → 백엔드 팀에 할당)
- 정적 ML 모델 (Static ML models) (한 번 학습된 후 업데이트되지 않음)
이러한 접근 방식은 다음과 같은 이유로 실패합니다:
- 언어는 미묘한 차이가 있습니다: "This is broken"과 "I think there might be an issue"는 모두 버그를 암시하지만 서로 다른 표현을 사용합니다.
- 문맥은 진화합니다: v1.0에서의 "성능(performance)" 이슈는 v2.0에서 다른 의미를 가질 수 있습니다.
- 피드백이 무시됩니다: 인간의 수정 사항이 미래의 예측을 개선하는 데 사용되지 않습니다.
우리의 목표는 의도를 이해하고, 실수로부터 배우며, 처음부터 다시 재학습하지 않고도 적응하는 에이전트를 만드는 것입니다.
2. 아키텍처 개요
다음은 상위 수준의 흐름입니다:
GitHub 이슈 생성 → 에이전트가 Webhook 수신 →
의미론적 분석 (Embeddings + Vector DB) →
예측 (Labels, Assignees, Priority) →
...
주요 구성 요소:
주요 구성 요소:
- GitHub Webhook Listener: 새로운 이슈를 실시간으로 캡처합니다.
- Embedding Engine: 이슈 텍스트를 의미론적 벡터 (Semantic Vectors)로 변환합니다.
- Vector Database: 빠른 유사도 검색 (Similarity Search)을 위해 이슈 임베딩 (Embeddings)을 저장합니다.
- Prediction Model: 임베딩과 과거 데이터를 사용하여 이슈를 분류합니다.
- Feedback Loop: 인간의 수정 사항을 바탕으로 모델 가중치 (Weights)를 업데이트합니다.
3. GitHub API 클라이언트 설정
GitHub와 상호작용하기 위해 PyGithub 라이브러리를 사용합니다.
의존성 설치
pip install PyGithub python-dotenv sentence-transformers faiss-cpu scikit-learn
GitHub 인증
.env 파일을 생성합니다:
GITHUB_TOKEN=your_personal_access_token
REPO_NAME=owner/repo
Python에서 로드합니다:
from github import Github
from dotenv import load_dotenv
import os
...
새로운 이슈 가져오기
def get_new_issues():
issues = repo.get_issues(state="open", sort="created", direction="desc")
return [issue for issue in issues if not issue.pull_request]
Pro Tip:
since파라미터를 사용하여 최근 이슈만 가져오고 속도 제한 (Rate Limits)을 피하세요:from datetime import datetime, timedelta since = datetime.now() - timedelta(days=1) issues = repo.get_issues(state="open", since=since)
4. 임베딩을 통한 의미론적 이해
이슈의 제목과 본문의 의미를 포착하기 위해 **문장 임베딩 (Sentence Embeddings)**을 사용합니다.
임베딩 모델 선택
가볍고 성능이 뛰어난 모델인 sentence-transformers의 all-MiniLM-L6-v2를 사용합니다.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
임베딩 생성
def get_issue_text(issue):
return f"{issue.title}. {issue.body or ''}"
...
작동 원리: 이 모델은 텍스트를 의미론적 의미를 포착하는 384차원 벡터로 변환합니다.
우리는 이슈 임베딩 (embeddings)을 효율적으로 저장하고 검색하기 위해 FAISS (Facebook AI Similarity Search)를 사용할 것입니다.
FAISS 인덱스 초기화
import faiss
import numpy as np
...
과거 이슈 저장
def build_index():
issues = get_new_issues()
embeddings = np.array([embed_issue(issue) for issue in issues])
...
유사한 이슈 찾기
def find_similar_issues(new_embedding, k=5):
distances, indices = index.search(np.array([new_embedding]), k)
return distances[0], indices[0]
왜 FAISS인가요?
- 수백만 개의 벡터가 있어도 매우 빠름
- GPU 가속 지원
- 가볍고 임베드(embeddable) 가능
6. 예측 수행: 레이블(Labels), 담당자(Assignees), 우선순위(Priority)
우리는 다음 세 가지를 예측할 것입니다:
- 레이블 (Labels) (예: "bug", "enhancement")
- 담당자 (Assignees) (예: "backend-team")
- 우선순위 (Priority) (low, medium, high)
접근 방식: k-NN + 투표 (Voting)
새로운 이슈에 대해 우리는 다음 과정을 수행합니다:
- 가장 유사한 과거 이슈 5개를 찾습니다.
- 해당 이슈들의 레이블, 담당자, 우선순위를 집계합니다.
- 각 항목에 대해 가장 빈도가 높은 값 (최빈값, mode)을 반환합니다.
from collections import Counter
def predict_issue(issue):
...
get_priority커스텀하기:def get_priority(issue): if "urgent" in issue.title.lower() or "critical" in issue.title.lower(): return "high" ...
7. 자기 최적화 피드백 루프 (The Self-Optimizing Feedback Loop)
이 부분이 에이전트가 더 똑똑해지는 지점입니다.
피드백 작동 방식
메인테이너(maintainer)가 다음과 같은 작업을 수행할 때:
- 레이블을 추가하거나 제거함
- 담당자를 변경함
- 우선순위를 조정함
에이전트는 변경 사항을 감지하고 자신의 지식을 업데이트합니다.
Webhooks를 통한 피드백 감지
GitHub의 issues 웹훅 (webhook) 이벤트 중 edited 액션을 사용합니다.
from flask import Flask, request
app = Flask(__name__)
...
모델 업데이트
def update_model(issue):
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기