Skip to content
Published on

AI 시대 생존 가이드 2편: 개발자에서 LLM 엔지니어/AI 엔지니어로 전환하기

Authors

들어가며: AI가 코드를 짜는 시대, 당신의 가치는?

Cursor를 처음 써본 날을 기억하시나요?

"이거... 나보다 빠른데?"라는 생각이 드는 순간, 묘한 불안감이 밀려옵니다. GitHub Copilot은 이미 많은 개발자의 일상이 됐고, Claude와 GPT-4는 스펙 문서를 보여주면 30분 만에 백엔드 API를 생성합니다. Devin 같은 AI 에이전트는 독립적으로 GitHub 이슈를 처리하고 PR을 올립니다.

"나는 이제 어디에 있어야 하나?"

이 질문에 정직하게 답하겠습니다. 단순 코드 작성만으로 차별화하기는 점점 어려워지고 있습니다. 하지만 역설적으로, AI 기술 자체를 깊이 이해하고 AI 제품을 만드는 엔지니어에 대한 수요는 폭발적으로 증가하고 있습니다.

바로 LLM 엔지니어(AI 엔지니어)입니다.

이들은 AI를 무서워하지 않습니다. AI를 만들고, 연결하고, 최적화하는 사람들입니다. 그리고 기존 SW 개발 경험이 있는 사람이 이 역할에 진입하기에 가장 유리합니다.

이 글에서는 백엔드, 풀스택, 또는 어떤 SW 개발 경험이 있는 분이라도 12-18개월 안에 LLM 엔지니어로 전환할 수 있는 현실적인 로드맵을 제시합니다.


1. LLM 엔지니어란 무엇인가?

여러 직함들의 차이

먼저 비슷해 보이는 직함들을 정리해봅시다.

프롬프트 엔지니어: LLM에게 더 나은 답을 끌어내는 프롬프트를 설계하는 사람. 초기에 주목받았지만, 실제로 독립적인 직군으로 굳어지기보다는 다른 역할에 통합되는 추세.

LLM 엔지니어 / AI 엔지니어: AI 애플리케이션을 설계하고 구현하는 SW 엔지니어. 프롬프트 설계는 물론, RAG 시스템, AI 에이전트, 파인튜닝, 프로덕션 배포까지 다루는 종합적인 역할. 지금 가장 수요가 많은 직군.

ML 엔지니어: 기계학습 모델 자체를 연구하고 개발하는 사람. 보통 ML/통계 배경이 필요하며, 수학적 이해가 깊어야 함. LLM 엔지니어보다 진입장벽이 높음.

MLOps 엔지니어: ML 모델의 배포, 운영, 모니터링에 집중. DevOps와 ML의 교차점.

SW 개발자가 전환하기에 가장 현실적인 경로는 LLM 엔지니어/AI 엔지니어입니다.

실제 LLM 엔지니어가 하는 일

채용 공고와 실제 업무를 분석해보면, LLM 엔지니어의 일상은 이렇습니다:

LLM API 통합 및 최적화

  • OpenAI, Anthropic, Google Gemini API를 이용해 기능 구현
  • 비용 최적화: 어떤 모델을 언제 쓸지, 캐싱 전략, 배치 처리
  • 레이턴시 최소화: 스트리밍 응답, 병렬 처리

RAG 시스템 설계와 구현

  • 기업 문서, 데이터베이스를 LLM이 활용할 수 있도록 파이프라인 구축
  • 청킹 전략, 임베딩 모델 선택, 벡터 DB 운영
  • 검색 품질 측정 및 개선

AI 에이전트 / 워크플로 구축

  • 여러 도구를 자율적으로 사용하는 AI 에이전트 개발
  • 멀티 에이전트 시스템 (CrewAI, LangGraph)
  • Human-in-the-loop 설계: 언제 사람이 개입할지

LLM 파인튜닝

  • 특정 도메인이나 스타일에 맞게 기존 모델을 추가 학습
  • 데이터셋 수집, 정제, 학습 파이프라인 구축
  • 평가 지표 설계

AI 제품의 평가와 모니터링

  • 할루시네이션(환각) 감지
  • 응답 품질 측정 (자동화 + 인간 평가)
  • 비용 및 레이턴시 대시보드

