이번 포스트에서는 머신 러닝 모델을 활용하여 자동으로 블로그를 생성하고 GitHub Pages에 해당 내용을 배포하는 방법을 알아보도록 하겠습니다. 블로그 내용은 OpenAI의 ChatGPT와 text-davinci-003라는 텍스트 생성 모델을 활용하여 주제에 따라 자동으로 작성될 것입니다.
Table of Contents
Toggle실습 파일 준비
먼저, 이번 튜토리얼을 진행하기 위한 실습 파일을 준비해야 합니다. 여기서는 Python을 사용하여 진행할 예정입니다.
OpenAI 설정 및 API 키 발급
OpenAI를 사용하기 위해서는 먼저 API 키가 필요합니다. 이를 얻는 방법은 다음과 같습니다:
- OpenAI 웹사이트에 접속하여 회원 가입을 합니다.
- 회원 가입이 완료된 후 API 키 발급 페이지에서 API 키를 발급받습니다.
- “Create new key” 버튼을 클릭하고 발급된 API 키를 복사합니다.
복사한 API 키를 활용하여 OpenAI를 설치하고 사용합니다.
# OpenAI 설치
# !pip install openai
# 모듈 불러오기
import openai
# OpenAI API 키 설정
openai.api_key = “YOUR_OPENAI_API_KEY”
주제와 세부 지시사항 선택
다음으로 블로그의 주제와 세부 지시사항을 선택합니다. 예를 들어, “뉴욕을 여행할 때 꼭 방문해야 하는 상위 10개의 레스토랑”이라는 주제로 블로그를 작성한다고 가정해 봅시다. 이를 위해 다음과 같이 코드를 작성합니다.
# 주제 선택
city = “New York”
topic = f”Top 10 Restaurants you must visit when traveling to {city}”
category = “travel”
print(topic)
세부 지시사항을 프롬프트 형태로 작성합니다. 프롬프트는 GPT에게 어떤 글을 작성할 것인지에 대한 지시를 제공합니다.
# 프롬프트 설정
prompt = f”’
Write blog posts in markdown format.
Write the theme of your blog as “{topic}”.
Highlight, bold, or italicize important words or sentences.
Please include the restaurant’s address, menu recommendations and other helpful information(opening and closing hours) as a list style.
Please make the entire blog less than 10 minutes long.
The audience of this article is 20-40 years old.
Create several hashtags and add them only at the end of the line.
Add a summary of the entire article at the beginning of the blog post.
”’
ChatGPT API를 활용한 블로그 생성
OpenAI의 ChatGPT API를 활용하여 블로그의 주제와 세부 지시사항에 따른 글을 생성합니다. 이때 사용하는 모델은 text-davinci-003로 설정하였으며, 최대 토큰 수는 2048로 설정합니다.
def generate_blog(topic, prompt):
# 모델 엔진 설정
model_engine = “text-davinci-003”
# 최대 토큰 수 설정
max_tokens = 2048
# 블로그 생성
completion = openai.Completion.create(
engine=model_engine,
prompt=prompt,
max_tokens=max_tokens,
temperature=0.3, # creativity
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return completion
그리고 결과를 출력합니다.
# 생성된 블로그 내용 얻기
response = generate_blog(topic, prompt)
# 생성된 내용 출력
print(response.choices[0].text.strip())
해시태그 추출
블로그 포스팅에서는 해시태그가 중요한 역할을 합니다. 따라서 생성된 블로그 글에서 해시태그를 추출하고, 추출한 해시태그를 블로그 헤더에 사용합니다. 이를 위해 정규 표현식을 사용합니다.# 해시태그 추출을 위한 정규 표현식 패턴
hashtag_pattern = r'(#+[a-zA-Z0-9(_)]{1,})’
# 해시태그 추출
hashtags = [w[1:] for w in re.findall(hashtag_pattern, response[‘choices’][0][‘text’])]
# 해시태그 문자열 생성
tag_string = “”
for w in hashtags:
# 3글자 이상만 추출
if len(w) > 3:
tag_string += f'{w}, ‘
tag_string = tag_string.strip()[:-1]
# 불필요한 문자 제거
tag_string = re.sub(r'[^a-zA-Z, ]’, ”, tag_string)
마크다운 형식의 블로그 글 생성
마크다운 형식으로 블로그 글을 작성합니다. 이때 블로그의 헤더는 Jekyll 기반의 블로그에서 사용하는 Front Matter 형식을 따릅니다.
# 블로그 헤더 생성
page_head = f”’—
layout: single
title: “{topic}”
categories: {category}
tag: [{tag_string}]
toc: false
author_profile: false
sidebar:
nav: “counts”
—
”’
# 첫 줄(제목 부분) 제거
body = ‘\n’.join(response[‘choices’][0][‘text’].strip().split(‘\n’)[1:])
# 블로그 글 완성
output = page_head + body
블로그 파일명 생성 및 파일 작성
마지막으로, 블로그 포스트의 파일명을 생성하고, 블로그 내용을 해당 파일에 작성합니다.
# 현재 날짜를 이용해 파일명 생성
yesterday = datetime.now() – timedelta(days=1)
timestring = yesterday.strftime(‘%Y-%m-%d’)
# 파일명 생성
filename = f”{timestring}-{‘-‘.join(topic.lower().split())}.md”
# 파일 경로 설정
blog_directory = r”블로그ROOT폴더경로/_posts”
filepath = os.path.join(blog_directory, filename)
# 파일에 블로그 내용 작성
with open(filepath, ‘w’) as f:
f.write(output)
f.close()
GitHub Pages에 배포
GitHub Pages에 배포하는 과정은 크게 두 가지 단계로 나눠볼 수 있습니다.
첫번째로, 로컬에서 생성한 파일을 GitHub 저장소로 푸시(Push)하는 과정입니다. 두번째로, GitHub에서 Jekyll(기본적으로 GitHub Pages가 지원하는 정적 사이트 생성기)를 실행하여 블로그를 배포하는 과정입니다.
1. 로컬에서 생성한 파일을 GitHub로 푸시(Push)
이전 단계에서는 Python 스크립트를 사용하여 블로그 글을 생성하고 파일로 저장하였습니다. 이제 이 파일을 GitHub로 푸시해야합니다.
우선, 변경 사항을 스테이징(Staging)하고 커밋(Commit)하는 과정이 필요합니다. 터미널을 열어서 블로그의 로컬 저장소로 이동한 후, 아래와 같이 명령어를 실행하면 됩니다.
git add .
git commit -m “Add a new post”
여기서 git add .
는 현재 디렉토리의 모든 변경 사항을 스테이징하는 명령어이며, git commit -m "Add a new post"
는 스테이징된 변경 사항들을 커밋하고, 커밋 메시지를 “Add a new post”로 설정하는 명령어입니다.
이제 변경 사항을 원격 저장소로 푸시해야합니다. 이때 원격 저장소는 GitHub에 있는 블로그 저장소가 됩니다. 다음 명령어를 실행하면 됩니다.
git push origin main
여기서 git push origin main
는 변경 사항을 원격 저장소의 메인 브랜치로 푸시하는 명령어입니다. 이때 사용되는 브랜치 이름은 저장소의 설정에 따라 달라질 수 있습니다.
2. GitHub에서 Jekyll을 실행하여 블로그 배포
GitHub에서는 푸시된 커밋을 감지하고, GitHub Pages로 설정된 저장소에 변경 사항이 푸시되면 자동으로 Jekyll을 실행하여 블로그를 빌드하고 배포합니다.
이 과정은 GitHub에서 자동으로 수행되므로 사용자가 별도로 작업할 필요는 없습니다. 블로그가 성공적으로 배포되면, https://<your-github-username>.github.io
와 같은 URL에서 새로운 블로그 글을 확인할 수 있습니다.
이렇게 해서 OpenAI의 API를 사용하여 자동으로 블로그 글을 생성하고, 그것을 GitHub Pages에 배포하는 과정을 살펴보았습니다. 이런 식으로 자동화를 통해 시간을 절약하고, 일관된 품질의 블로그 글을 생성하며, 블로그를 주기적으로 업데이트하는데 도움이 될 것입니다.