PHpullh

Python

🤖 AI 개발 학습 로드맵

모델을 직접 학습시키는 연구 경로가 아니라, 이미 있는 모델을 제품에 붙이는 응용 개발 경로를 5단계로 정리했습니다.

AI 개발이라는 말은 범위가 너무 넓어서, 무엇부터 해야 할지 정하는 데만 몇 주를 쓰는 경우가 많습니다. 여기서 다루는 것은 모델을 직접 학습시키는 연구 경로가 아니라, 이미 있는 모델을 불러 제품에 붙이는 응용 개발 경로입니다. 실무 수요가 가장 많고, 진입 장벽도 상대적으로 낮은 쪽입니다.

전체를 훑는 데 대략 3~5개월을 잡되, 단계마다 돌아가는 결과물을 하나씩 남기는 것을 기준으로 삼으십시오. 강의를 몇 개 들었는지보다 내가 만든 것이 몇 개인지가 다음 단계의 이해도를 좌우합니다.

1단계 — Python 기초 문법

AI 생태계의 라이브러리는 대부분 Python으로 제공됩니다. 다른 언어를 쓸 줄 알아도 이 단계는 건너뛰지 않는 편이 낫습니다. 필요한 범위는 넓지 않습니다. 리스트와 딕셔너리 다루기, 함수와 클래스, 예외 처리, 그리고 가상 환경과 패키지 설치까지입니다.

완료 기준: 남의 코드를 읽다가 막혔을 때, 그것이 문법 문제인지 라이브러리 사용법 문제인지 스스로 구분할 수 있으면 넘어가도 됩니다.
체크포인트: 폴더 안의 텍스트 파일을 모두 읽어 단어 빈도를 세고 결과를 파일로 저장하는 스크립트를 만들어 보십시오.
자주 막히는 곳: 가상 환경을 쓰지 않고 전역에 패키지를 설치했다가 버전이 꼬이는 경우입니다. 프로젝트마다 환경을 분리하는 습관을 처음부터 들이십시오.

학습 자료는 Python 심층 가이드의 기초 문법·함수·컬렉션·파일 입출력 편이면 충분합니다.

2단계 — 데이터 다루기

AI 응용의 절반 이상은 사실 데이터 정리입니다. pandas로 표 형태 데이터를 불러오고, 필터링하고, 결측값을 처리하고, 다른 형식으로 내보내는 작업에 익숙해지십시오. 시각화는 나중으로 미뤄도 됩니다.

완료 기준: 지저분한 CSV 파일 하나를 받아 원하는 형태로 정리해 낼 수 있으면 됩니다.
체크포인트: 공개 데이터셋 하나를 골라 결측치와 중복을 정리하고, 요약 통계를 뽑아 보십시오.
자주 막히는 곳: 인코딩 문제입니다. 한글이 깨질 때는 대개 파일이 UTF-8이 아니라 CP949로 저장된 경우이니, 읽을 때 인코딩을 명시하십시오.

3단계 — LLM API 호출

여기서부터가 본론입니다. 상용 LLM API를 호출해 응답을 받고, 그 응답을 프로그램이 쓸 수 있는 형태로 다루는 단계입니다. 프롬프트를 어떻게 쓰느냐보다 응답을 어떻게 신뢰할 수 있게 만드느냐가 실무의 핵심입니다.

완료 기준: 구조화된 출력(JSON 등)을 요청하고, 형식이 어긋났을 때 재시도하거나 검증하는 흐름을 만들 수 있으면 됩니다.
체크포인트: 긴 문서를 넣으면 요약과 핵심 키워드를 정해진 JSON 형식으로 돌려주는 작은 도구를 만들어 보십시오.
자주 막히는 곳: 두 가지입니다. 첫째, 토큰 한도를 넘겨 응답이 중간에 잘리는데 에러가 아니라 정상 응답으로 오는 경우. 둘째, API 키를 코드에 그대로 적어 저장소에 올리는 사고입니다. 키는 반드시 환경 변수로 분리하십시오.

체크포인트 — 구조화 출력과 검증

# 요약 도구: 형식이 어긋나면 재시도한다
import json, os
from typing import Any

MAX_RETRY = 2
SCHEMA_HINT = '{"summary": "3문장 이내", "keywords": ["문자열", ...]}'

def ask(client, text: str) -> str:
    """LLM에 요약을 요청하고 원문 응답을 돌려준다."""
    prompt = (
        "다음 문서를 요약하라. 반드시 아래 JSON 형식만 출력하라.\n"
        f"형식: {SCHEMA_HINT}\n\n문서:\n{text}"
    )
    return client.complete(prompt)          # 실제 SDK 호출부

def parse(raw: str) -> dict[str, Any]:
    """모델이 코드펜스를 감싸는 경우가 흔하므로 벗겨 낸다."""
    body = raw.strip()
    if body.startswith("```"):
        body = body.split("```")[1]
        body = body.partition("\n")[2]
    data = json.loads(body)                 # 형식 위반이면 여기서 예외
    if not isinstance(data.get("keywords"), list):
        raise ValueError("keywords가 리스트가 아닙니다")
    return data