2. 개발자 경험이 큰 무기인 이유

많은 개발자들이 "ML은 어렵고 수학이 많이 필요하다"고 생각해서 LLM 엔지니어 전환을 망설입니다. 하지만 LLM 엔지니어는 ML 연구자가 아닙니다. 여러분의 SW 개발 경험이 오히려 강점입니다.

SW 개발 경험이 AI 제품 개발에서 빛나는 이유

API 설계 능력: RAG 시스템, AI 에이전트를 프로덕션 품질로 만들려면 잘 설계된 API와 서비스 구조가 필요합니다. 순수 데이터 사이언티스트는 이 부분에서 종종 약합니다.

데이터베이스 지식: 벡터 데이터베이스가 새로운 기술이지만, 인덱싱, 쿼리 최적화, 트랜잭션 개념은 기존 DB 지식에서 자연스럽게 이어집니다.

성능 최적화: LLM API 호출은 비쌉니다. 캐싱, 배치 처리, 비동기 처리 - 이것들은 백엔드 개발에서 이미 배운 기술입니다.

시스템 사고: 복잡한 AI 파이프라인에서 각 컴포넌트가 어떻게 연결되는지, 장애가 어떻게 전파되는지 이해하는 것은 시스템 설계 경험에서 옵니다.

코드 품질: 많은 AI 개발 코드는 놀라울 정도로 품질이 낮습니다. 테스트 없이 노트북에서 바로 프로덕션으로 가는 경우도 있습니다. SW 개발자의 테스트 작성, 코드 리뷰, CI/CD 습관이 여기서 빛납니다.


3. LLM 엔지니어 전환 로드맵 (12개월)

1-2개월: LLM 기초

LLM의 작동 원리 이해

딥러닝 수학을 전부 알 필요는 없지만, 기본 개념은 이해해야 합니다:

  • Transformer 아키텍처: Attention 메커니즘이 왜 중요한지, Self-attention이 어떻게 컨텍스트를 이해하는지
  • 토크나이제이션: 텍스트가 어떻게 토큰으로 분리되는지, 왜 영어와 한국어의 토큰 수가 다른지
  • 컨텍스트 윈도우: 모델이 한번에 처리할 수 있는 텍스트 길이의 제한
  • Temperature, Top-p: 출력의 다양성을 조절하는 파라미터
  • Few-shot, Zero-shot: 프롬프트에 예시를 주는 방법들

추천 자료: Andrej Karpathy의 YouTube "Neural Networks: Zero to Hero" 시리즈 - 수학보다 직관을 먼저 알려주는 최고의 자료입니다.

ChatGPT, Claude, Gemini API 실습

계정을 만들고 실제로 API를 호출해보세요.

# OpenAI API 기본 사용
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "당신은 도움이 되는 코드 리뷰어입니다."},
        {"role": "user", "content": "이 Python 함수를 리뷰해줘: def add(a, b): return a + b"}
    ],
    temperature=0.7,
    max_tokens=500
)

print(response.choices[0].message.content)
print(f"사용된 토큰: {response.usage.total_tokens}")
print(f"비용 (gpt-4o 기준): ${response.usage.total_tokens * 0.000005:.6f}")

프롬프트 엔지니어링 기초

  • Zero-shot: 예시 없이 직접 질문
  • Few-shot: 2-3개 예시를 제공한 후 질문
  • Chain-of-Thought (CoT): "단계적으로 생각해봐"라고 요청하면 복잡한 추론 품질이 향상됨
  • System prompt: 모델의 역할과 행동 방식을 정의
  • Structured Output: JSON 형식으로 답변을 강제
# 구조화된 출력 예시
from openai import OpenAI
from pydantic import BaseModel
from typing import List

class CodeReview(BaseModel):
    issues: List[str]
    suggestions: List[str]
    severity: str  # "low", "medium", "high"
    score: int     # 1-10

client = OpenAI()

response = client.beta.chat.completions.parse(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "당신은 시니어 개발자입니다. 코드를 리뷰하고 JSON으로 결과를 반환하세요."},
        {"role": "user", "content": "다음 코드를 리뷰해주세요: [코드 내용]"}
    ],
    response_format=CodeReview
)

