문서 메뉴
문서 홈
/
MongoDB 아틀라스
/

Atlas Vector Search를 사용한 RAG(검색-증강 생성)

이 페이지의 내용

  • RAG를 사용하는 이유
  • Atlas Vector Search를 사용한 RAG
  • 수집
  • 조회
  • 세대
  • 시작하기
  • 전제 조건
  • 절차
  • 다음 단계
  • 미세 조정

RAG(검색 보강 생성)는 더 정확한 응답을 생성할 수 있도록 대규모 언어 모델(LLM)을 추가 데이터로 보강하는 데 사용되는 아키텍처입니다. LLM 과 Atlas Vector Search에서 제공하는 검색 시스템을 결합하여 생성형 AI 애플리케이션에RAG 를 구현할 수 있습니다.

시작하기

LLM으로 작업할 때 다음과 같은 제한 사항이 발생할 수 있습니다.

  • 오래된 데이터: LLM은 특정 시점까지의 정적 데이터 세트에서 훈련됩니다. 즉, 지식 기반이 제한되어 있고 오래된 데이터를 사용할 수 있습니다.

  • 로컬 데이터에 대한 액세스 권한 없음: LLM은 로컬 또는 개인화된 데이터에 액세스할 수 없습니다. 따라서 특정 도메인에 대한 지식이 부족할 수 있습니다.

  • 환각: 교육 데이터가 불완전하거나 오래된 경우 LLM에서 부정확한 정보를 생성할 수 있습니다.

다음 단계에 따라 RAG 를 구현하면 이러한 제한을 해결할 수 있습니다.

  1. 수집 : 사용자 지정 데이터를 벡터 임베딩 으로 MongoDB Atlas와 같은 벡터 데이터베이스에 저장합니다. 이를 통해 최신 개인화된 데이터로 지식창고를 생성할 수 있습니다.

  2. 조회: Atlas Vector Search와 같은 검색 솔루션을 사용하여 사용자의 질문을 기반으로 데이터베이스에서 의미적으로 유사한 문서를 조회합니다. 이러한 문서는 추가적인 관련 데이터로 LLM 을 보강합니다.

  3. 생성: LLM 프롬프트 . LLM 은 검색된 문서를 컨텍스트로 사용하여 보다 정확하고 관련성 높은 응답을 생성하여 환각을 줄입니다.

RAG 는 질문 답변 및 텍스트 생성과 같은 작업을 가능하게 하므로 도메인별 개인화된 응답을 제공하는 AI 챗봇을 구축하는 데 효과적인 아키텍처입니다. 프로덕션 환경에서 사용할 수 있는 챗봇을 만들려면 RAG 구현 위에 요청을 라우팅하고 사용자 인터페이스를 구축하도록 서버를 구성해야 합니다.

Atlas Vector Search를 사용하여 RAG 를 구현하려면 Atlas로 데이터를 수집하고, Atlas Vector Search로 문서를 검색하고, LLM 을 사용하여 응답을 생성합니다. 이 섹션에서는 Atlas Vector Search를 사용한 기본 또는 순진한 RAG 구현의 구성 요소에 대해 설명합니다. 단계별 지침은 시작하기를 참조하세요.

Atlas Vector Search를 사용한 RAG 순서도
클릭하여 확대

RAG 용 데이터 수집에는 사용자 지정 데이터를 처리하고 이를 벡터 데이터베이스에 저장하여 검색을 준비하는 작업이 포함됩니다. Atlas를 벡터 데이터베이스로 사용하여 기본 수집 파이프라인을 만들려면 다음을 수행합니다.

  1. 데이터를 로드합니다. 문서 로더 와 같은 도구를 사용할 수 있습니다.또는 데이터 커넥터 다양한 데이터 형식과 위치에서 데이터를 로드합니다.

  2. 데이터를 처리하거나 청크 합니다. 청킹에는 성능 향상을 위해 데이터를 작은 부분으로 분할하는 작업이 포함됩니다.

  3. 임베딩 모델 을 사용하여 데이터를 벡터 임베딩 으로 변환합니다. 자세한 내용은 벡터 임베딩을 만드는 방법을 참조하세요.

  4. 이러한 임베딩을 Atlas에 저장합니다. 컬렉션의 다른 데이터와 함께 임베딩을 필드로 저장합니다.

검색 시스템을 구축하려면 벡터 데이터베이스에서 가장 관련성이 높은 문서를 검색하고 반환하여 LLM 을 보강해야 합니다. Atlas Vector Search로 관련 문서를 검색하려면 사용자의 질문을 벡터 임베딩으로 변환하고 Atlas의 데이터에 대해 벡터 검색 쿼리 를 실행하여 임베딩이 가장 유사한 문서를 찾습니다.

