Search
Duplicate

LLM 애플리케이션 아키텍처를 활용한 생성형 AI 서비스 구현: RAG모델과 LangChain 프레임워크 기반

생성일
2024/08/04 09:59
태그
논문 정리

2. 이론적 배경

RAG 모델 이해

RAG (Retrieval-Augmented Generation) 모델은 대화형 AI 모델의 제한된 정보와 환각 문제를 해결하기 위해 제안된 방법입니다. 전통적인 LLM (대형 언어 모델)을 새로운 데이터로 파인튜닝하는 방법이나 프롬프트 콘텍스트에 직접 정보를 넣는 방식은 비용이 많이 들거나 비현실적입니다. RAG 모델은 데이터베이스에 정보를 저장하고 필요한 정보를 검색하여 LLM에 전달하는 방식으로 구현됩니다. 이를 통해 LLM은 질문과 관련된 참고자료를 활용해 보다 정확하고 신뢰성 있는 답변을 생성할 수 있습니다. 금융 분야와 같은 다양한 산업에서 고객 응대 챗봇 등의 애플리케이션에 적용될 수 있으며, 본 논문에서는 RAG 모델의 구현과 세부 사항을 자세히 다룹니다.

RAG 모델 아키텍처

RAG 사용을 위한 데이터 처리 과정은 원본 데이터를 청크(Chunk)단위의 작은 조각으로 나누고 텍스트 데이터를 숫자인 벡터로 전환하는 임베딩(Embedding)을 거처 벡터 저장소에 저장된다(Microsoft, 2023).
소스 데이터(Source Data) 수집 및 준비: 모델의 학습 및 활용을 위해 관련된 소스 데이터가 필요하며 문서, 웹 페이지, 뉴스 기사 등이 소스 데이터가 될 수 있으며, 이 데이터는 모델이 정보를 검색하고 생성할 내용에 대한 기반이 된다.
검색 가능한 청크 생성(Chunking): 소스 데이터를 처리하여 작은 단위인 청크로 분할한다. 청크는 보통 문장 또는 문단과 같은 작은 텍스트 조각을 의미하며, 이 작은 청크 단위로 정보를 검색하고 활용하기 용이 해진다.
임베딩(Embedding): 생성된 청크는 텍스트를 벡터 형태로 변환하는 과정을 거친다. 주로 사전 학습된 언어 모델을 사용하여 텍스트를 의미 있는 밀집 벡터로 변환하고, 이렇게 함으로써 텍스트의 의미와 관련 정보가 벡터로 포착된다.
벡터 데이터베이스 (Vector Database) 구축: 임베딩된 청크들을 기반으로 벡터 데이터베이스를 구축한다. 이 데이터베이스는 벡터 공간에서 각 청크의 위치를 나타내며, 검색 및 유사성 계산을 효율적으로 수행할 수 있게 해준다.
검색 및 정보 통합: 생성할 텍스트의 컨텍스트에 맞는 정보를 검색하기 위해 벡터 데이터베이스에서 적절한 청크를 검색한다. 이 때, 검색된 청크는 원래 텍스트 데이터로 디코딩하여 정보를 추출하고 이 정보는생성 과정에서 활용된다
텍스트 생성 (Generation): 검색된 정보를 기반으로 텍스트를 생성한다. 이 때, 생성할 텍스트의 종류나 길이,언어적인 스타일 등을 지정할 수 있으며, RAG 모델은 정보 검색과 생성 과정을 통합하여 더 정확하고 의미 있는 텍스트를 생성할 수 있도록 설계되었다.

LLM에서 임베딩 활용

임베딩 또는 임베딩 벡터(Embedding Vector): 텍스트를 고정된 크기의 배열 같은 실수(floating) 벡터 형태로 표현하는 것
특정 단어, 문장 또는 문서를 임베딩 생성 모델에 입력하면, 실수로 이루어진 벡터가 출력된다.
이러한 벡터는 사람이 직접 이해하기 어렵지만, 서로 다른 단어나 문서의 임베딩 간 거리를 계산하면 의미적 관계를 파악할 수 있다.

벡터 데이터베이스 (Vector Database)