review = response.choices[0].message.parsed
print(f"심각도: {review.severity}")
print(f"점수: {review.score}/10")

3-4개월: RAG 시스템

RAG(Retrieval-Augmented Generation)는 LLM 엔지니어의 핵심 기술입니다. LLM이 알지 못하는 회사 내부 문서, 최신 데이터를 활용할 수 있게 해줍니다.

RAG의 작동 원리

  1. 문서를 작은 청크로 분할
  2. 각 청크를 벡터(숫자 배열)로 변환 (임베딩)
  3. 벡터 데이터베이스에 저장
  4. 질문이 들어오면, 질문과 유사한 청크를 검색
  5. 검색된 청크와 질문을 LLM에 제공
  6. LLM이 컨텍스트를 바탕으로 답변 생성

벡터 데이터베이스

  • Chroma: 로컬 개발에 완벽. 파이썬 패키지 하나면 바로 시작 가능
  • Pinecone: 클라우드 관리형. 프로덕션에 많이 사용
  • pgvector: 기존 PostgreSQL에 벡터 기능 추가. 이미 Postgres를 쓴다면 매력적
# LangChain으로 RAG 시스템 구축
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 1. 문서 로드
loader = PyPDFLoader("company_docs.pdf")
documents = loader.load()

# 2. 청킹
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)

# 3. 임베딩 및 벡터 DB 저장
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 4. RAG 체인 생성
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 5})
)

# 5. 질문
result = qa_chain.invoke({"query": "우리 회사의 연차 정책이 어떻게 되나요?"})
print(result["result"])

실전 프로젝트: 회사 내부 문서(인사 정책, 기술 문서, FAQ)로 QA 챗봇 만들기. 이것이 가장 현실적인 첫 RAG 프로젝트입니다.


5-6개월: AI 에이전트

에이전트는 단순히 질문에 답하는 것을 넘어, 도구를 사용해 목표를 달성하는 AI 시스템입니다.

에이전트의 핵심 구성요소

  • 도구(Tools): 코드 실행기, 웹 검색, DB 조회, API 호출 등
  • 메모리: 대화 기록, 장기 기억
  • 계획(Planning): 목표를 달성하기 위한 단계별 계획 수립
# LangChain Agent 예시: 코드 리뷰 에이전트
from langchain import hub
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
from langchain_community.utilities import SerpAPIWrapper

# 도구 정의
def analyze_code_complexity(code: str) -> str:
    """코드의 복잡도를 분석합니다."""
    # 실제 구현에서는 radon 등 라이브러리 사용
    lines = code.count('\n')
    functions = code.count('def ')
    return f"코드 줄 수: {lines}, 함수 수: {functions}, 복잡도 점수: {lines // 10}"

def check_security_issues(code: str) -> str:
    """기본적인 보안 취약점을 검사합니다."""
    issues = []
    if 'eval(' in code:
        issues.append("eval() 사용 발견 - 보안 위험")
    if 'shell=True' in code:
        issues.append("shell=True 사용 발견 - 명령 인젝션 위험")
    if not issues:
        return "명백한 보안 취약점 없음"
    return "\n".join(issues)

tools = [
    Tool(
        name="코드_복잡도_분석",
        func=analyze_code_complexity,
        description="Python 코드의 복잡도를 분석합니다. 입력: 코드 문자열"
    ),
    Tool(
        name="보안_취약점_검사",
        func=check_security_issues,
        description="코드에서 보안 취약점을 검사합니다. 입력: 코드 문자열"
    )
]

llm = ChatOpenAI(model="gpt-4o", temperature=0)
prompt = hub.pull("hwchase17/react")

agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = agent_executor.invoke({
    "input": "다음 코드를 종합적으로 리뷰해주세요: [코드 내용]"
})

LangGraph로 복잡한 에이전트 워크플로

LangGraph는 에이전트의 상태 머신을 그래프로 정의합니다. 복잡한 분기, 루프, 멀티 에이전트 협업에 적합합니다.

CrewAI 멀티 에이전트