Atlas Vector Search를 사용하여 기본 검색을 수행하려면 다음을 수행합니다.

  1. 벡터 임베딩이 포함된 컬렉션에서 Atlas Vector Search 인덱스 를 정의합니다.

  2. 사용자의 질문에 따라 문서를 검색하려면 다음 방법 중 하나를 선택합니다.

    • 인기 있는 프레임워크 또는 서비스와 Atlas Vector Search 통합 을 사용하세요. 이러한 통합에는 Atlas Vector Search로 검색 시스템을 쉽게 구축할 수 있는 내장 라이브러리와 도구가 포함됩니다.

    • 나만의 검색 시스템을 구축하세요. 자체 함수와 파이프라인을 정의하여 사용 사례에 맞는 Atlas Vector Search 쿼리 를 실행할 수 있습니다.

응답을 생성하려면 검색 시스템을 LLM 과 결합합니다. 관련 문서를 조회하기 위해 벡터 검색을 수행한 후에는 관련 문서와 함께 사용자의 질문을 컨텍스트로 제공하여 LLM 이 보다 정확한 응답을 생성할 수 있도록 합니다.

다음 방법 중 하나를 선택하여 LLM 에 연결합니다.

  • 인기 있는 프레임워크 또는 서비스와 Atlas Vector Search 통합 을 사용하세요. 이러한 통합에는 최소한의 설정으로 LLM에 연결하는 데 도움이 되는 내장 라이브러리와 도구가 포함되어 있습니다.

  • LLMAPI를 호출합니다. 대부분의 AI 제공자는 응답을 생성하는 데 사용할 수 있는 생성 모델에 API를 제공합니다.

  • 오픈 소스 LLM 을 로드합니다. API 키나 크레딧이 없는 경우 애플리케이션에서 로컬로 로드하여 오픈 소스 LLM 을 사용할 수 있습니다.

다음 예제는 MongoDB LangChain 통합 및 허깅 페이스 를 사용하여 Atlas Vector Search로 기본 RAG를 구현하는 방법을 보여줍니다. 임베딩 및 생성 모델을 쉽게 로드하고 액세스할 수 있습니다.

이 예시를 완료하려면 다음이 필요합니다.

1

확장자가 .ipynb 인 파일을 저장하여 대화형 Python 노트북을 만든 후 노트북에서 다음 코드를 실행하여 종속성을 설치합니다.

pip install --quiet pymongo langchain langchain_community langchain_mongodb langchain_huggingface pypdf sentence_transformers
2

이 섹션에서는 LLM이 액세스할 수 없는 샘플 데이터를 Atlas로 수집 합니다. 다음 코드는 LangChain 통합PyMongo 드라이버 를 사용하여 다음을 수행합니다.

  • MongoDB의 최신 수익 보고서가 포함된 PDF를 로드합니다.

  • 데이터를 청크로 분할하여 청크 크기 (문자 수)와 청크 겹침 (연속된 청크 간에 겹치는 문자 수)을 지정합니다.

  • nomic-embed-text-v1 를 로드합니다. 허깅 페이스의 모델 허브에서 가져온 임베딩 모델입니다.

  • 데이터에서 벡터 임베딩을 생성하고 이러한 임베딩을 Atlas 클러스터의 rag_db.test 컬렉션에 저장합니다.

노트북에 다음 코드를 붙여넣고 실행하여 <connection-string> 을(를) Atlas 연결 문자열로 바꿉니다.

from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_mongodb import MongoDBAtlasVectorSearch
from pymongo import MongoClient
# Load the PDF
loader = PyPDFLoader("https://investors.mongodb.com/node/12236/pdf")
data = loader.load()
# Split the data into chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=20)
docs = text_splitter.split_documents(data)
# Load the embedding model (https://huggingface.co/nomic-ai/nomic-embed-text-v1")
model = HuggingFaceEmbeddings(model_name="nomic-ai/nomic-embed-text-v1", model_kwargs={ "trust_remote_code": True })
# Connect to your Atlas cluster
client = MongoClient("<connection-string>")
collection = client["rag_db"]["test"]
# Store the data as vector embeddings in Atlas
vector_store = MongoDBAtlasVectorSearch.from_documents(
documents = docs,
embedding = model,
collection = collection,
index_name = "vector_index"
)

코드를 실행한 후 클러스터의 rag_db.test 컬렉션으로 이동 하여 Atlas UI에서 벡터 임베딩을 볼 수 있습니다.

3

