사실은 코딩은 여기 오기 전부터 살살 해오다가 이번에 정리의 기회로 했습니다.
문서를 로딩시키고 그 문서를 통해 LLM으로 답변시키면 좀 더 도메인날리직한 답변이 온다고 합니다. 랭체인의 RAG는 작은 회사들한테는 유용할 것 같습니다. 아까 그 논문도 누가 공유해 주시고 해서 그 논문을 다운만 받았습니다. 그럼 시작합니다.
Retrieval
RAG(Retrieval Augmented Generation) 란?
[그림 출처] youtube "Langchain뿌시기 중"
https://www.youtube.com/watch?v=tIU2tw3PMUE&t=13s
많이 도움을 받은 유튜버라 구독 좋아요! 해주세요.
LLM 이 가지고 있지 않은 지식을 추가로 외부데이터에 저장하여 참조하여 LLM이 답변을 하도록 하는 프레임워크
사용자 질문 문장으로 PDF나 문서등을 Vector DB에 미리 넣어놓고 쿼리하여 가장 유사한 문장을 검색해 와서 그 질문과 유사문장을 다시 LLM에 넣어서 답변을 가져오는 방법
@구성요소
1) Document Loaders :
PDF, PPT, DOC,TXT, CSV, 웹사이트, 유튜브 스크립트 등등 다양한 문서들
WebBaseLoader
UnstructuredURLLoader
PyPDFLoader
CSVLoader
Page_content : 원래 문서의 내용
Metadata : 문서위치, 제목, 페이지넘버 등등 문서 자체의 속성 =>답변 근거
2) Text Splitters : 청크로 분할
Chunk : 긴 문서나 대화에서 주요 구절, 문장, 단락 등을 추출된 글 덩어리
크기나 사용자의 요구 처리할 텍스트 특성에 따라 정의
Vector : Chunk를 컴퓨터가 알아 먹을 수 있는 형태 (20938,39373,39372,38383) 의 숫자로 바꾸어진 것 나중에 가장 유사도가 높은 Chunk를 쿼리 해오기 위함이다.
Loader에서 올려진 문서를 Chunking 하는 과정을 담당
Chunk 하나에 Vector 하나씩으로 변환
a. CharactoerTextSplitter : 가장 간단한 텍스트 분할기로, 특정 구분자를 기준으로 텍스트를 여러개로 분할합니다.
b. RecursiveCharacterTextSplit : 재귀적으로 문서 분할, 줄바꿈 기준으로 했을때 여전히 크면 계속 재귀적으로 잘라나감.
c. 기타 : python 같이 개발언어 소스의 경우 from_language 같은 함수를 쓴다.
3) Vector Embeddings
텍스트를 숫자로 변환하여 문장 간의 유사성을 비교할 수 있도록 합니다.
위에서 나뉘어진 Chunk를 임베딩Vector로 변환하는 데 역할을 하는 것이 임베딩 모델이고 이 모델이 매우 중요함.(즉, 정확히 잘 임베딩 되어야 나중에 좋은 결과)
다차원의 비정형데이터를 숫자화 하는것. 무엇을 기준으로 하느냐
대용량의 말뭉치로 훈련된 모델을 가져와 쓴다. (Pre-trained Embedding Model)
이런 미리 학습된 모델이 있으면 Vector로 임베딩 하기가 쉬움.
아래는 유, 무료 모델임. (한국어는 한국어 모델이 좋음)
허깅페이스 리더 보드에서 순위 높은게 잘될 확률이 높음.
VectorStore
2개만 딱 찍어서
Chroma : 내 로컬에서 돌리고 싶을때, 속도느림, 저장됨
FAISS : Meta가 제공하는 무료DB, 속도 빠름 , 휘발성임 다음에 접속하면 다시 해야 함.
4) Retrievers
사용자의 질문을 임베딩해서 유사도 검색 쿼리 한다음 LLM으로 보내서 답을 얻는 행위.
Retriver는 검색을 쉽게 할 수 있도록 구성된 모듈
즉, 위 1)~3)까지는 준비해 놓는거고, 실제 RAG에서 핵심이 Retrievers라는 말
Retriever에는 4가지 문서 관련된 document Chain이 있음.
a. Stuff : LLM에게 (질문 + vectorStore 검색결과 배열)을 넘김
b. Map reduce : LLM에게 ((질문 + vectorStore 검색결과 1개) x4) 즉 4번을 넘김
원리와 장, 단점은 좀 더 공부 해야함. 병렬 처리
c. Refine : 각각 검색결과를 누적해서 LLM에게 질문 속도 느림.토큰제한, 품질 굿
d. Map re-rank : 각각 검색에 대한 결과를 평가해서 그중 최고의 답변만 가져옴
위 내용을 유튜브를 보고 공부하고 클론 코딩 했습니다. 아래 코랩링크 참조
참고하세요. 잘 안 돌 수 있습니다. 감사합니다.
먼가 API를 사용하려면 먼가 Key를 넣어 줘야 해서 어려웠어요.
https://colab.research.google.com/drive/12sJiNAeEd8KRq0tbVqZpl005YhIg7Vv5?usp=sharing