AI Agent 교육 1일차
AI의 역사에 대한 이야기

우리가 최근에 사용하는 ChatGPT의 원조는 ELIZA라고 할 수 있는데요. MIT의 조셉 와이젠바움이 1966년에 만든 ELIZA는 단순한 규칙 기반 챗봇이었습니다. 화자가 “내가 슬퍼” 라고 입력하면 “왜 슬퍼?” 라고 되묻는 식이죠. 이 챗봇 코드는 단순한 패턴 매칭이었습니다.
입력: "I am sad"
규칙: "I am X" → "Why are you X?"
출력: "Why are you sad?"
근데 놀랍게도 사람들은 ELIZA에게 진짜 비밀을 털어놓고 위안을 받았습니다. 와이젠바움 자신의 비서마저도 “교수님 잠깐 나가주세요, ELIZA와 단둘이 대화하고 싶어요” 라고 했다는 일화가 있다고 합니다.
이 후 1990년대~2000년대, 자연어 처리의 주류는 통계 기반 접근이었습니다. “이 단어 다음에 어떤 단어가 자주 나오는가?” 를 거대한 코퍼스(텍스트 모음)에서 세는 방식이었습니다. 즉 많이 나오는 것을 보여주는 것이라고 할 수 있죠.
"피자를" 다음에 자주 오는 단어:
먹다 (35%)
주문하다 (18%)
좋아하다 (12%)
...
이게 n-gram 언어 모델의 핵심입니다. 구글이 초기에 검색 결과를 정렬할 때, “이 검색어와 관련 깊은 단어가 페이지에 얼마나 자주 나오는가” 를 계산하던 게 이런 단순한 통계였습니다. 요즘 네이버의 자동완성과 같은 기능이라고 할 수 있습니다.
이 방식의 문제점은 명확합니다. 짧은 맥락만 봅니다. “피자를 어제 먹었는데 너무 짜서 오늘은 ___” 같은 문장에서 빈칸을 맞추려면 “어제 짜게 먹었으면 오늘은 싱겁게 먹고 싶을 것이다” 라는 추론이 필요한데, n-gram은 그냥 “피자” 다음에 자주 오는 단어만 보여줄 뿐 화자의 현재 상황을 고려할 수는 없습니다.

