RAG(Retrieval-Augmented Generation)
- Retrieval (검색)
- Augmented (증강)
- Generation (생성)
RAG 프로세스
1. 전처리 작업
- LOAD (문서 로드)
- Document Loader 문서로드 선택시 고려사항
- 텍스트를 원형 그대로 잘 가져오는가 ?
- 한글 인코딩
- 특수문자 처리
- 메타데이터(metadata)의 종류는 어떤 것들이 있는가?
- page_content : 문서 내용
- 페이지 번호(page)
- 표, 차트 , 문서의 coordinates(좌표), 속성(Title , Table, Image, Text)
- 사용자의 질문에 대한 출처를 표기해야하는 상황이 올 때는 "속도"를 중요시 하기 보다는 "메타 데이터"를 더 중요시하는 것이 옳은 선택일 수 있다.
- 문서를 읽는 속도는 얼마나 빠른가?
- 다량의 페이지를 포함하는 문서를 업로드시 문서를 읽는 "속도"가 중요
- SPLIT (Text Splitter)
- LLM에 들어갈 수 있는 토큰의 제한이 있으므로 text를 split 해서 넣어줘야 한다.
- Text Splitter란, 문서를 특정 기준으로 분할(chunk)할 때 활용한다.
- splitter 종류
- Character TextSplitter
- 공백이나 "."으로 분할
- 중요한 문서의 소제목에서 텍스트가 잘릴 수 있음 (이는 chunk_overlap이 궁극적인 문제를 해결하지 못하는 경우가 많음)
- RecursiveCharacterTextSplitter ⭐
- 청크가 충분히 작아질 때 까지 순서대로 분할하려고 시도
- 단락 → 문장 → 단어 순서로 분할
- 단락이 너무 길 경우에는 문장 단위로 문장이 너무 길 경우에는 단어 단위로 분할
- 단락 자체가 하나의 의미로 구성될 가능성이 크고, 단락이 너무 클 경우에는 문장으로 이어진다고 보기 때문
- TokenTextSplitter
- 토큰 단위로 분할 (한글 처리가 모호함)
- Konlpy TextSplitter를 사용하면 해결책이 될 수 있다.
- 빠른 텍스트 처리보다 분석적 심도(정보의 정확성)가 우선시 되는 application에 적합
- 오픈소스(HuggingFace)
- 다양한 토크나이저를 쉽게 활용할 수 있다.
- 신조어, 특정 도메인 용어 등의 tokenizer.trainer로 파인튜닝 또는 단순추가 가능
- Semantic Chunker
- langchain_experimental에 신규 추가된 Chunker
- 텍스트를 의미 유사성에 따라 분할
- 다른 Tokenizer와 달리 Chunk_size , Chunk_overlap과 같은 파라미터를 initialize에 사용하지 않는 것이 특징이다. (이러한 점은 chunk_size 와 chunk_overlap 관리가 어려울 수도 있다.)
- Character TextSplitter
- EMBED
- 임베딩은 텍스트의 벡터 표현을 만든다. 이는 벡터 공간에서 가장 유사한 텍스트를 찾는 Semantic Search(의미 검색)과 같은 작업을 수행할 수 있기 때문에 유용하다. 따라서 문서에 적합한 Embedding 모델을 선택하는 것은 매우 중요하다고 할 수 있다. (한글까지 고려해야 함)
- Langchain의 기본 Embedding 클래스는 두 가지 메서드를 제공한다.
- Document(문서) Embedding
- Query Embedding (사용자 질문 임베딩)
- 위 두 임베딩에서 같은 모델을 사용해야 함 (version 까지도 고려해야함)
- 주요 Embedding 목록
- OpenAIEmbedding(유료모델)
- API를 통해서 임베딩을 하기 때문 하드웨어 걱정 .. X , 저렴한 가격 (과금에 대한 고려는 해야 함)
- 다만, 문서의 양이 많다면 그만큼 과금에 대한 고려를 피할 수 없다.
- CacheBackedEmbeddings 을 적용하여 불필요한 과금을 줄여야 함
- HuggingFace(BGE , Mistral)
- 한글까지 잘 적용되는지 무조건 실험해야 함 ⭐
- https://huggingface.co/spaces/mteb/leaderboard
- 직접 로드해서 임베딩을 잘 하는지, Semantic Search로 유추해볼 수 있음
- OpenAIEmbedding(유료모델)
- STORE
- Vector Store
- Vector DB의 중요성
- cloud vs local
- Cloud : Pinecone , Weaviate , Elastic Search
- Local : Chroma , FAISS
- cloud vs local
RAG Pipeline을 구성할 때 모든 경우를 시험해볼 수 는 없으니, 자신의 Task에 적합한 것을 시도해보는게 적절하다.
중요한 정보태깅
키워드 추출을 할 수 있다면, 태깅하는 것이 좋음
필요한 영역 Crop
- 여백 영역에 표기된 정보가 추후 검색 시 노출
- 따라서 main 영역만 Crop하여 불필요한 정보는 제거
문서의 다양한 형태
- 문서를 어떻게 Parsing 할 지 고려해야 함
표 추출
표는 중요한 정보가 많다.
표를 추출하는 라이브러리 ⇒ Camelot, PaddleOCR
이미지 추출
fitz 를 사용하여 이미지만 추출
2. 서비스 단계에서 이뤄지는 작업
USER 질문 ⇒ 입력 검색(원하는 문서 내용 발췌) ⇒ LLM 전달 ⇒ 원하는 답변 생성
- Multi-Query Retriever
- Ensemble Retriever ⭐
- Sparse Retriever (특정 키워드) + Dense Retriever
- Prompt Engineering
✍🏻Reference
https://www.youtube.com/watch?v=NfQrRQmDrcc
https://github.com/teddylee777/langchain-kr?tab=readme-ov-file
GitHub - teddylee777/langchain-kr: LangChain 공식 Document, Cookbook, 그 밖의 실용 예제를 바탕으로 작성한 한
LangChain 공식 Document, Cookbook, 그 밖의 실용 예제를 바탕으로 작성한 한국어 튜토리얼입니다. 본 튜토리얼을 통해 LangChain을 더 쉽고 효과적으로 사용하는 방법을 배울 수 있습니다. - teddylee777/langch
github.com
'NLP(자연어처리)' 카테고리의 다른 글
Quantization & Prompt Engineering (1) | 2025.01.29 |
---|---|
[NLP] PEFT(Parameter Efficient Tuning) : LoRA 코드 (0) | 2025.01.06 |
[NLP] get_accuracy 함수 내부구현 이해 (0) | 2025.01.06 |