여러 전문화된 에이전트가 협력하는 시스템입니다:

from crewai import Agent, Task, Crew

# 에이전트 정의
researcher = Agent(
    role="기술 조사원",
    goal="주어진 주제에 대한 최신 기술 동향 조사",
    backstory="10년 경력의 기술 분석가",
    verbose=True
)

writer = Agent(
    role="기술 블로그 작가",
    goal="조사 결과를 이해하기 쉬운 블로그 포스트로 작성",
    backstory="개발자를 위한 기술 블로그 전문 작가",
    verbose=True
)

# 태스크 정의
research_task = Task(
    description="LLM 엔지니어링 최신 트렌드 조사",
    agent=researcher
)

writing_task = Task(
    description="조사 결과를 바탕으로 블로그 포스트 작성",
    agent=writer
)

# 크루 실행
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task]
)
result = crew.kickoff()

7-9개월: LLM 파인튜닝과 평가

언제 파인튜닝이 필요한가?

파인튜닝은 만능이 아닙니다. 다음 상황에서만 고려하세요:

  • 특정 도메인 용어/스타일이 필요할 때 (법률, 의료, 금융)
  • 특정 형식의 출력을 일관되게 얻고 싶을 때
  • 프롬프트를 아무리 수정해도 원하는 결과가 안 나올 때
  • API 비용보다 파인튜닝 비용이 저렴할 때

RAG나 프롬프트 엔지니어링으로 해결 가능하다면 그게 먼저입니다.

LoRA/QLoRA로 효율적인 파인튜닝

Full fine-tuning은 GPU가 엄청나게 필요합니다. LoRA(Low-Rank Adaptation)는 모델의 일부만 학습해서 비용을 크게 줄입니다.

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
from trl import SFTTrainer
from datasets import load_dataset

# 기본 모델 로드
model_name = "beomi/Llama-3-Open-Ko-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    load_in_4bit=True,  # QLoRA: 4비트 양자화
    device_map="auto"
)

# LoRA 설정
lora_config = LoraConfig(
    r=16,           # 랭크 (낮을수록 파라미터 수 적음)
    lora_alpha=32,  # 스케일 파라미터
    target_modules=["q_proj", "v_proj"],  # 어텐션 레이어에만 적용
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.CAUSAL_LM
)

model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 출력 예: trainable params: 3,407,872 (전체의 0.04%)

LLM 평가: RAGAS

RAG 시스템의 품질을 측정하는 프레임워크입니다:

from ragas import evaluate
from ragas.metrics import (
    faithfulness,        # 답변이 컨텍스트에 충실한지
    answer_relevancy,    # 답변이 질문에 관련있는지
    context_precision,   # 검색된 컨텍스트가 정확한지
    context_recall       # 필요한 컨텍스트가 모두 검색됐는지
)

# 평가 데이터셋
from datasets import Dataset

data = {
    "question": ["회사의 연차 정책은?", "급여는 언제 지급되나요?"],
    "answer": ["연차는 15일 제공됩니다.", "매월 25일에 지급됩니다."],
    "contexts": [
        ["연차는 연 15일 제공되며 잔여 연차는 이월 불가..."],
        ["급여 지급일은 매월 25일이며 공휴일인 경우 전일 지급..."]
    ],
    "ground_truth": ["연 15일", "매월 25일"]
}

dataset = Dataset.from_dict(data)
result = evaluate(dataset, metrics=[faithfulness, answer_relevancy])
print(result)

10-12개월: 프로덕션 AI 시스템

vLLM으로 오픈소스 모델 서빙

비용 절감이나 데이터 프라이버시를 위해 오픈소스 모델을 직접 서빙해야 할 때:

# vLLM 설치 및 모델 서빙
pip install vllm

# API 서버 시작
python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-3-8B-Instruct \
  --max-model-len 4096 \
  --gpu-memory-utilization 0.9

vLLM은 OpenAI API와 호환되는 서버를 제공하므로, 기존 OpenAI SDK 코드를 URL만 바꿔서 사용할 수 있습니다.

비용 최적화 전략

# 비용 모니터링 래퍼 예시
import time
from functools import wraps
from dataclasses import dataclass

