대규모 언어 모델(LLM)은 다양한 자연어 처리(NLP) 작업을 수행할 수 있는 딥러닝 모델이다.
장점 : 뛰어난 성능, API 방식의 편리한 사용성
단점 : 보장할 수 없는 보안, API 호출 비용 → 기업에서 사용하기 어려움 (기업 기밀 유출, API 과금 이슈)
장점 : Closed source 못지 않은 성능, 높은 보안성, 낮은 비용
단점 : 개발 난이도 높음, 사용 위한 GPU 서버 필요
ChatGPT(GPT-3.5)는 2021년까지의 데이터를 학습한 LLM이므로, 2022년 이후 정보는 답변을 하지 못하거나 거짓된 답변을 제공한다.
→ Vectorstore 기반 정보 탐색 or Agent 활용한 검색 결합
GPT-3.5 : 4096, GPT-4 : 8192 입력 토큰 제한 존재
→ TextSplitter를 활용한 문서 분할
Fact에 대한 질문을 했을 때, 엉뚱한 대답을 하거나 거짓말을 하는 경우가 많다.
→ 주어진 문서에 대해서만 답하도록 Prompt 입력
오픈소스
LangChain : 언어 모델로 구동되는 어플리케이션을 개발하기 위한 프레임워크
언어 모델을 잘 활용할 수 있게끔 도와줌
문서 불러오기, 다양한 형태의 문서(PDF, Word, YouTube etc.)를 RAG 전용 객체로 불러들이는 모듈이다.
다양한 형식의 문서를 불러오고 이를 LangChain에 결합하기 쉬운 테스트 형태로 변환하는 기능을 한다. 이를 통해 사용자는 txt 형식의 문서 뿐만 아니라 pdf, word, ppt, xlsx, csv 등 거의 모든 형식의 문서를 기반으로 LLM을 구동할 수 있다.
URL Loader : WebBaseLoader와 UnstructuredURLLoader
PDF Document Loader : PyPDFLoader
Word Document Loader : docx2txt
CSV Document Loader : CSVLoader
csv_args 설정 필요
문서 텍스트 분할하기, 토큰 제한이 있는 LLM이 여러 문장을 참고해 답변할 수 있도록 문서를 분할하는 역할이다.
Document를 여러 개의 Chunk로 쪼개고, Chunk를 embedding vector로 만들고, vector store에 저장해준다. Chunk 하나당 하나의 Vector로 매칭된다.
특정 기준을 통해 텍스트를 청크로 나누는 모듈이다. 토큰 제한 이슈를 우회하여 Context를 학습시킬 수 있다.
Chunk 사이즈를 어떻게 할지, 어떻게 Chunking 할지가 중요하다.
→ 대부분 RecursiveCharacterTextSplitter를 통해 분할
일반적인 글로 된 문서는 모두 TextSplitter로 분할할 수 있으며, 대부분 커버 가능하다.
그러나 코드, latex 등과 같이 컴퓨터 언어로 작성되는 문서의 경우 TextSplitter로 처리할 수 없으며, 해당 언어를 위해 특별하게 구분하는 Splitter가 필요하다.
예를 들어, Python 문서를 split하기 위해서는 def, class와 같이 하나의 단위로 묶이는 것을 기준으로 문서를 분할할 필요가 있다. 이러한 원리로 latex, HTML, 코드 등 다양한 문서도 분할할 수 있다.
RecursiveCharacterTextSplitter.from_language(language=Language.PYTHON)
Vector Embedding 형태로 저장하기 위해 Embedding 모델을 거쳐 수치화된 텍스트 데이터들을 Vector Store에 저장한다.
Text Embeddings는 텍스트를 숫자로 변환하여 문장 간의 유사성을 비교할 수 있도록 한다.
사용자 질문을 수치로 변환하는 것도 포함한다.
대부분의 경우 대용량의 말뭉치를 통해 사전학습된 모델을 통해 쉽게 임베딩한다.
비정형 데이터를 숫자로 변환해 좌표상에 위치할 수 있게 만들어주는게 임베딩 모델이다.
사전 학습 임베딩 모델에는 대표적으로 Open AI에서 제공하는 ada 모델과, HuggingFace의 모델들이 있다. 사용 목적과 요구사항에 따라 적절한 임베딩을 고르는 것은 RAG의 가장 중요한 부분이다.
한국어 임베딩 성능 좋은 모델 : ko-sbert-nli, KoSimCSE-roberta-multitask
Retrieval 안에서 RAG에 임베딩된 값들을 저장하는 벡터 저장소이다. 벡터 저장소는 임베딩된 데이터를 인덱싱하여, input으로 받아들이는 query와의 유사도를 빠르게 출력한다. 대표적으로 FAISS, Chroma가 존재한다. CRUD와 같은 일반적인 DB의 기능을 포함한다.
사용자의 질문과 가장 유사한 문장을 검색하는 역할이다.
사용자의 질문을 임베딩 모델을 통해 임베딩시키고 임베딩된 벡터를 벡터 저장소 안에 있는 여러 text chunk vector와 비교해 가장 유사한 벡터를 뽑아 context로 넘기고, 사용자의 질문과 함께 프롬프트로 엮어 llm에게 넘겨주는 역할이다.
어떤 매개변수를 어떻게 설정해주는지, 어떤식으로 사용자 질문에 대처하는지 잘 수행하도록 만들어야 한다.
[참고자료]
LangChain 뿌시기
LLM 어플리케이션 개발을 위한 LangChain 소개
LangChain GitHub