AI 에이전트를 만드는 4단계 — Prompt, Context, Loop, Graph Engineering 쉽게 이해하기
2026.08.17. AI
- AI
- 프롬프트 엔지니어링
- 컨텍스트 엔지니어링
- 에이전트
요즘 AI 에이전트 관련 글을 읽다 보면 “프롬프트 엔지니어링”, “컨텍스트 엔지니어링”, “루프 엔지니어링”, “그래프 엔지니어링”이라는 말이 계속 나와요. 다 비슷비슷해 보이는데 정확히 뭐가 다른 건지 헷갈려서, 앤트로픽 공식 글들을 근거로 하나씩 정리해봤어요.
먼저 결론부터 말하면, 이 네 가지는 AI에게 일을 맡길 때 “무엇을 정교하게 다듬을 것인가”가 점점 넓어지는 순서예요.
| 단계 | 무엇을 다듬나 | 한 줄 비유 |
|---|---|---|
| Prompt Engineering | AI에게 주는 지시문 한 장 | 신입사원에게 업무 지시서 잘 써주기 |
| Context Engineering | AI가 매 순간 보고 있는 정보 전체 | 책상 위에 필요한 자료만 딱 올려두기 |
| Loop Engineering | AI가 반복 작업하는 절차 | 요리사가 간 보고 다시 조리하는 루틴 |
| Graph Engineering | 여러 작업을 역할별로 나누고 연결하는 구조 | 회사 조직도처럼 업무를 부서별로 쪼개기 |
하나씩 쉽게 풀어볼게요.
1. Prompt Engineering — 지시문을 잘 쓰는 기술
프롬프트 엔지니어링은 AI에게 주는 지시문(prompt) 한 장을 최대한 명확하게 쓰는 기술이에요. 앤트로픽 공식 문서는 이걸 아주 쉬운 비유로 설명해요.
Claude를 “우리 회사 관행은 전혀 모르는, 똑똑하지만 갓 입사한 신입사원”이라고 생각하세요.
똑똑한 사람이라도 맥락을 모르면 엉뚱한 결과를 낼 수 있죠. 그래서 지시를 구체적으로, 명확하게 줘야 해요.
대표적인 기법들
- 명확하고 직접적으로 쓰기: “대시보드 만들어줘”보다 “어떤 기능이 필요한지, 어떤 형식으로 결과를 줄지”까지 구체적으로 써요.
- 맥락(이유) 함께 주기: “말줄임표 쓰지 마”보다 “이 글은 음성으로 읽힐 거라 말줄임표를 쓰면 안 돼”처럼 왜 그래야 하는지 설명하면, AI가 그 이유를 이해하고 비슷한 상황에도 스스로 응용해요.
- 예시(few-shot) 보여주기: 원하는 형식의 예시를 2~5개 정도 보여주면, 백 마디 설명보다 훨씬 정확하게 따라 해요.
- XML 태그로 구조 나누기:
<instructions>,<context>,<example>처럼 태그로 감싸주면 AI가 “이건 지시고, 이건 참고 자료구나”를 헷갈리지 않고 구분해요. - 역할(role) 부여하기: “너는 파이썬 전문 코딩 어시스턴트야”처럼 한 문장만 줘도 답변의 톤과 관점이 확 달라져요.
이 기법들은 지시문 한 번을 잘 쓰는 데 집중해요. 그런데 AI가 여러 단계에 걸쳐 도구를 쓰고, 대화가 길어지고, 파일을 읽고 쓰기 시작하면 — 지시문 하나만 잘 써서는 부족해져요. 여기서 다음 단계인 컨텍스트 엔지니어링이 필요해져요.
2. Context Engineering — AI가 보는 정보 전체를 관리하는 기술
컨텍스트 엔지니어링은 앤트로픽이 “프롬프트 엔지니어링의 자연스러운 다음 단계”라고 설명하는 개념이에요. 지시문 한 장뿐 아니라, AI가 답을 낼 때 실제로 보고 있는 모든 정보(시스템 지시사항, 도구 목록, 대화 기록, 파일 내용 등)를 어떻게 정리해서 보여줄지를 다루는 기술이에요.
왜 필요할까 — Context Rot
사람도 책상에 자료가 산더미처럼 쌓여 있으면 오히려 필요한 걸 못 찾잖아요. AI도 비슷해요. 앤트로픽은 이걸 컨텍스트 부패(Context Rot)라고 불러요 — 넣어주는 정보(토큰)가 많아질수록, 오히려 AI가 정말 중요한 내용을 놓치는 정확도가 떨어지는 현상이에요.
그래서 컨텍스트는 “무조건 많이”가 아니라 한정된 자원으로 다뤄야 해요. 정보 하나를 추가할 때마다 AI의 “집중력 예산”을 쓰는 셈이거든요.
대표적인 기법들
- 필요할 때만 가져오기(Just-in-Time Retrieval): 관련 자료를 미리 다 욱여넣는 대신, 파일 경로나 검색 키워드 같은 가벼운 정보만 들고 있다가, 진짜 필요한 순간에 도구로 찾아서 가져와요. 도서관에서 책을 통째로 복사해두지 않고, 필요할 때 서가에서 딱 그 책만 꺼내오는 것과 비슷해요.
- 압축(Compaction): 대화가 길어지면, 지금까지의 대화를 요약해서 핵심(결정된 사항, 아직 안 풀린 문제)만 남기고 나머지는 정리해요.
- 메모 남기기(Structured Note-Taking): AI가 작업 중간중간
TODO.md같은 메모를 남겨두면, 나중에 맥락이 리셋돼도 그 메모를 다시 읽고 이어서 작업할 수 있어요. - 부분 에이전트로 나누기(Sub-Agent): 하나의 AI가 모든 탐색 과정을 다 짊어지는 대신, 전문화된 “부분 에이전트”에게 조사를 맡기고, 결과를 짧게 요약해서만 돌려받아요. 탐색 과정에서 생기는 지저분한 정보는 부분 에이전트 안에 격리되는 거예요.
3. Loop Engineering — 스스로 확인하고 반복하는 절차를 설계하는 기술
루프 엔지니어링은 “AI가 멈출 조건을 만족할 때까지 작업을 반복하는 절차”를 설계하는 기술이에요. Claude Code 팀은 이 절차를 네 단계로 정의해요.
1. Gather context (상황 파악) — 지금 뭘 알아야 하는지 확인한다
2. Take action (행동 실행) — 코드 수정, 파일 생성 같은 실제 작업을 한다
3. Verify work (결과 검증) — 테스트를 돌리거나 결과를 스스로 확인한다
4. Repeat (필요시 반복) — 검증에 실패하면 1번부터 다시
요리사가 요리를 하고, 맛을 보고, 간이 부족하면 다시 조리하는 과정과 똑같아요. 핵심은 3번 “Verify work”예요 — AI가 스스로 결과를 확인하는 단계가 없으면, 반복해봤자 품질이 좋아지지 않고 제자리걸음만 해요. 검증 방법에는 린트/테스트 같은 규칙 기반 확인, 스크린샷으로 보는 시각적 확인, 다른 AI 모델이 품질을 평가하는 “LLM 심사” 등이 있어요.
루프의 네 가지 종류
| 종류 | 언제 실행되나 | 예시 |
|---|---|---|
| Turn-based | 사용자가 입력할 때마다 | 챗봇 대화 |
| Goal-based | 목표를 달성할 때까지 | “테스트가 다 통과할 때까지 코드 고쳐” |
| Time-based | 정해진 시간마다 | 매일 아침 리포트 생성 |
| Proactive | 조건이 감지되면 자동으로 | 에러 로그 발생 시 자동 대응 |
루프에는 반드시 “멈추는 조건”이 있어야 해요. 종료 조건이 불명확하면 AI가 일찍 멈춰버리거나, 반대로 끝없이 맴돌 수 있거든요.
4. Graph Engineering — 작업을 나누고 연결하는 구조를 설계하는 기술
여기까지는 AI 하나가 얼마나 똑똑하게 일하는지에 대한 이야기였어요. 그런데 작업이 커지면 질문이 달라져요 — “이 많은 일을 정말 AI 하나가 다 처리하는 게 맞을까?”
단일 에이전트의 한계 — 백엔드 개발자 관점에서
이건 백엔드 개발에서 익숙한 문제예요. 회원가입, 결제, 알림, 재고 관리를 전부 처리하는 함수 하나를 상상해볼게요.
function handleEverything(request) {
// 회원가입 로직 200줄
// 결제 로직 300줄
// 알림 로직 150줄
// 재고 관리 로직 250줄
// 그 사이를 넘나드는 if-else 분기 수십 개...
}
이런 “갓 함수(God Function)“에서 결제가 실패하면 무슨 일이 생길까요?
- 어디서 실패했는지 잘 안 보여요. 결제 로직인지, 그 앞의 재고 확인 로직인지 로그를 다 뒤져야 해요.
- 일부만 고치기가 무서워요. 결제 로직을 고쳤는데 알림 로직에 영향을 줄지 안 줄지 확신할 수 없어요.
- 일부만 따로 테스트하기 어려워요. 회원가입만 테스트하고 싶어도 전체를 다 실행해야 해요.
그래서 백엔드에서는 이걸 회원가입 서비스, 결제 서비스, 알림 서비스로 나누고, 그 사이를 API 호출이나 이벤트로 연결하죠. AI 에이전트도 똑같은 문제를 겪어요. 하나의 에이전트가 계획·검색·코드 작성·검증을 전부 떠맡으면, 실패했을 때 어느 단계가 문제였는지 파악하기 어렵고, 컨텍스트도 뒤죽박죽 섞여서 앞서 본 Context Rot이 더 빨리 와요.
그래서 나온 게 그래프 엔지니어링
그래프 엔지니어링은 하나의 AI에게 모든 일을 맡기는 대신, 작업을 여러 조각(노드)으로 나누고 그 사이를 잇는 이동 규칙(엣지)을 설계하는 방식이에요. 네 가지 요소로 이루어져요.
| 요소 | 의미 | 백엔드 비유 |
|---|---|---|
| Node(노드) | 작업 하나의 단위 (LLM 호출, 도구 실행 등) | 함수 하나, 마이크로서비스 하나 |
| Edge(엣지) | 다음 노드로 넘어가는 연결선 | API 호출, 이벤트 전달 |
| State(상태) | 지금까지 쌓인 데이터/진행 상황 | 요청 객체, DB의 현재 행 값 |
| Condition(조건) | 어느 엣지로 갈지 판단하는 기준 | if (결제성공) 배송준비 else 결제실패 |
이 구조는 사실 백엔드에서 흔히 쓰는 **상태 머신(State Machine)**과 거의 똑같아요. 주문 처리를 예로 들면 이렇게 그릴 수 있어요.
[결제대기] --(결제 성공)--> [배송준비] --(출고 완료)--> [배송중] --(수령 확인)--> [배송완료]
|
└--(결제 실패)--> [결제실패]
각 대괄호가 노드, 화살표가 엣지, 화살표 위 조건이 Condition, 지금 어느 칸에 있는지가 State예요. 이 구조 그대로를 AI 에이전트에 적용한 게 그래프 엔지니어링이에요. (draft에 적어두신 것처럼, 진행 경로가 상황에 따라 달라진다는 점에서 다이나믹 워크플로우와 개념이 비슷해요 — 그래프가 곧 “상황별로 달라지는 작업 흐름”인 거예요.)
참고: “그래프 엔지니어링”이라는 용어 자체는
한 가지 짚고 넘어갈게요. “그래프 엔지니어링”이라는 이름 자체는 앤트로픽이 공식적으로 쓰는 용어는 아니에요. 대신 앤트로픽은 Building Effective Agents라는 글에서 같은 개념을 워크플로우 패턴이라는 이름으로 다섯 가지로 정리해요. 이게 사실상 그래프의 각기 다른 모양이에요.
| 패턴 | 그래프 모양 | 언제 쓰나 |
|---|---|---|
| Prompt Chaining | 노드가 일렬로 연결 (A → B → C) | 순서가 고정된 단계로 나눌 수 있을 때 |
| Routing | 조건에 따라 갈라지는 분기 | 입력 유형별로 다른 처리가 필요할 때 |
| Parallelization | 여러 노드가 동시에 실행 후 합류 | 독립적인 작업을 동시에 처리해도 될 때 |
| Orchestrator-Workers | 중심 노드가 작업자 노드들에게 동적으로 업무 분배 | 필요한 하위 작업을 미리 예측할 수 없을 때 |
| Evaluator-Optimizer | 두 노드가 서로 피드백을 주며 순환 | 명확한 평가 기준이 있고 반복 개선이 유효할 때 |
실제로 LangGraph 같은 프레임워크가 이 패턴들을 정확히 “노드-엣지-상태-조건”이라는 문자 그대로의 그래프 구조로 구현하고 있어요. 그래서 draft에 적어주신 표현(“Node-Edge-State-Condition”)은 정확히 이 프레임워크들이 쓰는 용어예요.
워크플로우 vs 자율 에이전트
앤트로픽은 이 글에서 중요한 구분을 하나 더 해요.
- 워크플로우(Workflow): 미리 정해진 경로(그래프)를 따라 움직여요. 예측 가능하고 비용도 적게 들어요.
- 자율 에이전트(Autonomous Agent): AI가 스스로 계획을 세우고, 다음에 뭘 할지 그때그때 판단해요. 유연하지만 비용이 더 들고 오류가 누적될 위험도 있어요.
앤트로픽의 원칙은 명확해요 — “가장 단순한 해결책부터 시작하고, 성능 개선이 확실할 때만 복잡도를 높여라.” 즉, 굳이 자율 에이전트나 복잡한 그래프가 필요 없는 일까지 무리해서 에이전트로 만들 필요는 없어요.
정리하며
네 가지를 한 문장씩으로 요약하면 이래요.
- Prompt Engineering: 지시문 한 장을 명확하게 쓴다.
- Context Engineering: AI가 매 순간 보는 정보 전체를 필요한 만큼만 유지한다.
- Loop Engineering: 상황 파악 → 행동 → 검증 → 반복의 절차와 멈출 조건을 설계한다.
- Graph Engineering: 큰 작업을 노드로 쪼개고, 조건에 따라 이동하는 엣지로 연결한다.
이 네 가지는 순서대로 쌓이는 관계예요 — 지시문이 잘못되면 컨텍스트도 소용없고, 컨텍스트가 뒤죽박죽이면 아무리 루프를 돌려도 품질이 안 좋고, 루프 하나로 감당 안 되는 큰 작업은 그래프로 쪼개야 해요. 그래서 실제로 복잡한 AI 에이전트를 설계할 때는 이 네 가지를 함께 고려하게 되는 것 같아요.
다음에 더 파볼 것
- Orchestrator-Workers 패턴을 실제로 LangGraph나 Claude Agent SDK로 구현하면 어떤 코드가 될까?
- Sub-Agent 구조에서 “부분 에이전트 결과를 요약해서 돌려받는다”는 건 실제로 얼마나 많은 토큰을 절약해줄까?
- 워크플로우(그래프)와 자율 에이전트를 섞어 쓰는 하이브리드 설계는 실무에서 어떻게 만들어질까?
참고한 글
- Effective context engineering for AI agents — Anthropic
- Building Effective AI Agents — Anthropic
- Loop engineering: Getting started with loops — Claude
- Building agents with the Claude Agent SDK — Claude
- Prompting best practices — Claude Platform Docs