라마인덱스, 엘라스틱서치, 미스트랄을 이용한 검색 증강 생성(RAG)

LlamaIndex, Elasticsearch, 로컬에서 실행 중인 Mistral을 사용해 RAG(검색 증강 생성) 시스템을 구현하는 방법을 알아보세요.

Elasticsearch는 업계 최고 수준의 생성형 AI 도구 및 다양한 공급업체와 기본적으로 연동됩니다. Elastic 벡터 데이터베이스를 활용해 진행 중인 RAG 기본 넘어서기 또는 프로덕션 수준 앱 구축 웨비나를 확인해 보세요.

사용 사례에 가장 적합한 검색 솔루션을 구축하려면 무료 클라우드 체험판을 시작하거나 로컬 기기에서 Elastic을 지금 사용해 보세요.

이 블로그에서는 벡터 데이터베이스로서 Elasticsearch와 함께 RAG(검색 증강 생성) 기법을 사용하여 Q&A 환경을 구현하는 방법에 대해 설명합니다. LlamaIndex와 로컬에서 실행되는 Mistral LLM을 사용합니다.

시작하기 전에 몇 가지 용어를 살펴보겠습니다.

용어

LlamaIndex는 LLM(대규모 언어 모델) 애플리케이션을 구축하기 위한 선도적인 데이터 프레임워크입니다. LlamaIndex는 검색 증강 생성(RAG) 애플리케이션 구축의 다양한 단계에 대한 추상화를 제공합니다. 라마인덱스나 랭체인과 같은 프레임워크는 애플리케이션이 특정 LLM의 API에 밀접하게 연결되지 않도록 추상화를 제공합니다.

Elasticsearch는 Elastic에서 제공합니다. Elastic은 정밀도를 위한 전체 텍스트 검색, 의미 이해를 위한 벡터 검색, 두 가지 장점을 모두 갖춘 하이브리드 검색을 지원하는 검색 및 분석 엔진인 Elasticsearch를 개발한 업계 리더입니다. Elasticsearch는 확장 가능한 데이터 저장소이자 벡터 데이터베이스입니다. 이 블로그에서 사용하는 Elasticsearch 기능은 무료 및 오픈 버전의 Elasticsearch에서 사용할 수 있습니다.

검색 증강 생성(RAG) 은 사용자 쿼리에 대한 응답을 생성하기 위해 LLM에 외부 지식을 제공하는 AI 기술/패턴입니다. 이를 통해 특정 상황에 맞게 LLM 응답을 조정할 수 있으며 응답이 더욱 구체화됩니다.

미스트랄은 오픈 소스 및 최적화된 엔터프라이즈급 LLM 모델을 모두 제공합니다. 이 튜토리얼에서는 노트북에서 실행되는 오픈 소스 모델 mistral-7b를 사용합니다. 노트북에서 모델을 실행하고 싶지 않다면 클라우드 버전을 사용할 수도 있는데, 이 경우 올바른 API 키와 패키지를 사용하도록 이 블로그의 코드를 수정해야 합니다.

Ollama는 노트북에서 로컬로 LLM을 실행하는 데 도움이 됩니다. Ollama를 사용하여 오픈 소스 Mistral-7b 모델을 로컬에서 실행할 것입니다.

임베딩은 텍스트/미디어의 의미를 숫자로 표현한 것입니다. 이는 고차원적 정보를 저차원적으로 표현한 것입니다.

LlamaIndex, Elasticsearch로 RAG 애플리케이션 구축하기 & Mistral: 시나리오 개요

시나리오:

가상의 주택 보험 회사의 상담원과 고객 간의 콜센터 대화에 대한 샘플 데이터 세트(JSON 파일)가 있습니다. 다음과 같은 질문에 답할 수 있는 간단한 RAG 애플리케이션을 구축합니다.

Give me summary of water related issues.

높은 수준의 흐름

저희는 Ollama를 사용하여 로컬에서 Mistral LLM을 실행하고 있습니다.

