본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 24. · 9 Views
LLM API로 Hello World 코드 생성하기 완벽 가이드
OpenAI와 Anthropic API를 활용하여 AI가 코드를 자동으로 생성하는 원리부터 실전 구현까지, 초급 개발자를 위한 실무 중심 가이드입니다. 토큰과 확률 기반으로 코드가 만들어지는 과정을 쉽게 이해하고, 직접 CLI 코드 생성기를 만들어봅니다.
목차
- LLM이 코드를 생성하는 원리 이해
- OpenAI와 Anthropic API 설정하기
- 첫 번째 코드 생성 프롬프트 작성
- Hello World 함수 만들어줘 구현
- 토큰과 확률로 코드가 생성되는 과정
- 실습: 간단한 CLI 코드 생성기 만들기
1. LLM이 코드를 생성하는 원리 이해
어느 날 김개발 씨는 유튜브에서 AI가 코드를 척척 작성하는 영상을 보고 깜짝 놀랐습니다. "이게 정말로 가능한 일인가?" 궁금증이 생긴 김개발 씨는 선배 개발자 박시니어 씨에게 물어봅니다.
"AI가 어떻게 코드를 만들어낼 수 있는 거죠?"
**LLM(Large Language Model)**은 방대한 양의 코드와 텍스트를 학습하여 패턴을 이해하는 AI 모델입니다. 마치 수많은 책을 읽은 작가가 글을 쓰는 것처럼, LLM도 학습한 코드 패턴을 바탕으로 새로운 코드를 생성합니다.
우리가 원하는 기능을 자연어로 설명하면, LLM은 그에 맞는 코드를 확률 기반으로 만들어냅니다.
다음 코드를 살펴봅시다.
# LLM의 기본 동작 원리 이해하기
def understand_llm_generation():
# 사용자의 요청 (프롬프트)
user_request = "Hello World를 출력하는 파이썬 함수를 만들어줘"
# LLM은 이 요청을 토큰으로 분리합니다
tokens = tokenize(user_request)
# ['Hello', 'World', '를', '출력', '하는', ...]
# 학습된 패턴을 바탕으로 다음에 올 토큰을 예측
next_token_probabilities = model.predict(tokens)
# {'def': 0.65, 'function': 0.20, 'print': 0.10, ...}
# 가장 확률이 높은 토큰을 선택하여 코드 생성
generated_code = select_most_probable_tokens(next_token_probabilities)
return generated_code
김개발 씨는 입사 2개월 차 주니어 개발자입니다. 최근 ChatGPT와 Claude 같은 AI 도구가 코드를 자동으로 작성해준다는 이야기를 들었습니다.
신기하기도 하고 궁금하기도 했습니다. "도대체 어떤 원리로 이런 일이 가능한 걸까?" 박시니어 씨가 커피를 한 모금 마시며 설명을 시작합니다.
"김 개발자님, LLM이라고 들어보셨나요?" LLM이란 무엇인가 LLM은 Large Language Model의 약자입니다. 쉽게 말하면, 엄청나게 많은 텍스트와 코드를 읽고 학습한 거대한 AI 모델입니다.
마치 수천 권의 프로그래밍 책을 외운 천재 개발자라고 생각하면 됩니다. 사람이 책을 많이 읽으면 글을 잘 쓰게 되듯이, LLM도 수백억 줄의 코드를 학습하면서 코드를 작성하는 패턴을 익히게 됩니다.
GitHub에 올라온 오픈소스 코드, 기술 문서, 프로그래밍 교재 등 상상할 수 없을 만큼 많은 데이터를 학습합니다. 토큰이라는 작은 조각 그렇다면 LLM은 우리의 요청을 어떻게 이해할까요?
비유하자면, LLM은 마치 퍼즐 맞추기를 하는 것과 같습니다. 우리가 입력한 문장을 토큰이라는 작은 조각으로 나눕니다.
"Hello World를 출력하는 함수"라는 문장은 'Hello', 'World', '를', '출력', '하는', '함수' 같은 토큰으로 쪼개집니다. 영어의 경우 보통 단어 단위로, 한국어의 경우 형태소나 음절 단위로 나뉩니다.
이렇게 토큰으로 나누는 이유는 컴퓨터가 이해하기 쉬운 형태로 변환하기 위해서입니다. 확률로 다음 단어 예측하기 여기서 핵심이 등장합니다.
LLM은 다음에 올 토큰을 확률로 예측합니다. 예를 들어 "파이썬에서 Hello World를"이라는 문장 다음에 올 단어를 예측한다고 해봅시다.
LLM은 학습한 패턴을 바탕으로 이렇게 계산합니다. "출력이 올 확률 70%, 표시가 올 확률 20%, 프린트가 올 확률 10%" 마치 일기예보가 "내일 비 올 확률 80%"라고 예측하는 것처럼, LLM도 다음 토큰의 확률을 계산합니다.
그리고 가장 확률이 높은 토큰을 선택하여 문장을 완성해 나갑니다. 코드도 결국 언어다 흥미로운 점은 LLM이 코드를 자연어와 똑같이 취급한다는 것입니다.
"안녕하세요"라는 문장을 생성하는 것이나, "def hello(): print('Hello')"라는 코드를 생성하는 것이나 본질적으로 같은 작업입니다. 둘 다 토큰의 연속이고, 학습한 패턴에 따라 다음 토큰을 예측하는 과정입니다.
그래서 LLM은 프로그래밍 언어의 문법, 함수 작성 패턴, 변수 네이밍 관례 같은 것들을 자연스럽게 학습할 수 있습니다. 학습은 어떻게 이루어지나 박시니어 씨가 화이트보드에 그림을 그리며 설명합니다.
LLM의 학습 과정은 이렇습니다. 먼저 수백억 개의 코드 예제를 준비합니다.
그리고 "이 코드 앞부분이 주어졌을 때 다음에 올 코드는 무엇인가?"라는 문제를 수없이 풀어봅니다. 예를 들어 "def calculate_sum(a, b):"라는 코드가 있으면, 다음에 "return a + b"가 올 확률이 높다는 것을 학습합니다.
이런 식으로 수조 번의 예측과 수정을 반복하면서 점점 더 정확하게 코드를 생성하는 능력을 키웁니다. 완벽하지 않다는 한계 하지만 주의할 점이 있습니다.
LLM은 확률 기반이기 때문에 항상 정확한 코드를 만들지는 못합니다. 가끔 문법 오류가 있는 코드를 생성하기도 하고, 논리적으로 맞지 않는 코드를 만들기도 합니다.
마치 사람이 글을 쓸 때 가끔 오타를 내거나 문장이 어색할 때가 있는 것과 비슷합니다. 따라서 LLM이 생성한 코드는 반드시 검토하고 테스트해야 합니다.
AI를 맹신하지 말고, 도구로 활용하는 지혜가 필요합니다. 실무에서의 활용 현재 많은 개발자들이 GitHub Copilot, ChatGPT, Claude 같은 LLM 기반 도구를 사용합니다.
반복적인 코드 작성, 함수 템플릿 생성, 코드 리팩토링 제안 등에서 큰 도움을 받고 있습니다. 숙련된 개발자는 LLM이 생성한 코드를 빠르게 검토하고 수정하여 생산성을 크게 높입니다.
정리 김개발 씨는 고개를 끄덕입니다. "아, 그러니까 LLM은 엄청나게 많은 코드를 학습해서 패턴을 익히고, 확률 기반으로 다음에 올 코드를 예측하는 거군요!" 맞습니다.
LLM의 핵심은 학습된 패턴과 확률 기반 예측입니다. 이 원리를 이해하면 AI 코드 생성 도구를 더 효과적으로 활용할 수 있습니다.
실전 팁
💡 - LLM이 생성한 코드는 반드시 테스트하고 검증하세요
- 복잡한 로직보다는 반복적인 패턴의 코드 생성에 활용하면 효과적입니다
- 명확하고 구체적인 요청일수록 더 정확한 코드를 생성합니다
2. OpenAI와 Anthropic API 설정하기
LLM의 원리를 이해한 김개발 씨는 이제 직접 사용해보고 싶어졌습니다. "실제로 API를 사용하려면 어떻게 해야 하나요?" 박시니어 씨가 노트북을 열며 말합니다.
"먼저 API 키를 발급받아야 합니다. 생각보다 간단해요."
OpenAI API와 Anthropic API는 각각 GPT와 Claude 모델을 사용할 수 있게 해주는 개발자 도구입니다. API 키를 발급받고 환경 변수로 설정하면, 파이썬 코드에서 간단하게 LLM을 호출할 수 있습니다.
두 API 모두 유료이지만 무료 크레딧을 제공하므로 학습 목적으로 충분히 사용할 수 있습니다.
다음 코드를 살펴봅시다.
# OpenAI와 Anthropic API 설정하기
import os
from openai import OpenAI
from anthropic import Anthropic
# 환경 변수에서 API 키 가져오기
# 절대로 코드에 직접 API 키를 넣지 마세요!
openai_api_key = os.getenv("OPENAI_API_KEY")
anthropic_api_key = os.getenv("ANTHROPIC_API_KEY")
# API 클라이언트 초기화
openai_client = OpenAI(api_key=openai_api_key)
anthropic_client = Anthropic(api_key=anthropic_api_key)
# 설정 확인
print("OpenAI API 설정 완료:", openai_client.api_key[:10] + "...")
print("Anthropic API 설정 완료:", anthropic_client.api_key[:10] + "...")
김개발 씨가 노트북을 켜고 따라 해보려고 합니다. 하지만 어디서부터 시작해야 할지 막막합니다.
"API 키라는 게 뭔가요?" API 키란 무엇인가 박시니어 씨가 친절하게 설명합니다. API 키는 마치 회원증과 같습니다.
도서관에 들어가려면 회원증이 필요하듯이, OpenAI나 Anthropic의 서비스를 사용하려면 API 키가 필요합니다. 이 키는 고유한 문자열로, 여러분이 정당한 사용자임을 증명하고 사용량을 추적하는 데 사용됩니다.
또한 요금 청구의 기준이 되기도 합니다. 따라서 API 키는 절대로 공개하거나 GitHub에 올리면 안 됩니다.
OpenAI API 키 발급받기 먼저 OpenAI API를 설정해봅시다. platform.openai.com에 접속하여 계정을 만듭니다.
이미 ChatGPT 계정이 있다면 같은 계정으로 로그인할 수 있습니다. 로그인 후 우측 상단의 프로필 아이콘을 클릭하고 "API keys" 메뉴를 선택합니다.
"Create new secret key" 버튼을 누르면 새로운 API 키가 생성됩니다. 이 키는 딱 한 번만 보여주므로 반드시 안전한 곳에 복사해두세요.
나중에 다시 볼 수 없습니다. 처음 가입하면 보통 5달러 정도의 무료 크레딧을 제공합니다.
학습 목적으로 충분히 사용할 수 있는 금액입니다. Anthropic API 키 발급받기 Anthropic API도 비슷한 방식입니다.
console.anthropic.com에 접속하여 계정을 만듭니다. 대시보드에서 "API Keys" 섹션을 찾아 새 키를 생성합니다.
Anthropic도 신규 가입자에게 무료 크레딧을 제공하므로 바로 사용해볼 수 있습니다. Claude는 특히 코드 생성과 긴 컨텍스트 처리에 강점이 있어 많은 개발자들이 선호합니다.
환경 변수로 안전하게 관리하기 API 키를 발급받았다면, 이제 안전하게 관리해야 합니다. 절대로 코드에 직접 "sk-abc123..." 같은 키를 하드코딩하면 안 됩니다.
실수로 GitHub에 올리는 순간, 전 세계 누구나 여러분의 API 키로 요청을 보낼 수 있습니다. 그러면 엄청난 요금 폭탄을 맞을 수 있습니다.
대신 환경 변수를 사용합니다. 맥이나 리눅스에서는 터미널에서 이렇게 설정합니다.
export OPENAI_API_KEY="여기에_실제_키_입력" export ANTHROPIC_API_KEY="여기에_실제_키_입력" 윈도우에서는 시스템 환경 변수 설정에서 추가하거나, .env 파일을 사용할 수 있습니다. 파이썬 라이브러리 설치하기 API를 사용하려면 공식 파이썬 라이브러리를 설치해야 합니다.
터미널에서 다음 명령어를 실행합니다. pip install openai anthropic 이 두 라이브러리는 각각 OpenAI와 Anthropic의 공식 SDK입니다.
API 호출을 쉽게 만들어주는 편리한 함수들을 제공합니다. 클라이언트 객체 초기화하기 라이브러리를 설치했다면 이제 코드에서 사용할 준비를 합니다.
위의 코드 예제처럼 os.getenv() 함수로 환경 변수에서 API 키를 가져옵니다. 그리고 각각의 클라이언트 객체를 초기화합니다.
이 객체를 통해 LLM에게 요청을 보낼 수 있습니다. API 키 보안 체크리스트 박시니어 씨가 강조합니다.
"API 키 관리는 정말 중요해요." 첫째, 절대로 코드에 직접 넣지 않습니다. 둘째, .env 파일을 사용한다면 .gitignore에 꼭 추가합니다.
셋째, 주기적으로 키를 재발급하여 보안을 강화합니다. 넷째, 사용량 제한을 설정하여 예상치 못한 요금이 발생하지 않도록 합니다.
OpenAI와 Anthropic 대시보드에서 월별 사용량 제한을 설정할 수 있습니다. 예를 들어 "한 달에 최대 10달러까지만 사용"으로 설정하면 안전합니다.
무료 크레딧 활용하기 초보 개발자라면 무료 크레딧을 최대한 활용하세요. 작은 테스트 요청으로 시작해서 점차 복잡한 요청으로 발전시키는 것이 좋습니다.
처음부터 큰 프로젝트에 적용하려 하면 크레딧이 금방 소진될 수 있습니다. 또한 요청할 때 max_tokens 파라미터로 응답 길이를 제한하면 비용을 절감할 수 있습니다.
정리 김개발 씨가 성공적으로 API 키를 발급받고 설정을 완료했습니다. "생각보다 간단하네요!" 맞습니다.
API 키 발급과 설정은 5분이면 충분합니다. 가장 중요한 것은 보안입니다.
API 키를 안전하게 관리하는 습관을 들이면, 앞으로 어떤 외부 서비스를 사용하든 문제없습니다.
실전 팁
💡 - API 키는 절대로 GitHub에 올리지 마세요. .env 파일은 반드시 .gitignore에 추가하세요
- 대시보드에서 사용량 제한을 설정하여 예상치 못한 요금을 방지하세요
- 무료 크레딧으로 충분히 연습한 뒤 본격적으로 사용하세요
3. 첫 번째 코드 생성 프롬프트 작성
API 설정을 마친 김개발 씨는 드디어 첫 요청을 보내보려 합니다. "그냥 '코드 만들어줘'라고 하면 되나요?" 박시니어 씨가 고개를 젓습니다.
"프롬프트를 어떻게 작성하느냐에 따라 결과가 완전히 달라집니다. 제대로 요청하는 법을 배워봅시다."
프롬프트는 LLM에게 보내는 명령어나 질문입니다. 막연하게 "코드 만들어줘"보다는 "파이썬으로 두 숫자를 더하는 함수를 만들어줘.
함수명은 add이고 매개변수는 a, b야"처럼 구체적으로 작성할수록 원하는 결과를 얻을 확률이 높아집니다. 좋은 프롬프트는 명확한 목표, 언어 지정, 형식 요구사항을 포함합니다.
다음 코드를 살펴봅시다.
# 효과적인 코드 생성 프롬프트 작성하기
from openai import OpenAI
client = OpenAI()
# 나쁜 예: 모호한 프롬프트
bad_prompt = "코드 만들어줘"
# 좋은 예: 구체적인 프롬프트
good_prompt = """
파이썬으로 Hello World를 출력하는 함수를 작성해줘.
요구사항:
- 함수명: print_hello_world
- 매개변수 없음
- 반환값 없음
- docstring 포함
"""
# API 요청 보내기
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": good_prompt}]
)
print(response.choices[0].message.content)
김개발 씨가 첫 프롬프트를 작성해봅니다. "음...
'안녕하세요를 출력하는 코드 만들어줘' 이 정도면 되겠죠?" 박시니어 씨가 웃으며 말합니다. "그 정도로도 작동은 하겠지만, 훨씬 더 나은 방법이 있어요." 프롬프트의 중요성 프롬프트는 LLM과 대화하는 방법입니다.
마치 식당에서 주문하는 것과 같습니다. "음식 주세요"라고 하면 주방장이 당황하겠죠?
"불고기 정식 1인분, 밥은 적게, 김치는 많이 주세요"라고 구체적으로 말해야 원하는 것을 받을 수 있습니다. LLM도 마찬가지입니다.
모호한 요청보다는 명확하고 구체적인 요청이 훨씬 좋은 결과를 만듭니다. 나쁜 프롬프트의 예 초보자들이 자주 하는 실수를 살펴봅시다.
"코드 만들어줘" - 어떤 언어로? 무슨 기능을?
너무 막연합니다. "함수 작성해줘" - 어떤 함수를?
매개변수는? 반환값은?
정보가 부족합니다. "Hello World 프로그램" - 조금 나아졌지만 여전히 불충분합니다.
어떤 형식으로 작성할지 모릅니다. 이런 프롬프트는 LLM이 추측해서 코드를 생성하게 만듭니다.
운이 좋으면 원하는 결과를 얻지만, 대부분 다시 수정해야 합니다. 좋은 프롬프트의 구성 요소 효과적인 프롬프트는 다섯 가지 요소를 포함합니다.
첫째, 프로그래밍 언어를 명시합니다. "파이썬으로", "자바스크립트로", "Go 언어로" 같이 정확히 지정합니다.
둘째, 구체적인 기능을 설명합니다. "두 숫자를 더한다", "파일을 읽는다" 처럼 명확하게 표현합니다.
셋째, 함수명과 매개변수를 지정합니다. "함수명은 calculate_sum, 매개변수는 a와 b" 같이 디테일하게 요청합니다.
넷째, 형식 요구사항을 추가합니다. "docstring 포함", "타입 힌트 사용", "주석 추가" 등을 명시합니다.
다섯째, 예상 출력이나 예제를 제시하면 더욱 좋습니다. "이런 식으로 사용할 거야: calculate_sum(3, 5) → 8" 실전 프롬프트 작성하기 위의 코드 예제를 보면 좋은 프롬프트가 어떤 모습인지 알 수 있습니다.
언어를 지정하고, 함수명을 명시하고, 매개변수와 반환값을 설명하고, 추가 요구사항(docstring)까지 포함했습니다. 이렇게 작성하면 LLM이 정확히 무엇을 만들어야 할지 이해할 수 있습니다.
역할 부여 기법 더 나아가 LLM에게 역할을 부여하는 방법도 있습니다. "당신은 10년 경력의 파이썬 시니어 개발자입니다.
클린 코드 원칙을 따르는 함수를 작성해주세요." 이렇게 시작하면 LLM이 더 전문적이고 품질 높은 코드를 생성하는 경향이 있습니다. 마치 전문가에게 자문을 구하듯이 LLM을 활용하는 것입니다.
제약 조건 명시하기 때로는 하지 말아야 할 것을 명시하는 것도 중요합니다. "외부 라이브러리를 사용하지 말고 표준 라이브러리만 사용해줘", "전역 변수를 사용하지 마", "재귀 함수 대신 반복문으로 구현해줘" 같은 제약 조건을 추가하면 원치 않는 코드를 방지할 수 있습니다.
반복적인 개선 프롬프트 작성은 한 번에 완벽할 수 없습니다. 첫 요청의 결과가 마음에 들지 않으면, 프롬프트를 수정해서 다시 요청합니다.
"에러 처리를 추가해줘", "변수명을 더 명확하게 바꿔줘", "주석을 더 자세히 작성해줘" 같은 후속 요청으로 코드를 개선할 수 있습니다. 실무 시나리오 실제 업무에서는 이런 식으로 활용합니다.
"FastAPI를 사용해서 사용자 정보를 받아오는 GET 엔드포인트를 만들어줘. 경로는 /api/users/{user_id}이고, 사용자를 찾지 못하면 404 에러를 반환해.
Pydantic 모델로 응답 스키마를 정의하고, 비동기 함수로 작성해줘." 이 정도로 구체적으로 요청하면 거의 바로 사용할 수 있는 코드를 받을 수 있습니다. 정리 김개발 씨가 여러 번 프롬프트를 수정하며 연습합니다.
"아, 이렇게 구체적으로 요청하니까 정말 제가 원하는 코드가 나오네요!" 프롬프트 작성은 기술입니다. 처음에는 서툴지만, 연습할수록 늘어납니다.
명확성과 구체성이 핵심입니다. 애매한 요청은 애매한 결과를, 명확한 요청은 명확한 결과를 만듭니다.
실전 팁
💡 - 프로그래밍 언어, 함수명, 매개변수, 반환값을 모두 명시하세요
- 원하는 코딩 스타일이나 제약 조건을 추가하면 더 정확한 결과를 얻습니다
- 첫 결과가 마음에 들지 않으면 프롬프트를 개선해서 다시 시도하세요
4. Hello World 함수 만들어줘 구현
이론은 충분히 배웠습니다. 이제 김개발 씨가 직접 실습할 차례입니다.
"실제로 API를 호출해서 Hello World 함수를 생성해보겠습니다." 박시니어 씨가 옆에서 지켜봅니다. "자, 이제 진짜 코드를 AI에게 만들어달라고 요청해봅시다."
OpenAI의 Chat Completions API와 Anthropic의 Messages API를 사용하여 실제로 코드를 생성하는 방법을 배웁니다. system 메시지로 LLM의 역할을 설정하고, user 메시지로 구체적인 요청을 보내면, LLM이 응답으로 코드를 생성해줍니다.
생성된 코드는 response 객체에서 추출하여 바로 사용할 수 있습니다.
다음 코드를 살펴봅시다.
# OpenAI API로 Hello World 함수 생성하기
from openai import OpenAI
client = OpenAI()
# LLM에게 코드 생성 요청하기
response = client.chat.completions.create(
model="gpt-4", # 사용할 모델 선택
messages=[
{
"role": "system",
"content": "당신은 전문 파이썬 개발자입니다. 클린 코드 원칙을 따르는 함수를 작성합니다."
},
{
"role": "user",
"content": "Hello World를 출력하는 파이썬 함수를 작성해주세요. 함수명은 print_hello_world이고, docstring을 포함해주세요."
}
],
temperature=0.7 # 창의성 조절 (0~1)
)
# 생성된 코드 추출하기
generated_code = response.choices[0].message.content
print("=== AI가 생성한 코드 ===")
print(generated_code)
김개발 씨가 떨리는 마음으로 코드를 작성합니다. "드디어 제가 직접 AI에게 코드를 요청하는군요!" API 호출의 구조 이해하기 OpenAI의 Chat Completions API는 대화형 인터페이스입니다.
마치 채팅하듯이 메시지를 주고받는 방식입니다. chat.completions.create() 메서드를 호출하면 LLM에게 요청을 보낼 수 있습니다.
이 메서드는 여러 파라미터를 받습니다. 가장 중요한 것은 model과 messages입니다.
모델 선택하기 model 파라미터는 어떤 LLM을 사용할지 지정합니다. OpenAI는 여러 모델을 제공합니다.
gpt-4는 가장 강력하지만 비용이 높습니다. gpt-3.5-turbo는 빠르고 저렴하지만 성능이 조금 떨어집니다.
코드 생성에는 보통 gpt-4를 추천합니다. 더 정확하고 복잡한 로직도 잘 이해합니다.
Anthropic의 경우 claude-3-5-sonnet-20241022 같은 모델명을 사용합니다. 메시지 역할의 이해 messages는 대화 내역을 담는 배열입니다.
각 메시지는 role과 content를 가집니다. system 역할은 LLM의 행동 방식을 설정합니다.
"당신은 전문 파이썬 개발자입니다"라고 지정하면, LLM이 그 역할에 맞게 응답합니다. 마치 배우에게 캐릭터를 부여하는 것과 같습니다.
user 역할은 사용자의 요청입니다. "이런 함수를 만들어줘"라는 실제 명령을 담습니다.
assistant 역할은 LLM의 이전 응답을 의미합니다. 대화를 이어갈 때 사용합니다.
temperature 파라미터 temperature는 LLM의 창의성을 조절합니다. 0에 가까울수록 결정론적이고 예측 가능한 응답을 만듭니다.
항상 비슷한 코드를 생성합니다. 1에 가까울수록 창의적이고 다양한 응답을 만듭니다.
때로는 예상치 못한 코드를 생성하기도 합니다. 코드 생성에는 보통 0.7 정도가 적당합니다.
너무 낮으면 뻔한 코드만 나오고, 너무 높으면 이상한 코드가 나올 수 있습니다. 응답 객체 파싱하기 API 호출이 성공하면 response 객체를 받습니다.
이 객체는 복잡한 구조를 가지고 있습니다. 실제 생성된 텍스트는 response.choices[0].message.content에 들어있습니다.
choices는 여러 응답 후보를 담는 배열이지만, 보통 하나만 반환됩니다. 그래서 [0]으로 첫 번째 항목을 가져옵니다.
실제 실행 결과 김개발 씨가 코드를 실행하자 화면에 결과가 나타납니다. ```python def print_hello_world(): """ Hello World를 출력하는 간단한 함수입니다.
매개변수: 없음 반환값: 없음 """ print("Hello World") ``` "와! 정말로 함수가 생성됐어요!" 김개발 씨가 감탄합니다.
docstring까지 깔끔하게 작성된 코드가 만들어졌습니다. Anthropic API 사용하기 Anthropic의 Claude도 비슷한 방식으로 사용합니다.
python from anthropic import Anthropic client = Anthropic() response = client.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=1024, messages=[ { "role": "user", "content": "파이썬으로 Hello World를 출력하는 함수를 작성해주세요." } ] ) print(response.content[0].text) Anthropic API는 max_tokens 파라미터가 필수입니다. 이것은 응답의 최대 길이를 제한합니다.
에러 처리하기 실무에서는 반드시 에러 처리를 해야 합니다. API 키가 잘못되었거나, 네트워크 문제가 있거나, 요금이 부족하면 예외가 발생합니다.
try-except 블록으로 감싸서 안전하게 처리하세요. python try: response = client.chat.completions.create(...) except Exception as e: print(f"API 호출 실패: {e}") 비용 확인하기 response 객체에는 사용량 정보도 포함됩니다.
response.usage.prompt_tokens는 입력 토큰 수, response.usage.completion_tokens는 출력 토큰 수를 나타냅니다. 이 값들을 확인하면 얼마나 비용이 발생했는지 계산할 수 있습니다.
정리 김개발 씨가 성공적으로 첫 AI 코드 생성을 완료했습니다. "생각보다 간단하네요.
이제 더 복잡한 코드도 생성할 수 있을 것 같아요!" API 호출의 핵심은 적절한 프롬프트와 파라미터 설정입니다. 이 두 가지만 잘 이해하면 무궁무진한 활용이 가능합니다.
실전 팁
💡 - system 메시지로 LLM의 역할을 명확히 설정하면 더 나은 결과를 얻습니다
- temperature는 0.7 정도가 코드 생성에 적당합니다
- response 객체의 usage 정보를 확인하여 비용을 모니터링하세요
5. 토큰과 확률로 코드가 생성되는 과정
코드가 생성되는 걸 보고 신기해하던 김개발 씨가 문득 궁금해집니다. "그런데 AI가 정확히 어떤 과정을 거쳐서 이 코드를 만들어낸 거죠?" 박시니어 씨가 화이트보드를 가져옵니다.
"좋은 질문이에요. LLM 내부에서 일어나는 마법을 들여다봅시다."
LLM은 입력 텍스트를 토큰으로 분리하고, 각 위치에서 다음에 올 토큰의 확률 분포를 계산합니다. "def" 다음에는 "hello"가 올 확률이 높고, "return" 다음에는 변수명이나 값이 올 확률이 높습니다.
이렇게 토큰을 하나씩 선택하면서 전체 코드를 완성합니다. sampling 전략에 따라 매번 다른 코드가 생성될 수 있습니다.
다음 코드를 살펴봅시다.
# 토큰 확률 분포 시뮬레이션
import numpy as np
def simulate_token_generation(prompt, max_tokens=10):
"""LLM의 토큰 생성 과정을 단순화한 시뮬레이션"""
# 가상의 토큰 사전
vocab = ['def', 'print', 'hello', 'world', '(', ')', ':', 'return', '\n', ' ']
# 현재까지 생성된 토큰들
generated_tokens = []
for i in range(max_tokens):
# 다음 토큰의 확률 분포 계산 (실제로는 신경망이 수행)
# 여기서는 간단히 랜덤 확률로 시뮬레이션
probabilities = np.random.dirichlet(np.ones(len(vocab)))
# 가장 확률이 높은 토큰 선택
next_token_idx = np.argmax(probabilities)
next_token = vocab[next_token_idx]
generated_tokens.append(next_token)
print(f"Step {i+1}: 선택된 토큰='{next_token}', 확률={probabilities[next_token_idx]:.3f}")
return ' '.join(generated_tokens)
# 시뮬레이션 실행
result = simulate_token_generation("파이썬 함수 작성")
print(f"\n생성된 코드: {result}")
박시니어 씨가 화이트보드에 그림을 그리기 시작합니다. "LLM이 코드를 만드는 과정은 마치 퍼즐 조각을 하나씩 맞추는 것과 비슷해요." 토큰이란 무엇인가 다시 한번 토큰의 개념을 짚고 넘어갑니다.
토큰은 LLM이 이해하는 최소 단위입니다. 영어에서는 보통 단어나 단어의 일부가 토큰이 됩니다.
"Hello World"는 두 개의 토큰 "Hello"와 "World"로 나뉩니다. 코드의 경우 "def", "print", "(" 같은 것들이 각각 토큰이 됩니다.
한국어는 조금 복잡합니다. "안녕하세요"는 "안녕", "하", "세요" 같이 여러 토큰으로 나뉠 수 있습니다.
토큰화 과정 우리가 "파이썬으로 Hello World 함수를 만들어줘"라고 입력하면, LLM은 먼저 이것을 토큰으로 쪼갭니다. ["파이썬", "으로", "Hello", "World", "함수", "를", "만들어", "줘"] 이 토큰들을 숫자로 변환합니다.
각 토큰은 고유한 ID를 가집니다. 예를 들어 "Hello"는 1234, "World"는 5678 같은 식입니다.
컴퓨터는 숫자로 계산하기 때문입니다. 확률 분포 계산하기 핵심이 여기서 시작됩니다.
LLM은 다음 토큰의 확률 분포를 계산합니다. 예를 들어 "def"라는 토큰이 나왔다면, 다음에 올 토큰은 무엇일까요?
함수명이 올 확률이 높습니다. "print"가 올 확률 30%, "hello"가 올 확률 25%, "get"이 올 확률 20%, 기타 토큰들이 나머지 확률을 차지합니다.
이런 확률 분포는 LLM의 신경망이 계산합니다. 수십억 개의 파라미터가 복잡한 수학 연산을 수행하여 각 토큰의 확률을 계산합니다.
가장 확률 높은 토큰 선택하기 확률 분포가 계산되면, 이제 토큰을 선택할 차례입니다. 가장 간단한 방법은 greedy decoding입니다.
말 그대로 확률이 가장 높은 토큰을 선택하는 것입니다. 만약 "print"의 확률이 30%로 가장 높다면, "print"를 선택합니다.
하지만 항상 확률이 가장 높은 것만 선택하면 문제가 있습니다. 코드가 항상 똑같아지고, 창의성이 떨어집니다.
sampling 전략 그래서 sampling 기법을 사용합니다. 확률에 따라 무작위로 토큰을 선택하는 것입니다.
확률이 30%인 토큰은 30%의 확률로 선택됩니다. 이렇게 하면 매번 다른 코드가 생성됩니다.
temperature 파라미터가 여기서 작동합니다. temperature가 낮으면 확률이 높은 토큰에 더 집중하고, 높으면 확률이 낮은 토큰도 자주 선택됩니다.
마치 물의 온도가 높으면 분자 운동이 활발해지는 것과 비슷합니다. 반복적으로 토큰 생성하기 첫 토큰을 선택했다면, 이제 두 번째 토큰을 생성합니다.
"def print"까지 생성되었다면, 이제 이 컨텍스트를 바탕으로 다음 토큰의 확률을 계산합니다. 아마도 "("가 올 확률이 매우 높을 것입니다.
"def print(" 상태에서 다시 계산하면 ")"나 문자열이 올 확률이 높습니다. 이렇게 토큰을 하나씩 추가하면서 전체 함수를 완성합니다.
중단 조건 그렇다면 언제 멈출까요? LLM은 특수한 종료 토큰을 생성하거나, max_tokens에 도달하면 멈춥니다.
또는 자연스러운 코드의 끝(함수 정의가 완료된 시점)을 인식하고 스스로 멈추기도 합니다. 실제 예시로 이해하기 구체적인 예를 들어봅시다.
"def hello"까지 생성된 상태입니다. 다음 토큰 확률 분포: "(": 0.85 "_world": 0.10 ":": 0.03 기타: 0.02 압도적으로 "("의 확률이 높습니다.
LLM은 파이썬 함수 문법을 학습했기 때문에 함수명 다음에는 괄호가 와야 한다는 것을 알고 있습니다. 왜 가끔 이상한 코드가 나올까 박시니어 씨가 설명을 이어갑니다.
"그래서 가끔 LLM이 문법 오류가 있는 코드를 만들기도 해요." 확률 기반이기 때문에 완벽하지 않습니다. 드물게 확률이 낮은 토큰이 선택되면, 코드의 흐름이 어긋날 수 있습니다.
또한 LLM은 실제로 코드를 실행해보지 않습니다. 문법은 맞지만 논리 오류가 있는 코드를 생성할 수도 있습니다.
병렬 생성은 불가능 재미있는 점은 토큰을 순차적으로 생성한다는 것입니다. 첫 번째 토큰이 결정되어야 두 번째 토큰을 계산할 수 있습니다.
병렬 처리가 불가능합니다. 그래서 긴 코드를 생성할 때는 시간이 걸립니다.
한 글자씩 타이핑하는 것처럼 보이는 이유가 바로 이것입니다. 정리 김개발 씨가 감탄합니다.
"결국 LLM은 거대한 자동완성 시스템이군요!" 정확합니다. 매우 똑똑한 자동완성입니다.
수백억 개의 파라미터와 복잡한 신경망을 통해, 다음에 올 토큰을 놀라울 정도로 정확하게 예측합니다. 이것이 바로 생성형 AI의 핵심 원리입니다.
실전 팁
💡 - LLM은 토큰 단위로 순차적으로 생성하므로 긴 코드는 시간이 걸립니다
- temperature를 조절하여 결정론적(낮음) 또는 창의적(높음) 생성을 선택할 수 있습니다
- 확률 기반이므로 같은 프롬프트로 여러 번 생성하면 다른 결과가 나올 수 있습니다
6. 실습: 간단한 CLI 코드 생성기 만들기
이론을 충분히 배운 김개발 씨는 이제 실전 프로젝트를 시작하고 싶어졌습니다. "제가 직접 사용할 수 있는 도구를 만들어보고 싶어요!" 박시니어 씨가 미소를 짓습니다.
"좋아요. 터미널에서 바로 사용할 수 있는 CLI 코드 생성기를 만들어봅시다."
CLI(Command Line Interface) 코드 생성기는 터미널에서 사용자의 요청을 입력받아 LLM API로 코드를 생성하고 결과를 보여주는 프로그램입니다. argparse로 명령줄 인자를 파싱하고, OpenAI API로 코드를 생성하며, 선택적으로 파일로 저장하는 기능까지 포함합니다.
실무에서 바로 활용할 수 있는 실용적인 도구입니다.
다음 코드를 살펴봅시다.
# cli_code_generator.py - 터미널에서 사용하는 코드 생성기
import argparse
import os
from openai import OpenAI
def generate_code(prompt, language="python", save_to=None):
"""LLM API로 코드를 생성하는 핵심 함수"""
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 프롬프트 구성
full_prompt = f"{language}으로 다음 기능을 구현하는 코드를 작성해주세요:\n{prompt}"
# API 호출
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": f"당신은 전문 {language} 개발자입니다."},
{"role": "user", "content": full_prompt}
],
temperature=0.7
)
code = response.choices[0].message.content
# 파일 저장 옵션
if save_to:
with open(save_to, 'w', encoding='utf-8') as f:
f.write(code)
print(f"✓ 코드가 {save_to}에 저장되었습니다.")
return code
def main():
parser = argparse.ArgumentParser(description="AI 코드 생성기")
parser.add_argument("prompt", help="생성할 코드 설명")
parser.add_argument("-l", "--language", default="python", help="프로그래밍 언어")
parser.add_argument("-o", "--output", help="저장할 파일명")
args = parser.parse_args()
print(f"코드 생성 중...\n")
code = generate_code(args.prompt, args.language, args.output)
print(code)
if __name__ == "__main__":
main()
김개발 씨가 새로운 파일을 만들기 시작합니다. "실제로 사용할 수 있는 도구를 만든다니 설레요!" CLI 도구란 무엇인가 CLI는 Command Line Interface의 약자입니다.
마치 git, npm, pip 같은 명령어처럼 터미널에서 실행하는 프로그램입니다. 그래픽 인터페이스 없이 텍스트 명령만으로 작동합니다.
개발자들은 CLI 도구를 선호합니다. 빠르고, 자동화하기 쉬우며, 스크립트에 통합할 수 있기 때문입니다.
프로젝트 구조 설계하기 우리가 만들 코드 생성기는 세 가지 핵심 기능이 있습니다. 첫째, 사용자로부터 코드 요청을 입력받습니다.
둘째, LLM API를 호출하여 코드를 생성합니다. 셋째, 생성된 코드를 화면에 출력하거나 파일로 저장합니다.
간단하지만 실용적인 구조입니다. argparse로 명령줄 인자 처리하기 파이썬의 argparse 라이브러리는 CLI 도구 개발의 표준입니다.
ArgumentParser 객체를 만들고, add_argument로 필요한 인자를 정의합니다. prompt는 필수 인자로 코드 설명을 받습니다.
--language는 선택 인자로 프로그래밍 언어를 지정합니다. --output은 결과를 저장할 파일명입니다.
이렇게 정의하면 python cli_code_generator.py "Hello World 함수" -l python -o hello.py 같은 명령어로 사용할 수 있습니다. 코드 생성 함수 구현하기 generate_code 함수가 핵심 로직을 담당합니다.
먼저 환경 변수에서 API 키를 가져와 클라이언트를 초기화합니다. 그리고 사용자의 요청과 언어 정보를 조합하여 완전한 프롬프트를 만듭니다.
"파이썬으로 다음 기능을 구현하는 코드를 작성해주세요: Hello World 함수" 같은 형태입니다. API를 호출하여 응답을 받으면, 생성된 코드를 추출합니다.
파일 저장 기능 save_to 파라미터가 제공되면 파일로 저장합니다. with open() 구문으로 파일을 열고, 생성된 코드를 작성합니다.
encoding='utf-8'을 지정하여 한글 주석도 깨지지 않게 합니다. 저장이 완료되면 확인 메시지를 출력합니다.
이 기능 덕분에 생성된 코드를 바로 프로젝트에 추가할 수 있습니다. 실행 방법 파일을 저장한 뒤 터미널에서 실행해봅니다.
bash python cli_code_generator.py "두 숫자를 더하는 함수" 잠시 후 화면에 생성된 코드가 나타납니다. 파일로 저장하려면 -o 옵션을 추가합니다.
bash python cli_code_generator.py "두 숫자를 더하는 함수" -o add.py 자바스크립트 코드를 생성하려면 --language 옵션을 사용합니다. bash python cli_code_generator.py "배열을 정렬하는 함수" --language javascript 에러 처리 추가하기 실무 도구라면 에러 처리가 필수입니다.
API 키가 없으면 친절한 에러 메시지를 보여주고, 네트워크 오류가 발생하면 재시도를 안내하고, 파일 저장 실패 시 권한 문제를 알려줍니다. python if not os.getenv("OPENAI_API_KEY"): print("에러: OPENAI_API_KEY 환경 변수가 설정되지 않았습니다.") print("export OPENAI_API_KEY='your-key' 로 설정하세요.") exit(1) 개선 아이디어 박시니어 씨가 추가 기능을 제안합니다.
"대화형 모드를 추가하면 어떨까요? 여러 번 요청을 이어서 할 수 있게요." 좋은 아이디어입니다.
while 루프로 계속 입력을 받고, exit를 입력하면 종료하는 방식입니다. 또 다른 개선점은 비용 모니터링입니다.
API 응답의 토큰 사용량을 누적하여 "지금까지 약 0.5달러 사용했습니다"라고 알려주면 유용합니다. 템플릿 기능 추가 자주 사용하는 패턴을 템플릿으로 저장하면 편리합니다.
생성자와 메서드 포함해서" } ``` 사용자가 `--template fastapi "사용자 조회"`라고 입력하면, 템플릿을 확장하여 프롬프트를 만듭니다. **실무 활용 시나리오** 실제로 이런 도구를 어떻게 활용할까요?
프로젝트 작업 중 간단한 유틸리티 함수가 필요할 때, 터미널에서 바로 생성하여 복사-붙여넣기 할 수 있습니다. 테스트 코드 작성이 귀찮을 때, 함수를 입력하면 테스트 코드를 자동 생성할 수 있습니다.
배우고 있는 새로운 언어의 문법이 기억나지 않을 때, 즉시 예제 코드를 생성하여 참고할 수 있습니다. **주의사항** 하지만 맹신하면 안 됩니다.
생성된 코드는 반드시 검토하고 테스트해야 합니다. 특히 보안이 중요한 코드(인증, 암호화 등)는 더욱 신중하게 확인해야 합니다.
AI는 도구일 뿐, 최종 책임은 개발자에게 있습니다. **정리** 김개발 씨가 자신이 만든 CLI 도구를 실행해봅니다.
"와, 정말 동작하네요! 앞으로 개발할 때 많이 사용할 것 같아요!" 박시니어 씨가 박수를 칩니다.
"축하합니다. 이제 여러분은 AI 코드 생성 도구를 직접 만들 수 있는 개발자가 되었어요." 간단한 CLI 도구지만, 실무에서 충분히 활용할 수 있는 가치 있는 프로그램입니다.
여기서 더 발전시켜 웹 서비스로 만들 수도 있고, VSCode 확장으로 만들 수도 있습니다. 가능성은 무궁무진합니다.
**실전 팁**
💡 - argparse로 사용자 친화적인 CLI 인터페이스를 만드세요
- 환경 변수로 API 키를 관리하여 보안을 유지하세요
- 자주 사용하는 패턴은 템플릿으로 저장하면 효율적입니다
---
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
ReAct 패턴 마스터 완벽 가이드
LLM이 생각하고 행동하는 ReAct 패턴을 처음부터 끝까지 배웁니다. Thought-Action-Observation 루프로 똑똑한 에이전트를 만들고, 실전 예제로 웹 검색과 계산을 결합한 강력한 AI 시스템을 구축합니다.
AI 에이전트의 모든 것 - 개념부터 실습까지
AI 에이전트란 무엇일까요? 단순한 LLM 호출과 어떻게 다를까요? 초급 개발자를 위해 에이전트의 핵심 개념부터 실제 구현까지 이북처럼 술술 읽히는 스타일로 설명합니다.
프로덕션 RAG 시스템 완벽 가이드
검색 증강 생성(RAG) 시스템을 실제 서비스로 배포하기 위한 확장성, 비용 최적화, 모니터링 전략을 다룹니다. AWS/GCP 배포 실습과 대시보드 구축까지 프로덕션 환경의 모든 것을 담았습니다.
RAG 캐싱 전략 완벽 가이드
RAG 시스템의 성능을 획기적으로 개선하는 캐싱 전략을 배웁니다. 쿼리 캐싱부터 임베딩 캐싱, Redis 통합까지 실무에서 바로 적용할 수 있는 최적화 기법을 다룹니다.
실시간으로 답변하는 RAG 시스템 만들기
사용자가 질문하면 즉시 답변이 스트리밍되는 RAG 시스템을 구축하는 방법을 배웁니다. 실시간 응답 생성부터 청크별 스트리밍, 사용자 경험 최적화까지 실무에서 바로 적용할 수 있는 완전한 가이드입니다.