벡터 데이터베이스는 LLM의 장기 기억 부족 문제를 해결하기 위해 개발된 새로운 유형의 데이터베이스
LLM의 데이터베이스는 RDB가 아닌 벡터 DB를 사용
이 데이터베이스는 고차원 실수 벡터 인덱스를 효율적으로 저장하고 관리하는데 특화되어 있으며, 전통적인 데이터베이스와 다르게 쿼리를 실수 벡터(Embedding) 형태로 표현하며, 이와 유사한 벡터를 가진 데이터를 추출하는 방식을 지원한다.
벡터 데이터베이스에 대한 일반적인 벡터 파이프라인은 아래 3단계를 거친다.
1.
Indexing: PQ, LSH 또는 HNSW 와 같은 알고리즘을 사용하여 벡터를 인덱싱한다.
더 빠른 검색을 가능하게 하는 데이터 구조에 벡터를 매핑
2.
Querying: 가장 가까운 근접 데이터를 찾기 위해 인덱싱된 쿼리 벡터를 데이터 세트의 인덱싱된 벡터와 비교한다. 이때 해당 인덱스에서 사용하는 유사성 메트릭을 적용한다.
3.
Post Processing: 경우에 따라 벡터 데이터베이스는 데이터 세트에서 가장 가까운 최종 근접 데이터를 검색하고 사후 처리 하여 최종 결과를 반환한다. 이 단계에는 다른 유사성 측정을 사용하여 가장 가까운 근접 데이터의 순위를 다시 매기는 작업이 포함될 수 있다.

LLM 서비스 구현을 위한 오케스트레이션 프레임워크(Orchestration Framework)

LangChain은 LLM 서비스를 구현하기 위한 대표적인 오케스트레이션 프레임워크
LLM의 기능을 효율적으로 활용하고 사용자에게 편리한 사용 경험을 제공하는 것을 목표
LangChain은 Model I/O, Retrieval, Chains, Agents, Memory, Callbacks 모듈로 구성되어 있으며, LLM을 사용하여 다양한 언어 처리 작업을 수행
LangChain의 핵심적인 개념은 LLM 프롬프트의 실행과 외부 소스의 실행(계산기, 구글 검색, 슬랙 메시지 전송이나 소스코드 실행 등)을 엮어 Chaining하는 것으로 LLM을 사용하여 번역, 요약, 질문 답변, 텍스트 생성, 자연어 추론 등 다음과 같은 다양한 작업을 수행

3. 생성형 AI 활용 서비스 구현 방법

[그림] RAG기반 생성형 AI 서비스 구현 플랫폼
위 그림은 플랫폼을 오케스트레이션하는 프레임워크를 통해 소스 데이터로부터의 정보 추출 및 LLM의 활용 절차까지 나타내고 있다.
1.
문서에서 정보를 추출하여 소규모 청크로 분할
2.
이를 임베딩하여 벡터 데이터베이스에 저장
3.
사용자의 질문이 임베딩된 후, 질문과 유사한 벡터를 저장소에서 검색하여 LLM에 전달
4.
LLM은 이러한 청크들을 조합하여 사용자 정의 데이터로부터 응답을 생성해 제공

RAG 모델 및 LangChain 통합 구현 절차

구성 요소
설명
오케스트레이션 프레임워크
LangChain
청크 작업 및 임베딩
OpenAI, GPT4All 모델
벡터 저장소
Chroma DB
LLM
OpenAI의 GPT-3.5-turbo 모델, GPT4All
사용자 인터페이스
Streamlit, Brity Assistant

RAG기반 구현 절차