다음으로, JSON 파일( Documents )의 대화를 ElasticsearchStore (Elasticsearch가 지원하는 VectorStore)로 로드합니다. 문서를 로드하는 동안 로컬에서 실행되는 Mistral 모델을 사용하여 임베딩을 생성합니다. 우리는 이러한 임베딩을 대화와 함께 LlamaIndex Elasticsearch 벡터 저장소(ElasticsearchStore)에 저장합니다.

LlamaIndex 수집 파이프라인을 구성하고 여기에 우리가 사용하는 로컬 LLM(이 경우 Ollama를 통해 실행되는 Mistral)을 제공합니다.

"물 관련 이슈를 요약해 주세요."와 같은 질문을 할 때, Elasticsearch는 시맨틱 검색을 수행하여 물 문제와 관련된 대화를 반환합니다. 이러한 대화는 원래 질문과 함께 로컬에서 실행 중인 LLM으로 전송되어 답변을 생성합니다.

RAG 애플리케이션 구축 단계

로컬에서 미스트랄 실행

Ollama를 다운로드하여 설치합니다. Ollama를 설치한 후 다음 명령을 실행하여 미스트랄을다운로드하고 실행합니다.

모델을 로컬에서 처음 다운로드하고 실행하는 데 몇 분 정도 걸릴 수 있습니다. 아래 "구름에 대한 시를 써주세요"와 같은 질문을 통해 미스트랄이 실행 중인지 확인하고 마음에 드는 시가 있는지 확인합니다. 나중에 코드를 통해 미스트랄 모델과 상호 작용해야 하므로 올라마를 계속 실행하세요.

Elasticsearch 설치

클라우드 배포(여기 지침)를 생성하거나 Docker에서 실행(여기 지침)하여 Elasticsearch를 시작하고 실행하세요. 여기에서 시작하여 프로덕션 등급 자체 호스팅 Elasticsearch 배포를 생성할 수도 있습니다.

클라우드 배포를 사용 중이라고 가정하고 지침에 언급된 대로 배포를 위한 API 키와 클라우드 ID를 가져옵니다. 나중에 사용하겠습니다.

RAG 애플리케이션

참고로 전체 코드는 이 깃허브 리포지토리에서 확인할 수 있습니다. 아래 코드를 통해 진행하므로 리포지토리를 복제하는 것은 선택 사항입니다.

즐겨 사용하는 IDE에서 아래 3개의 파일을 사용하여 새 Python 애플리케이션을 만듭니다.

  • index.py 데이터 인덱싱과 관련된 코드가 있는 곳입니다.
  • query.py 쿼리 및 LLM 상호 작용과 관련된 코드가 있는 곳입니다.
  • .env API 키와 같은 구성 속성이 있는 곳입니다.

몇 가지 패키지를 설치해야 합니다. 애플리케이션의 루트 폴더에 새 파이썬 가상 환경을 만드는 것으로 시작합니다.

가상 환경을 활성화하고 아래 필수 패키지를 설치합니다.

데이터 인덱싱

가상의 주택 보험 회사의 고객과 콜센터 상담원 간의 대화가 포함된 conversations.json 파일을 다운로드하세요. 이 파일을 애플리케이션의 루트 디렉터리에 2개의 파이썬 파일 및 .env 파일과 함께 배치합니다. 파일을 생성합니다. 다음은 파일 내용의 예시입니다.

index.py 에서 get_documents_from_file 라는 함수를 정의하여 json 파일을 읽고 문서 목록을 생성합니다. 문서 객체는 LlamaIndex가 작동하는 기본 정보 단위입니다.

수집 파이프라인 생성

먼저, Install Elasticsearch 섹션에서 얻은 Elasticsearch CloudID와 API 키를 .env 파일에 추가합니다. .env 파일은 아래와 같이 표시되어야 합니다(실제 값 포함).

