🚀   70세 이전에 한 모든 일은 신경 쓸 가치가 없다. - 호쿠사이

Ollama를 이용한 Github PR 리뷰

2024.08.05
10분

RAG란 무엇인가?

RAG이란 Retrieval-Augmented Generation의 약자로, 정보 검색과 생성 모델을 결합한 기술입니다. 간단히 말해, RAG는 텍스트 생성 작업을 수행하기 전에 대규모 데이터베이스나 문서에서 관련 정보를 검색하여 이를 기반으로 더 정확하고 관련성 높은 텍스트를 생성하는 기술입니다. 이를 통해 RAG는 더 정확하고 맥락에 맞는 응답을 생성할 수 있습니다.

RAG의 주요 구성 요소

  1. Retrieval (검색): 먼저, 입력된 질의(query)에 대해 관련된 문서나 정보를 대규모 데이터베이스에서 검색합니다.
  2. Augmentation (증강): 검색된 정보는 텍스트 생성 모델의 입력으로 사용되며, 이를 통해 생성 모델은 더 정확하고 관련성 높은 텍스트를 생성합니다.
  3. Generation (생성): 최종적으로, 텍스트 생성 모델은 검색된 정보를 기반으로 사용자에게 필요한 응답을 생성합니다.

RAG는 정보 검색과 텍스트 생성을 결합하여, 단순한 생성 모델보다 더 신뢰할 수 있는 결과를 제공하는 데 중점을 둡니다.

Ollama Local API를 이용하여 RAG 서비스 만들기

Ollama는 다양한 AI 모델을 지원하는 로컬 API를 제공하여, 개발자와 비개발자 모두가 쉽게 RAG 서비스를 구축할 수 있도록 돕습니다. 이 API를 활용하면 로컬 환경에서 다양한 AI 모델을 활용하여 맞춤형 텍스트 생성 작업을 수행할 수 있습니다. Ollama를 실행하면 Localhost의 11434 포트에 API 서버가 실행되기 때문에 이를 이용하여 HTTP로 접근할 수 있습니다.

Ollama Local API 사용 방법

  1. Ollama 설치 및 실행: Ollama를 설치하고 실행합니다. 이를 통해 로컬 환경에서 다양한 AI 모델을 사용할 수 있습니다.
  2. 모델 선택: 작업에 적합한 AI 모델을 선택합니다. 여기에서는 llama3.1 모델을 선택했습니다.
    다운로드 방법: $ ollama run llama3.1
  3. API 호출: API를 통해 텍스트 생성 작업을 수행합니다. 여기에서는 PR 리뷰 작업을 위한 스크립트를 작성하여 GitHub PR을 분석하고 리뷰합니다.

PR을 리뷰하는 Ollama 스크립트

다음은 Ollama Local API를 사용하여 GitHub PR을 리뷰하는 스크립트입니다. 이 스크립트는 PR의 변경된 소스 코드를 분석하고, 자동 생성된 파일을 제외한 코드에 대한 리뷰를 제공합니다.
스크립트 파일은 Git 저장소 내에 위치해야 합니다. 테스트를 진행했던 저장소는 Flutter 코드 저장소였지만 다른 프로그램 언어라 하더라도 유사하게 적용가능합니다.
리뷰 결과는 실행한 위치에 마크다운 파일로 생성되도록 해 놓았지만, git 명령어를 이용하여 PR 댓글로 작성할 수도 있을 것입니다.

이 스크립트는 RAG의 간단한 예시를 보여주기 위해 제작했으며 RAG 의 구성요소는 다음과 같이 적용되었습니다.

  1. Retrieval (검색): 입력된 PR 번호에 대하여 git 명령어를 이용하여 요청한 소스코드와 기존 코드의 차이점을 검색합니다.
  2. Augmentation (증강): 소스코드의 차이점에 대하여 작업을 수행할 모델을 선택하고 코드 리뷰를 요청하는 간단한 프롬프트를 추가하여 증감합니다.
  3. Generation (생성): Ollama는 요청 코드와 프롬프트에 따라 결과를 생성합니다. 여기에서는
pr_review.sh
#!/bin/zsh