이 섹션에서는 Atlas Vector Search를 설정하여 벡터 데이터베이스에서 문서를 검색 합니다. 다음 단계를 완료하세요.

  1. 벡터 임베딩에 Atlas Vector Search 인덱스를 생성합니다.

    무료 및 공유 클러스터의 경우 , Atlas UI를 통해 인덱스를 생성하는 단계를 따르세요. 인덱스 이름을 vector_index 로 지정하고 다음 인덱스 정의를 사용합니다.

    {
    "fields": [
    {
    "type": "vector",
    "path": "embedding",
    "numDimensions": 768,
    "similarity": "euclidean"
    }
    ]
    }

    전용 클러스터의 경우 PyMongo 드라이버를 사용하여 애플리케이션에서 직접 인덱스를 만들 수 있습니다. 노트북에 다음 코드를 붙여넣고 실행합니다.

    pymongo.operations import SearchIndexModel
    # Create your index model, then create the search index
    search_index_model = SearchIndexModel(
    definition = {
    "fields": [
    {
    "type": "vector",
    "numDimensions": 768,
    "path": "embedding",
    "similarity": "cosine"
    }
    ]
    },
    name = "vector_index",
    type = "vectorSearch"
    )
    collection.create_search_index(model=search_index_model)
  2. Atlas Vector Search를 리트리버로 구성합니다.

    노트북에서 다음 코드를 실행하여 검색 시스템을 설정하고 LangChain 통합을 사용하여 샘플 시맨틱 검색 쿼리를 실행합니다.

    # Instantiate Atlas Vector Search as a retriever
    retriever = vector_store.as_retriever(
    search_type = "similarity"
    )
    # Run a sample query in order of relevance
    retriever.invoke("AI technology")
    [Document(metadata={'_id': '66a910ba7f78f7ec6760ceba', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 0}, page_content="more of our customers. We also see a tremendous opportunity to win more legacy workloads, as AI has now become a catalyst to modernize these\napplications. MongoDB's document-based architecture is particularly well-suited for the variety and scale of data required by AI-powered applications."),
    Document(metadata={'_id': '66a910ba7f78f7ec6760ced6', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 1}, page_content='artificial intelligence, in our offerings or partnerships; the growth and expansion of the market for database products and our ability to penetrate that\nmarket; our ability to integrate acquired businesses and technologies successfully or achieve the expected benefits of such acquisitions; our ability to'),
    Document(metadata={'_id': '66a910ba7f78f7ec6760cec3', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 0}, page_content='MongoDB continues to expand its AI ecosystem with the announcement of the MongoDB AI Applications Program (MAAP),'),
    Document(metadata={'_id': '66a910ba7f78f7ec6760cec4', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 1}, page_content='which provides customers with reference architectures, pre-built partner integrations, and professional services to help\nthem quickly build AI-powered applications. Accenture will establish a center of excellence focused on MongoDB projects,\nand is the first global systems integrator to join MAAP.')]
4

이 섹션에서는 검색된 문서를 컨텍스트로 사용하도록 LLM 에 프롬프트를 표시하여 응답을 생성 합니다. 다음 코드는 LangChain을 사용하여 다음을 수행합니다.

  • 미스트럴 7B 지침 에 액세스 허깅 페이스의 모델 허브에 있는 모델입니다.

  • 프롬프트 템플릿 사용하여 프롬프트에 사용자의 질문과 조회한 문서를 포함하도록 LLM 에 지시 및 체인.

  • MongoDB의 최신 AI 발표에 대해 LLM 에 표시합니다.

노트북에 다음 코드를 붙여넣고 실행하여 <token> 을 허깅 페이스 액세스 토큰으로 바꿉니다. 생성된 응답은 다를 수 있습니다.

from langchain_huggingface import HuggingFaceEndpoint
from langchain.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
import os
# Authenticate to your Hugging Face account
os.environ["HF_TOKEN"] = "<token>"
# Access the LLM (https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2)
llm = HuggingFaceEndpoint(repo_id="mistralai/Mistral-7B-Instruct-v0.2")
# Create prompt and RAG workflow
prompt = PromptTemplate.from_template("""
Answer the following question based on the given context.
Question: {question}
Context: {context}
""")
rag_chain = (
{ "context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# Prompt the LLM
question = "In a few sentences, what are MongoDB's latest AI announcements?"
answer = rag_chain.invoke(question)
print(answer)
Answer: MongoDB recently announced the MongoDB AI Applications Program
(MAAP) as part of their efforts to expand their AI ecosystem.
The document-based architecture of MongoDB is particularly well-suited
for AI-powered applications, offering an opportunity to win more legacy
workloads. These announcements were made at MongoDB.local NYC.

RAG 튜토리얼에 대한 자세한 내용을 보려면 다음 리소스를 참조하세요.

Atlas Vector Search로 프로덕션용 챗봇 구축을 시작하려면 MongoDB 챗봇 프레임워크 를 사용하면 됩니다. . 이 프레임워크는 AI 챗봇 애플리케이션을 빠르게 구축할 수 있는 라이브러리 세트를 제공합니다.

RAG 애플리케이션을 최적화하고 미세 조정하기 위해 다양한 임베딩 모델, 청크 전략 및 LLM을 실험할 수 있습니다. 자세히 알아보려면 다음 리소스를 참조하세요.

또한 Atlas Vector Search는 고급 검색 시스템을 지원합니다. Atlas에서는 벡터 데이터를 다른 데이터와 함께 원활하게 인덱싱할 수 있으므로 컬렉션의 다른 필드를 사전 필터링 하거나 하이브리드 검색 을 수행하여 시맨틱 검색을 전체 텍스트 검색 결과와 결합하여 검색 결과를 미세 조정할 수 있습니다.

돌아가기

쿼리 생성 및 실행

다음

배포 옵션 검토