이 후 지지부진하던 AI는 2013년 구글의 토마스 미콜로프 팀이 Word2Vec을 발표하면서 충격이 발생합니다. 단어를 숫자 벡터로 표현하는 기법인데, 이렇게 학습된 벡터들이 놀라운 성질을 보였습니다.
king - man + woman ≈ queen
서울 - 한국 + 일본 ≈ 도쿄
벡터 간의 산술 연산이 의미적 관계를 표현하는 거예요. 컴퓨터가 단어의 의미를 어렴풋이나마 “공간”에서 다루기 시작한 순간입니다.
이후 RNN, LSTM 같은 신경망이 단어 시퀀스를 처리하기 시작했지만, 긴 문장에서는 앞부분 정보를 까먹는 문제가 있었어요. “어제 친구와 만난 카페에서 마신 음료가 아주 비쌌는데, 그 ___은(는)…” 같이 멀리 있는 단어를 가리키는 게 약했습니다.
⚡ 2017년의 변곡점 — “Attention is All You Need”
구글 연구팀이 발표한 트랜스포머(Transformer) 논문은 NLP의 전환점이었습니다. 어텐션은 동시에 본다는 것이 가장 핵심인데요.
모든 단어가 모든 단어를 동시에 본다 (Self-Attention).
기존 RNN은 단어를 한 줄로 줄세워서 차례로 처리했습니다. 트랜스포머는 모든 단어가 동시에, 서로의 중요도를 가중치로 계산하는 방식으로 변경된 것입니다.
🎯 우리가 LLM을 쓰기까지의 역사
규칙 기반 (1966) ─── 똑똑하지만 좁음 (ELIZA)
↓
통계 기반 (1990s) ─── 빠르지만 짧은 맥락
↓
단어 임베딩 (2013) ─── 의미를 벡터로
↓
트랜스포머 (2017) ─── 긴 맥락 파악
↓
대규모 학습 (2020+) ─── GPT-3, ChatGPT, Claude…
점점 더 똑똑해지는 형태로 발전되어왔습니다.
GPT가 학습할 때 풀어야 하는 task는 한 줄로 표현됩니다.
“앞 단어들이 주어졌을 때, 다음에 올 가장 그럴듯한 토큰을 맞춰라.”
입력: "오늘 점심은 김치"
모델의 예측 (확률):
찌개 → 32%
볶음밥 → 18%
전 → 12%
국 → 9%
말이 → 4%
...
이게 전부입니다.
창발(Emergence) — 작은 모델은 못 풀던 게 갑자기 풀린다
진짜 마법은 여기서 일어납니다. 작은 모델은 풀지 못하던 task가, 모델이 일정 크기 이상이 되면 갑자기 풀기 시작합니다.
다음은 실제 연구 결과입니다 (Wei et al., 2022 “Emergent Abilities of Large Language Models”)
3자리 덧셈 정확도:
10억 파라미터 모델 → 0% (못 함)
100억 파라미터 모델 → 0% (여전히 못 함)
1000억 파라미터 모델 → 0% (?!)
더 크게 키웠더니 → 80% (?!?!)
코드 완성 정확도:
마찬가지로 임계점 넘으면서 갑자기 가능해짐
작은 모델은 데이터를 늘려도, 학습을 더 시켜도 0% 입니다. 하지만 임계 사이즈를 넘으면 갑자기 가능해집니다. 이걸 창발(emergence) 라고 합니다. ChatGPT의 원리이기도 하죠. 원인을 알 수 없으나 커지면 동작이 됩니다 ㅎㅎ
OpenAI가 ChatGPT를 만들 때 추가한 단계가 2개가 있는데요.
- Instruction Tuning — “사람이 시킨 대로 따라하는” 데이터로 파인튜닝
- RLHF (Reinforcement Learning from Human Feedback) — 사람이 더 좋아하는 답변에 보상
이 두 가지가 합쳐져서, 우리가 지금 쓰는 “친절하고 도움이 되는” ChatGPT가 탄생했습니다. 그리고 2022년 11월 출시 5일 만에 100만 사용자를 돌파한 상황입니다.
ChatGPT 프롬프트의 주요 형태
1️⃣ 역할 부여 (Role Prompting)
"너는 10년차 시니어 백엔드 개발자야. 코드 리뷰를 부탁받았어."
모델이 그 역할에 맞는 어휘·관점·디테일로 답합니다.
2️⃣ 형식 지정 (Format Specification)
"다음 형식의 JSON으로만 답해:
{
\"sentiment\": \"positive|negative|neutral\",
\"confidence\": <0~1 사이 실수>
}"
코드에서 후속 처리하려면 출력 형식이 일정해야 합니다.
3️⃣ Few-shot Examples
"다음 형식으로 답해:
예시 1:
입력: '오늘 너무 행복해'
출력: {sentiment: positive, confidence: 0.95}
예시 2:
입력: '진짜 짜증나'
출력: {sentiment: negative, confidence: 0.90}
이제 다음 입력에 대해 답해:
입력: '뭐 그냥 그랬어'"
예시 2~3개만 보여줘도 모델이 패턴을 따라합니다.
4️⃣ Chain-of-Thought (CoT)
"단계적으로 생각해 (think step by step)."
복잡한 문제는 한 번에 풀게 하지 말고 단계를 출력하게 시키면 정확도가 올라갑니다. 모델이 “생각하는 시간”을 토큰으로 벌어주는 것이라고 생각하면 됩니다.
5️⃣ 부정 예시 (Negative Examples)
"다음 같은 답은 절대 하지 마:
- 모호한 표현 ('아마도', '~수도 있습니다')
- 사과 ('죄송하지만…')
- 반복 ('정리하자면, 정리하자면…')"
원하지 않는 패턴을 명시적으로 막습니다.
6️⃣ 출력 시작 강제 (Output Priming)
"답변을 다음 단어로 시작해: 'JSON: '"
모델이 첫 단어를 정해진 형태로 시작하게 만들면 형식 안정성이 올라갑니다.
그래서 LLM에 “harness”를 씌우기 시작했다
LLM이라는 엔진 주변에 다양한 컴포넌트를 붙이면 단점이 보완됩니다. 하네스(Harness)는 원래 말(馬)에 장착하는 마구(馬具), 즉 말의 힘을 안전하게 제어하고 유용한 방향으로 이끌기 위한 도구를 가리키는 단어입니다. 동사로는 ‘강력한 것을 제어하여 유익하게 활용한다’는 의미로도 쓰입니다.
| 컴포넌트 | 해결하는 문제 |
|---|---|
| 🔁 그래프(State·Node·Edge·Cycle) | 조건 분기·루프·자동 재시도, Agentic RAG → ReAct |
| 🔧 도구 + MCP | 외부 API·DB 호출, FastMCP로 사내 DB를 표준 프로토콜로 노출 |
| ⚙️ 미들웨어 + 체크포인터 + HITL + 가드레일 + State 제어 | 호출 전후 훅, 대화 상태 저장·복구, 위험 작업 사람 승인, PII·인젝션 차단, 메시지 다듬기 |
| 👥 멀티 에이전트 + Circuit Breaker | Supervisor·Network·Hierarchical·Subgraph 협업 + 장애 격리 |
| 📋 플래닝 + 장기 메모리 | Plan-and-Execute·Replanner·ReWOO 로 작업 분해, LangMem으로 사용자 선호 영구 기억 |
| 📊 관찰성 + 평가 | LangSmith 트레이싱·프롬프트 Hub, RAGAS 4지표, LLM-as-Judge, 벤치마크/CI |
| 🚀 서비스화 | langgraph dev 한 줄로 HTTP 서비스 + Chat UI + ngrok 외부 노출 |
🌟 ReAct — 추론과 행동의 결합
2022년 구글의 Yao et al.가 발표한 ReAct 논문은 에이전트의 핵심 패턴을 정립했습니다.
Reasoning + Acting — LLM이 생각하고(Thought) → 행동하고(Action) → 관찰(Observation)을 반복복사
사용자: "지오의 이메일 주소 알려줘"
[Thought] 사용자가 직원 이메일을 물어봤다. 사내 디렉토리를 검색해야겠다.
[Action] search_employee(name="지오")
[Observation] {"name": "지오", "email": "[email protected]", "team": "dev"}
[Thought] 정보를 찾았다. 사용자에게 전달하면 된다.
[최종 답] 지오의 이메일은 [email protected] 입니다.
이 사이클이 ReAct의 본질입니다. 그리고 이 사이클을 잘 돌리기 위해 LangChain·LangGraph 같은 프레임워크가 만들어졌습니다.
이처럼 LLM + 다양한 컴포넌트가 합쳐진 시스템이 곧 우리가 부르는 에이전트(Agent) 입니다.
[ LLM ] → 말 잘하는 챗봇
[ LLM + 도구 ] → 검색·계산하는 챗봇
[ LLM + 도구 + 루프 ] → 스스로 시도/수정하는 봇
[ LLM + 도구 + 루프 + 메모리 + 플래닝 ] → 진짜 에이전트
🎬 실제 사례 — Cursor, Devin, Perplexity
요즘 가장 화제인 AI 제품들도 모두 이 구조입니다.
- Perplexity = LLM + 웹 검색 도구 + 인용 처리. 단일 도구지만 강력.
- Cursor = LLM + 파일시스템 도구 + 코드 실행 + 메모리(프로젝트 컨텍스트). IDE 안에서 동작.
- Devin = LLM + 터미널 + 브라우저 + 에디터 + 플래닝 + 멀티스텝 실행. 풀스택 에이전트.
이들은 모두 “LLM 한 번 호출” 이 아니라 “LLM을 중심으로 한 시스템” 입니다.
이렇게 발전해 오고 있는 것입니다.