def summarize(client, text: str) -> dict[str, Any]:
    last = None
    for attempt in range(MAX_RETRY + 1):
        try:
            return parse(ask(client, text))
        except (json.JSONDecodeError, ValueError) as e:
            last = e                        # 형식 오류만 재시도한다
    raise RuntimeError(f"{MAX_RETRY + 1}회 시도 후 실패: {last}")

# API 키는 코드가 아니라 환경 변수에서 읽는다
API_KEY = os.environ["LLM_API_KEY"]

배경 지식은 AI 기초 개념 가이드와 프롬프트 엔지니어링 가이드에서 정리할 수 있습니다.

4단계 — 검색 증강 생성(RAG)

모델이 모르는 사내 문서나 최신 자료를 답변에 쓰게 하려면, 질문과 관련된 내용을 찾아 프롬프트에 함께 넣어야 합니다. 문서를 적당한 크기로 자르고, 임베딩으로 바꿔 저장하고, 질문과 가까운 조각을 찾아오는 흐름을 익히는 단계입니다.

완료 기준: 답변이 이상할 때 그것이 검색 단계의 문제인지 생성 단계의 문제인지 구분해 낼 수 있으면 됩니다. 이 구분이 안 되면 프롬프트만 계속 고치게 됩니다.
체크포인트: 자신이 가진 문서 수십 개를 넣고 질문에 근거와 함께 답하는 도구를 만들어 보십시오. 근거로 쓴 원문 조각을 함께 보여주도록 만드는 것이 중요합니다.
자주 막히는 곳: 문서를 자르는 크기와 겹침을 대충 정하고 넘어가는 것입니다. 이 값이 검색 품질을 크게 좌우합니다. 또 임베딩 모델을 바꾸면 기존에 저장한 벡터를 전부 다시 만들어야 한다는 점도 놓치기 쉽습니다.

체크포인트 — 근거를 함께 돌려주는 검색

# 문서를 잘라 저장하고, 질문과 가까운 조각을 근거로 함께 반환한다
from dataclasses import dataclass

CHUNK, OVERLAP = 800, 120                   # 이 두 값이 검색 품질을 좌우한다

@dataclass
class Chunk:
    doc_id: str
    text: str
    vector: list[float]

def split(text: str) -> list[str]:
    """겹침을 두어 문장이 경계에서 잘려도 맥락이 남게 한다."""
    out, start = [], 0
    while start < len(text):
        out.append(text[start:start + CHUNK])
        start += CHUNK - OVERLAP
    return out

def search(store: list[Chunk], q_vec: list[float], k: int = 4) -> list[Chunk]:
    scored = [(cosine(q_vec, c.vector), c) for c in store]
    scored.sort(key=lambda x: x[0], reverse=True)
    return [c for _, c in scored[:k]]

def answer(client, store, question: str) -> dict:
    hits = search(store, embed(question))
    context = "\n---\n".join(h.text for h in hits)
    reply = client.complete(
        f"아래 자료만 근거로 답하라. 자료에 없으면 모른다고 답하라.\n\n{context}\n\n질문: {question}"
    )
    # 답변과 함께 근거 조각을 돌려줘야 검색 문제인지 생성 문제인지 구분된다
    return {"answer": reply, "sources": [h.doc_id for h in hits]}

자세한 내용은 RAG & 검색 가이드에 정리해 두었습니다.

5단계 — 에이전트와 운영

모델이 도구를 호출하고 여러 단계를 스스로 진행하게 만드는 단계입니다. 재미있어 보이지만 실패 모드가 가장 많은 영역이기도 합니다. 반복 횟수 상한, 실패 시 처리, 비용 추적 같은 안전장치를 함께 설계해야 합니다.

완료 기준: 에이전트가 잘못된 경로로 갔을 때 어디서 어긋났는지 로그로 추적할 수 있으면 됩니다.
체크포인트: 도구 두세 개를 붙인 작은 에이전트를 만들고, 반복 상한과 실패 처리를 넣어 보십시오.
자주 막히는 곳: 상한 없이 돌렸다가 반복 호출로 비용이 급증하는 사고가 흔합니다. 개발 단계부터 호출 횟수와 비용을 찍어 보십시오.

AI Ops & 운영 가이드와 보안 & 윤리 가이드를 함께 보시길 권합니다.

지금은 미뤄도 되는 것

  • 모델을 직접 학습시키거나 파인튜닝하는 일 — 응용 개발에서는 마지막 수단에 가깝습니다.
  • 선형대수와 확률론을 처음부터 다시 공부하는 일 — 필요해지는 시점에 그 부분만 보면 됩니다.
  • 프레임워크를 여러 개 비교하는 일 — 하나로 끝까지 만들어 본 뒤에 비교해야 차이가 보입니다.

바로 시작할 학습 자료