1.
소스 데이터 수집(Source Data Gathering) 및 추출(Data Extraction) 단계
데이터 수집 단계에서는 정형 데이터(CSV, JSON, XML)와 비정형 데이터(PDF, TXT, HTML, 이미지, 비디오)를 모두 수집합니다. 정형 데이터는 비교적 수집이 쉽지만, 비정형 데이터는 더 어렵습니다. 업무 관련 자료 규정집, 사용자 매뉴얼, 약관 등의 자료를 사전에 준비하고, LLM에 활용할 자료를 LangChain 모듈을 이용해 로드합니다.
2.
청크 생성 (Splitting Chunks) 단계 소스 데이터를 처리하여 작은 단위인 청크로 분할하는 단계이다. 청크는 보통 문장 또는 문단과 같은 작은 텍스트 조각으로 분할되며 LLM에서 검색 가능한 단위로 정보를 검색하고 활용하기 용이 하게 LangChain 모듈을 이용하여 분할한다.
3.
임베딩 (Embeddings) 단계 생성된 청크 단위 텍스트 데이터를 수치화된 벡터 형태로 변환하는 과정을 거친다. 이 단계에서는 단어나 문장을 벡터로 매핑하는 작업이 이루어지며 OpenAI 또는 GPT4All에서 제공하는 라이브러리를 이용할 수 있다.
4.
벡터 데이터베이스 (Vector Database) 구축 단계 임베딩된 청크들을 기반으로 벡터 데이터베이스를 구축하는 단계이다. 이 데이터베이스는 벡터 공간에서 각 청크의 위치를 나타내며, 검색 및 유사성 계산을 효율적으로 수행할 수 있도록 한다. 일반적으로 각 문서의 콘텐츠를 포함시킨 다음 임베딩과 문서를 벡터 저장소에 저장하고 임베딩을 사용하여 문서를 인덱싱하며, Chroma나 FAISS같은 벡터 인덱스를 활용할 수 있다.
5.
질문(User Prompt)과 검색(Search)결과 통합 단계
프롬프트로 질문한 내용으로 검색하고 관련 정보를 통합하는 단계이다. 생성할 텍스트의 컨텍스트에 맞는 정보를 검색하기 위해 벡터 데이터베이스에서 적절한 청크를 검색된 관련 청크들을 LLM에 보내어 답변 생성 과정에서 활용될 수 있도록 하며, LangChain에 있는 벡터스토어 유사성 검색하는 많은 검색기를 활용한다.
6.
답변 생성 (Generation) 단계 검색된 정보를 기반으로 답변 텍스트를 생성하는 단계이다. 이 때, 생성할 텍스트의 종류나 길이, 언어적인 스타일 등을 지정할 수 있으며, OpenAI 또는 GPT4All 등 LLM에서 LangChain의 유사내용 검색 모듈을 통해서 검색된 문서에서 LLM이 답변을 생성하여 제공한다.
7.
사용자에게 채널을 통해 답변제공 LLM에서 생성된 답변은 Streamlit 같은 UI 생성 라이브러리로 구현된 화면이나 Brity Assistant 같은 챗봇 메신저를 통해 최종 사용자에게 제공한다.

RAG 기반 Vector Store선정 및 답변 제공유형 정의

[그림] RAG기반 Vector Store 구성유형 및 처리절차
RAG기반 Vector Store 저장 유형은 <그림>과 같이 모든 소스 데이터를 사전에 Vector Store에 저장하는 경우와 질문 시 실시간으로 넣는 경우로 나눌 수 있다.
1.
실시간 소스데이터 임시 저장 형태는 질문이 들어왔을 때, 데이터 베이스에서 Query하는 경우에는 기업에 있는 여러 개의 소스 데이터베이스에서 질문과 관련된 데이터 베이스를 조회하는 DB Query prompt를 생성한 후 API를 통해 관련된 데이터 베이스에서 모든 스키마를 가져오거나, DB형태가 아닌 File형태의 지식은 파일을 Upload하여 최적의 많은 내용을 가져와서 실시간으로 임베딩한 후 Vector Store에 저장한다. 또 다른 형태인 사전 전체 소스데이터 저장 형태는 사전에 정의한 대상 범위내의 모든소스 데이터베이스의 내용이나 Vector화 할 지식 File을 모두 임베딩하여 Vector Store에 저장한다.
[예시] ” 직원의 최소근무시간 알려줘 “ ⇒ 소스 DB중에서 인사(HR) DB 선택하여 DB Query 저장 ⇒ 또는 ‘인사정보.pdf’ File Upload 저장
2. 실시간으로 저장된 Vector Store에서 질문과 관련된 내용을 찾아와서 질문과 함께 프롬프트를 이용하여 LLM으로 전달한다.
3.
질문에 해당하는 유사한 답변을 여러 개 찾아서 질문과 함께 LLM에 전달하여 최적의 최종 답변을 생성한다.

RAG기반 답변 제공 유형

RAG 모델을 활용하여 답변을 제공하는 방법
1.
QA 시스템 활용
유사도 기반의 벡터 검색 알고리즘 활용
2.
QA 시스템 미활용
직접 전체 벡터화된 지식에서 답변을 제공하는 방법
[그림] QA시스템을 활용한 LLM 지식답변 예시
그림은 QA시스템에서 검색한 두가지 유사 Passage를 질문과 같이 프롬프트를 넣어 LLM에 전달하여 최종 한 개 답변을 전달받을 수 있는 것을 보여주고 있다.

4. 구현 결과

각 구현 요소 별 개발환경
오케스트레이션 프레임워크: LangChain
데이터 추출 및 Chunking: LangChain 모듈
임베딩: OpenAI, GPT4All
벡터 데이터베이스: Chroma, FAISS
LLM: OpenAI GPT-3.5-tubo모델, GPT4ALL
Python 개발 환경: Google Colab
QA시스템: Brity Assistant MRQA 모듈
UI: Streamlit (Python apps library)