이 문서를 통해 아래 질문들에 답할 수 있게 됩니다.

  • Java/Spring 백엔드 개발자가 AI 학습에서 Python을 어느 정도 알아야 하는가?
  • 기존 Python 메모의 함수, 자료형, list comprehension, itertools, 코드 관례는 AI 코드에서 어디에 쓰이는가?
  • Python 실험 코드를 운영 가능한 worker나 eval 코드로 키울 때 무엇을 조심해야 하는가?

개요

AI 백엔드 개발자가 반드시 Python 전문가가 될 필요는 없다. 그러나 Python 생태계는 LLM SDK, RAG, eval, 데이터 처리, worker 예제가 매우 풍부하다. Java/Spring 서버를 주력으로 쓰더라도 Python 코드를 읽고 작은 worker와 eval script를 작성할 수 있으면 학습 속도가 빨라진다.

이 문서는 기존 Blog/posts/AI/Python 아래의 함수, 자료형, list comprehension, itertools, 코드 관례 메모를 AI 개발 관점으로 흡수한 것이다.

왜 백엔드 개발자에게 중요한가

AI 프로젝트에서는 이런 구조가 자주 나온다.

  • Spring Boot API 서버가 job을 queue에 넣는다.
  • Python worker가 문서를 읽고 embedding을 만든다.
  • Python eval runner가 prompt 변경을 테스트한다.
  • Python script가 vector index를 재색인한다.

따라서 Python 문법은 알고리즘 풀이보다 AI 파이프라인을 이해하기 위한 도구로 보면 좋다.

함수와 Keyword Argument

기존 메모에는 기본 인자, *args, **kwargs, lambda, closure, docstring이 정리되어 있었다. AI 코드에서는 특히 keyword argument가 중요하다.

def call_llm(*, prompt: str, model: str = "fast", timeout_seconds: float = 8.0) -> str:
    """LLM provider를 호출하고 텍스트 응답을 반환한다."""
    return provider.generate(
        prompt=prompt,
        model=model,
        timeout_seconds=timeout_seconds,
    )
 
 
answer = call_llm(
    prompt="문서를 요약해줘",
    model="balanced",
    timeout_seconds=6.0,
)

call_llm("문서를 요약해줘", "balanced", 6.0)보다 훨씬 읽기 쉽다. AI 코드는 인자 순서보다 의미가 중요하다. prompt, model, timeout, tenant, trace id가 섞이면 positional argument는 실수를 만들기 쉽다.

자료형

기존 메모의 list, tuple, set, dict는 AI 코드에서 다음처럼 쓰인다.

  • list: 검색 결과, eval case, chunk 목록
  • tuple: 변경하지 않을 좌표나 pair
  • set: source id 중복 제거
  • dict: JSON payload, tool result, usage event
from collections import Counter
 
 
failures = ["missing_source", "invalid_schema", "missing_source"]
summary = Counter(failures)
 
assert dict(summary) == {
    "missing_source": 2,
    "invalid_schema": 1,
}

Counter는 eval 실패 유형 집계에 유용하다.

List Comprehension과 itertools

기존 메모의 list comprehension은 chunk 필터링과 source id 추출에 자주 쓰인다.

visible_chunks = [
    chunk for chunk in chunks
    if chunk.tenant_id == user.tenant_id and not chunk.deleted
]
 
source_ids = [chunk.source_id for chunk in visible_chunks]

itertools는 prompt 조합 테스트나 eval case 생성에 쓸 수 있다.

from itertools import product
 
 
models = ["fast", "balanced"]
prompts = ["qa-v1", "qa-v2"]
 
eval_matrix = [
    {"model": model, "prompt_version": prompt}
    for model, prompt in product(models, prompts)
]

이런 코드는 모델과 prompt 조합을 비교할 때 유용하다.

코드 관례

기존 메모에는 띄어쓰기, line break, keyword argument 사용이 있었다. AI 코드에서는 관례가 특히 중요하다. 실험 코드가 빠르게 커져 production worker가 되는 일이 많기 때문이다.

나쁜 호출:

run_eval("doc-qa-v3", True, 20, 0.7)

좋은 호출:

run_eval(
    prompt_version="doc-qa-v3",
    include_security_cases=True,
    max_cases=20,
    judge_threshold=0.7,
)

AI 코드에서는 “이 값이 무엇인지”가 디버깅 시간을 크게 줄인다.

백엔드 설계 판단

Python worker나 eval script를 작성할 때도 백엔드 원칙을 적용한다.

  • 입력을 검증한다.
  • timeout을 둔다.
  • idempotency key를 사용한다.
  • 로그에 trace id를 남긴다.
  • 민감정보를 마스킹한다.
  • 실패 유형을 분리한다.

실험 코드라도 나중에 운영 코드가 될 수 있다.

코드로 이해하기

간단한 eval runner 예시다.

from dataclasses import dataclass
 
 
@dataclass(frozen=True)
class EvalCase:
    case_id: str
    question: str
    expected_source_ids: set[str]
 
 
def run_case(*, case: EvalCase, rag_client) -> dict:
    result = rag_client.answer(question=case.question)
    found_sources = set(result["source_ids"])
    return {
        "case_id": case.case_id,
        "passed": case.expected_source_ids.issubset(found_sources),
        "missing_sources": list(case.expected_source_ids - found_sources),
    }

기본 문법은 단순하지만, keyword argument와 dataclass를 쓰면 AI 테스트 코드도 읽기 쉬워진다.

실전 팁

  • AI script도 함수로 쪼갠다. notebook에서 검증한 뒤 worker로 옮기기 쉽다.
  • dict payload는 가능한 dataclass나 Pydantic model로 감싼다.
  • print만 쓰지 말고 event 이름이 있는 structured log를 남긴다.
  • prompt, model, timeout, tenant id는 keyword argument로 명시한다.

위험 신호!

  • Python script에 API key가 직접 들어 있다.
  • eval 실패 유형을 문자열 로그로만 남긴다.
  • worker가 중복 실행을 고려하지 않는다.
  • 실험 코드가 그대로 production batch job이 된다.

확인 질문

확인 질문

  • AI 백엔드 개발자가 Python을 알아야 하는 실전 이유는 무엇인가?
    • AI SDK, RAG, eval, embedding worker, 데이터 처리 예제가 Python 중심인 경우가 많기 때문이다.
  • keyword argument가 AI 코드에서 중요한 이유는 무엇인가?
    • prompt, model, timeout, tenant, trace id처럼 의미가 중요한 인자의 실수를 줄이기 때문이다.
  • 기존 Python 메모에서 AI eval에 특히 유용한 것은 무엇인가?
    • dict, Counter, list comprehension, itertools product 같은 컬렉션 처리다.

참고 문서