LlamaIndex 수집 파이프라인을 사용하면 여러 구성 요소를 사용하여 파이프라인을 구성할 수 있습니다. index.py 파일에 아래 코드를 추가합니다.

앞서 언급했듯이 LlamaIndex 수집 파이프라인은 여러 구성 요소로 구성될 수 있습니다. pipeline = IngestionPipeline(... 라인의 파이프라인에 3개의 컴포넌트를 추가하고 있습니다.

  • SentenceSplitter: get_documents_from_file() 의 정의에서 볼 수 있듯이 각 문서에는 json 파일에서 찾은 대화를 저장하는 텍스트 필드가 있습니다. 이 텍스트 필드는 긴 텍스트입니다. 시맨틱 검색이 제대로 작동하려면 텍스트를 작은 텍스트 덩어리로 잘게 쪼개야 합니다. SentenceSplitter 클래스가 이 작업을 수행합니다. 이러한 청크를 라마인덱스 용어로는 노드라고 합니다. 노드에는 해당 노드가 속한 문서를 가리키는 메타데이터가 있습니다. 또는 이 블로그에 나와 있는 것처럼 청킹을 위해 Elasticsearch Ingestpipeline을 사용할 수도 있습니다.
  • 올라마 임베딩: 임베딩 모델은 텍스트를 숫자(벡터라고도 함)로 변환합니다. 숫자로 표현하면 단순한 텍스트 검색이 아닌 단어의 의미와 일치하는 검색 결과를 얻을 수 있는 의미론적 검색을 실행할 수 있습니다. 당사는 섭취 파이프라인에 OllamaEmbedding("mistral") 을 제공합니다. SentenceSplitter를 사용하여 분할한 청크는 Ollama를 통해 로컬 머신에서 실행 중인 Mistral 모델로 전송되고, Mistral은 청크에 대한 임베딩을 생성합니다.
  • 엘라스틱서치스토어: LlamaIndex ElasticsearchStore 벡터 스토어는 생성 중인 임베딩을 Elasticsearch 인덱스로 백업합니다. ElasticsearchStore는 지정된 Elasticsearch 인덱스의 콘텐츠를 생성하고 채우는 작업을 처리합니다. ElasticsearchStore( es_vector_store 참조)를 생성할 때 생성하려는 Elasticsearch 인덱스의 이름(이 경우calls ), 임베딩을 저장할 인덱스의 필드(이 경우conversation_vector ), 텍스트를 저장할 필드(이 경우conversation )를 지정합니다. 요약하면, 구성에 따라 ElasticsearchStore 은 (자동 생성된 다른 필드 중에서) conversation_vectorconversation 을 필드로 사용하여 Elasticsearch에 새 인덱스를 생성합니다.

이 모든 것을 하나로 묶어 pipeline.run(documents=documents) 를 호출하여 파이프라인을 실행합니다.

index.py 스크립트를 실행하여 수집 파이프라인을 실행합니다:

파이프라인 실행이 완료되면, Elasticsearch에 calls 이라는 새 인덱스가 표시됩니다. 개발자 콘솔을 사용하여 간단한 Elasticsearch 쿼리를 실행하면 임베딩과 함께 로드된 데이터를 볼 수 있어야 합니다.

지금까지 한 일을 요약하자면, JSON 파일에서 문서를 생성하고, 이를 청크로 분할하고, 해당 청크에 대한 임베딩을 생성하고, 임베딩(및 텍스트 대화)을 벡터 저장소(ElasticsearchStore)에 저장했습니다.

쿼리하기

llamaIndex 벡터스토어인덱스를 사용하면 관련 문서를 검색하고 데이터를 쿼리할 수 있습니다. 기본적으로 VectorStoreIndex는 임베딩을 SimpleVectorStore에 인메모리로 저장합니다. 그러나 외부 벡터 저장소(예: ElasticsearchStore)를 대신 사용하여 임베딩을 영구적으로 만들 수 있습니다.

query.py 을 열고 아래 코드를 붙여넣습니다.

로컬 LLM(local_llm)을 정의하여 Ollama에서 실행되는 미스트랄 모델을 가리키도록 합니다. 다음으로, 앞서 생성한 ElasticsearchStore 벡터 스토어에서 VectorStoreIndex(index)를 생성한 다음 이 인덱스에서 쿼리 엔진을 가져옵니다. 쿼리 엔진을 만드는 동안 응답에 사용해야 하는 로컬 LLM을 참조하고, 벡터 스토어에서 검색하여 응답을 받기 위해 LLM으로 보내야 하는 문서 수를 구성하기 위해 (similarity_top_k=10)도 제공합니다.

query.py 스크립트를 실행하여 RAG 흐름을 실행합니다:

Give me summary of water related issues ( query)으로 쿼리를 보내면 관련 문서와 함께 제공되는 LLM의 응답은 아래와 같아야 합니다.

제공된 맥락에서 고객이 물과 관련된 피해에 대한 보상에 대해 문의한 사례를 몇 가지 확인할 수 있습니다. 두 사례에서는 홍수로 인한 지하실 피해, 또 다른 사례에서는 지붕 누수가 문제였습니다. 상담원은 두 가지 유형의 수해가 각 보험에 따라 보장된다는 사실을 확인했습니다. 따라서 홍수 및 지붕 누수를 포함한 물 관련 문제는 일반적으로 주택 보험에서 보장됩니다.

몇 가지 주의 사항:

이 블로그 게시물은 Elasticsearch를 사용한 RAG 기술에 대한 초보자 소개이므로 이 시작점을 프로덕션으로 가져갈 수 있는 기능 구성은 생략되어 있습니다. 프로덕션 사용 사례를 위해 구축할 때는 문서 수준 보안으로 데이터를 보호할 수 있는지, Elasticsearch 수집 파이프라인의 일부로 데이터를 청크화하는지, 심지어 GenAI/Chat/Q에 사용되는 동일한 데이터에서 다른 ML 작업을 실행하는지 등 보다 정교한 측면을 고려해야 합니다.&A 사용 사례.

또한 Elastic 커넥터를 사용하여 다양한 외부 소스(예: Azure Blob Storage, Dropbox, Gmail 등)에서 데이터를 소싱하고 임베딩을 생성하는 것도 고려할 수 있습니다.

Elastic은 위의 모든 것을 가능하게 하며, GenAI 사용 사례와 그 이상을 위한 포괄적인 엔터프라이즈급 솔루션을 제공합니다.

이제 그 다음은?

  • 사용자 질문과 함께 10개의 관련 대화를 LLM으로 보내 답변을 작성하는 것을 보셨을 것입니다. 이러한 대화에는 이름, 생년월일, 주소 등과 같은 PII(개인 식별 정보)가 포함될 수 있습니다. 저희의 경우 LLM이 로컬에 있으므로 데이터 유출은 문제가 되지 않습니다. 그러나 클라우드에서 실행되는 LLM(예: OpenAI)을 사용하려는 경우 PII 정보가 포함된 문자를 보내는 것은 바람직하지 않습니다. 후속 블로그에서는 RAG 흐름에서 외부 LLM으로 전송하기 전에 PII 정보를 마스킹하는 방법을 살펴보겠습니다.
  • 이 글에서는 로컬 LLM을 사용했으며, 다음 글인 RAG의 PII 데이터 마스킹에서는 로컬 LLM에서 퍼블릭 LLM으로 쉽게 전환하는 방법을 살펴볼 예정입니다.

자주 묻는 질문

라마인덱스란 무엇인가요?

LlamaIndex는 LLM(대규모 언어 모델) 애플리케이션을 구축하기 위한 선도적인 데이터 프레임워크입니다.

미스트랄이란 무엇인가요?

미스트랄은 오픈 소스 및 최적화된 엔터프라이즈급 LLM 모델을 모두 제공하는 회사입니다.

관련 콘텐츠

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요