model="llama3.1"
output_file_ext="md"

# Prompt 설정
prompt="다음 PR에 대해 변경된 소스코드를 한국어로 리뷰해 주세요. 만약 오타가 의심되거나 수정될 필요가 있는 부분이 있다면 추천 코드를 알려주세요."

# PR 번호 확인
pr_number="$1"
if [ -z "$pr_number" ]; then
    echo "Please provide a pull request number as the first argument."
    exit 1
fi

echo "::: Start :::"

# 현재 시간 확인
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "Current time: $current_time"

output_file="[pr-$pr_number] $current_time review_$model.$output_file_ext"

# diff 가져오기 및 자동 생성 파일 필터링
diff=$(gh pr diff "$pr_number" 2>/dev/null)
if [ $? -ne 0 ]; then
    echo "Failed to fetch PR diff. Please check the PR number and your GitHub CLI setup."
    exit 1
fi

# 필터링된 diff 만들기: freezed, g  파일 등 자동생성된 파일을 걸러낸다.
filtered_diff=$(echo "$diff" | grep -Ev '.*\.(g|freezed)\.dart' | awk '{printf "%s\\n", $0}')

# 리뷰 요청
review=$(curl -s http://127.0.0.1:11434/api/generate -d '{
  "model": "'"$model"'",
  "prompt": "'"$prompt"':\n\n```\n'"$filtered_diff"'\n```",
  "stream": false
}' | jq -r '.response')

if [ $? -ne 0 ] || [ -z "$review" ]; then
    echo "Failed to get a response from the review API."
    exit 1
fi

comment="\n\n---\n# Ollama 코드 리뷰 ($model)\n\n$review"

# 리뷰 내용을 파일에 저장
echo "$comment" >> "$output_file"
if [ $? -eq 0 ]; then
    echo "Review saved to $output_file"
else
    echo "Failed to save the review to $output_file"
    exit 1
fi

echo "::: End :::"

이 스크립트를 사용하면 GitHub PR의 변경된 코드에 대해 자동으로 리뷰를 수행하고, 결과를 파일로 저장할 수 있습니다.
리뷰할 PR과 동일한 Git 저장소 내에 스크립트 파일을 두고, 스크립트를 실행하기 위해 chmod 명령어로 권한을 변경한 이후 파일을 실행할 수 있습니다.
이 때 PR 번호를 파라미터로 넘겨주면 해당 PR을 읽어 프롬프트를 생성하게 됩니다.

# 실행 권한 설정
$ chmod +x review_pr.sh

# PR 리뷰 실행 (파라미터: PR 번호)
$ .reveiw_pr.sh 115

PR 리뷰의 결과물은 호출될 때마다 다르고 어떤 모델을 사용하느냐에 따라 달라집니다.
개인이 사용하는 로컬 개발 머신은 리소스에 한계가 있기 때문에, 많은 파라미터가 적용된 모델을 다운로드하여 사용하기 힘들다는 것을 감안하면 한계가 있는 것도 사실입니다.
예를 들어 위의 스크립트를 이용한 테스트만 하더라도 한국어로 된 리뷰를 요청하고 있지만 한국어를 지원하지 않는 모델을 사용하거나 PR의 코드 길이가 어느 정도를 넘어가게 되면 영어로 답변을 하는 문제가 있습니다.
이 예제는 로컬머신에서 Ollama를 이용하여 RAG를 적용하는 사례를 보여주기 위한 용도이기 때문에 개선할 부분도 많고 한계가 있음을 인지하고 읽어주시면 감사하겠습니다.
로컬 머신의 한계를 넘어 AI를 이용한 PR 리뷰가 정말 필요하다면 Ollama가 아니라 OpenAI의 API를 대신 사용할 수도 있습니다. API 호출 부분만 교체한다면 사실상 동일한 과정이기 때문입니다.


소스코드는 다음 링크에서도 보실 수 있습니다.

Gist Link


프로필 사진
Nanutbae
A small boat sailing freely on the sea of curiosity ⊹ ࣪ ﹏𓊝﹏𓂁﹏⊹ ࣪ ˖