18회차에서 외부 API를 코드로 다뤘으니, 이번엔 그 대상이 LLM입니다. 1회차에서 토큰·temperature 같은 개념은 잡았으니, 여기선 그걸 '코드 파라미터'로 직접 만집니다. 만들 것은 '주제 요약기'입니다. 글이나 주제를 넣으면 정해진 JSON 틀로 요약을 돌려줘요. 이게 20회차 '내 자료로 답하는 챗봇'의 LLM 호출 부품이 됩니다. AI로 빠르게 짜되, 각 줄이 무엇을 하는지는 내가 압니다.
💸 잠깐, 이 트랙부터는 'API 종량제'입니다 (비용 주의)
1~3트랙은 ChatGPT Plus·Claude Pro 같은 '정액 구독'이라 아무리 써도 월정액이었죠. 하지만 코드로 직접 부르는 API는 '쓴 만큼 내는' 종량제예요. 호출 한 번 한 번이 토큰 단위로 과금됩니다. 겁낼 정도는 아닙니다. 트랙 전체 실습이 보통 책 한 권 값 수준이에요. 그래도 '모르고 많이 돌리는' 사고는 미리 막아야 합니다.
- 보통 실습 — 요약·질문 몇 번은 몇 센트 수준. 거의 무시 가능.
- 조심할 구간 — 20회차 대량 임베딩, 21회차 에이전트 루프, 22회차 평가(같은 질문을 수십 번)처럼 호출 수가 확 늘면 비용이 커질 수 있음.
- 실수 사고 — 무한 루프나 거대 입력으로 한 번에 많이 나가는 경우.
🧠 먼저 감 — 1회차 개념을 코드 손잡이로
- 토큰 — 요금·길이의 기준. max_tokens로 응답 길이를 제한.
- temperature — 창의성 손잡이. 0이면 일관·반복 가능, 높을수록 다양(요약·추출은 낮게).
- 모델 선택 — 빠르고 싼 모델 vs 똑똑하고 비싼 모델. 작업 난이도에 맞춰.
🔌 LLM을 코드로 호출하기
노코드(Make)나 GPTs를 거치지 않고, 내 코드가 직접 모델에 메시지를 보내고 답을 받습니다. 형태는 18회차 API 호출과 똑같아요. 요청 → 응답 → 값 꺼내기죠.
- pip install anthropic (또는 openai)
- .env에 키 저장 → load_dotenv()로 로드 (18회차 그대로)
- client.messages.create(...)로 호출 → 응답에서 텍스트만 추출
# llm.py — Anthropic으로 한 번 호출해보기
import os
from dotenv import load_dotenv
from anthropic import Anthropic
load_dotenv()
client = Anthropic(api_key=os.environ['ANTHROPIC_API_KEY'])
res = client.messages.create(
model='claude-sonnet-4-6',
max_tokens=300,
temperature=0,
messages=[{'role': 'user', 'content': '한국 1인 가구 소비 트렌드를 3줄로 요약해줘'}],
)
print(res.content[0].text) # 응답에서 텍스트만 꺼내기
📐 구조화 출력 — '항상 같은 틀'로 받기
자유 문장으로 받으면 코드가 파싱하다 깨집니다. '결과를 이 JSON 모양으로 달라'고 강제하면, 다음 단계 코드가 안정적으로 값을 꺼낼 수 있어요. 'AI를 부품으로 쓰는' 모든 코드의 핵심입니다.
- 원하는 출력 모양을 JSON 스키마로 정의 (예: title, bullets[], sentiment)
- 프롬프트에 '아래 JSON 형식으로만 답하라'고 명시 (또는 tool/structured output 기능 사용)
- 받은 문자열을 json.loads로 파싱 → 실패하면 재시도 로직
# 출력 틀을 강제하면 파싱이 안정적이다
SCHEMA_HINT = '''아래 JSON 형식으로만 답하라(설명 금지):
{"title": "...", "bullets": ["...", "..."], "sentiment": "긍정|중립|부정"}'''
msg = f'{SCHEMA_HINT}\n\n원문:\n{text}'
# 호출 후:
import json
data = json.loads(res.content[0].text) # 이제 dict로 안전하게 사용
🔁 멀티 프로바이더 — 한 코드, 여러 회사
회사마다 SDK는 조금씩 달라도 '메시지 넣고 텍스트 받기'는 같습니다. 얇은 래퍼 함수 하나로 감싸두면, 환경변수만 바꿔 Anthropic·OpenAI를 갈아끼울 수 있어요. 15회차 게이트웨이(LiteLLM)가 하던 일을 작게 직접 만드는 셈입니다.
# provider.py — 환경변수 PROVIDER로 회사 전환
import os
def ask(prompt: str) -> str:
provider = os.environ.get('PROVIDER', 'anthropic')
if provider == 'anthropic':
from anthropic import Anthropic
c = Anthropic()
r = c.messages.create(model='claude-sonnet-4-6', max_tokens=300,
messages=[{'role': 'user', 'content': prompt}])
return r.content[0].text
else: # openai
from openai import OpenAI
c = OpenAI()
r = c.chat.completions.create(model='gpt-5.5',
messages=[{'role': 'user', 'content': prompt}])
return r.choices[0].message.content
🔧 만들 것 — 주제 요약기
- 주제/텍스트를 입력받아 ask()로 호출
- 출력을 JSON 스키마(title·bullets·sentiment)로 강제해 파싱
- PROVIDER를 바꿔 두 회사 결과를 같은 코드로 비교
✅ 완료 기준 (체크포인트)
- 같은 입력을 2개 프로바이더로 호출해 둘 다 성공한다.
- 출력이 정해진 JSON 스키마로 100% 파싱된다(파싱 실패 0).
- PROVIDER 환경변수만 바꿔 회사를 전환했다(코드 수정 없이).
📌 19회차 핵심
- LLM을 노코드 거치지 않고 코드로 직접 호출 — 요청→응답→값 꺼내기.
- 구조화 출력(JSON 강제)이 'AI를 부품으로 쓰는' 코드의 핵심.
- 얇은 래퍼 + 환경변수로 멀티 프로바이더 — 15회차 게이트웨이를 코드로 맛보기.