COST_PER_TOKEN = {
    "gpt-4o": {"input": 0.000005, "output": 0.000015},
    "gpt-4o-mini": {"input": 0.00000015, "output": 0.0000006},
    "claude-3-5-sonnet": {"input": 0.000003, "output": 0.000015},
}

@dataclass
class APICall:
    model: str
    input_tokens: int
    output_tokens: int
    latency_ms: float
    cost_usd: float

def track_llm_cost(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        elapsed = (time.time() - start) * 1000

        # 사용량 추적 (실제 구현에서는 DB 저장)
        print(f"레이턴시: {elapsed:.0f}ms")
        return result
    return wrapper

LangSmith로 모니터링

LangSmith는 LangChain 생태계의 모니터링/디버깅 도구입니다. 프로덕션에서 어떤 프롬프트가 어떻게 실행되는지, 어디서 실패하는지 추적할 수 있습니다.

import os
from langchain_core.tracers import LangChainTracer

# 환경변수 설정
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-langsmith-api-key"

# 이후 모든 LangChain 호출이 자동으로 추적됨

4. 실제 프로젝트 아이디어 (포트폴리오용)

취업할 때 "저 이런 거 배웠어요"보다 "저 이런 거 만들었어요"가 훨씬 설득력 있습니다. 다음 프로젝트들은 실제 채용 면접에서 눈길을 끄는 것들입니다.

프로젝트 1: 개인화 코드 리뷰 봇

  • GitHub PR에 자동으로 AI 코드 리뷰 코멘트
  • 코드베이스의 스타일 가이드를 학습해서 일관된 리뷰
  • 기술 스택: GitHub Actions + Claude API + GitHub API
  • 차별화: 단순 리뷰가 아닌, "이 팀만의 컨벤션"을 학습하는 RAG 활용

프로젝트 2: 회사 지식 기반 QA 챗봇

  • Confluence, Notion, Slack 등 내부 문서를 검색하는 챗봇
  • 멀티모달: PDF, 이미지 포함 문서 처리
  • 기술 스택: FastAPI + LangChain + pgvector + React
  • 차별화: 소스 인용 기능, 신뢰도 점수 표시

프로젝트 3: 한국어 특화 뉴스 분석 에이전트

  • 매일 주요 뉴스를 수집, 요약, 카테고리화
  • 특정 회사/키워드에 대한 감성 분석
  • 기술 스택: CrewAI + SerpAPI + Anthropic Claude + Cron
  • 차별화: 한국어 최적화 (한국어 LLM 파인튜닝 활용)

프로젝트 4: SQL 자동 생성기 (Text-to-SQL)

  • 자연어로 데이터베이스를 질의하는 시스템
  • "지난달 가장 많이 구매한 고객 상위 10명 알려줘"
  • 기술 스택: LangChain SQL Agent + Streamlit + DuckDB
  • 차별화: 복잡한 조인, 서브쿼리도 처리하는 고도화

프로젝트 5: AI 면접 코치

  • JD(Job Description)와 이력서를 분석해서 예상 질문 생성
  • 답변을 듣고 피드백 제공 (음성 입력 포함)
  • 기술 스택: OpenAI Whisper + GPT-4o + FastAPI + Next.js
  • 차별화: 실제 면접 데이터로 파인튜닝한 평가 모델

5. LLM 엔지니어 취업 시장

채용 공고가 요구하는 스킬

실제 LLM 엔지니어 채용 공고를 분석해보면:

필수 스킬

  • Python 숙련 (당연)
  • LLM API 사용 경험 (OpenAI, Anthropic, Google)
  • RAG 시스템 구현 경험
  • 벡터 DB (Pinecone, Weaviate, pgvector 등)
  • LangChain 또는 LlamaIndex 경험

우대 스킬

  • 파인튜닝 경험 (LoRA, PEFT)
  • 모델 서빙 경험 (vLLM, TGI)
  • MLOps (MLflow, W&B)
  • 클라우드 경험 (AWS Bedrock, GCP Vertex AI, Azure AI)

핵심: 이론보다 실제 만든 것을 보고 싶어합니다. 포트폴리오가 전부입니다.

연봉 현황 (2026년 기준 추정)

  • 주니어 LLM 엔지니어 (1-2년): 5,000-7,000만원
  • 미드레벨 (3-5년): 7,000-1억원
  • 시니어 (5년+): 1억-1억 5,000만원
  • 빅테크/AI 스타트업: 1억 5,000만원 이상 + 스톡옵션

SW 개발자 중 LLM 엔지니어 전환은 현재 가장 연봉 상승 폭이 큰 커리어 이동 중 하나입니다.

한국 vs 해외

한국 시장에서도 LLM 엔지니어 수요는 폭발적입니다. 네이버, 카카오, 삼성, LG를 비롯해 수많은 스타트업이 AI 제품을 만들고 있습니다.

해외 원격 근무도 고려해볼 만합니다. LinkedIn, Glassdoor에서 "LLM Engineer remote"로 검색하면 한국에 거주하면서 미국 스타트업에서 일하는 포지션을 찾을 수 있습니다. 영어 능력이 충분하다면, 연봉이 2-3배 차이날 수 있습니다.


6. 즉시 시작할 수 있는 첫 번째 프로젝트

이론은 충분합니다. 지금 당장 만들 수 있는 가장 간단하지만 인상적인 프로젝트를 알려드립니다.

"나만의 책 추천 챗봇" 만들기 (2-3시간)

이 프로젝트는 RAG의 핵심을 경험할 수 있으면서, 실제로 유용한 결과물을 만듭니다.

사전 준비

pip install openai langchain chromadb tiktoken

Step 1: 데이터 준비

좋아하는 책 10-20권의 정보를 텍스트 파일로 만들어보세요. 제목, 저자, 줄거리, 주요 테마, 추천 독자.

Step 2: 벡터 DB 구축

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import TextLoader
import os

os.environ["OPENAI_API_KEY"] = "your-api-key"

# 책 정보 로드
loader = TextLoader("books.txt", encoding="utf-8")
documents = loader.load()

# 청킹
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = splitter.split_documents(documents)

# 벡터 DB 생성
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="books_db"
)
print(f"저장된 청크 수: {len(chunks)}")

