언어 모델과 LLM
- 언어모델
- 텍스트를 이해하고 생성할 수 있는 인공지능 모델
- 주어진 문장의 다음 단어를 예측하거나, 문장을 완성하거나, 질문에 답변을 제공하는 등의 작업이 가능
- LLM(Large Language Model)
- 대규모의 텍스트 데이터로 학습된 언어 모델
- 수억~수조 개의 매개변수(parameters)를 가지고 있어 매우 복잡하고 정교한 언어 이해와 생성 능력이 있음
- pretrained model, foundation model
- 이미 대규모 데이터로 학습을 완료한 상태의 모델
- 새로운 작업에 맞게 fine-tuning 하여 활용할 수 있음
RAG
- 검색 증강 생성(Retrieval-Augmented Generation)
- 외부 지식 소스(카탈로그, 제품 가격 등)를 LLM과 연동하여 원하는 답을 이끌어 내는 방법
- 외부 지식 소스를 chunk로 나누어 임베딩 및 Vector DB에 저장하고, 사용자의 질문을 임베딩 한 후 DB에 쿼리하여 유사한 데이터를 추출. 이 데이터와 사용자 질문을 하나의 프롬프트로 만들어서 LLM에 제공하는데, 이 때 LLM이 컨텍스트 정보만을 이용하여 답변할 수 있도록 프롬프트 엔지니어링이 필요
- RAG 등장 배경
- LLM은 최신 정보, 독점 정보 또는 도메인별 정보와 같이 학습 데이터셋에 포함되지 않은 지식이 필요한 경우에는 부정확
- LLM의 환각을 줄이면서 더 정확하고 상황에 맞는 답변을 생성해야 함
- 환각(Hallucinations): 모델이 내놓은 답이 사실과 다르거나, 논리적으로 오류가 있는 답을 생성하는 현상
환각 예시
- 환각(Hallucinations): 모델이 내놓은 답이 사실과 다르거나, 논리적으로 오류가 있는 답을 생성하는 현상
- fine-tuning을 통해 도메인별 정보에 맞게 모델을 조정할 수 있지만, 비용이 많이 들고 전문 지식이 필요하므로, 변화하는 정보에 적응하는 민첩성이 떨어짐
- RAG 구성
- Retrieve(검색): 사용자 쿼리와 유사한 문서를 검색하는 과정
- 사용자 쿼리는 임베딩 모델을 통해 임베딩 한 후, Vector DB에 저장된 데이터와 유사도를 기반으로 검색
- Vector DB에서 가장 유사한 상위 k개 데이터 객체 반환
- Augment(증강): Vector DB의 검색 결과를 사용자 질의(Question)와 함께 프롬프트로 생성하여 LLM 모델로 전달
- Generate(생성): 프롬프트를 입력받은 LLM이 답변을 생성하여 사용자에게 제공
- Retrieve(검색): 사용자 쿼리와 유사한 문서를 검색하는 과정
- RAG의 활용예시
- 여러 종류의 장비를 사용하는 기업의 장비 매뉴얼 챗봇
- 쇼핑몰의 상품 정보 페이지에서 상세 정보를 검색할 수 있는 기능
- RAG의 성능을 향상시킬 수 있는 고급 기법
- Hybrid
- 시맨틱 검색과 키워드 검색의 장단점을 서로 극복
- 둘 다 사용하여 검색을 진행하고, 결과를 합쳐서 가장 좋은 응답을 제공
- RAG Fusion
- 사용자 질의를 여러 형태로 변형하여 다양한 검색 결과 추출
- 랭크 퓨전 기법을 사용하여 여러 결과 중에서 최적의 응답 생성
- HyDE
- 질의에 대한 가상 답변을 얻고, 답변을 기반으로 시맨틱 검색을 하여 가상 답변과 최대한 유사한 내용 검색
- Parent document
- chunk 사이즈가 작으면 정보가 유실되고, 긴 경우 정보 유실은 막을 수 있지만 의미가 희석될 수 있음
- 검색은 chunk 사이즈가 짧은 child를 대상으로 하여 시맨틱 검색 성능을 올리고, 결과는 매핑되는 Parent를 리턴하여 정보 손실을 줄임
- Reranker
- 한 번 더 사용자의 질문과 응답의 관련성을 평가하여 가장 관련성이 높은 결과가 상위에 오도록 순위를 다시 조정
- Hybrid
[RAG 예제1 - 사용자 매뉴얼 질의 응답]
워크플로

RAG 시스템 구성
- 텍스트 embedding 모델: KLUE base embedding model 사용
- LLM: Meta Llama 3 8B Instruct
- Vector DB: ChromaDB
예제 코드
rag_example1.ipynb
0.01MB
- 결과(빨간 박스는 민감 정보라서 가렸습니다.)
코드 설명
- "사용자_매뉴얼.pdf" 파일을 파싱해서 4 depth 기준으로 chunk로 나눔
- chunk를 embedding model에 입력하여 embedding vector 값 추출 및 Vector DB에 저장
- 사용자 질문을 임베딩 한 후, Vector DB에 쿼리하여 유사한 문단 추출
- 사용자 질문 및 Vector DB에서 추출된 문단으로 프롬프트 생성
- 사용자 질문에 대한 자연스러운 답변을 만들도록 LLM 모델에 프롬프트 제공
- LLM을 통해 생성된 답변을 사용자에게 제공
[RAG 예제2 - 직원 연락망 테이블 질의 응답]
예제 코드
rag_example2.ipynb
0.01MB
- 결과(빨간 박스는 민감 정보라서 가렸습니다.)
코드 설명
- "직원연락망.xlsx" 파일을 파싱해서 NaN 및 날짜 데이터에 대한 전처리
- 직원 이름을 임베딩하고, 해당 직원에 대한 정보를 metadata로 Vector DB 에 저장
- 특정 직원에 대해 정보를 질문하면, LLM 모델을 거쳐 직원 이름을 추출하여 임베딩 후 DB에 쿼리
- 질문 및 Vector DB에서 추출된 정보로 프롬프트 생성
- 추출된 정보를 기준으로 질문에 대한 답변을 생성하도록 LLM 모델에 프롬프트 입력
- LLM을 통해 생성된 답변을 사용자에게 제공