공부할 챕터
챕터 | 주제 | 실무 연계 포인트 | 미니 프로젝트 |
1 | RAG & Agent 구조 개념 | 실무용 LLM 설계 철학 이해 | 없음 |
2 | LangChain & LangGraph 구조 분석 | 실전 Agent 개발 기반 | Agent 구조도 시각화 |
3 | 문서 임베딩 & 벡터 DB | 사내 문서 RAG 구축 핵심 | 회사 정책 RAG 검색기 |
4 | RAG 파이프라인 구조화 | 실전 검색 + 생성 흐름 튜닝 | 고객문의 자동응답 Agent |
5 | Prompt/Context Engineering | Prompt 전략에 따른 결과 차이 실험 | Prompt 최적화 실험툴 |
6 | LLM 파인튜닝 & LoRA | 맞춤형 Agent 개발 | 사용자 응대 특화 LLM |
7 | AI Agent 평가와 모니터링 | KPI 정의, Ragas, eval 도입 | Agent 평가 자동화 스크립트 |
8 | 보안, 프라이버시, 권한관리 | 실무 배포 전 필수 고려사항 | 사용자 인증 포함한 Agent |
9 | Docker + 배포 구조 | 온프레미스, 클라우드 환경 전개 | 로컬 RAG Agent 배포 |
10 | 종합 프로젝트 | 제품 수준 Agent 구현 | 기업형 RAG AI Agent 완성 |
자 이제 프로젝트 작게작게하면서 머신러닝을 좀더 공부해보자!
LLM의 한계: 왜 RAG가 필요할까?
기존 LLM 사용 방식
대화형 AI를 만들고싶당 → GPT API를 연결한다 → Prompt 작성 → 답을 받아본다!
이런 방식은 아주 치명적인 3가지 실무 한계가 있다!!
문제 | 설명 | 실무 예시 |
1. 최신/사내 정보 없음 | LLM은 훈련 시점의 정보만 기억함 | 회사 제품 정보는 GPT가 모름 |
2. 맥락 유지 어려움 | 긴 대화나 문서를 잘 기억 못함 (Token 제한) | 정책 문서 요약, 긴 대화 처리 실패 |
3. 제어 어려움 | 답변의 정확도/논리성을 완전히 통제하기 어려움 | 고객 응대에서 사실과 다름 |
그래서 등장한 기술이 RAG(Retrieval-Augmented Generation) 이다!
RAG가 뭔데!
외부 지식베이스에서 관련 정보를 검색해 LLM의 답변 생성에 활용하는 구조
사용자 질문 -> 관련 문서 검색(Retriever) -> LLM(Generator) -> 최종 답변
Retriever: 백터 DB에서 관련 문서들을 검색한다.
LLM: 검색된 문서들을 Context로 넣어 답변을 생성한다.
그래서 RAG는 왜 필요한데?
방식 | 장점 | 단점 | 사용 시기 |
In Context Learning | 빠름, 코드만 작성 | Token제한, 비쌈 | 간단한 작업, 빠른 prototyping |
Fine Tuning | 구조 자체 변경, 맞춤형 응답 | 고비용, 시간/자원 | 도메인 특화 대응 |
RAG | 최신 문서 반영 가능, 제어 용이 | 검색 품질에 민감 | 사내 데이터 활용, 정확성 요구 |
결론: RAG는 LLM을 수정하지 않고도 지식 반영/갱신/제어가 가능하다.
RAG의 핵심 요소: RAG는 검색 품질이 전부라고 해도 과언이 아니다!
- Chunking: 문서 쪼개는 방식 (Sliding, Recursive 등)
- Embedding: 텍스트 -> 백테 변환 (OpenAI, Cohere 등)
- Retriever: 유사 문서 검색 방식 (KNN, hybrid, rerank)
- Prompt Template: 문서 context 구성 방식
사내 QA Agent를 설계해보자
고려사항
- 문서 포맷: PDF, PPTX, Excel 등
- 사내망 보안: 인터넷 미연결 환경에서도 동작해야함 (on-premise)
- 성능: 1초 이내 응답 요구
- 확장성: 부서별 문서 필터링, 사용자 권한 반영 필요
Retrieval 파라미터가 결과에 미치는 영향
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
Top-k를 1, 3, 5로 바꾸며 답변 비교해 보거나 Chunk Size를 256, 512, 1024로 변경해보며 정보 손실 체크해보자
실무에서는 k=1일 때 정확성이 증가하지만 맥락이 부족하다. Chunk size가 작을수록 빠르지만 맥락 손실이 있을 수 있다.
왜 Chunking이 중요할까?
- LLM은 Token 제한이 있다!
- GPT-4-turbo의 경우 128k token 까지 지원하지만 보통 4k ~ 8k token에 제한된다.
- 긴 문서를 직접 넣을 수 없기 째문에 쪼개야 한다.
- 쪼갤 때 정보 손실이 생길 수 있다.
- 어떤 개념이 여러 문단에 걸쳐 성명될 경우 중간에 쪼개면 문맥이 날라간다.
- 이걸 semantic drift 또는 context fragmentation 이라고 한다.
- 검색의 정확도와 성능에 직접적인 영향을 준다.
- Chunk가 너무 크면 정확도는 높을 수 있지만 처리량이 줄고 유사도 검색 효율이 낮아진다.
- Chunk가 너무 작으면 문맥이 부족해서 정확도가 떨어진다.
일단 해보기
일단 내가 수동으로 청크를 직접 나눈거다!
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. 문장 임베딩 모델
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. 텍스트 청크들
chunks = [
"신입사원의 연차는 입사 후 1개월부터 발생합니다.",
"연차 신청은 최소 2주 전에 해야 합니다.",
"회사 보안 정책은 클라우드 시스템을 통해 데이터가 관리됩니다.",
"원격 근무는 주 2회 가능합니다.",
]
# 3. 벡터로 변환
embeddings = model.encode(chunks)
# 4. FAISS 인덱스 생성
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(embeddings))
# 5. 검색 함수 정의
def search(query: str, top_k: int = 3):
query_emb = model.encode([query])
D, I = index.search(query_emb, top_k)
print(f"\n🔍 Query: {query}\n")
for i, idx in enumerate(I[0]):
print(f"Top-{i+1} chunk (거리: {D[0][i]:.4f})")
print(f"> {chunks[idx]}\n")
# 6. 예시 실행
search("연차 신청 절차가 어떻게 되나요?")
결과
🔍 Query: 연차 신청 절차가 어떻게 되나요?
Top-1 chunk (거리: 0.4299) > 연차 신청은 최소 2주 전에 해야 합니다.
Top-2 chunk (거리: 0.7366) > 회사 보안 정책은 클라우드 시스템을 통해 데이터가 관리됩니다.
Top-3 chunk (거리: 0.8173) > 신입사원의 연차는 입사 후 1개월부터 발생합니다.
실제 LLM 기반 시스템에서는!!?
실무에서는 보통 아래처럼 청크를 나눈다!
- 문단 기준: \n\n을 기준으로 문서를 문단 단위로 분리
- 문장 기준: 마침표(., !, ?)등을 기준으로 분리
- 토큰 수 기준: OpenAI나 HuggingFace의 토크나이저로 토큰 수를 세고, 500 토큰 단위로 쪼갬
- 문맥 기반 분리: LangChain의 RecursiveCharacterTextSpliter 같은 도구가 쓰인다.
위 실습으로 실험할 수 있던 것은 Chunk Size를 다르게 하면 정보 손실이 생길 수 있다는 것이다!
Overlap을 주면 앞뒤 문맥이 유지되어 성능 향상이 가능하다.
저 거리 계산은 뭐야?
저 거리는 벡터로 바꾼 문장들 사이의 L2거리 (Euclidean Distance)를 사용하고 있다!
예를 들어서 두 벡터가 있다고 치자!
A = [1, 2, 3]
B = [4, 6, 9
이 두 벡터 간의 L2 거리는 다음 공식으로 계산 된다.
즉 벡터간의 물리적 거리를 의미한다!
그럼 왜 L2 거리를 쓰는거야? 라고 물어볼 수 있지?
위에 사용한 faiss.IndexFlatL2는 L2 거리 기반으로 벡터 간의 차이를 측정 한다.
거리가 작을 수록 더 비슷한 문장
거리가 클수록 더 다른 문장
L2는 직관적이고 빠르고 문장 임베딩과 잘 맞는다! 그래서 L2를 사용한다!
L2 거리 와 코사인 유사도까지 비교해보자!
비교 항목 | L2 거리 | 코사인 유사도 |
의미 | 벡터 간 거리 | 벡터 간 각도 |
값 범위 | 0 이상 (작을수록 유사) | -1 ~ 1 (클수록 유사) |
예시 사용처 | FAISS IndexFlatL2 | 문장 유사도 비교 등 |
특징 | 벡터의 크기까지 고려 | 벡터의 방향만 고려 (크기 무시) |
많이 알아본거같다 그만알아보자!
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > AI' 카테고리의 다른 글
[AI] 챕터01 - RAG & AI Agent 구조-2 (5) | 2025.07.30 |
---|---|
[AI] 챕터08 - 과적합과 일반 (2) | 2025.07.24 |
[AI] 챕터07 - 대표 알고리즘 (5) | 2025.07.22 |
[AI] 챕터06 - 성능 평가 (7) | 2025.07.21 |
[AI] 챕터05 - 학습과 예측 (3) | 2025.07.17 |
댓글