Step 3: 챗봇 구현

from langchain_openai import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

# LLM 설정
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

# 대화 메모리
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

# RAG 체인
qa_chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
    memory=memory,
    verbose=True
)

# 대화 루프
print("책 추천 챗봇입니다. 어떤 종류의 책을 찾으시나요?")
while True:
    query = input("You: ")
    if query.lower() in ["quit", "exit", "종료"]:
        break

    response = qa_chain.invoke({"question": query})
    print(f"Bot: {response['answer']}\n")

Step 4: 개선하기

이것만으로도 동작하는 RAG 챗봇입니다. 여기서 개선 방향을 스스로 찾아보세요:

  • 더 많은 책 데이터 추가
  • 검색 결과에 출처 표시
  • Streamlit으로 웹 인터페이스 만들기
  • 독자 취향을 기억하는 장기 메모리 추가

이 프로젝트를 GitHub에 올리고, README에 작동 방법을 설명하고, 스크린샷을 추가하면 훌륭한 포트폴리오 아이템이 됩니다.


마치며: 두려움보다 빠르게 움직이세요

AI가 개발자를 대체하는 속도와, AI를 활용하는 개발자가 새 가치를 만드는 속도 - 어느 쪽이 더 빠를까요?

저는 후자가 더 빠르다고 믿습니다. 그리고 그 후자의 중심에 LLM 엔지니어가 있습니다.

이미 SW 개발을 알고 있다는 것은 엄청난 출발점입니다. Python을 다룰 줄 알고, API를 연결할 줄 알고, 시스템을 설계하는 경험이 있다면 - LLM 엔지니어의 기초 체력은 이미 갖춰진 것입니다.

남은 것은 LLM의 특성을 이해하고, 그것을 이용해 실용적인 것을 만드는 연습입니다.

오늘 OpenAI API 키를 발급받고, 위의 첫 번째 코드를 실행해보세요. 처음 AI가 여러분의 입력에 응답하는 순간, 12개월 후의 모습이 조금씩 보이기 시작할 것입니다.


참고 자료