Langchain을 사용한 RAG 구현 워크플로우

Gen AI RAG 실전 가이드, Langchain을 활용한 AI 챗봇 완전정복 강좌의 맛보기 강의입니다.

강의 대본 보기

그러면 본격적으로 RAG를 통해서 RAG를 구축하는 실습을 진행하기에 앞서서 RAG에 필요한 컴포넌트들이 어떤 것들이 있는지 알아보고 이런 것들이 어떻게 연결되는지 다시 한번 짚고 넘어가 보도록 하겠습니다. Langchain을 활용해서 RAG를 구축할 때는 어떤 형태의 문서이든지 보시는 구조도와 같은 형태를 통해서 구축하게 됩니다. Chat PDF라는 서비스라는 이거는 Chat PDF라는 서비스를 기준으로 RAG 시스템이 어떻게 구축되어 있는지를 한번 그려본 건데요. 대부분의 RAG 서비스들이 이런 식으로 구축된다고 이해를 하시면 되겠습니다. 가장 기본적인 형태의 RAG 시스템이고요. 첫 번째부터 살펴볼게요. 저희가 일단 문서를 가져와서 특정 문서를 기반으로 대화를 할 수 있게 하는 시스템이기 때문에 문서를 먼저 업로드해야겠죠. 문서를 업로드할 때는 랭체인의 다큐먼트 로더라는 모듈을 통해서 업로드를 하게 됩니다. 이제 PDF 파일의 경우에는 랭체인 안에 PyPDF 로더라는 것이 기본적으로 설정이 되어 있습니다. 그래서 PyPDF 로더를 활용해서 문서를 가져오게 되면요 저희가 PDF 파일을 그대로 가져오는 게 아니라 PDF 파일을 다큐먼트 객체라는 것을 통해서 한번 변환한 형태로 가져오게 됩니다. 다큐먼트 객체는 텍스트 콘텐츠를 담고 있는 하나의 구조가 있고 또 하나는 메타데이터를 담는 구조가 있어요. 그렇게 두 개 중에서 텍스트 스플리터를 통해 텍스트 콘텐츠들을 여러 개의 문서로 분할을 하게 됩니다. 그러면 PDF 파일이 예를 들어서 50장짜리 PDF다 그러면 한 장씩 잘라서 내가 문서를 분할하겠다 라고 하면 50개의 새로운 문서들이 생기게 되는 거죠. 이 50장짜리 PDF 문서 하나를 50개의 문서들로 쪼개게 되는 겁니다. 이걸 할 때 TextSplitter라는 Langchain의 하나의 모듈을 활용하게 될 겁니다. TextSplitter의 경우에는 글자 수를 기준으로 대부분 문장을 나누는데요. 글자 수 기준으로 문장을 나눌 때 좀 애로사항이 있다 보니까 의미 흐름을 기준으로 특정 의미 흐름이 한번 끝나면 여기서 끊고 그 다음 의미 흐름이 끝나면 거기서 또 끊고 이런 식으로 시맨틱 청킹 전략을 쓰는 경우도 있습니다. 굉장히 다양한 전략이 있는데 이런 것들도 나중에 살펴보도록 하겠습니다. 그리고 이렇게 분할된 문서들을 하나씩 벡터 임베딩으로 변환하기 위해서 임베딩 모델을 기반으로 문서를 임베딩 할 텐데요. 이때 필요한 게 임베딩 모델 그리고 벡터 스토어라고 할 수 있겠습니다. 예를 들어서 이제 이러한 단어가 있을 때 OpenAI에서는 ADA-002 모델을 통해서 임베딩 모델을 활용할 수 있게 API를 열어뒀거든요. 그래서 이러한 문장을 이 임베딩 모델을 통해서 이러한 행렬 형태로 바꿨을 때 저희가 이걸 Vector Embedding이라고 합니다. 그래서 LLM이 이해할 수 있도록 문서를 수치화하는 과정이 문서 임베딩이 되겠고요. 이런 식으로 변환이 된 여러 개의 벡터 임베딩들을 하나의 벡터 DB에다가 담은 다음에 저희가 사용자 질문을 "What is Python?" 이라는 것을 통해서 받았다 라고 하면은 이 "What is Python?" 이라는 질문과 가장 유사한 문장 사용자의 질문과 가장 유사한 문장이 벡터 DB 내에서 무엇일까? 를 찾는 과정이 VectorStore와 Retriever를 통해서 수행되게 됩니다. Retriever가 구체적으로 사용자의 질문과 벡터 DB 내에 다양한 벡터 임베딩들과의 유사성 검색을 진행하는 과정이라고 보시면 되겠습니다. 그래서 "What is Python?" 이라는 사용자의 질문도 역시 벡터 임베딩으로 변환을 하겠죠. 이러한 ADA-002와 같은 임베딩 모델을 통해서 그러면 이렇게 변환된 벡터 임베딩과 벡터 DB 내에 다양한 벡터 임베딩과 비교를 해서 가장 유사한 이러한 여러 개의 벡터 임베딩들을 유사 문서로 뽑아내게 됩니다. QA 체인, Langchain의 체인 구조를 통해 사용자의 질문과 유사 문서들을 함께 넣어서 프롬프트 구성, 프롬프트 자체를 LLM에게 넣어서 답변을 받고 끝낼 수 있습니다. 답변을 조금 더 고도화하고 싶다 라고 하면은 체인을 하나 더 연결해서 체인의 구조를 하나 더 추가하는 거죠. LLM이 답변을 내놓은 걸 한 번 더 가공해서 답변을 내놓게끔 하는 체인을 구축할 수도 있습니다. 그렇게 했을 때 답변이 더 고도화되고 더 품질이 높아진다고 하면 그렇게 만들 수도 있겠죠. 이런 식으로 저희가 하나의 사슬을 만들어서 사용자가 어떤 파일에 대해서 질문을 했을 때 RAG 시스템 기반에서 답변을 할 수 있도록 만든다 라고 이해를 하시면 될 것 같습니다.

이 강좌의 맛보기 강의

Gen AI RAG 실전 가이드, Langchain을 활용한 AI 챗봇 완전정복
Gen AI RAG 실전 가이드, Langchain을 활용한 AI 챗봇 완전정복강좌 자세히 보기