yonchelee.com 프로젝트 ← 홈으로
🤖 AI Agent 제작 완전 가이드

Dataset에서 Agent까지
한 페이지로 끝내기

임베딩, Knowledge, Chunk, Top-K, 역할 설정, 프롬프트 강화까지
Agent를 만들기 위해 알아야 할 모든 개념을 순서대로 정리했다.

📂Dataset ✂️Chunking 🔢Embedding 🗄️Knowledge 🤖Agent
scroll
00 — 전체 파이프라인

Agent 제작 전체 흐름

Dataset을 가공해서 Knowledge를 만들고, 역할과 프롬프트를 더해 Agent를 완성한다.

Phase 1 — 인덱싱 (사전 구축)
📂
원본
Dataset
PDF, MD, CSV
DB, API
원본 문서
✂️
분할
Chunking
512 tokens
overlap 50
검색 단위 분할
🔢
변환
Embedding
의미 →
숫자 벡터
각 Chunk 벡터화
🗄️
저장
Vector DB
Chroma
Pinecone
Knowledge 완성
Phase 2 — 런타임 (질문 처리)
💬
입력
사용자 질문
"연차 며칠?"
🔢
변환
Embed 질문
질문도 벡터로
🔍
검색
Top-K 검색
유사 Chunk
k=3 반환
📋
조합
프롬프트 조합
System +
Chunk + 질문
🤖
생성
LLM 답변
최종 응답
01 — 집합 관계

세 개념의 포함 관계

Knowledge ⊃ Chunk ⊃ Embedding 순서의 계층 구조.

KNOWLEDGE BASE Dataset에서 구축한 정보 저장소 CHUNKS 검색 단위로 분할된 조각 EMBEDDING 벡터로 변환된 표현 [0.23, -0.45, 0.87...] ① Knowledge 가장 큰 집합 — 모든 정보 ② Chunks Knowledge 부분집합 검색 가능 단위로 분할 ③ Embedding 가장 작은 집합 Chunk의 수치 표현 포함 관계 Knowledge ⊃ Chunks ⊃ Embeddings ⊃ Vectors
🗄️
Knowledge Base
Agent가 참조하는 모든 정보의 집합. Dataset을 가공해서 만든다.
가장 큰 집합
✂️
Chunk
Knowledge를 검색 가능한 단위로 분할. 1개의 문서 = N개의 Chunk.
Knowledge의 부분집합
🔢
Embedding
각 Chunk를 고차원 숫자 벡터로 변환. 의미 유사도를 수치화해서 검색에 활용.
Chunk의 수치 표현
02 — 임베딩

Embedding 이란?

텍스트의 의미를 고차원 숫자 배열로 변환하는 기술. 의미가 비슷할수록 벡터 공간에서 가까이 위치한다.

📐 핵심 원리
텍스트 → [0.23, -0.45, 0.87, ...]
"강아지" ↔ "개" → 벡터 가까움 ✓
"강아지" ↔ "자동차" → 벡터 멀음 ✗
보통 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
✓ 정밀한 검색 ✗ 문맥 정보 부족
FAQ, 짧은 QA에 적합
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 파라미터로 조정.
크기토큰검색 정밀도문맥 품질추천 용도
Small128–256⭐⭐⭐⭐⭐⭐⭐FAQ, 단문 QA
Medium ★512–1024⭐⭐⭐⭐⭐⭐⭐⭐사내 문서, 매뉴얼
Large2048+⭐⭐⭐⭐⭐⭐⭐논문, 법률, 기술 명세
청킹 전략
✂️
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 = 11개빠름, 비용 낮음정보 부족단순 사실 확인
K = 3 ★3개균형-일반 QA (기본값)
K = 5~105~10개풍부한 문맥비용 증가, 노이즈복잡한 질문
⚠️
K가 너무 크면?
관련 없는 Chunk도 포함되어 LLM이 혼란. 노이즈 증가로 오히려 답변 품질 저하. 토큰 비용도 상승.
💡
Re-ranking으로 보완
Top-K로 넉넉히 가져온 뒤 Re-ranking 모델로 재정렬. 정밀도와 문맥 풍부함을 동시에 확보.
05 — Agent 설정

Agent 역할 설정

Knowledge와 프롬프트를 연결해 완성되는 Agent. 역할(Persona), 제약(Constraint), 도구(Tool) 설정이 핵심이다.

PERSONA
🎭 역할 / 페르소나
Agent가 "누구"인지 정의. 이름, 직책, 말투, 전문 분야를 지정.

예: "당신은 XX회사의 HR 담당 어시스턴트입니다. 정확하고 친절하게 답변하세요."
CONSTRAINT
🚧 제약 / 범위 설정
답변 범위와 금지 사항을 명확히. 할루시네이션 방지와 범위 제한.

예: "제공된 문서에 없는 내용은 '확인이 필요합니다'라고 답하세요."
FORMAT
📋 출력 형식 지정
답변 길이, 구조, 언어를 지정. 일관된 UX를 위해 필수.

예: "답변은 3문장 이내로 작성하고, 핵심 정보는 bullet로 정리하세요."
TOOL USE
🔧 도구 사용 설정
Agent가 사용할 수 있는 도구 목록. 검색, 계산, API 호출 등.

예: 벡터 DB 검색, 날씨 API, 캘린더 조회 등.
MEMORY
💾 메모리 설정
대화 히스토리 유지 범위. 단기/장기 메모리 전략 선택.

예: 최근 5턴 유지, 중요 정보는 별도 저장.
FALLBACK
🛡️ 폴백 설정
모르는 질문, 범위 밖 질문에 대한 처리 방식.

예: "관련 문서를 찾지 못한 경우 담당자 연결을 안내하세요."
06 — 프롬프트 강화

프롬프트 설계 전략

좋은 프롬프트가 좋은 Agent를 만든다. System Prompt 구조화, RAG 연동, 출력 제어를 조합한다.

SYSTEM PROMPT 구조 예시 (RAG Agent)
당신은 XYZ회사의 HR 어시스턴트입니다. 직원들의 인사 관련 질문에 정확하고 친절하게 답변합니다. 항상 한국어로 답변하며, 전문 용어는 쉽게 설명합니다.
아래 참고 문서를 바탕으로 답변하세요: --- {retrieved_chunk_1} {retrieved_chunk_2} {retrieved_chunk_3} ---
1. 위 참고 문서에 없는 내용은 답변하지 마세요. 2. 모르는 경우 "확인이 필요합니다. HR팀(hr@xyz.com)에 문의해주세요" 3. 답변은 3문장 이내로 간결하게. 핵심은 bullet로 정리. 4. 개인정보(연봉, 평가 등)는 절대 언급 금지.
{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
🔢 Embedding
벡터 변환
🗄️ Knowledge
Vector DB
🤖 Agent
Role+Prompt+Top-K
CHUNK SIZE
작으면 정밀↑ 문맥↓
크면 문맥↑ 정밀↓
512~1024가 기본값
TOP-K
작으면 빠름 문맥↓
크면 풍부 노이즈↑
k=3이 일반 기본값
SYSTEM PROMPT
역할 + 제약 + 형식
RAG 결과 삽입
Fallback 처리 포함