
【AWS 공부 중】 신입 1년 차가 「さくらの AI Engine」으로 AWS 문제가 나오는 가차를 만들어 보았다
요약
Sakura AI Engine을 활용하여 AWS 학습을 돕는 CLI 기반의 'AWS 키워드 가차' 도구를 개발한 사례를 소개합니다. OpenAI 호환 API를 사용하여 Python으로 약 100줄의 코드를 작성했으며, 매번 새로운 문제를 생성하여 학습 효율을 높였습니다.
핵심 포인트
- Sakura AI Engine의 OpenAI 호환성을 활용한 간편한 API 연동
- 요청 수 기반의 무료 구간 제공으로 초보자의 비용 관리 용이
- Python과 OpenAI 라이브러리를 이용한 100줄 내외의 가벼운 구현
- 환경 변수(.env) 사용을 통한 API 키 보안 관리 실천
여러분 안녕하세요!!
올해부터 엔지니어가 되어, AWS 공부를 시작했습니다!
AWS Certified Cloud Practitioner는 취득했지만, 시간이 지나면 지식이 멀어져 가고...
저희 회사에서는 매일 점심에 AWS 문제를 풀고 있는데, 신입인 저에게는 조금 어렵습니다!!!
그래서, さくらの AI Engine을 사용하여 가차(Gacha)를 돌리는 느낌으로 AWS 단어를 학습해 보려고 생각했습니다!
그렇게 해서 만든 것이 이번 「AWS 키워드 가차」입니다. 100줄 정도의 Python 코드로 동작하는 것을 만들었으니, 마찬가지로 초보자 분들에게 참고가 된다면 기쁘겠습니다.
터미널에서 실행하면,
- AWS 키워드를 가차로 1개 추첨
- 그 키워드의 미니 해설을 AI가 작성
- 해설한 내용으로부터 4지선다 문제가 출제 - A~D로 답하면 정답 판정 및 해설
이라는 흐름으로, AWS를 한 번에 한 테마씩 공부할 수 있는 CLI 도구입니다.
문제는 매번 AI가 만들기 때문에, 같은 문제가 두 번 다시 나오지 않습니다. 기출문제집과 달리 무한히 즐길 수 있습니다.
🎰 오늘의 AWS 키워드 가차를 돌렸다! 데굴데굴...
【키워드】 보안 그룹(Security Group)과 네트워크 ACL의 차이
【난이도】 ★☆☆ (비기너)
...
さくらインターネット(Sakura Internet)가 제공하는, 생성 AI를 API로 사용할 수 있는 서비스입니다. 초보자 입장에서 감사한 포인트가 3가지 있었습니다.
1. 무료 구간이 「요청 수」로 되어 있어 알기 쉽다
월 3,000 요청까지 무료. AI API라고 하면 「토큰 (Token)」이라는 단위로 과금되는 것이 일반적이라, 초보자에게는 「이게 얼마큼 쓰고 있는 거지?」가 솔직히 이해하기 어렵습니다. 그런 점에서 횟수로 셀 수 있다는 점은 체감상 굉장히 이해하기 쉬웠습니다.
2. 멋대로 과금되지 않는다
무료 구간을 초과해도 자동으로 과금되는 것이 아니라, 레이트 리밋 (Rate Limit)이 걸리는 방식.
과금 걱정 없이 자유롭게 사용할 수 있다!
3. OpenAI 호환
이것이 이번의 가장 큰 포인트이며, 후술하겠지만 일반적인 openai 라이브러리를 그대로 사용할 수 있습니다.
さくらインターネット 회원 ID와 さくらの 클라우드 프로젝트를 준비하고, 컨트롤 패널에서 이용 약관에 동의한 뒤 플랜을 선택합니다.
그 후, 왼쪽 메뉴의 「계정 토큰 (Account Token)」 → 오른쪽 상단의 **「계정 토큰 생성」**에서 API 키가 발행됩니다.
⚠️ 여기 주의사항입니다. 토큰은 생성 시 단 한 번만 표시됩니다. UUID:시크릿
이라는 형식의 문자열이므로, 반드시 그 자리에서 복사해 두세요.
pip install openai python-dotenv
키를 코드에 직접 쓰면, GitHub에 올렸을 때 유출됩니다 (신입이 저지르기 쉬운 사고입니다! 저도 해본 적이 있습니다). .env
파일로 나누어 둡니다.
SAKURA_AI_API_KEY="API 키를 입력"
그리고 .gitignore에 .env를 적어둔다. 여기까지가 기본 매너라고 합니다.
.env
from openai import OpenAI
client = OpenAI(
api_key=API_KEY,
...
OpenAI 호환이므로, base_url을 교체하는 것만으로 평소의 openai 패키지를 그대로 사용할 수 있습니다.
AWS_KEYWORDS = [
# 서비스 계열
"Amazon S3", "Amazon EC2", "AWS Lambda", "Amazon RDS", "Amazon DynamoDB",
...
이 부분이 이 도구의 소소한 아이디어 포인트입니다.
처음에는 「AWS 문제를 랜덤으로 내줘」라고 AI에게 통째로 맡겼었는데, 그랬더니 S3와 EC2만 계속 나왔습니다. AI는 「AWS 하면 떠오르는 것?」으로 유명한 것들을 골라버리더군요.
그래서, 무엇을 출제할지는 Python 측에서 랜덤하게 결정하고, AI에게는 「이 키워드로 문제를 만들어줘」라고 전달하도록 했습니다. 키워드는 AWS의 공식 출제 범위에서 가져왔습니다.
키워드 추첨은 프로그램, 문장 작성은 AI, 라는 역할 분담입니다.
난이도는 random.choices()의 weights로 가중치를 두어, ★3이 15%가 되도록 약간 희귀하게 설정했습니다. 소셜 게임 같아서 조금 기분이 좋아집니다.
프롬프트는 다음과 같습니다.
prompt = f"""あなたはAWSに詳しい優しい先輩エンジニアです。
新卒1年目のエンジニア向けに、AWSのキーワードについて「まず解説→そのあと4択クイズ」の教材を作ってください。
条件:
...
"""
print("❓ クエスチョン:")
print(quiz["question"] + "\n")
for letter in ["A", "B", "C", "D"]: ...
.strip().upper()
를 붙인 이유는 소문자 b나 공백을 포함하여 입력해도 정답으로 처리하기 위함입니다. 제가 사용하는 툴이라서 이런 사소한 스트레스는 제거해 두었습니다.
이 툴은 1회 가챠로 소비하는 API 요청이 단 한 번입니다. 해설・문제・선택지・정답・해설문・격려의 말을 1회 요청으로 한꺼번에 생성하고 있기 때문입니다.
즉, 월 3,000 요청 = 3,000 문제.
- 하루에 100문제 풀어도 한 달 분량입니다.
- 매일 30문제라면 여유롭게 남습니다.
솔직히 신입이 한 달 만에 3,000개의 AWS 문제를 풀 수 있을 거라고는 생각하지 못해서, 실질적으로 다 쓸 수 없는 양입니다!
생성형 AI의 API는 생각했던 것보다 1/10 정도로 쉬웠습니다.
제가 한 일을 분해해보면 다음과 같습니다.
- API 키를 발급하는 것
base_url을 사쿠라의 AI Engine으로 지정하고 - 원하는 것을 일본어로 작성하여 전송하기- 돌아온 문자열을
json.loads()로 처리하기
어려웠던 것은 AI에게 무엇을 부탁할지 프롬프트를 생각하는 부분이었습니다. '랜덤하게 문제를 내줘'라고 맡기면 같은 문제만 반복되었고, JSON 형식을 지정하니 갑자기 다루기 쉬워졌습니다. 이 두 가지는 실제로 손으로 해보지 않으면 알 수 없었을 것 같습니다.
- 틀린 문제의 키워드만 모은 '약점 가챠'를 만드는 것
- 소셜 게임처럼 키워드 컬렉션 같은 것을 만드는 것
- 서술형 문제를 내고, 답안을 AI가 채점하게 하는 것
- 문제 저장 기능을 만드는 것
앞으로도 사쿠라의 AI Engine을 사용해서 이것저것 많이 만져보려고 합니다!
import json
import os
import random
...
```json`).removeprefix("```").removesuffix("```")
return json.loads(content)
def main():
if not API_KEY:
print("⚠️ API 키를 찾을 수 없습니다!")
print(" (API 키는 사쿠라의 AI Engine 컨트롤 패널에서 발급할 수 있습니다)")
sys.exit(1)
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
count = 0
while True:
keyword, difficulty = spin_gacha()
print("\n🎰 오늘의 AWS 키워드 가챠를 돌렸다! 덜그럭…\n")
print(f"【키워드】 {keyword}")
print(f"【난이도】 {difficulty}\n")
print("🤖 사쿠라의 AI가 교재를 작성 중…\n")
try:
quiz = generate_quiz(client, keyword, difficulty)
except json.JSONDecodeError:
print("😵 AI의 대답이 JSON 형식이 아니었어…다시 뽑아봐!")
continue
count += 1
print(f"📖 우선 미니 해설: ' {keyword} '는 무엇?
")
print(quiz["lecture"])
input("\n(읽으면 엔터키! 이 내용에서 문제가 나올 거야)")
print("\n❓ 문제:")
print(quiz["question"] + "\n")
for letter in ["A", "B", "C", "D"]:
print(f" {letter}. {quiz['choices'][letter]}")
# A〜D의 답이 입력될 때까지 다시 물어보기
while True:
choice = input("\n네 대답은?")}
[A/B/C/D] > ").strip().upper()
if choice in ("A", "B", "C", "D"):
break
print(" A・B・C・D 중 하나로 대답해줘!")
correct = quiz["correct"].strip().upper()
if choice == correct:
print("\n🎉 정답!! 역시 대단해!")
else:
print(f"\n😢 아쉽다! 정답은 {correct}였습니다.")
print(f"\n💡 정답: {correct}. {quiz['choices'][correct]}\n")
print(f"【포인트】\n{quiz['explanation']}\n")
print(f"🌸 {quiz['cheer']}")
print(f"\n(이번 달 무료 횟수 3,000회 중, 이번 세션에서 {count}회 사용)")
again = input("\n한 번 더 가차를 돌릴까? [Enter=돌리기 / q=그만두기] > ")
if again.strip().lower() == "q":
print("\n👋 수고했어! 내일도 또 가차를 돌려서 AWS 마스터가 되자!")
break
if __name__ == "__main__":
main()
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기