Split View: AI Engineer 되는 방법 완벽 가이드 2026 — LLM, RAG, 에이전트, Evals, 커리어 로드맵
AI Engineer 되는 방법 완벽 가이드 2026 — LLM, RAG, 에이전트, Evals, 커리어 로드맵
- 들어가며 — 2026년, 왜 AI Engineer인가
- AI Engineer의 정의 — ML Engineer, Data Scientist와 무엇이 다른가
- 2023에서 2026으로 — 직무는 이렇게 진화했다
- 스킬 1 — 언어: Python과 TypeScript
- 스킬 2 — LLM API를 제대로 다루기
- 스킬 3 — 프롬프트 엔지니어링, 감이 아니라 공학으로
- 스킬 4 — RAG 설계: 청킹, 임베딩, 하이브리드 검색, 리랭킹
- RAG는 평가가 절반이다 — recall@k와 MRR
- 스킬 5 — 에이전트 구축: 툴 콜링 루프에서 MCP까지
- 스킬 6 — 파인튜닝 기초: LoRA, QLoRA, DPO
- 스킬 7 — 서빙: vLLM과 TGI
- Evals 중심 개발 — LLM-as-Judge와 골든 데이터셋
- 프레임워크 지형 — LangChain, LlamaIndex, DSPy, PydanticAI
- 벡터 DB 선택 가이드
- 비용 최적화 — 캐싱, 모델 라우팅, 배치
- 관측성 — LangSmith, Langfuse, Braintrust
- 포트폴리오 프로젝트 5가지
- 채용 시장 2026 — 한국
- 채용 시장 2026 — 일본과 글로벌
- 인터뷰 대비 — 시스템 디자인, 코딩, ML 기초
- 학습 자료 — 강의, 책, 뉴스레터
- 커리어 전환 경로 — 백엔드에서, 데이터 사이언스에서
- 마치며 — 6개월 로드맵
- References
들어가며 — 2026년, 왜 AI Engineer인가
2026년 현재, 채용 시장에서 가장 빠르게 늘어난 직함 하나를 꼽으라면 단연 AI Engineer입니다.
3년 전만 해도 이 직함은 낯설었습니다. 지금은 네이버, 카카오, 토스의 채용 공고에도, 실리콘밸리 스타트업의 구인 글에도 같은 이름이 붙습니다.
핵심은 간단합니다. 모델을 처음부터 만드는 사람이 아니라, 이미 존재하는 강력한 파운데이션 모델 위에서 제품을 만드는 사람. 그 수요가 폭발했습니다.
진입 장벽은 낮아 보입니다. API 호출 몇 줄이면 데모가 나오니까요. 하지만 프로덕션 수준의 AI 제품은 전혀 다른 이야기입니다. 검색 품질, 환각 억제, 평가 체계, 비용 관리, 관측성까지 갖춰야 비로소 서비스가 됩니다.
이 글은 그 간극을 메우는 로드맵입니다. 역할 정의부터 필수 스킬 7가지, 평가 중심 개발, 도구 선택, 포트폴리오, 채용 시장, 인터뷰 대비, 전환 경로까지 하나씩 짚어 봅니다.
AI Engineer의 정의 — ML Engineer, Data Scientist와 무엇이 다른가
먼저 용어를 정리해야 합니다. 세 직무는 겹치는 부분이 있지만 무게 중심이 다릅니다.
| 직무 | 핵심 질문 | 주요 산출물 | 대표 도구 |
|---|---|---|---|
| Data Scientist | 데이터가 무엇을 말하는가 | 분석 리포트, 예측 모델 | SQL, pandas, 통계 |
| ML Engineer | 모델을 어떻게 학습하고 배포하는가 | 학습 파이프라인, 모델 서빙 | PyTorch, Kubeflow, MLflow |
| AI Engineer | 파운데이션 모델로 어떤 제품을 만드는가 | RAG 시스템, 에이전트, AI 기능 | LLM API, 벡터 DB, 평가 도구 |
이 구분을 대중화한 것이 2023년 6월 swyx의 에세이 "The Rise of the AI Engineer"입니다. 요지는 이렇습니다. 모델 학습은 소수의 연구 조직에 집중되고, 나머지 대다수 엔지니어는 API 반대편에서 모델의 능력을 제품으로 바꾸는 일을 하게 된다는 것.
그 예측은 적중했습니다. AI Engineer는 모델 내부 가중치를 만지는 대신, 프롬프트, 검색, 오케스트레이션, 평가라는 레버를 당깁니다.
다만 경계는 점점 흐려지고 있습니다. 2026년의 AI Engineer 공고에는 LoRA 파인튜닝이나 vLLM 서빙 경험이 우대 사항으로 자주 등장합니다. API만 쓰는 사람과 필요할 때 모델 레이어까지 내려갈 수 있는 사람의 몸값 차이가 벌어졌습니다.
2023에서 2026으로 — 직무는 이렇게 진화했다
이 직무의 3년은 크게 네 단계로 요약됩니다.
2023 — 래퍼의 시대. ChatGPT 충격 이후 누구나 데모를 만들었습니다. 프롬프트 하나로 시작하는 소위 GPT 래퍼가 쏟아졌고, 차별화는 거의 없었습니다.
2024 — RAG의 표준화. 회사 데이터와 모델을 연결하는 검색 증강 생성이 사실상의 표준 아키텍처가 됐습니다. 청킹, 임베딩, 리랭킹 같은 용어가 실무 어휘로 자리 잡았습니다.
2025 — 에이전트와 MCP. 툴 콜링이 안정화되면서 모델이 루프 안에서 도구를 골라 쓰는 에이전트가 실무에 들어왔습니다. Model Context Protocol이 도구 연결의 공통 규격으로 퍼졌습니다.
2026 — 평가와 신뢰성의 시대. 데모는 쉽고 프로덕션은 어렵다는 인식이 업계 전체에 자리 잡았습니다. 채용 공고에 evals 경험이 명시되기 시작했고, 비용 최적화와 관측성이 핵심 역량으로 올라왔습니다.
이 순서는 그대로 학습 로드맵이기도 합니다. API 활용, RAG, 에이전트, 그리고 평가. 아래에서 하나씩 다룹니다.
스킬 1 — 언어: Python과 TypeScript
AI Engineer의 양대 언어는 Python과 TypeScript입니다.
Python은 기본값입니다. 모델, 데이터, 평가 생태계가 전부 Python에 있습니다. FastAPI로 백엔드를 세우고, pydantic으로 스키마를 검증하고, asyncio로 동시 호출을 처리하는 수준까지는 필수입니다. 타입 힌트를 습관화하면 LLM 출력 파싱에서 사고가 크게 줄어듭니다.
TypeScript는 제품 쪽 절반입니다. AI 기능의 상당수는 결국 웹 UI로 전달됩니다. 스트리밍 응답을 화면에 흘려보내고, Vercel AI SDK 같은 도구로 챗 인터페이스를 빠르게 조립하는 능력은 풀스택형 AI Engineer의 강점이 됩니다.
권장 전략은 하나를 깊게, 다른 하나를 읽고 고칠 수 있는 수준으로 유지하는 것입니다. 백엔드 출신이라면 Python을 축으로, 프론트엔드 출신이라면 TypeScript를 축으로 잡으면 됩니다.
언어 자체보다 중요한 것은 소프트웨어 엔지니어링 기본기입니다. 버전 관리, 테스트, CI, 로깅. LLM이 코드를 대신 써 주는 시대일수록, 무엇이 좋은 코드인지 판단하는 눈이 연봉을 가릅니다.
스킬 2 — LLM API를 제대로 다루기
LLM API 활용은 단순 호출이 아니라 신뢰성 엔지니어링입니다. 실무에서 반드시 다루게 되는 요소들입니다.
- 구조화 출력 — 자유 텍스트가 아니라 스키마가 보장된 JSON을 받아 파싱 실패를 없앱니다.
- 스트리밍 — 첫 토큰까지의 시간을 줄여 체감 지연을 낮춥니다. 긴 출력은 스트리밍이 사실상 필수입니다.
- 툴 콜링 — 모델이 함수를 호출하도록 스키마를 설계합니다. 에이전트의 기초 부품입니다.
- 에러 처리 — 레이트 리밋 429, 과부하 529에 대한 지수 백오프 재시도. SDK 기본 재시도 설정을 이해해야 합니다.
- 프롬프트 캐싱 — 반복되는 긴 컨텍스트를 캐시해 비용을 크게 줄입니다.
구조화 출력의 최소 예제입니다. Pydantic 모델을 스키마로 넘기면 검증된 객체를 돌려받습니다.
# pip install anthropic pydantic
import anthropic
from pydantic import BaseModel
class Ticket(BaseModel):
category: str # "billing" | "bug" | "feature_request"
urgency: int # 1 (low) - 5 (critical)
summary: str
client = anthropic.Anthropic()
def classify(text: str) -> Ticket:
response = client.messages.parse(
model="claude-opus-4-8",
max_tokens=1024,
system="You classify customer support tickets.",
messages=[{"role": "user", "content": text}],
output_format=Ticket,
)
return response.parsed_output
print(classify("I was charged twice this month. Please fix this ASAP."))
이 정도의 견고함이 모든 파이프라인의 바탕이 됩니다. 자유 텍스트를 정규식으로 긁는 코드가 보이면 그 시스템은 아직 프로토타입입니다.
스킬 3 — 프롬프트 엔지니어링, 감이 아니라 공학으로
프롬프트 엔지니어링은 한때 조롱받는 단어였지만, 2026년에는 명확한 실무 기술로 정리됐습니다. 핵심 원칙은 네 가지입니다.
첫째, 시스템 프롬프트는 사양서다. 역할, 입력 형식, 출력 형식, 금지 사항, 예외 처리를 문서처럼 씁니다. 모호한 지시는 모호한 출력을 낳습니다.
둘째, 예시가 지시보다 강하다. few-shot 예시 두세 개가 형용사 열 개보다 출력 품질을 안정시킵니다. 특히 형식을 맞춰야 할 때 그렇습니다.
셋째, 추론 여지를 준다. 복잡한 판단은 결론부터 뱉게 하지 말고 근거를 먼저 정리하게 합니다. 최신 모델의 추론 모드를 쓸 때도 문제를 명확히 정의하는 쪽이 품질을 좌우합니다.
넷째, 프롬프트는 코드다. 저장소에서 버전 관리하고, 변경은 리뷰를 거치고, 배포 전에 평가 셋으로 회귀 검사를 돌립니다. 프롬프트를 채팅창에서 즉흥으로 고치는 팀과, 평가로 검증하는 팀의 격차는 시간이 갈수록 벌어집니다.
안티 패턴도 알아 둬야 합니다. 대문자로 강조를 남발하는 프롬프트는 최신 모델에서 오히려 과잉 반응을 일으킵니다. 최신 모델은 지시를 더 문자 그대로 따르므로, 강한 명령어를 걷어내고 조건을 정확히 쓰는 편이 낫습니다.
스킬 4 — RAG 설계: 청킹, 임베딩, 하이브리드 검색, 리랭킹
RAG는 모델이 모르는 지식을 검색으로 보강하는 아키텍처입니다. 지식 주입이 필요한 상황에서는 파인튜닝보다 RAG가 먼저입니다. 파이프라인은 크게 네 단계입니다.
1) 청킹. 문서를 검색 단위로 자릅니다. 고정 길이보다 문단, 제목 같은 구조 경계를 존중하는 재귀 분할이 기본값입니다. 한 청크 300–800자, 오버랩 10–15 퍼센트에서 시작해 평가로 조정합니다. 표와 코드는 따로 취급해야 합니다.
2) 임베딩. 텍스트를 벡터로 바꿉니다. 한국어, 일본어가 섞인 서비스라면 다국어 성능이 검증된 모델을 골라야 합니다. 차원 수는 저장 비용과 직결되므로 무조건 큰 모델이 답이 아닙니다.
3) 하이브리드 검색. 벡터 검색은 의미를 잡지만 고유명사, 오류 코드, 제품명 같은 정확 일치에 약합니다. BM25 키워드 검색과 결합하고 RRF로 순위를 융합하는 것이 표준입니다.
4) 리랭킹. 넓게 가져온 후보를 크로스 인코더로 다시 정렬합니다. 비용이 들지만 상위 정밀도를 가장 확실하게 올리는 단계입니다.
네 단계를 압축한 파이프라인 예제입니다.
# pip install sentence-transformers rank-bm25 numpy
import numpy as np
from rank_bm25 import BM25Okapi
from sentence_transformers import CrossEncoder, SentenceTransformer
embedder = SentenceTransformer("BAAI/bge-m3") # multilingual dense embeddings
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3") # cross-encoder reranker
def chunk(text: str, size: int = 500, overlap: int = 80) -> list[str]:
chunks, start = [], 0
while start < len(text):
chunks.append(text[start : start + size])
start += size - overlap
return chunks
docs = chunk(open("handbook.txt").read())
doc_vecs = embedder.encode(docs, normalize_embeddings=True)
bm25 = BM25Okapi([d.split() for d in docs])
def retrieve(query: str, k: int = 5) -> list[str]:
# 1) dense: cosine similarity on normalized vectors
q = embedder.encode([query], normalize_embeddings=True)[0]
dense_rank = np.argsort(-(doc_vecs @ q))
# 2) sparse: BM25 keyword scores
sparse_rank = np.argsort(-np.array(bm25.get_scores(query.split())))
# 3) hybrid: reciprocal rank fusion (RRF)
rrf = np.zeros(len(docs))
for rank, idx in enumerate(dense_rank):
rrf[idx] += 1.0 / (60 + rank)
for rank, idx in enumerate(sparse_rank):
rrf[idx] += 1.0 / (60 + rank)
candidates = np.argsort(-rrf)[: k * 4] # wide candidate pool
# 4) rerank candidates with the cross-encoder, keep top-k
scores = reranker.predict([(query, docs[i]) for i in candidates])
return [docs[candidates[i]] for i in np.argsort(-scores)[:k]]
여기에 쿼리 재작성, 부모 문서 검색, 메타데이터 필터 같은 기법이 얹힙니다. 하지만 어떤 고급 기법이든 다음 섹션의 평가 없이는 효과를 알 수 없습니다.
RAG는 평가가 절반이다 — recall@k와 MRR
RAG 개선의 출발점은 항상 측정입니다. 검색과 생성을 분리해서 평가합니다.
검색 평가. 질문마다 정답 문서를 표시한 골든셋을 만들고, recall@k와 MRR을 봅니다. recall@5가 낮으면 리랭커나 프롬프트를 손보기 전에 청킹과 검색부터 고쳐야 합니다. 정답 문서가 아예 후보에 없으면 그 뒤 단계는 전부 헛수고이기 때문입니다.
생성 평가. 검색이 맞아도 답이 틀릴 수 있습니다. 답변이 검색 결과에 근거하는지(충실성), 질문에 실제로 답하는지(관련성)를 LLM 판정으로 측정합니다. Ragas 같은 라이브러리가 이 지표들을 제공합니다.
검색 평가는 라이브러리 없이도 몇 줄이면 됩니다.
def recall_at_k(retrieved: list[str], relevant: set[str], k: int = 5) -> float:
return len(set(retrieved[:k]) & relevant) / len(relevant)
def mrr(retrieved: list[str], relevant: set[str]) -> float:
for rank, doc_id in enumerate(retrieved, start=1):
if doc_id in relevant:
return 1.0 / rank
return 0.0
golden_set = [
{"query": "How many vacation days do new hires get?",
"relevant_ids": {"policy-041", "policy-007"}},
# ... 50-200 more cases, curated from real user queries
]
scores = []
for case in golden_set:
retrieved_ids = [doc_id for doc_id, _ in retrieve_with_ids(case["query"], k=10)]
scores.append({
"recall@5": recall_at_k(retrieved_ids, case["relevant_ids"], k=5),
"mrr": mrr(retrieved_ids, case["relevant_ids"]),
})
avg = {metric: sum(s[metric] for s in scores) / len(scores) for metric in scores[0]}
print(avg) # e.g. recall@5 = 0.87, mrr = 0.79
골든셋 50–200개면 충분히 방향을 잡을 수 있습니다. 실제 사용자 질문에서 뽑는 것이 핵심입니다. 만들어 낸 질문은 실제 분포와 다릅니다.
스킬 5 — 에이전트 구축: 툴 콜링 루프에서 MCP까지
에이전트는 LLM이 루프 안에서 도구를 선택하고, 결과를 보고, 다음 행동을 결정하는 시스템입니다. 뼈대는 놀랄 만큼 단순합니다.
import anthropic
client = anthropic.Anthropic()
tools = [{
"name": "search_orders",
"description": "Search the order database by customer email.",
"input_schema": {
"type": "object",
"properties": {"email": {"type": "string"}},
"required": ["email"],
},
}]
def run_agent(user_input: str) -> str:
messages = [{"role": "user", "content": user_input}]
while True:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
tools=tools,
messages=messages,
)
if response.stop_reason != "tool_use":
return next(b.text for b in response.content if b.type == "text")
messages.append({"role": "assistant", "content": response.content})
results = []
for block in response.content:
if block.type == "tool_use":
output = execute_tool(block.name, block.input) # your implementation
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
})
messages.append({"role": "user", "content": results})
실무 감각은 루프 바깥에 있습니다.
- 워크플로 vs 에이전트. 순서가 정해진 작업은 코드로 오케스트레이션하는 워크플로가 낫습니다. 경로를 미리 알 수 없는 열린 문제에만 에이전트를 씁니다. 단순한 쪽이 이기는 경우가 대부분입니다.
- 툴 설계가 절반. 좋은 설명, 명확한 스키마, 언제 쓰는지에 대한 지침. 도구가 많을수록 모델은 흔들리므로 도구 수는 최소로 유지합니다.
- 가드레일. 되돌리기 어려운 행동은 사람 승인을 거치게 하고, 최대 반복 횟수와 예산 상한을 겁니다.
- MCP. Model Context Protocol은 도구 연결의 USB-C 같은 규격입니다. 한 번 만든 MCP 서버는 여러 클라이언트에서 재사용됩니다. 2026년 기준 에이전트 생태계의 공용어가 됐습니다.
스킬 6 — 파인튜닝 기초: LoRA, QLoRA, DPO
파인튜닝의 첫 질문은 방법이 아니라 여부입니다.
해야 할 때 — 출력 스타일과 형식을 고정하고 싶을 때, 도메인 어휘가 특수할 때, 큰 모델의 동작을 작은 모델에 증류해 비용과 지연을 줄이고 싶을 때.
하지 말아야 할 때 — 지식을 주입하고 싶을 때. 새 정보는 RAG가 답입니다. 파인튜닝으로 지식을 넣으면 갱신할 때마다 재학습해야 하고 환각도 잘 억제되지 않습니다.
핵심 기법 세 가지는 다음과 같습니다.
- LoRA — 원본 가중치를 얼리고 저랭크 어댑터 행렬만 학습합니다. 학습 파라미터가 수십 분의 1로 줄어 단일 GPU로도 가능해집니다.
- QLoRA — 베이스 모델을 4비트로 양자화한 채 LoRA를 학습합니다. 소비자용 GPU에서 7–8B 모델을 튜닝할 수 있게 만든 기법입니다.
- DPO — 좋은 답과 나쁜 답 쌍으로 선호를 직접 최적화합니다. 보상 모델과 강화학습이 필요한 RLHF보다 훨씬 단순해 정렬 학습의 실무 기본값이 됐습니다.
Hugging Face TRL과 PEFT 조합의 전형적인 설정입니다.
# pip install torch transformers peft trl bitsandbytes datasets
import torch
from datasets import load_dataset
from peft import LoraConfig
from transformers import BitsAndBytesConfig
from trl import SFTConfig, SFTTrainer
lora_config = LoraConfig(
r=16, # rank: 8-64 is the usual range
lora_alpha=32, # commonly set to 2x rank
lora_dropout=0.05,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
task_type="CAUSAL_LM",
)
bnb_config = BitsAndBytesConfig( # QLoRA: 4-bit quantized base weights
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
trainer = SFTTrainer(
model="Qwen/Qwen3-8B",
train_dataset=load_dataset("json", data_files="train.jsonl", split="train"),
peft_config=lora_config,
args=SFTConfig(
output_dir="checkpoints",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=2e-4,
num_train_epochs=2,
model_init_kwargs={"quantization_config": bnb_config},
),
)
trainer.train()
반드시 지킬 것 하나. 튜닝 전후를 같은 평가 셋으로 비교하고, 일반 능력이 무너지지 않았는지도 확인해야 합니다. 평가 없는 파인튜닝은 도박입니다.
스킬 7 — 서빙: vLLM과 TGI
오픈 모델을 직접 운영해야 하는 순간이 옵니다. 데이터가 외부로 나갈 수 없거나, 토큰량이 많아 API 비용이 역전되거나, 파인튜닝한 모델을 배포해야 할 때입니다.
핵심 지표부터 정리합니다.
- TTFT — 첫 토큰까지의 시간. 체감 반응성을 좌우합니다.
- TPOT — 토큰당 생성 시간. 출력 속도입니다.
- 처리량 — 초당 처리 토큰 수. GPU 비용 효율을 결정합니다.
vLLM이 사실상의 표준입니다. PagedAttention으로 KV 캐시 메모리를 페이지 단위로 관리해 낭비를 없애고, 연속 배칭으로 GPU를 놀리지 않습니다. OpenAI 호환 API를 제공해 클라이언트 교체도 쉽습니다. TGI는 Hugging Face 생태계와의 통합이 강점이고, SGLang은 구조화 출력과 프리픽스 캐시 활용에 강합니다. 로컬 개발과 프로토타입에는 Ollama가 편합니다.
pip install vllm
# OpenAI-compatible server with continuous batching + PagedAttention
vllm serve Qwen/Qwen3-8B \
--max-model-len 16384 \
--gpu-memory-utilization 0.90 \
--enable-prefix-caching
# smoke test
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "Qwen/Qwen3-8B", "messages": [{"role": "user", "content": "Hello"}]}'
양자화(AWQ, GPTQ, FP8)로 메모리와 처리량을 조정하는 감각, 그리고 벤치마크를 직접 돌려 지연-처리량 곡선을 그려 보는 경험까지 갖추면 서빙 역량으로는 충분한 출발점입니다.
Evals 중심 개발 — LLM-as-Judge와 골든 데이터셋
2026년의 AI Engineer를 가르는 단 하나의 역량을 꼽으라면 평가입니다. 뛰어난 팀들의 공통점은 화려한 아키텍처가 아니라 촘촘한 평가 루프입니다.
작동하는 평가 체계는 세 층으로 구성됩니다.
1층 — 프로그램적 검사. 코드로 판정 가능한 것들. JSON 파싱 성공 여부, 필수 필드 존재, 금지 표현, 길이 제한. 싸고 빠르므로 전수 적용합니다.
2층 — LLM-as-Judge. 정확성, 어조, 유용성처럼 코드로 못 재는 품질을 모델이 루브릭 기준으로 채점합니다. 주의할 편향이 있습니다. 쌍대 비교에서 앞 응답을 선호하는 위치 편향, 자기 출력을 선호하는 자기 선호 편향. 순서를 뒤집어 두 번 묻고, 사람 라벨과의 일치율로 판정자 자체를 캘리브레이션해야 합니다.
3층 — 사람 검토. 판정자의 기준을 만들고 검증하는 최종 심급입니다. 에러 분석, 즉 실패 사례를 직접 읽고 분류하는 일은 아무리 자동화가 발달해도 사라지지 않습니다.
이 셋을 CI에 묶으면 회귀 게이트가 됩니다. 프롬프트나 모델을 바꿀 때마다 골든셋 점수가 기준선 아래로 내려가면 배포를 막는 것입니다.
import json
import anthropic
client = anthropic.Anthropic()
JUDGE_PROMPT = """You are grading an AI assistant's answer.
Question: {question}
Reference answer: {reference}
Assistant answer: {answer}
Score 1-5 for factual accuracy against the reference.
Reply with JSON only: {{"score": <int>, "reason": "<one sentence>"}}"""
def judge(question: str, reference: str, answer: str) -> dict:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=256,
messages=[{"role": "user", "content": JUDGE_PROMPT.format(
question=question, reference=reference, answer=answer)}],
)
text = next(b.text for b in response.content if b.type == "text")
return json.loads(text)
def test_no_regression():
golden = [json.loads(line) for line in open("golden.jsonl")]
scores = []
for case in golden:
answer = my_rag_app(case["question"]) # system under test
scores.append(judge(case["question"], case["reference"], answer)["score"])
mean_score = sum(scores) / len(scores)
print(f"mean judge score: {mean_score:.2f}")
assert mean_score >= 4.2, "quality regression: below release threshold"
golden.jsonl은 실제 사용자 질문에서 출발해 꾸준히 늘려 갑니다. 프로덕션에서 실패한 사례가 발견될 때마다 골든셋에 추가하는 습관이 시스템을 복리로 개선합니다.
프레임워크 지형 — LangChain, LlamaIndex, DSPy, PydanticAI
프레임워크 선택은 소모적인 논쟁거리지만, 2026년 기준 실무 지형은 비교적 선명합니다.
| 프레임워크 | 강점 | 이런 경우에 |
|---|---|---|
| LangChain / LangGraph | 방대한 통합, 그래프 기반 상태 오케스트레이션 | 복잡한 멀티 스텝 워크플로, 체크포인트가 필요한 에이전트 |
| LlamaIndex | 문서 인제스트와 인덱싱 추상화가 성숙 | 데이터 소스가 많은 RAG 중심 서비스 |
| DSPy | 프롬프트를 선언하고 최적화기로 컴파일 | 평가 셋이 있고 프롬프트 튜닝을 자동화하고 싶을 때 |
| PydanticAI | 타입 안전, 얇은 추상화, 테스트 친화 | 견고한 프로덕션 에이전트를 가볍게 만들고 싶을 때 |
그리고 다섯 번째 선택지가 가장 중요합니다. 프레임워크 없이 SDK로 직접 쓰기. 학습 단계에서는 이쪽을 강하게 권합니다. 툴 콜링 루프를 직접 짜 본 사람은 프레임워크가 무엇을 감춰 주는지 알고, 문제가 생겼을 때 어디를 파야 하는지 압니다.
실무 조언은 세 가지입니다. 추상화가 얇은 도구를 고르고, 오케스트레이션과 LLM 호출을 분리해 교체 가능하게 유지하고, 프레임워크의 유행보다 자기 평가 셋의 점수를 믿으세요.
벡터 DB 선택 가이드
벡터 DB 선택도 과대평가된 고민입니다. 문서 수백만 건 이하라면 대부분의 선택지가 충분히 빠릅니다. 기준은 성능보다 운영입니다.
| 선택지 | 성격 | 이런 경우에 |
|---|---|---|
| pgvector | Postgres 확장 | 이미 Postgres를 쓰는 팀의 기본값. 트랜잭션, 조인과 한솥밥 |
| Qdrant | 오픈소스 전용 엔진 | 메타데이터 필터가 무겁고 성능이 중요할 때 |
| Weaviate | 하이브리드 내장 | 키워드+벡터 결합 검색을 빠르게 세우고 싶을 때 |
| Milvus | 분산 아키텍처 | 수억 벡터 이상 대규모 |
| Pinecone | 완전 관리형 | 운영 인력 없이 확장이 필요할 때 |
| Chroma / LanceDB | 경량, 임베디드 | 프로토타입, 로컬 개발, 소규모 앱 |
체크리스트는 다섯 개입니다. 규모(현실적 상한), 필터링(권한, 날짜, 카테고리 조건 검색이 얼마나 복잡한가), 하이브리드 지원, 운영 부담(관리형 여부), 비용 구조.
한 가지 함정만 조심하면 됩니다. 권한 필터링을 나중에 붙이려면 아프기 때문에, 사내 문서 RAG라면 문서 접근 권한 메타데이터를 처음부터 스키마에 넣어야 합니다.
비용 최적화 — 캐싱, 모델 라우팅, 배치
AI 기능이 성공할수록 청구서가 문제가 됩니다. 2026년의 AI Engineer 면접에서 비용 질문이 빠지지 않는 이유입니다. 효과 순으로 정리합니다.
- 프롬프트 캐싱. 시스템 프롬프트, 문서, few-shot처럼 반복되는 접두부를 캐시하면 캐시된 부분의 입력 비용이 약 10분의 1로 떨어집니다. 안정된 내용을 앞에, 매번 바뀌는 내용을 뒤에 두는 프롬프트 구조 설계가 전제 조건입니다.
- 모델 라우팅. 모든 요청에 최상위 모델을 쓸 이유가 없습니다. 저렴한 모델이 요청 난이도를 분류하고, 어려운 것만 상위 모델로 보냅니다.
- 배치 API. 실시간이 필요 없는 대량 작업은 배치 엔드포인트로 보내면 통상 절반 가격입니다.
- 프롬프트 다이어트. 출력 토큰은 입력보다 몇 배 비쌉니다. 불필요한 장황한 출력을 줄이는 지시 하나가 의외로 큰 절감이 됩니다.
- 셀프호스팅 손익분기. 토큰량이 일정 수준을 넘으면 오픈 모델 자체 서빙이 싸집니다. GPU 비용, 운영 인건비까지 넣고 계산해야 정직한 비교입니다.
캐싱과 라우팅을 한 번에 보여 주는 예제입니다.
import anthropic
client = anthropic.Anthropic()
ROUTER_SYSTEM = "Classify the request. Reply with exactly one word: simple or complex."
def route_model(user_input: str) -> str:
# step 1: a small, cheap model decides the tier
verdict = client.messages.create(
model="claude-haiku-4-5",
max_tokens=8,
system=ROUTER_SYSTEM,
messages=[{"role": "user", "content": user_input}],
)
label = next(b.text for b in verdict.content if b.type == "text").strip().lower()
return "claude-haiku-4-5" if label == "simple" else "claude-opus-4-8"
def answer(user_input: str, knowledge_base: str) -> str:
response = client.messages.create(
model=route_model(user_input),
max_tokens=2048,
system=[{
"type": "text",
"text": knowledge_base, # large, stable context
"cache_control": {"type": "ephemeral"}, # cached reads cost ~10%
}],
messages=[{"role": "user", "content": user_input}],
)
return next(b.text for b in response.content if b.type == "text")
비용 최적화의 전제도 결국 평가입니다. 라우팅으로 품질이 떨어지지 않는다는 것을 골든셋으로 증명할 수 있어야 안심하고 절감할 수 있습니다.
관측성 — LangSmith, Langfuse, Braintrust
LLM 시스템은 전통적인 APM만으로 디버깅이 안 됩니다. 응답이 이상할 때 어느 검색 결과가 들어갔고, 프롬프트가 정확히 어떻게 렌더링됐고, 몇 토큰을 썼는지를 추적할 수 있어야 합니다.
기본 개념은 트레이싱입니다. 하나의 요청을 트레이스로, 그 안의 검색, 리랭킹, LLM 호출, 툴 실행을 스팬으로 기록합니다. 여기에 토큰 사용량, 비용, 지연, 사용자 피드백을 붙입니다.
| 도구 | 성격 | 비고 |
|---|---|---|
| LangSmith | LangChain 팀의 관리형 서비스 | LangChain 사용 시 통합이 가장 매끄러움 |
| Langfuse | 오픈소스, 셀프호스트 가능 | 데이터 주권이 중요한 팀의 기본값. 프롬프트 관리 포함 |
| Braintrust | 평가 중심 플랫폼 | 평가 실험과 로그를 한곳에서 관리 |
OpenTelemetry의 GenAI 시맨틱 컨벤션이 자리 잡으면서, 표준 계측으로 수집하고 백엔드를 갈아 끼우는 구성도 흔해졌습니다.
실무 팁 세 가지. 첫날부터 붙이세요, 나중에 붙이는 관측성은 없는 것과 같습니다. 프로덕션 로그에서 실패 사례를 골라 골든셋으로 승격시키는 파이프라인을 만드세요. 그리고 사용자 피드백 버튼(좋아요, 싫어요)을 트레이스에 연결하면 가장 싼 라벨링 파이프라인이 됩니다.
포트폴리오 프로젝트 5가지
채용 담당자가 보고 싶은 것은 튜토리얼 복제가 아니라 판단의 흔적입니다. 실제로 구현 가능하고 차별화되는 다섯 가지입니다.
1) 도메인 특화 RAG 챗봇. 자신이 잘 아는 도메인의 문서로 만듭니다. 하이브리드 검색, 리랭킹, 출처 인용까지 넣고, 무엇보다 recall@5와 충실성 수치를 README에 씁니다. 배포까지 하면 완성입니다.
2) 에이전트 자동화. GitHub 이슈 트리아지, 주간 리포트 생성처럼 자신이 실제로 반복하는 일을 자동화합니다. 툴 콜링, 실패 복구, 사람 승인 게이트를 갖추고 성공률을 측정합니다.
3) 평가 하네스. 공개 태스크 하나를 골라 골든셋, 프로그램적 검사, LLM 판정, CI 회귀 게이트를 갖춘 평가 시스템을 만듭니다. 판정자와 사람 라벨의 일치율까지 보고하면 상위 몇 퍼센트의 포트폴리오가 됩니다.
4) 파인튜닝 프로젝트. 작은 오픈 모델을 QLoRA로 특정 작업(구조화 추출, 도메인 요약)에 튜닝합니다. 베이스라인 대비 전후 평가, 학습 비용, vLLM 배포까지 기록합니다.
5) MCP 서버. 잘 아는 API나 도구를 MCP 서버로 감싸 공개합니다. 에이전트 생태계 이해를 증명하는 가장 시의성 있는 방법입니다.
공통 원칙은 하나입니다. 다섯 개를 얕게 하지 말고 두세 개를 깊게 하세요. 각 저장소의 README에 지표, 아키텍처 결정과 트레이드오프, 실패에서 배운 것을 쓰는 순간 프로젝트가 이력서가 됩니다.
채용 시장 2026 — 한국
한국 시장은 크게 세 층으로 나뉩니다.
모델을 만드는 곳. 네이버(HyperCLOVA X), LG AI연구원(EXAONE), SKT(A.X), 카카오(Kanana), 그리고 Solar 시리즈의 업스테이지. 이 층의 리서치 포지션은 논문 실적을 요구하는 경우가 많지만, 같은 조직 안에 모델을 서비스로 만드는 AI Engineer 포지션이 함께 늘고 있습니다.
AI를 제품에 싣는 곳. 토스, 쿠팡, 당근, 배달의민족 같은 서비스 기업들. 검색, 추천, 고객 상담, 내부 생산성 도구에 LLM을 접목하는 포지션이 꾸준히 열립니다. 이 층이 채용 볼륨으로는 가장 큽니다.
AI 네이티브 스타트업. 뤼튼, 리턴제로를 비롯해 특정 도메인(법률, 의료, 교육, 커머스)에 AI를 파는 회사들. 손이 빠르고 풀스택에 가까운 사람을 선호합니다.
연봉은 공개 공고와 연봉 정보 사이트 기준의 대략적인 범위로, 주니어 5,000만–8,000만 원, 경력 3–7년 8,000만–1억 5,000만 원, 시니어와 리드는 1억 5,000만 원 이상에 스톡이 얹히는 구조가 일반적입니다. 대기업 AI 조직과 상위 스타트업은 이 범위를 상회하기도 합니다.
한국 시장의 특징 하나. 코딩 테스트 문화가 여전히 강해서, LLM 역량과 별개로 알고리즘 준비가 필요합니다. 그리고 사내 문서 RAG, 상담 자동화처럼 실무 과제와 직결된 프로젝트 경험이 면접에서 가장 잘 통합니다.
채용 시장 2026 — 일본과 글로벌
일본. 자국어 모델 생태계가 뚜렷합니다. Preferred Networks(PLaMo), 소프트뱅크 산하 SB Intuitions(Sarashina), 그리고 진화적 모델 병합으로 주목받은 도쿄의 Sakana AI가 대표적인 모델 개발 조직입니다. ELYZA, rinna, Stockmark가 그 뒤를 잇고, CyberAgent, LINEヤフー, 메루카리 같은 서비스 기업이 응용 포지션을 냅니다. 연봉은 대략 600만–1,200만 엔 범위가 일반적이고, 외국계와 Sakana AI 같은 글로벌 보상 체계의 조직은 그 이상을 제시합니다. 일본어 능력이 있다면 경쟁이 상대적으로 덜한 틈새이기도 합니다.
글로벌. 미국 빅테크와 AI 랩의 시니어 총보상은 공개 데이터 기준 USD 300K–500K 이상까지 형성돼 있고, 일반적인 AI Engineer 포지션은 USD 150K–300K 범위가 흔합니다. levels.fyi 같은 사이트에서 최신 수치를 확인하는 편이 정확합니다. 원격 포지션은 팬데믹 직후보다 줄었지만, 유럽과 아시아를 대상으로 한 원격 채용은 여전히 존재합니다.
글로벌 지원에서 결정적인 것은 영어로 된 증거물입니다. 영어 README, 기술 블로그, 오픈소스 기여가 곧 통화입니다. 그리고 어느 시장이든 두 가지 조합 — 프로덕션 소프트웨어 경험과 LLM 시스템 경험 — 을 갖춘 사람이 가장 희소합니다.
인터뷰 대비 — 시스템 디자인, 코딩, ML 기초
AI Engineer 인터뷰는 대략 네 종류의 라운드로 구성됩니다.
시스템 디자인. 가장 흔한 문제는 이것입니다. "사내 문서 100만 건에 대한 Q&A 시스템을 설계하라." 좋은 답변의 뼈대는 다음 순서입니다.
- 요구 명확화 — 사용자 수, 지연 목표, 문서 갱신 주기, 접근 권한 존재 여부
- 인제스트 파이프라인 — 파싱, 청킹 전략, 임베딩, 인덱스 갱신
- 검색 — 하이브리드, 권한 필터, 리랭킹
- 생성 — 프롬프트 구성, 출처 인용, 환각 억제
- 평가 — 골든셋, recall@k, 충실성, 회귀 게이트
- 운영 — 비용 추정, 캐싱, 관측성, 실패 모드
권한 필터링과 평가를 먼저 입에 올리는 지원자는 드물고, 그래서 돋보입니다.
코딩. LeetCode 미디엄 수준의 알고리즘에 더해, 실무형 문제가 늘었습니다. 스트리밍 응답 파싱, 재시도 로직 구현, 간단한 검색 파이프라인 조립 같은 것들입니다.
ML 기초. 트랜스포머와 어텐션의 큰 그림, 토크나이저, temperature와 샘플링, 임베딩과 코사인 유사도, LoRA가 왜 파라미터 효율적인지, 환각의 원인과 완화. 수식 유도까지는 아니어도 개념의 인과를 설명할 수 있어야 합니다.
행동 면접. 포트폴리오 딥다이브에 대비해, 각 프로젝트의 결정과 트레이드오프, 실패와 배움을 3분 안에 말하는 연습을 해 두세요.
학습 자료 — 강의, 책, 뉴스레터
전부 볼 필요는 없습니다. 각 층에서 하나씩 고르면 충분합니다.
기초 이해. Andrej Karpathy의 Neural Networks: Zero to Hero 영상 시리즈는 트랜스포머를 코드로 이해하는 최고의 지름길입니다. Hugging Face의 무료 코스(LLM, 에이전트)도 탄탄합니다.
실무 기술. DeepLearning.AI의 단기 강좌들이 RAG, 에이전트, 평가를 주제별로 다룹니다. 평가에 관해서는 Hamel Husain과 Shreya Shankar의 AI Evals 강의가 실무자들 사이에서 표준처럼 통합니다.
책. Chip Huyen의 AI Engineering(2025)이 이 직무의 교과서 위치에 있습니다. Sebastian Raschka의 Build a Large Language Model from Scratch는 내부 원리를, Jay Alammar와 Maarten Grootendorst의 Hands-On Large Language Models는 응용 전반을 다룹니다.
흐름 따라가기. Latent Space(swyx의 팟캐스트와 뉴스레터), Simon Willison의 블로그, Interconnects, Sebastian Raschka의 Ahead of AI 정도를 구독하면 소음 대비 신호가 좋습니다.
커뮤니티. AI Engineer World's Fair 발표 영상들은 실무 사례의 보고입니다. 발표 자료만 훑어도 업계의 현재 관심사가 보입니다.
커리어 전환 경로 — 백엔드에서, 데이터 사이언스에서
이 직무의 좋은 소식은 완전한 신입보다 인접 직군 전환자에게 유리하다는 점입니다.
백엔드 엔지니어에서. 가장 흔하고 가장 빠른 경로입니다. API 설계, 데이터베이스, 배포, 신뢰성 감각이 그대로 자산이 됩니다. 보완할 것은 모델 감각입니다. LLM API 심화, RAG, 평가를 3개월 정도 집중하고, 지금 다니는 회사에서 AI 기능 하나를 자원해서 맡는 것이 최고의 전환 전략입니다. 사내 전환은 이력서 전환보다 열 배 쉽습니다.
데이터 사이언티스트에서. 실험 설계와 평가 마인드라는 최대 무기를 이미 갖고 있습니다. 평가 중심 개발 섹션의 내용이 여러분에게는 자연스러울 것입니다. 보완할 것은 프로덕션 엔지니어링입니다. 노트북에서 서비스로 — API 서버, 컨테이너, CI, 관측성을 갖춘 프로젝트를 만들어 배포 경험을 증명하세요.
프론트엔드에서. AI 프로덕트 엔지니어라는 유효한 경로가 있습니다. 스트리밍 UI, 챗 인터페이스, 낙관적 업데이트 같은 AI 특유의 UX를 잘 만드는 사람은 드뭅니다. TypeScript 기반 AI SDK로 시작해 백엔드 쪽으로 확장하면 됩니다.
MLOps에서. LLMOps로의 자연 확장입니다. 모델 서빙, GPU 인프라, 파이프라인 경험 위에 평가와 프롬프트 관리를 얹으면 됩니다.
공통 조언 하나. 전환의 증거는 수료증이 아니라 배포된 프로젝트와 그 지표입니다.
마치며 — 6개월 로드맵
지금까지의 내용을 실행 가능한 순서로 압축합니다.
- 1개월 차 — Python 정비, LLM API 심화. 구조화 출력, 스트리밍, 툴 콜링, 에러 처리를 손에 익히고 작은 CLI 도구를 만듭니다.
- 2개월 차 — RAG. 청킹부터 리랭킹까지 직접 구현하고, 골든셋 50개로 recall@5를 측정하며 개선 루프를 돕니다. 포트폴리오 1호 완성.
- 3개월 차 — 에이전트. 툴 콜링 루프를 프레임워크 없이 짜 보고, 실제 반복 업무 하나를 자동화합니다. MCP 서버도 하나 만들어 공개합니다.
- 4개월 차 — 평가 심화. LLM-as-Judge 하네스를 만들고 CI에 회귀 게이트를 겁니다. 기존 프로젝트 두 개에 평가 리포트를 추가합니다.
- 5개월 차 — 파인튜닝과 서빙. QLoRA로 소형 모델을 하나 튜닝하고 vLLM로 서빙해 전후 지표를 기록합니다.
- 6개월 차 — 마감과 지원. README 정리, 기술 블로그 2–3편, 인터뷰 준비(시스템 디자인 모의 연습), 지원 시작.
마지막으로 이것만 기억하세요. 2026년의 AI Engineer를 차별화하는 것은 최신 모델 소식을 많이 아는 것이 아니라, 측정하고 개선하는 루프를 만들 줄 아는 것입니다. 모델은 계속 바뀝니다. 평가 위에 세운 시스템과 그 시스템을 만든 경험은 바뀌지 않습니다.
References
- swyx, "The Rise of the AI Engineer" — https://www.latent.space/p/ai-engineer
- Lewis, P. et al. "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" (2020) — https://arxiv.org/abs/2005.11401
- Hu, E. et al. "LoRA: Low-Rank Adaptation of Large Language Models" (2021) — https://arxiv.org/abs/2106.09685
- Dettmers, T. et al. "QLoRA: Efficient Finetuning of Quantized LLMs" (2023) — https://arxiv.org/abs/2305.14314
- Rafailov, R. et al. "Direct Preference Optimization" (2023) — https://arxiv.org/abs/2305.18290
- Kwon, W. et al. "Efficient Memory Management for LLM Serving with PagedAttention" (vLLM, 2023) — https://arxiv.org/abs/2309.06180
- Zheng, L. et al. "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena" (2023) — https://arxiv.org/abs/2306.05685
- Anthropic, "Building Effective Agents" — https://www.anthropic.com/research/building-effective-agents
- Hamel Husain, "Your AI Product Needs Evals" — https://hamel.dev/blog/posts/evals/
- Eugene Yan, "Patterns for Building LLM-based Systems and Products" — https://eugeneyan.com/writing/llm-patterns/
- Chip Huyen, AI Engineering (O'Reilly, 2025) — https://huyenchip.com/books/
- LangChain Documentation — https://python.langchain.com/
- LlamaIndex Documentation — https://docs.llamaindex.ai/
- DSPy — https://dspy.ai/
- PydanticAI — https://ai.pydantic.dev/
- vLLM Documentation — https://docs.vllm.ai/
- Hugging Face PEFT Documentation — https://huggingface.co/docs/peft
- Ragas Documentation — https://docs.ragas.io/
- Langfuse Documentation — https://langfuse.com/docs
- Model Context Protocol — https://modelcontextprotocol.io/
- Simon Willison's Weblog — https://simonwillison.net/
How to Become an AI Engineer in 2026 — LLMs, RAG, Agents, Evals, and a Career Roadmap
- Introduction — Why AI Engineer, Why 2026
- What Is an AI Engineer — vs ML Engineer and Data Scientist
- From 2023 to 2026 — How the Role Evolved
- Skill 1 — Languages: Python and TypeScript
- Skill 2 — Using LLM APIs Properly
- Skill 3 — Prompt Engineering as Engineering, Not Vibes
- Skill 4 — RAG Design: Chunking, Embeddings, Hybrid Search, Reranking
- RAG Is Half Evaluation — recall@k and MRR
- Skill 5 — Building Agents: From the Tool-Calling Loop to MCP
- Skill 6 — Fine-Tuning Basics: LoRA, QLoRA, DPO
- Skill 7 — Serving: vLLM and TGI
- Evals-Driven Development — LLM-as-Judge and Golden Datasets
- The Framework Landscape — LangChain, LlamaIndex, DSPy, PydanticAI
- Choosing a Vector Database
- Cost Optimization — Caching, Model Routing, Batching
- Observability — LangSmith, Langfuse, Braintrust
- Five Portfolio Projects
- The Job Market 2026 — Korea
- The Job Market 2026 — Japan and Global
- Interview Prep — System Design, Coding, ML Fundamentals
- Learning Resources — Courses, Books, Newsletters
- Career Transition Paths — From Backend, From Data Science
- Closing — A Six-Month Roadmap
- References
Introduction — Why AI Engineer, Why 2026
If you had to name the job title that grew fastest over the last three years, AI Engineer would be a strong pick.
In 2023 the title barely existed. Today it shows up in job posts at Naver, Kakao, and Toss in Korea, at startups across Tokyo, and in nearly every Silicon Valley job board.
The core idea is simple. An AI Engineer is not someone who trains models from scratch. It is someone who builds products on top of powerful foundation models that already exist. Demand for that skill set exploded.
The entry barrier looks deceptively low. A few lines of API calls produce a demo. But a production-grade AI product is a different animal entirely. Retrieval quality, hallucination control, evaluation pipelines, cost management, observability — only with all of these does a demo become a service.
This guide is a roadmap across that gap: the role definition, seven core skills, evals-driven development, tool choices, portfolio projects, the job market, interview prep, and transition paths.
What Is an AI Engineer — vs ML Engineer and Data Scientist
Terminology first. The three roles overlap, but their centers of gravity differ.
| Role | Core question | Typical output | Representative tools |
|---|---|---|---|
| Data Scientist | What does the data say | Analyses, predictive models | SQL, pandas, statistics |
| ML Engineer | How do we train and deploy models | Training pipelines, model serving | PyTorch, Kubeflow, MLflow |
| AI Engineer | What product can foundation models power | RAG systems, agents, AI features | LLM APIs, vector DBs, eval tooling |
The person who popularized the distinction is swyx, in the June 2023 essay "The Rise of the AI Engineer." The thesis: model training concentrates in a handful of research labs, while the vast majority of engineers work on the other side of the API, turning model capability into products.
That prediction landed. AI Engineers rarely touch model weights. Their levers are prompts, retrieval, orchestration, and evaluation.
The boundary is blurring, though. In 2026, AI Engineer postings routinely list LoRA fine-tuning or vLLM serving experience as a plus. There is a growing pay gap between people who can only call APIs and people who can drop down to the model layer when needed.
From 2023 to 2026 — How the Role Evolved
Three years of this role compress into four phases.
2023 — the wrapper era. After the ChatGPT shock, everyone shipped demos. So-called GPT wrappers flooded the market with almost no differentiation.
2024 — RAG becomes standard. Retrieval-augmented generation became the default architecture for connecting company data to models. Chunking, embeddings, and reranking entered the everyday vocabulary.
2025 — agents and MCP. As tool calling stabilized, agents that pick tools inside a loop reached real production. The Model Context Protocol spread as the common standard for connecting tools.
2026 — the era of evals and reliability. The industry internalized that demos are easy and production is hard. Job posts started listing evals experience explicitly, and cost optimization and observability rose to core-skill status.
That sequence doubles as a study plan: API fluency, RAG, agents, then evaluation. The rest of this guide follows it.
Skill 1 — Languages: Python and TypeScript
The two working languages of the AI Engineer are Python and TypeScript.
Python is the default. The model, data, and evaluation ecosystems all live there. You should be comfortable standing up a FastAPI backend, validating schemas with pydantic, and handling concurrent calls with asyncio. Consistent type hints prevent a whole class of LLM-output parsing accidents.
TypeScript is the product half. Most AI features ultimately ship through a web UI. Streaming tokens into an interface and assembling chat UIs quickly with tools like the Vercel AI SDK is what makes a full-stack AI Engineer valuable.
The recommended strategy: go deep in one, stay fluent enough to read and fix the other. Backend folks anchor on Python; frontend folks anchor on TypeScript.
More important than either language is software engineering fundamentals — version control, testing, CI, logging. In an era where LLMs write much of the code, the judgment to tell good code from bad is what actually commands a salary.
Skill 2 — Using LLM APIs Properly
Working with LLM APIs is reliability engineering, not just making calls. These are the things you will handle in practice:
- Structured outputs — receive schema-guaranteed JSON instead of free text, eliminating parse failures.
- Streaming — cut time-to-first-token so the product feels fast. For long outputs, streaming is effectively mandatory.
- Tool calling — design schemas so the model can invoke functions. This is the building block of agents.
- Error handling — exponential backoff for rate limits (429) and overload (529). Know your SDK's built-in retry behavior.
- Prompt caching — cache long repeated context to cut input costs dramatically.
Here is a minimal structured-output example. Pass a Pydantic model as the schema and get a validated object back.
# pip install anthropic pydantic
import anthropic
from pydantic import BaseModel
class Ticket(BaseModel):
category: str # "billing" | "bug" | "feature_request"
urgency: int # 1 (low) - 5 (critical)
summary: str
client = anthropic.Anthropic()
def classify(text: str) -> Ticket:
response = client.messages.parse(
model="claude-opus-4-8",
max_tokens=1024,
system="You classify customer support tickets.",
messages=[{"role": "user", "content": text}],
output_format=Ticket,
)
return response.parsed_output
print(classify("I was charged twice this month. Please fix this ASAP."))
This level of robustness underpins every pipeline you will build. If you see code scraping free text with regexes, that system is still a prototype.
Skill 3 — Prompt Engineering as Engineering, Not Vibes
Prompt engineering was once a punchline. By 2026 it has settled into a clear practice built on four principles.
First, the system prompt is a spec. Write role, input format, output format, prohibitions, and edge-case handling like a document. Vague instructions produce vague outputs.
Second, examples beat adjectives. Two or three few-shot examples stabilize output quality more than ten qualifiers, especially for format compliance.
Third, leave room to reason. For complex judgments, have the model lay out its reasoning before the conclusion. Even with modern reasoning modes, a crisply defined problem statement drives most of the quality.
Fourth, prompts are code. Version them in the repo, review changes, and run regression checks against an eval set before deploying. Teams that tweak prompts ad hoc in a chat window fall further behind teams that verify with evals every month.
Know the anti-patterns too. Prompts stuffed with all-caps emphasis tend to over-trigger modern models. Newer models follow instructions more literally, so precise conditions beat loud commands.
Skill 4 — RAG Design: Chunking, Embeddings, Hybrid Search, Reranking
RAG augments the model with retrieved knowledge it was never trained on. When the problem is knowledge injection, RAG comes before fine-tuning. The pipeline has four stages.
1) Chunking. Split documents into retrieval units. Recursive splitting that respects structural boundaries — paragraphs, headings — beats fixed-length cuts. Start around 300–800 characters per chunk with 10–15 percent overlap, then tune with evals. Tables and code deserve special handling.
2) Embeddings. Turn text into vectors. If your service mixes Korean, Japanese, and English, pick a model with proven multilingual performance. Dimension count drives storage cost, so the biggest model is not automatically the right one.
3) Hybrid search. Vector search captures meaning but is weak on exact matches — product names, error codes, proper nouns. Combining it with BM25 keyword search and fusing ranks with RRF is the standard recipe.
4) Reranking. Re-order a wide candidate pool with a cross-encoder. It costs latency, but it is the most reliable way to raise top-k precision.
Here is the whole pipeline compressed into one example.
# pip install sentence-transformers rank-bm25 numpy
import numpy as np
from rank_bm25 import BM25Okapi
from sentence_transformers import CrossEncoder, SentenceTransformer
embedder = SentenceTransformer("BAAI/bge-m3") # multilingual dense embeddings
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3") # cross-encoder reranker
def chunk(text: str, size: int = 500, overlap: int = 80) -> list[str]:
chunks, start = [], 0
while start < len(text):
chunks.append(text[start : start + size])
start += size - overlap
return chunks
docs = chunk(open("handbook.txt").read())
doc_vecs = embedder.encode(docs, normalize_embeddings=True)
bm25 = BM25Okapi([d.split() for d in docs])
def retrieve(query: str, k: int = 5) -> list[str]:
# 1) dense: cosine similarity on normalized vectors
q = embedder.encode([query], normalize_embeddings=True)[0]
dense_rank = np.argsort(-(doc_vecs @ q))
# 2) sparse: BM25 keyword scores
sparse_rank = np.argsort(-np.array(bm25.get_scores(query.split())))
# 3) hybrid: reciprocal rank fusion (RRF)
rrf = np.zeros(len(docs))
for rank, idx in enumerate(dense_rank):
rrf[idx] += 1.0 / (60 + rank)
for rank, idx in enumerate(sparse_rank):
rrf[idx] += 1.0 / (60 + rank)
candidates = np.argsort(-rrf)[: k * 4] # wide candidate pool
# 4) rerank candidates with the cross-encoder, keep top-k
scores = reranker.predict([(query, docs[i]) for i in candidates])
return [docs[candidates[i]] for i in np.argsort(-scores)[:k]]
On top of this you can layer query rewriting, parent-document retrieval, and metadata filters. But no advanced technique means anything without the evaluation loop in the next section.
RAG Is Half Evaluation — recall@k and MRR
Every RAG improvement starts with measurement. Evaluate retrieval and generation separately.
Retrieval evaluation. Build a golden set that marks the correct documents for each question, then track recall@k and MRR. If recall@5 is low, fix chunking and search before touching the reranker or the prompt — if the right document never reaches the candidate pool, everything downstream is wasted effort.
Generation evaluation. Retrieval can be right while the answer is wrong. Measure whether the answer is grounded in the retrieved context (faithfulness) and whether it actually answers the question (relevancy), typically with LLM judges. Libraries like Ragas ship these metrics.
Retrieval metrics need only a few lines, no library required.
def recall_at_k(retrieved: list[str], relevant: set[str], k: int = 5) -> float:
return len(set(retrieved[:k]) & relevant) / len(relevant)
def mrr(retrieved: list[str], relevant: set[str]) -> float:
for rank, doc_id in enumerate(retrieved, start=1):
if doc_id in relevant:
return 1.0 / rank
return 0.0
golden_set = [
{"query": "How many vacation days do new hires get?",
"relevant_ids": {"policy-041", "policy-007"}},
# ... 50-200 more cases, curated from real user queries
]
scores = []
for case in golden_set:
retrieved_ids = [doc_id for doc_id, _ in retrieve_with_ids(case["query"], k=10)]
scores.append({
"recall@5": recall_at_k(retrieved_ids, case["relevant_ids"], k=5),
"mrr": mrr(retrieved_ids, case["relevant_ids"]),
})
avg = {metric: sum(s[metric] for s in scores) / len(scores) for metric in scores[0]}
print(avg) # e.g. recall@5 = 0.87, mrr = 0.79
A golden set of 50–200 cases is enough to steer by. The crucial part is sourcing it from real user questions. Invented questions do not match the real distribution.
Skill 5 — Building Agents: From the Tool-Calling Loop to MCP
An agent is a system where the LLM picks tools inside a loop, observes results, and decides the next action. The skeleton is surprisingly small.
import anthropic
client = anthropic.Anthropic()
tools = [{
"name": "search_orders",
"description": "Search the order database by customer email.",
"input_schema": {
"type": "object",
"properties": {"email": {"type": "string"}},
"required": ["email"],
},
}]
def run_agent(user_input: str) -> str:
messages = [{"role": "user", "content": user_input}]
while True:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
tools=tools,
messages=messages,
)
if response.stop_reason != "tool_use":
return next(b.text for b in response.content if b.type == "text")
messages.append({"role": "assistant", "content": response.content})
results = []
for block in response.content:
if block.type == "tool_use":
output = execute_tool(block.name, block.input) # your implementation
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
})
messages.append({"role": "user", "content": results})
The real craft lives outside the loop.
- Workflows vs agents. If the steps are known in advance, orchestrate them in code as a workflow. Reserve agents for open-ended problems where the path cannot be predetermined. The simpler design usually wins.
- Tool design is half the job. Good descriptions, tight schemas, explicit guidance on when to use each tool. More tools means more confusion, so keep the set minimal.
- Guardrails. Gate hard-to-reverse actions behind human approval, and set iteration caps and budget limits.
- MCP. The Model Context Protocol is the USB-C of tool integration: build an MCP server once and reuse it across clients. As of 2026 it is the lingua franca of the agent ecosystem.
Skill 6 — Fine-Tuning Basics: LoRA, QLoRA, DPO
The first fine-tuning question is not how but whether.
Do it when you need to lock in output style and format, when your domain vocabulary is unusual, or when you want to distill a large model's behavior into a small one to cut cost and latency.
Do not do it when you want to inject knowledge. New information belongs in RAG. Baking knowledge into weights means retraining on every update, and it does not even suppress hallucinations well.
Three techniques cover most of the ground.
- LoRA — freeze the base weights and train only low-rank adapter matrices. Trainable parameters shrink by orders of magnitude, making single-GPU training feasible.
- QLoRA — train LoRA on top of a 4-bit quantized base model. This is what made tuning 7–8B models on consumer GPUs possible.
- DPO — optimize directly on pairs of preferred and rejected answers. Far simpler than RLHF with its reward model and RL loop, and now the practical default for alignment tuning.
A typical Hugging Face TRL plus PEFT setup looks like this.
# pip install torch transformers peft trl bitsandbytes datasets
import torch
from datasets import load_dataset
from peft import LoraConfig
from transformers import BitsAndBytesConfig
from trl import SFTConfig, SFTTrainer
lora_config = LoraConfig(
r=16, # rank: 8-64 is the usual range
lora_alpha=32, # commonly set to 2x rank
lora_dropout=0.05,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
task_type="CAUSAL_LM",
)
bnb_config = BitsAndBytesConfig( # QLoRA: 4-bit quantized base weights
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
)
trainer = SFTTrainer(
model="Qwen/Qwen3-8B",
train_dataset=load_dataset("json", data_files="train.jsonl", split="train"),
peft_config=lora_config,
args=SFTConfig(
output_dir="checkpoints",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=2e-4,
num_train_epochs=2,
model_init_kwargs={"quantization_config": bnb_config},
),
)
trainer.train()
One non-negotiable: compare before and after on the same eval set, and check that general capabilities did not collapse. Fine-tuning without evals is gambling.
Skill 7 — Serving: vLLM and TGI
Sooner or later you will need to run open models yourself — because data cannot leave your infrastructure, because token volume makes API pricing uneconomical, or because you have a fine-tuned model to deploy.
The key metrics first:
- TTFT — time to first token; drives perceived responsiveness.
- TPOT — time per output token; the generation speed.
- Throughput — tokens per second across requests; determines GPU cost efficiency.
vLLM is the de facto standard. PagedAttention manages KV-cache memory in pages to eliminate waste, and continuous batching keeps the GPU busy. It exposes an OpenAI-compatible API, so swapping clients is trivial. TGI integrates tightly with the Hugging Face ecosystem, SGLang shines at structured output and prefix-cache-heavy workloads, and Ollama is the comfortable choice for local development.
pip install vllm
# OpenAI-compatible server with continuous batching + PagedAttention
vllm serve Qwen/Qwen3-8B \
--max-model-len 16384 \
--gpu-memory-utilization 0.90 \
--enable-prefix-caching
# smoke test
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "Qwen/Qwen3-8B", "messages": [{"role": "user", "content": "Hello"}]}'
Add a feel for quantization (AWQ, GPTQ, FP8) as a memory-throughput dial, plus the experience of running your own benchmark to plot the latency-throughput curve, and you have a solid serving foundation.
Evals-Driven Development — LLM-as-Judge and Golden Datasets
If one skill separates AI Engineers in 2026, it is evaluation. What strong teams share is not exotic architecture but a tight evaluation loop.
A working eval stack has three layers.
Layer 1 — programmatic checks. Everything code can verify: JSON parses, required fields exist, banned phrases absent, length limits respected. Cheap and fast, so run them on everything.
Layer 2 — LLM-as-judge. A model scores qualities code cannot measure — accuracy, tone, helpfulness — against a rubric. Watch for its biases: position bias in pairwise comparisons (favoring the first answer) and self-preference bias (favoring its own outputs). Ask twice with the order swapped, and calibrate the judge against human labels.
Layer 3 — human review. The court of final appeal that defines and validates the judge's standards. Error analysis — actually reading and categorizing failures — never goes away, no matter how automated the rest becomes.
Wire the three layers into CI and you get a regression gate: any prompt or model change that drops the golden-set score below the baseline blocks the release.
import json
import anthropic
client = anthropic.Anthropic()
JUDGE_PROMPT = """You are grading an AI assistant's answer.
Question: {question}
Reference answer: {reference}
Assistant answer: {answer}
Score 1-5 for factual accuracy against the reference.
Reply with JSON only: {{"score": <int>, "reason": "<one sentence>"}}"""
def judge(question: str, reference: str, answer: str) -> dict:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=256,
messages=[{"role": "user", "content": JUDGE_PROMPT.format(
question=question, reference=reference, answer=answer)}],
)
text = next(b.text for b in response.content if b.type == "text")
return json.loads(text)
def test_no_regression():
golden = [json.loads(line) for line in open("golden.jsonl")]
scores = []
for case in golden:
answer = my_rag_app(case["question"]) # system under test
scores.append(judge(case["question"], case["reference"], answer)["score"])
mean_score = sum(scores) / len(scores)
print(f"mean judge score: {mean_score:.2f}")
assert mean_score >= 4.2, "quality regression: below release threshold"
The golden.jsonl file starts from real user questions and grows continuously. Promote every production failure into the golden set, and the system improves with compound interest.
The Framework Landscape — LangChain, LlamaIndex, DSPy, PydanticAI
Framework choice generates endless debate, but the 2026 landscape is fairly legible.
| Framework | Strength | Reach for it when |
|---|---|---|
| LangChain / LangGraph | Huge integration surface, graph-based stateful orchestration | Complex multi-step workflows, agents needing checkpoints |
| LlamaIndex | Mature document ingestion and indexing abstractions | RAG-heavy services with many data sources |
| DSPy | Declare prompts, compile them with optimizers | You have an eval set and want automated prompt tuning |
| PydanticAI | Type-safe, thin abstraction, test-friendly | Lightweight but robust production agents |
And the fifth option matters most: no framework, just the SDK. While learning, I strongly recommend this route. If you have written the tool-calling loop yourself, you know what frameworks are hiding — and where to dig when things break.
Three practical rules: prefer thin abstractions, keep orchestration separate from LLM calls so parts stay swappable, and trust your own eval scores over framework fashion.
Choosing a Vector Database
Vector DB choice is another overrated agony. Below a few million documents, almost every option is fast enough. The real criteria are operational, not benchmarks.
| Option | Character | Reach for it when |
|---|---|---|
| pgvector | Postgres extension | Default if you already run Postgres; lives with transactions and joins |
| Qdrant | Open-source dedicated engine | Heavy metadata filtering with performance requirements |
| Weaviate | Hybrid search built in | You want keyword+vector fusion out of the box |
| Milvus | Distributed architecture | Hundreds of millions of vectors and beyond |
| Pinecone | Fully managed | Scaling without ops headcount |
| Chroma / LanceDB | Lightweight, embedded | Prototypes, local dev, small apps |
The checklist has five items: scale (your realistic ceiling), filtering (how complex are permission, date, category conditions), hybrid support, operational burden (managed or not), and cost structure.
One trap to avoid: retrofitting permission filtering hurts. If you are building RAG over internal documents, put document-level access metadata into the schema from day one.
Cost Optimization — Caching, Model Routing, Batching
The more successful your AI feature, the bigger the bill. That is why cost questions appear in nearly every 2026 AI Engineer interview. In order of impact:
- Prompt caching. Cache the repeated prefix — system prompt, documents, few-shot examples — and input costs for the cached portion drop to roughly a tenth. The prerequisite is prompt structure: stable content first, volatile content last.
- Model routing. Not every request deserves the top model. Let a cheap model classify difficulty and escalate only the hard cases.
- Batch APIs. Non-realtime bulk work sent through batch endpoints typically costs half.
- Prompt diet. Output tokens cost several times more than input. A single instruction trimming verbose output can be a surprisingly large saving.
- Self-hosting break-even. Past a certain token volume, serving open models yourself becomes cheaper. An honest comparison includes GPU cost and operations headcount.
Here is caching and routing in one example.
import anthropic
client = anthropic.Anthropic()
ROUTER_SYSTEM = "Classify the request. Reply with exactly one word: simple or complex."
def route_model(user_input: str) -> str:
# step 1: a small, cheap model decides the tier
verdict = client.messages.create(
model="claude-haiku-4-5",
max_tokens=8,
system=ROUTER_SYSTEM,
messages=[{"role": "user", "content": user_input}],
)
label = next(b.text for b in verdict.content if b.type == "text").strip().lower()
return "claude-haiku-4-5" if label == "simple" else "claude-opus-4-8"
def answer(user_input: str, knowledge_base: str) -> str:
response = client.messages.create(
model=route_model(user_input),
max_tokens=2048,
system=[{
"type": "text",
"text": knowledge_base, # large, stable context
"cache_control": {"type": "ephemeral"}, # cached reads cost ~10%
}],
messages=[{"role": "user", "content": user_input}],
)
return next(b.text for b in response.content if b.type == "text")
Cost optimization also rests on evals. You can only cut spending with confidence when your golden set proves routing did not degrade quality.
Observability — LangSmith, Langfuse, Braintrust
Traditional APM cannot debug LLM systems. When a response goes wrong, you need to see which retrieved chunks went in, exactly how the prompt rendered, and how many tokens it burned.
The core concept is tracing: one request becomes a trace, and each retrieval, rerank, LLM call, and tool execution inside it becomes a span. Attach token usage, cost, latency, and user feedback to those spans.
| Tool | Character | Notes |
|---|---|---|
| LangSmith | Managed service from the LangChain team | Smoothest integration if you use LangChain |
| Langfuse | Open source, self-hostable | Default for data-sovereignty-sensitive teams; includes prompt management |
| Braintrust | Evals-first platform | Experiments and logs managed in one place |
With OpenTelemetry's GenAI semantic conventions maturing, instrumenting once with the standard and swapping backends freely has become a common setup.
Three field tips. Instrument from day one — observability added later is observability you do not have. Build the pipeline that promotes production failures into your golden set. And wire user feedback buttons into traces; it is the cheapest labeling pipeline you will ever get.
Five Portfolio Projects
What hiring managers want to see is evidence of judgment, not tutorial reproductions. Five projects that are realistic to build and genuinely differentiating:
1) A domain-specific RAG chatbot. Use documents from a domain you know deeply. Include hybrid search, reranking, and source citations — and above all, publish recall@5 and faithfulness numbers in the README. Deploy it.
2) An agent automation. Automate something you actually repeat: GitHub issue triage, weekly report drafting. Include tool calling, failure recovery, and a human approval gate, and measure the success rate.
3) An evaluation harness. Pick one public task and build the full stack: golden set, programmatic checks, LLM judge, CI regression gate. Report judge-human agreement and you are in the top few percent of portfolios.
4) A fine-tuning project. QLoRA-tune a small open model for one narrow task (structured extraction, domain summarization). Record before-and-after evals against the baseline, training cost, and a vLLM deployment.
5) An MCP server. Wrap an API or tool you know well as an MCP server and publish it. It is the most timely way to demonstrate you understand the agent ecosystem.
One shared principle: two or three deep projects beat five shallow ones. The moment each README states metrics, architecture decisions with trade-offs, and lessons from failures, the project becomes your resume.
The Job Market 2026 — Korea
The Korean market splits into three tiers.
Companies building models. Naver (HyperCLOVA X), LG AI Research (EXAONE), SKT (A.X), Kakao (Kanana), and Upstage with its Solar series. Research positions in this tier often require publications, but the same organizations are hiring growing numbers of AI Engineers to turn models into services.
Companies shipping AI into products. Toss, Coupang, Daangn, Baemin, and other service companies. Positions applying LLMs to search, recommendations, customer support, and internal productivity open steadily. By volume, this tier hires the most.
AI-native startups. Wrtn, ReturnZero, and a long tail of companies selling AI into specific domains — legal, medical, education, commerce. They favor fast, close-to-full-stack builders.
Salary ranges, roughly, based on public postings and salary sites: junior 50–80 million KRW, three-to-seven years 80–150 million KRW, senior and lead 150 million KRW and up, often with equity. Big-tech AI orgs and top startups can exceed these bands.
One Korea-specific note: the coding-test culture remains strong, so algorithm prep is required alongside LLM skills. And projects tied to real enterprise problems — internal document RAG, support automation — resonate most in interviews.
The Job Market 2026 — Japan and Global
Japan. A distinctly domestic model ecosystem exists. Preferred Networks (PLaMo), SoftBank's SB Intuitions (Sarashina), and Tokyo-based Sakana AI, famous for evolutionary model merging, lead model development. ELYZA, rinna, and Stockmark follow, while CyberAgent, LINE Yahoo, and Mercari post applied roles. Compensation typically lands around 6–12 million JPY, with foreign firms and globally benchmarked outfits like Sakana AI paying above that. For those with Japanese language skills, it is a comparatively less crowded niche.
Global. Senior total compensation at US big tech and AI labs reaches USD 300K–500K and beyond per public data, while typical AI Engineer roles commonly fall in the USD 150K–300K range. Check levels.fyi for current numbers. Remote positions have thinned since the pandemic peak, but remote hiring targeting Europe and Asia still exists.
For global applications, the decisive factor is evidence in English: READMEs, technical blog posts, open-source contributions. And in every market, the scarcest profile is the same combination — production software experience plus LLM systems experience.
Interview Prep — System Design, Coding, ML Fundamentals
AI Engineer interviews typically consist of four kinds of rounds.
System design. The most common prompt: "Design a Q&A system over one million internal documents." A strong answer follows this skeleton:
- Clarify requirements — user count, latency targets, document update cadence, whether access control exists
- Ingestion pipeline — parsing, chunking strategy, embeddings, index refresh
- Retrieval — hybrid search, permission filters, reranking
- Generation — prompt assembly, source citation, hallucination control
- Evaluation — golden set, recall@k, faithfulness, regression gates
- Operations — cost estimates, caching, observability, failure modes
Candidates who raise permission filtering and evaluation unprompted are rare, which is exactly why they stand out.
Coding. LeetCode-medium algorithms plus a growing share of practical tasks: parsing streaming responses, implementing retry logic, assembling a small retrieval pipeline.
ML fundamentals. The big picture of transformers and attention, tokenizers, temperature and sampling, embeddings and cosine similarity, why LoRA is parameter-efficient, causes and mitigations of hallucination. You need causal explanations of concepts, not derivations.
Behavioral. Prepare a three-minute walkthrough of each portfolio project: the decisions, the trade-offs, the failures, and what they taught you.
Learning Resources — Courses, Books, Newsletters
You do not need all of these. Pick one from each layer.
Foundations. Andrej Karpathy's Neural Networks: Zero to Hero series remains the best shortcut to understanding transformers through code. Hugging Face's free courses on LLMs and agents are solid.
Applied skills. DeepLearning.AI's short courses cover RAG, agents, and evaluation topic by topic. For evals specifically, the AI Evals course by Hamel Husain and Shreya Shankar has become the practitioner standard.
Books. Chip Huyen's AI Engineering (2025) sits closest to a textbook for this role. Sebastian Raschka's Build a Large Language Model from Scratch covers the internals; Hands-On Large Language Models by Jay Alammar and Maarten Grootendorst covers the applied landscape.
Staying current. Latent Space (swyx's podcast and newsletter), Simon Willison's blog, Interconnects, and Sebastian Raschka's Ahead of AI offer a strong signal-to-noise ratio.
Community. Talks from the AI Engineer World's Fair are a trove of production case studies. Even skimming the slides shows you what the industry cares about right now.
Career Transition Paths — From Backend, From Data Science
The good news about this role: it favors adjacent-role switchers over complete beginners.
From backend engineering. The most common and fastest path. API design, databases, deployment, and reliability instincts carry over directly. What you add is model sense: three focused months on LLM APIs, RAG, and evals. The single best move is volunteering to own one AI feature at your current company — an internal transfer is ten times easier than a resume transfer.
From data science. You already own the biggest weapon: experimental design and an evaluation mindset. The evals section of this guide will feel native to you. What you add is production engineering — from notebook to service. Build one project with an API server, containers, CI, and observability to prove deployment ability.
From frontend. The AI product engineer path is real. People who craft AI-specific UX well — streaming interfaces, chat UIs, optimistic updates — are scarce. Start with TypeScript AI SDKs and expand backend-ward.
From MLOps. A natural extension into LLMOps. Layer evals and prompt management on top of your serving, GPU infrastructure, and pipeline experience.
One shared piece of advice: the proof of transition is not a certificate but a deployed project with metrics.
Closing — A Six-Month Roadmap
Everything above, compressed into an executable sequence.
- Month 1 — Sharpen Python; go deep on LLM APIs. Structured outputs, streaming, tool calling, error handling; build a small CLI tool.
- Month 2 — RAG. Implement chunking through reranking yourself, build a 50-case golden set, and iterate on recall@5. Portfolio project number one done.
- Month 3 — Agents. Write the tool-calling loop without a framework, automate one real recurring task, and publish an MCP server.
- Month 4 — Evals in depth. Build an LLM-as-judge harness and wire a regression gate into CI. Add eval reports to two existing projects.
- Month 5 — Fine-tuning and serving. QLoRA-tune one small model, serve it with vLLM, record before-and-after metrics.
- Month 6 — Polish and apply. Clean up READMEs, write two or three technical blog posts, run mock system-design interviews, start applying.
If you remember one thing, make it this: what differentiates the 2026 AI Engineer is not knowing the latest model news but knowing how to build a loop that measures and improves. Models keep changing. A system built on evals — and the experience of having built one — does not.
References
- swyx, "The Rise of the AI Engineer" — https://www.latent.space/p/ai-engineer
- Lewis, P. et al. "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" (2020) — https://arxiv.org/abs/2005.11401
- Hu, E. et al. "LoRA: Low-Rank Adaptation of Large Language Models" (2021) — https://arxiv.org/abs/2106.09685
- Dettmers, T. et al. "QLoRA: Efficient Finetuning of Quantized LLMs" (2023) — https://arxiv.org/abs/2305.14314
- Rafailov, R. et al. "Direct Preference Optimization" (2023) — https://arxiv.org/abs/2305.18290
- Kwon, W. et al. "Efficient Memory Management for LLM Serving with PagedAttention" (vLLM, 2023) — https://arxiv.org/abs/2309.06180
- Zheng, L. et al. "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena" (2023) — https://arxiv.org/abs/2306.05685
- Anthropic, "Building Effective Agents" — https://www.anthropic.com/research/building-effective-agents
- Hamel Husain, "Your AI Product Needs Evals" — https://hamel.dev/blog/posts/evals/
- Eugene Yan, "Patterns for Building LLM-based Systems and Products" — https://eugeneyan.com/writing/llm-patterns/
- Chip Huyen, AI Engineering (O'Reilly, 2025) — https://huyenchip.com/books/
- LangChain Documentation — https://python.langchain.com/
- LlamaIndex Documentation — https://docs.llamaindex.ai/
- DSPy — https://dspy.ai/
- PydanticAI — https://ai.pydantic.dev/
- vLLM Documentation — https://docs.vllm.ai/
- Hugging Face PEFT Documentation — https://huggingface.co/docs/peft
- Ragas Documentation — https://docs.ragas.io/
- Langfuse Documentation — https://langfuse.com/docs
- Model Context Protocol — https://modelcontextprotocol.io/
- Simon Willison's Weblog — https://simonwillison.net/