요즘 SQL 문제를 많이 풀고있다. 맞춰서 게시글도 자주 올리는 편이다.

그래서 자동화를 해보면 어떨까..? 라는 생각이 들었는데 마침? llama3가 떠버렸고,

qwen2라는 알리바바의 더 좋은 모델이 있다길래 한번 적용해서 진행하게 되었다. (...???)

 

우선 프로젝트를 어떻게 진행했는지 소개하려한다.

프로젝트 진행 순서

1. llama3 & qwen2 을 사용하기

우선 핵심적인 부분을 진행하기로했다.

바로 llama3나 qwen2를 로컬에서 사용해보는 것이다. 오..

이를 위해서 ollama를 사용하는 방법에 대해서 찾게 되었고, 매우 편하게 llm 모델을 실행할 수 있게 되었다.

설치 과정에 대해서는 좋은 블로그글이 많아서 따로 적지는 않으려한다. (아래는 참고)

https://brunch.co.kr/@b2439ea8fc654b8/28

 

Ollama + Llama 3 사용법

ollama  + llama3 를 통해서 나만의 노래가사를 만드는 챗봇 | 기업이 생성형 AI를 도입하는 데 있어 가장 우려하는 것은 바로 비용과 보안 문제입니다. 로컬에서 LLM을 실행함으로써 기업들은

brunch.co.kr

 

2. 내 SQL 코드 리뷰해줘.

처음 사용방식이 chat 방식이여서 이것을 그대로 사용할수는 없겠다 라는 생각이 들었다.

그래서? API로 접근하는 방식을 채용했다. request 모듈을 활용하였는데 코드는 다음과 같다.

# Ollama API 서버의 URL
url = 'http://localhost:11434/api/generate'

# 요청에 사용할 데이터
data = {
    "model": "qwen2",
    "prompt":""
    }
# HTTP POST 요청 보내기 (스트리밍 응답 받기)
response = requests.post(url, json=data, stream=True)

# 응답 본문을 한 줄씩 처리
translated_text = ""

try:
    for line in response.iter_lines():
        if line:
            # 각 줄을 JSON으로 파싱
            line_data = json.loads(line.decode('utf-8'))
            # 응답에서 'response' 키의 값을 추가
            translated_text += line_data.get('response', '')
except json.JSONDecodeError as e:
    print("JSON decode error:", e)

 

답변을 받아서 파일로 저장하는 방식으로 진행했다.

그래서 적절한 프롬프트를 작성하였는데.. 이게 이렇게 어려울줄은 몰랐다. 아무래도 프롬프트 엔지니어링 책을 읽어봐야할 듯 싶다.

결과는 성공! 내 SQL에 대해서 꽤나 괜찮은 리뷰를 받을 수 있었다.

 

3. Github내 코드 가져오기

현재 LeetHub를 사용해서 내가 풀이한 것이 정답이면 github에 자동으로 commit되도록 진행하고있다.

커밋된 내용에는 내가 풀이한 SQL 코드와 문제에 대한 간단한 내용이 담겨있다.

그럼 이제 무엇을 해야할까?

바로 가장 최신 커밋을 찾아서 파일을 가져오는 것이다. 이를 프롬프트에 넣고 결과값을 md파일로 출력하면된다.

코드는 다음과 같다.

def get_latest_commit_sha(repo_owner, repo_name):
    url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/commits"
    params = {'per_page': 1}  # 최근 커밋 하나만 가져오기 위한 파라미터

    try:
        response = requests.get(url, params=params)
        response.raise_for_status()  # HTTP 요청 오류 확인

        commit_data = response.json()[0]
        sha = commit_data['sha']
        return sha
        
    except requests.exceptions.RequestException as e:
        print(f"Error fetching data from GitHub API: {e}")
        return None
    
def get_latest_commit_file(repo_owner, repo_name):
    latest_sha = get_latest_commit_sha(repo_owner, repo_name)
    url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/commits/{latest_sha}"
    try:
        response = requests.get(url)
        response.raise_for_status()  # HTTP 요청 오류 확인

        commit_data = response.json()
        files = commit_data['files']
        if files:
            latest_file_name = files[0]['filename']
            return latest_file_name
        else:
            return None  # 커밋에 파일이 없는 경우
        
    except requests.exceptions.RequestException as e:
        print(f"Error fetching data from GitHub API - sha: {e}")
        return None

owner = 'poriz'
repo_name = 'leetcode'
latest_file = get_latest_commit_file(owner,repo_name)
# 예시: 'owner'와 'repo_name'을 실제 레포지토리의 소유자와 이름으로 변경해야 합니다.

level = re.search(r'LeetCode/(.*?)/', latest_file).group(1)
pattern = rf'{level}\/(.*?)\/'
problem_num = re.search(pattern, latest_file).group(1)

# warning!!
token = 'your_git_token'
headers = {'Authorization': 'token ' + token}
# warning!!
# input leetcode data
git_md = f'https://raw.githubusercontent.com/{owner}/leetcode/main/LeetCode/{level}/{problem_num}/README.md'
res = requests.get(git_md,headers=headers)
description = BeautifulSoup(res.content, 'html.parser')

solved_codes = f'https://raw.githubusercontent.com/{owner}/leetcode/main/LeetCode/{level}/{problem_num}/{problem_num}.sql'
res = requests.get(solved_codes,headers=headers)
my_code = BeautifulSoup(res.content, 'html.parser')

 

중간에 warning은 github accesstoken 때문에 사용하였다. (키값 주의!)

코드에 대해서 간단하게 설명한다면..?

github-api를 이용해서 첫 커밋의 sha를 가져온다. 이 sha를 이용해서 commit에 무슨일이 있었는지를 확인 가능한데

다시 api에 이 sha를 넣어 호출해보면 file 정보를 가져올 수 있다.

 

자 이제 file 정보에 level과 문제의 이름이 있기 때문에 이를 자동으로 파싱해서 request에 적당한 url로 넣어주면된다.

코드를 가져가셔서 사용하신다면 변수에 주의해주세요~

 

전체 코드는 깃헙에 올려두었습니다.

https://github.com/poriz/leetcode_blog_auto/blob/main/sql_model1.py

 

leetcode_blog_auto/sql_model1.py at main · poriz/leetcode_blog_auto

Contribute to poriz/leetcode_blog_auto development by creating an account on GitHub.

github.com

 


아직은 프롬프트도 조금 문제고 보완해야할 문제가 많다. 가능하다면 commit을 감지해서 md파일 생성도 자동으로 진행하고 싶었지만, llm모델이 돌아가기에는 약간의 금전적 이슈가있어 로컬로 진행하였다.

그리고 이제 당분간 SQL 리뷰의 경우에는 LLM으로 생성된 버전이 같이 올라갈 것이다. 쉬운 문제의 경우에는 이를 적극 활용할것이고, 조금 어렵거나 배울 것이 많은 문제의 경우에는 별도 포스팅 혹은 내용적으로 추가가 들어갈 계획이다.

+ Recent posts