에이전트
조립하기
시스템 프롬프트 · 지식베이스 · 도구
구성도를 읽고 프롬프트를 복사하면 된다.
에이전트의 정체
에이전트는 새로운 기술이 아니다. LLM 호출에 설정 세 개를 더한 것이 전부다.
시스템 프롬프트
역할, 제약, 가드레일. 프롬프트가 다르면 다른 에이전트다.
지식베이스
사내 위키, API 문서, 매뉴얼. RAG로 연결하면 에이전트만의 기억이 된다.
도구 세트
DB 조회, 메신저 알림, MCP 서버 연결. 도구가 다르면 능력이 다르다.
에이전트는 새로운 기술이 아니다. LLM 호출에 이름표를 붙인 것이다.
시스템 프롬프트 설계
시스템 프롬프트가 에이전트의 성격을 결정한다. 다섯 개의 계층으로 설계한다. 한 계층이라도 빠지면 에이전트가 예측 불가능하게 행동한다.
"너는 BACKEND 프로젝트의 Jira 이슈를 관리하는 AI다"
"이슈 삭제는 거부한다. 프로젝트 키 없이 생성하지 않는다"
"BACKEND, FRONTEND 프로젝트만 안다. 다른 프로젝트는 모른다고 답한다"
"이슈 생성 결과는 JSON, 요약은 자연어로 응답한다"
"확신이 없으면 확인을 요청한다. 도구를 5회 이상 연속 호출하면 중단하고 보고한다"
- "너는 도움이 되는 AI야."
- "사용자 요청을 처리해줘."
- 역할: Jira 이슈 관리 전담
- 제약: 삭제 거부, 키 필수
- 범위: BACKEND/FRONTEND만
- 형식: 생성=JSON, 요약=자연어
- 가드레일: 불확실하면 확인
- 역할이 넓을수록 좋다? — "뭐든 하는 AI"는 아무것도 잘 못 한다. 하나의 역할에 집중해야 도구 선택 정확도가 올라간다
- 제약을 안 써도 상식적으로 행동하겠지? — LLM에게 상식은 없다. 명시하지 않은 행동은 한다. "삭제 금지"를 안 쓰면 삭제한다
- 출력 형식을 안 정하면? — "이슈를 만들었습니다!" vs JSON 응답. 후속 처리가 불가능해진다. 파싱할 거면 형식을 강제하라
대괄호 [ ] 안의 내용을 자신의 환경에 맞게 수정한 뒤, AI에 붙여넣으세요.
지식베이스 구축
LLM은 학습 데이터 밖의 것을 모른다. 사내 위키, API 문서, 온보딩 가이드를 연결하는 기술이 RAG(Retrieval-Augmented Generation)다. 문서를 쪼개고, 벡터로 바꾸고, 질문과 유사한 조각을 찾아 LLM에 건넨다.
PDF, Confluence, Notion, GitHub, Slack 히스토리
500~1000 토큰 단위 분할, 100 토큰 오버랩으로 맥락 보존
텍스트를 벡터(숫자 배열)로 변환 — 의미가 비슷하면 벡터도 가깝다
벡터를 인덱싱, 유사도 검색이 가능한 형태로 저장
질문 → 관련 청크 검색 → LLM 컨텍스트에 주입 → 답변 생성
어디에 저장할 것인가
- Pinecone — 관리형, 스케일 자동
- Chroma — 로컬, 프로토타이핑
- pgvector — 기존 PG 활용
- Weaviate — 하이브리드 검색
어떻게 벡터로 바꿀 것인가
- OpenAI — text-embedding-3
- Cohere — embed-v3, 다국어
- BGE / E5 — 오픈소스, 비용 0
어떤 도구로 조립할 것인가
- LangChain — 생태계 최대
- LlamaIndex — 문서 특화
- 직접 구현 — 의존성 최소
- 문서 업데이트 → 즉시 반영
- 비용: 벡터 DB + 검색 (낮음)
- 환각: 출처 명시로 검증 가능
- 자주 바뀌는 문서, FAQ에 적합
- 재학습 필요 (수일~수주)
- 비용: GPU 학습 (높음)
- 환각: 출처 추적 어려움
- 특수 도메인 용어, 톤 변경에 적합
대부분의 경우 RAG가 먼저다. 파인튜닝은 RAG로 해결이 안 될 때 — 도메인 전문 용어가 많거나, 응답 톤 자체를 바꿔야 할 때 검토한다.
대괄호 [ ] 안의 내용을 자신의 환경에 맞게 수정한 뒤, AI에 붙여넣으세요.
도구 — 안에서 vs 밖에서
에이전트의 능력은 도구가 결정한다. 도구를 연결하는 방법은 둘이다. 앱 안에서 Function Calling으로 직접 호출하거나, MCP 서버로 분리해서 연결하거나. 핵심 질문은 하나다 — 이 도구를 안에 넣을까, 밖에 둘까.
- 같은 프로세스에서 실행
- 지연 시간 최소
- 이 앱에서만 사용
- 배포 단위 = 하나
- 비즈니스 로직 특화
- JSON-RPC로 통신
- 여러 클라이언트에서 재사용
- 독립 배포, 독립 관리
- Claude Desktop/Cursor에서도 사용
- 범용 도구 특화
판단 기준은 단순하다.
- 여러 앱에서 같은 도구를 공유한다 → MCP
- 이 앱에서만 쓰는 비즈니스 로직이다 → 내장
- Claude Desktop이나 Cursor에서도 쓰고 싶다 → MCP
- 지연 시간이 1ms라도 중요하다 → 내장
- 팀이 도구를 독립 배포하고 관리한다 → MCP
- 혼자 빠르게 프로토타이핑한다 → 내장
현실에서는 둘을 섞는다. 비즈니스 로직은 내장, 외부 서비스 연동은 MCP. 이 구조가 가장 실용적이다.
내장 도구 (견적 계산, 권한 검증, 비즈니스 규칙) + MCP 클라이언트
GitHub (이슈/PR) · Slack (메시지) · Jira (이슈) · DB (쿼리) · 사내 위키 (검색)
- 전부 MCP로 만든다 — 프로세스 간 통신 오버헤드, 배포 복잡도 폭증. 내부 로직까지 MCP로 분리하면 오버엔지니어링이다
- 전부 내장한다 — 앱이 비대해지고 재사용이 불가능하다. 다른 앱에서 같은 도구가 필요하면 코드를 복사하게 된다
- description을 대충 쓴다 — LLM은 description만 읽고 도구를 고른다. "Creates issue"로는 판단이 불가능하다. "Jira에 Bug/Task/Story 이슈를 생성합니다. 프로젝트 키와 제목이 필수입니다"처럼 써야 한다
대괄호 [ ] 안의 내용을 자신의 환경에 맞게 수정한 뒤, AI에 붙여넣으세요.
Function Calling에 while 루프를 감으면 에이전트가 된다. 텍스트가 올 때까지 도구를 반복 실행한다.
전체 조립
세 장의 설정을 조립하면 이렇게 된다.
자연어 요청 — "로그인 500 에러, 이슈 만들어줘"
시스템 프롬프트 (성격/제약/가드레일) · 지식베이스 (RAG + 벡터 DB) · 내장 도구 (비즈니스 로직) · MCP 클라이언트 (외부 연결)
GPT-4o / Claude / Gemini — 텍스트 응답 또는 tool_call 반환
GitHub · Slack · Jira · DB · 사내 위키
아래 프롬프트 하나로 시스템 설계, 기술 스택, 비용 추정까지 받을 수 있습니다.
프롬프트가 성격을 정하고, 지식이 기억을 채우고, 도구가 손발이 된다. 나머지는 조립이다.
구조는 보여줬다
나머지는 조립이다
프롬프트를 복사하고, 대괄호를 채우고, AI에게 건네라.