🤖 AI Agent 제작 완전 가이드
Dataset에서 Agent까지
한 페이지로 끝내기
임베딩, Knowledge, Chunk, Top-K, 역할 설정, 프롬프트 강화까지
Agent를 만들기 위해 알아야 할 모든 개념을 순서대로 정리했다.
scroll
00 — 전체 파이프라인
Agent 제작 전체 흐름
Dataset을 가공해서 Knowledge를 만들고, 역할과 프롬프트를 더해 Agent를 완성한다.
Phase 1 — 인덱싱 (사전 구축)
원본
Dataset
PDF, MD, CSV
DB, API
DB, API
원본 문서
→
분할
Chunking
512 tokens
overlap 50
overlap 50
검색 단위 분할
→
변환
Embedding
의미 →
숫자 벡터
숫자 벡터
각 Chunk 벡터화
→
저장
Vector DB
Chroma
Pinecone
Pinecone
Knowledge 완성
Phase 2 — 런타임 (질문 처리)
입력
사용자 질문
"연차 며칠?"
→
변환
Embed 질문
질문도 벡터로
→
검색
Top-K 검색
유사 Chunk
k=3 반환
k=3 반환
→
조합
프롬프트 조합
System +
Chunk + 질문
Chunk + 질문
→
생성
LLM 답변
최종 응답
01 — 집합 관계
세 개념의 포함 관계
Knowledge ⊃ Chunk ⊃ Embedding 순서의 계층 구조.
Knowledge Base
Agent가 참조하는 모든 정보의 집합. Dataset을 가공해서 만든다.
가장 큰 집합Chunk
Knowledge를 검색 가능한 단위로 분할. 1개의 문서 = N개의 Chunk.
Knowledge의 부분집합Embedding
각 Chunk를 고차원 숫자 벡터로 변환. 의미 유사도를 수치화해서 검색에 활용.
Chunk의 수치 표현02 — 임베딩
Embedding 이란?
텍스트의 의미를 고차원 숫자 배열로 변환하는 기술. 의미가 비슷할수록 벡터 공간에서 가까이 위치한다.
📐 핵심 원리
텍스트 → [0.23, -0.45, 0.87, ...]
"강아지" ↔ "개" → 벡터 가까움 ✓
"강아지" ↔ "자동차" → 벡터 멀음 ✗
보통 1,536차원 벡터
"강아지" ↔ "개" → 벡터 가까움 ✓
"강아지" ↔ "자동차" → 벡터 멀음 ✗
보통 1,536차원 벡터
🎯 왜 필요한가
키워드 검색은 동의어를 못 찾는다.
임베딩은 의미 기반이라 "연차" 검색에 "휴가 정책" 문서도 검색된다.
→ 의미 기반 유사도 검색 가능
임베딩은 의미 기반이라 "연차" 검색에 "휴가 정책" 문서도 검색된다.
→ 의미 기반 유사도 검색 가능
EMBEDDING — Python 예시
from langchain.embeddings import OpenAIEmbeddings
embed_model = OpenAIEmbeddings(model="text-embedding-3-small")
# 텍스트 → 벡터 변환
vector = embed_model.embed_query("연차는 며칠이야?")
# → [0.023, -0.145, 0.387, ...] (1536차원)
# 유사도 = 두 벡터의 코사인 거리 (1에 가까울수록 유사)
03 — Chunk
Chunk와 Chunk Size
긴 문서를 검색하기 좋은 크기로 잘라낸 조각. Chunk Size는 검색 정밀도와 문맥 품질에 직접 영향을 준다.
📄 원본 문서
회사의 연차 정책은 입사 1년 후부터 적용되며, 기본 15일이 제공됩니다. 미사용 연차는 이월 불가.
출장비 청구는 출장 후 5영업일 이내 제출. 항공권은 이코노미 클래스만 인정됩니다.
재택근무는 주 2회까지 허용. 사전에 팀장 승인 필요. 코어타임 오전 10시~오후 4시.
경조사 지원금: 결혼 50만원, 출산 30만원. HR 시스템에서 30일 이내 신청.
↓ Chunking (size=512, overlap=50) ↓
Chunk 1
연차 정책: 입사 1년 후 15일. 미사용 이월 불가.Chunk 2
출장비: 5영업일 이내. 이코노미만 인정.Chunk 3
재택근무: 주 2회. 팀장 승인. 코어타임 10~16시.Chunk 4
경조사: 결혼 50만, 출산 30만. 30일 이내.Chunk Size가 검색에 미치는 영향
같은 문서를 다른 크기로 잘랐을 때의 차이
Small — 128 tokens
C1
C2
C3
C4
C5
C6
C7
C8
Medium — 512 tokens ★
Chunk 1
Chunk 2
Chunk 3
Chunk 4
Large — 2048 tokens
Chunk 1 (대용량)
Chunk 2 (대용량)
Overlap — 경계 잘림 방지
앞뒤 Chunk와 일부 텍스트를 겹치게 저장해서 정보 손실 방지
Chunk 1
━━━━━
Chunk 2
━━━━━
Chunk 3
━━━━━
💡 overlap ~50~100 tokens 설정으로 경계에서 잘린 문맥 손실 보완. chunk_overlap 파라미터로 조정.
| 크기 | 토큰 | 검색 정밀도 | 문맥 품질 | 추천 용도 |
|---|---|---|---|---|
| Small | 128–256 | ⭐⭐⭐⭐⭐ | ⭐⭐ | FAQ, 단문 QA |
| Medium ★ | 512–1024 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 사내 문서, 매뉴얼 |
| Large | 2048+ | ⭐⭐ | ⭐⭐⭐⭐⭐ | 논문, 법률, 기술 명세 |
청킹 전략
Fixed-size
글자/토큰 수로 균등 분할. 가장 빠르다.
단순 / 빠름Semantic
임베딩 유사도로 경계 탐지. 정확도 최상.
정확도 최상Structure
제목/단락 구조 기준. MD·HTML에 최적.
구조 보존Recursive
구분자 우선순위로 시도. LangChain 기본값.
균형 / 추천04 — Top-K
Top-K 란?
사용자 질문과 가장 유사한 Chunk를 벡터 DB에서 K개 가져오는 것. K값이 클수록 더 많은 문맥을 LLM에 전달한다.
질문: "연차는 며칠이야?" → Top-K=3 검색 결과
벡터 DB에서 유사도 높은 순으로 K개 Chunk 반환
1
Chunk #3
연차 정책: 입사 1년 후 15일 제공. 미사용 이월 불가.유사도: 0.94
2
Chunk #7
반차 사용: 반일 단위 가능. 팀장 사전 승인 필요.유사도: 0.87
3
Chunk #11
병가 처리: 의사 진단서 제출 시 유급 처리.유사도: 0.76
Chunk #2
출장비 청구: 5영업일 이내 제출...유사도: 0.31
Chunk #9
재택근무: 주 2회. 팀장 승인 필요...유사도: 0.24
✅ 선택된 Top-3 Chunk가 LLM 프롬프트에 삽입됨 → LLM이 이 문맥을 바탕으로 답변 생성
| K 값 | Chunk 수 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|---|
| K = 1 | 1개 | 빠름, 비용 낮음 | 정보 부족 | 단순 사실 확인 |
| K = 3 ★ | 3개 | 균형 | - | 일반 QA (기본값) |
| K = 5~10 | 5~10개 | 풍부한 문맥 | 비용 증가, 노이즈 | 복잡한 질문 |
K가 너무 크면?
관련 없는 Chunk도 포함되어 LLM이 혼란. 노이즈 증가로 오히려 답변 품질 저하. 토큰 비용도 상승.
Re-ranking으로 보완
Top-K로 넉넉히 가져온 뒤 Re-ranking 모델로 재정렬. 정밀도와 문맥 풍부함을 동시에 확보.
05 — Agent 설정
Agent 역할 설정
Knowledge와 프롬프트를 연결해 완성되는 Agent. 역할(Persona), 제약(Constraint), 도구(Tool) 설정이 핵심이다.
PERSONA
🎭 역할 / 페르소나
Agent가 "누구"인지 정의. 이름, 직책, 말투, 전문 분야를 지정.
예: "당신은 XX회사의 HR 담당 어시스턴트입니다. 정확하고 친절하게 답변하세요."
예: "당신은 XX회사의 HR 담당 어시스턴트입니다. 정확하고 친절하게 답변하세요."
CONSTRAINT
🚧 제약 / 범위 설정
답변 범위와 금지 사항을 명확히. 할루시네이션 방지와 범위 제한.
예: "제공된 문서에 없는 내용은 '확인이 필요합니다'라고 답하세요."
예: "제공된 문서에 없는 내용은 '확인이 필요합니다'라고 답하세요."
FORMAT
📋 출력 형식 지정
답변 길이, 구조, 언어를 지정. 일관된 UX를 위해 필수.
예: "답변은 3문장 이내로 작성하고, 핵심 정보는 bullet로 정리하세요."
예: "답변은 3문장 이내로 작성하고, 핵심 정보는 bullet로 정리하세요."
TOOL USE
🔧 도구 사용 설정
Agent가 사용할 수 있는 도구 목록. 검색, 계산, API 호출 등.
예: 벡터 DB 검색, 날씨 API, 캘린더 조회 등.
예: 벡터 DB 검색, 날씨 API, 캘린더 조회 등.
MEMORY
💾 메모리 설정
대화 히스토리 유지 범위. 단기/장기 메모리 전략 선택.
예: 최근 5턴 유지, 중요 정보는 별도 저장.
예: 최근 5턴 유지, 중요 정보는 별도 저장.
FALLBACK
🛡️ 폴백 설정
모르는 질문, 범위 밖 질문에 대한 처리 방식.
예: "관련 문서를 찾지 못한 경우 담당자 연결을 안내하세요."
예: "관련 문서를 찾지 못한 경우 담당자 연결을 안내하세요."
06 — 프롬프트 강화
프롬프트 설계 전략
좋은 프롬프트가 좋은 Agent를 만든다. System Prompt 구조화, RAG 연동, 출력 제어를 조합한다.
SYSTEM PROMPT 구조 예시 (RAG Agent)
① ROLE — 역할 정의
당신은 XYZ회사의 HR 어시스턴트입니다.
직원들의 인사 관련 질문에 정확하고 친절하게 답변합니다.
항상 한국어로 답변하며, 전문 용어는 쉽게 설명합니다.
② CONTEXT — RAG 검색 결과 삽입
아래 참고 문서를 바탕으로 답변하세요:
---
{retrieved_chunk_1}
{retrieved_chunk_2}
{retrieved_chunk_3}
---
③ CONSTRAINT — 제약 조건
1. 위 참고 문서에 없는 내용은 답변하지 마세요.
2. 모르는 경우 "확인이 필요합니다. HR팀(hr@xyz.com)에 문의해주세요"
3. 답변은 3문장 이내로 간결하게. 핵심은 bullet로 정리.
4. 개인정보(연봉, 평가 등)는 절대 언급 금지.
④ USER — 사용자 질문
{user_question}
프롬프트 강화 기법
Few-shot 예시
좋은 Q&A 예시를 2~3개 포함. LLM이 원하는 답변 형식을 학습.
출력 품질 ↑↑Chain-of-Thought
"단계적으로 생각하세요"를 지시. 복잡한 질문의 추론 품질 향상.
논리적 답변출력 형식 강제
JSON, Markdown, Bullet 등 출력 형식을 명시. 파싱·UX 일관성 확보.
구조화 출력Temperature 조정
사실 기반 QA는 0.0~0.3. 창의적 작업은 0.7~1.0.
정확도 vs 창의성Hallucination 방지
"문서에 없으면 모른다고 하라" 지시. 출처 인용 요구로 근거 강제.
신뢰도 ↑Self-Reflection
답변 후 "충분히 응답했는지 확인하세요"를 추가. 품질 자체 점검.
자가 검증07 — 전체 코드
Dataset → Agent 완전 구현
인덱싱부터 Agent 역할 설정, Top-K 검색, 답변 생성까지 전체 파이프라인.
PHASE 1 — 인덱싱 (Dataset → Knowledge)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
# ① Dataset → Chunks
splitter = RecursiveCharacterTextSplitter(
chunk_size=512, # 문서 특성에 맞게 조정
chunk_overlap=50, # 경계 잘림 방지
separators=["\n\n", "\n", ".", " "]
)
chunks = splitter.split_documents(documents)
# ② Chunks → Embedding → Vector DB
vectordb = Chroma.from_documents(
documents=chunks,
embedding=OpenAIEmbeddings()
)
PHASE 2 — Agent 설정 & 런타임
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# ③ Agent 역할 설정 (System Prompt)
SYSTEM_PROMPT = PromptTemplate(
template="""당신은 XYZ회사의 HR 어시스턴트입니다.
아래 참고 문서를 바탕으로 정확하게 답변하세요.
[참고 문서]
{context}
규칙: 문서에 없으면 "확인이 필요합니다"라고 답하세요.""",
input_variables=["context", "question"]
)
# ④ LLM (temperature=0: 일관된 답변)
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# ⑤ Agent 완성
agent = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectordb.as_retriever(search_kwargs={"k": 3}),
chain_type_kwargs={"prompt": SYSTEM_PROMPT}
)
# ⑥ 실행
answer = agent.invoke("연차는 며칠이야?")
# → "입사 1년 후 15일이 제공됩니다."
전체 요약
Dataset → Agent 한 줄로 정리
5단계 파이프라인을 기억하자
📂 Dataset
→
✂️ Chunk
size & overlap
→
size & overlap
🔢 Embedding
벡터 변환
→
벡터 변환
🗄️ Knowledge
Vector DB
→
Vector DB
🤖 Agent
Role+Prompt+Top-K
Role+Prompt+Top-K
CHUNK SIZE
작으면 정밀↑ 문맥↓
크면 문맥↑ 정밀↓
512~1024가 기본값
크면 문맥↑ 정밀↓
512~1024가 기본값
TOP-K
작으면 빠름 문맥↓
크면 풍부 노이즈↑
k=3이 일반 기본값
크면 풍부 노이즈↑
k=3이 일반 기본값
SYSTEM PROMPT
역할 + 제약 + 형식
RAG 결과 삽입
Fallback 처리 포함
RAG 결과 삽입
Fallback 처리 포함