MongoDB Vector Search를 Haystack 와 통합하여 LLM으로사용자 지정 애플리케이션을 빌드 하고 RAG(검색 강화 생성)를 구현 수 있습니다. 이 튜토리얼에서는 Haystack과 함께 MongoDB Vector Search를 사용하여 데이터에 대해 시맨틱 검색 수행하고 RAG 구현 빌드 방법을 보여줍니다. 구체적으로 다음 조치를 수행합니다.
환경을 설정합니다.
MongoDB Vector Search 인덱스 생성합니다.
사용자 지정 데이터를 MongoDB 에 저장합니다.
MongoDB Vector Search를 사용하여 데이터에 대한 질문에 답변 RAG 를 구현합니다.
이 튜토리얼의 실행 가능한 버전을 Python 노트북으로 사용합니다.
배경
Haystack은 LLM, 임베딩 모델 및 벡터 검색 사용하여 사용자 지정 애플리케이션을 구축하기 위한 프레임워크 입니다. MongoDB Vector Search를 Haystack과 통합하면 MongoDB 벡터 데이터베이스 로 사용하고 MongoDB Vector Search를 사용하여 데이터에서 의미적으로 유사한 문서를 검색하여 RAG 를 구현 . RAG에 대해 자세히 학습 MongoDB 사용한 RAG(검색 보강 생성)를 참조하세요.
절차
전제 조건
이 튜토리얼을 완료하려면 다음 조건을 충족해야 합니다.
다음 MongoDB cluster 유형 중 하나입니다.
MongoDB 버전 6.0.11을 실행하는 Atlas 클러스터 7.0.2 또는 그 이상. IP 주소가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요.
Atlas CLI 사용하여 생성된 로컬 Atlas 배포서버 입니다. 자세히 학습 로컬 Atlas 배포 만들기를 참조하세요.
검색 및 벡터 검색이 설치된 MongoDB Community 또는 Enterprise 클러스터.
OpenAI API 키입니다. API 요청에 사용할 수 있는 크레딧이 있는 OpenAI 계정이 있어야 합니다. OpenAI 계정 등록에 대해 자세히 학습하려면 OpenAI API 웹사이트를 참조하세요.
Voyage AI API 키입니다. 계정과 API 키를 만들려면 Voyage AI 웹사이트참조하세요.
Colab과같은 Python 프로젝트 실행 위한 노트북입니다.
환경 설정
이 튜토리얼의 환경을 설정합니다. 확장자가 .ipynb
인 파일 저장하여 대화형 Python 노트북을 만듭니다. 이 노트북을 사용하면 Python 코드 스니펫을 개별적으로 실행 수 있으며, 이 튜토리얼에서는 이를 사용하여 코드를 실행 .
노트북 환경을 설정하다 하려면 다음을 수행합니다.
종속성을 설치하고 가져옵니다.
다음 명령을 실행합니다:
pip install --quiet --upgrade mongodb-atlas-haystack voyage-embedders-haystack pymongo 다음 코드를 실행하여 필요한 패키지를 가져옵니다.
import os from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy from haystack.components.writers import DocumentWriter from haystack.components.generators import OpenAIGenerator from haystack.components.builders.prompt_builder import PromptBuilder from haystack_integrations.components.embedders.voyage_embedders import VoyageDocumentEmbedder, VoyageTextEmbedder from haystack_integrations.document_stores.mongodb_atlas import MongoDBAtlasDocumentStore from haystack_integrations.components.retrievers.mongodb_atlas import MongoDBAtlasEmbeddingRetriever from pymongo import MongoClient from pymongo.operations import SearchIndexModel
환경 변수를 정의합니다.
다음 코드를 실행하고 자리 표시자를 다음 값으로 대체합니다.
Voyage AI API 키.
사용자의 OpenAI API 키.
MongoDB 클러스터의 연결 문자열.
os.environ["VOYAGE_API_KEY"] = "<voyage-api-key>" os.environ["OPENAI_API_KEY"] = "<openai-api-key>" os.environ["MONGO_CONNECTION_STRING"]= "<connection-string>"
참고
<connection-string>
을 Atlas 클러스터 또는 로컬 Atlas 배포서버의 연결 문자열로 교체합니다.
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
자세한 학습은 드라이버를 통해 클러스터에 연결을 참조하세요.
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb://localhost:<port-number>/?directConnection=true
학습 내용은 연결 문자열을 참조하세요.
MongoDB Vector Search 인덱스 만들기
이 섹션에서는 사용자 지정 데이터를 저장 haystack_db
데이터베이스 와 test
컬렉션 만듭니다. 그런 다음 데이터에 대한 벡터 검색 쿼리를 활성화 하려면 MongoDB Vector Search 인덱스 만듭니다.
AMongoDB Vector Search 인덱스 정의합니다.
다음 코드를 실행하여 vectorSearch 유형의 인덱스 만듭니다. embedding
필드 에는 Voyage AI의 voyage-3-large
임베딩 모델을 사용하여 생성할 임베딩이 포함되어 있습니다. 인덱스 정의는 1024
벡터 차원을 지정하고 cosine
를 사용하여 유사성을 측정합니다.
# Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1024, "similarity": "cosine" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
인덱스 작성에는 약 1분 정도가 소요됩니다. 인덱스가 작성되는 동안 인덱스는 초기 동기화 상태에 있습니다. 빌드가 완료되면 컬렉션의 데이터 쿼리를 시작할 수 있습니다.
MongoDB 에 사용자 지정 데이터 저장
이 섹션에서는 MongoDB 문서 저장 라고도 하는 벡터 데이터베이스 로 인스턴스화합니다. 그런 다음 사용자 지정 데이터에서 벡터 임베딩을 생성하고 이러한 문서를 MongoDB 의 컬렉션 에 저장 . 노트북에 다음 코드 스니펫을 붙여넣고 실행 .
Atlas를 문서 저장소로 인스턴스화합니다.
다음 코드를 실행하여 Atlas를 문서 저장소로 인스턴스화합니다. 이 코드는 Atlas 클러스터에 대한 연결을 설정하고 다음을 지정합니다.
haystack_db
및 문서를 저장하는 데 사용되는 Atlas 데이터베이스 및 컬렉션으로test
를 사용합니다.vector_index
시맨틱 Atlas Search 쿼리를 실행하는 데 사용되는 인덱스로 사용됩니다.
document_store = MongoDBAtlasDocumentStore( database_name="haystack_db", collection_name="test", vector_search_index="vector_index", full_text_search_index="search_index" # Declared but not used in this example )
Atlas cluster에 샘플 데이터를 로드합니다.
이 코드는 몇 가지 샘플 문서를 정의하고 다음 구성 요소를 사용하여 파이프라인을 실행합니다.
# Create some example documents documents = [ Document(content="My name is Jean and I live in Paris."), Document(content="My name is Mark and I live in Berlin."), Document(content="My name is Giorgio and I live in Rome."), ] # Initializing a document embedder to convert text content into vectorized form. doc_embedder = VoyageDocumentEmbedder() # Setting up a document writer to handle the insertion of documents into the MongoDB collection. doc_writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP) # Creating a pipeline for indexing documents. The pipeline includes embedding and writing documents. indexing_pipe = Pipeline() indexing_pipe.add_component(instance=doc_embedder, name="doc_embedder") indexing_pipe.add_component(instance=doc_writer, name="doc_writer") # Connecting the components of the pipeline for document flow. indexing_pipe.connect("doc_embedder.documents", "doc_writer.documents") # Running the pipeline with the list of documents to index them in MongoDB. indexing_pipe.run({"doc_embedder": {"documents": documents}})
Calculating embeddings: 100%|██████████| 1/1 [00:00<00:00, 4.42it/s] {'doc_embedder': {'meta': {'total_tokens': 32}}, 'doc_writer': {'documents_written': 3}}
팁
샘플 코드를 실행 후 Atlas 사용하는 경우 haystack_db.test
Atlas UI 의 네임스페이스 로이동하여 벡터 임베딩을 확인할 수 있습니다.
데이터에 대한 질문에 답변
이 섹션에서는 MongoDB Vector Search 및 Haystack을 사용하여 애플리케이션에서 RAG 를 구현 방법을 설명합니다.
다음 코드는 다음 구성 요소로 파이프라인을 정의하고 실행합니다.
OpenAITextEmbedder 임베더 를 사용하여 쿼리에서 임베딩을 생성합니다.
MongoDBAtlasEmbeddingRetriever 리트리버 를 사용하여 문서 저장 에서 쿼리 임베딩과 유사한 임베딩을 조회 .
조회된 문서 프롬프트의 컨텍스트로 사용하도록 LLM에 지시하는 프롬프트 템플릿을 전달하는 PromptBuilder 입니다.
OpenAIGenerator 생성기 는 OpenAI의 LLM을 사용하여 컨텍스트 인식 응답을 생성합니다.
이 예시 에서는 샘플 쿼리 Where does Mark live?
을 사용하여 LLM에 프롬프트를 표시합니다. LLM은 Atlas 에 저장한 사용자 지정 데이터로부터 정확한 컨텍스트 인식 응답을 생성합니다.
# Template for generating prompts for a movie recommendation engine. prompt_template = """ You are an assistant allowed to use the following context documents.\nDocuments: {% for doc in documents %} {{ doc.content }} {% endfor %} \nQuery: {{query}} \nAnswer: """ # Setting up a retrieval-augmented generation (RAG) pipeline for generating responses. rag_pipeline = Pipeline() rag_pipeline.add_component("text_embedder", VoyageTextEmbedder()) # Adding a component for retrieving related documents from MongoDB based on the query embedding. rag_pipeline.add_component(instance=MongoDBAtlasEmbeddingRetriever(document_store=document_store,top_k=15), name="retriever") # Building prompts based on retrieved documents to be used for generating responses. rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template, required_variables=["query", "documents"])) # Adding a language model generator to produce the final text output. rag_pipeline.add_component("llm", OpenAIGenerator()) # Connecting the components of the RAG pipeline to ensure proper data flow. rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding") rag_pipeline.connect("retriever", "prompt_builder.documents") rag_pipeline.connect("prompt_builder", "llm") # Run the pipeline query = "Where does Mark live?" result = rag_pipeline.run( { "text_embedder": {"text": query}, "prompt_builder": {"query": query}, }); print(result['llm']['replies'][0])
Mark lives in Berlin.
전제 조건
이 튜토리얼을 완료하려면 다음 조건을 충족해야 합니다.
다음 MongoDB cluster 유형 중 하나입니다.
MongoDB 버전 6.0.11을 실행하는 Atlas 클러스터 7.0.2 또는 그 이상. IP 주소가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요.
Atlas CLI 사용하여 생성된 로컬 Atlas 배포서버 입니다. 자세히 학습 로컬 Atlas 배포 만들기를 참조하세요.
검색 및 벡터 검색이 설치된 MongoDB Community 또는 Enterprise 클러스터.
OpenAI API 키입니다. API 요청에 사용할 수 있는 크레딧이 있는 OpenAI 계정이 있어야 합니다. OpenAI 계정 등록에 대해 자세히 학습하려면 OpenAI API 웹사이트를 참조하세요.
Colab과같은 Python 프로젝트 실행 위한 노트북입니다.
환경 설정
이 튜토리얼의 환경을 설정합니다. 확장자가 .ipynb
인 파일 저장하여 대화형 Python 노트북을 만듭니다. 이 노트북을 사용하면 Python 코드 스니펫을 개별적으로 실행 수 있으며, 이 튜토리얼에서는 이를 사용하여 코드를 실행 .
노트북 환경을 설정하다 하려면 다음을 수행합니다.
종속성을 설치하고 가져옵니다.
다음 명령을 실행합니다:
pip install --quiet --upgrade mongodb-atlas-haystack pymongo 다음 코드를 실행하여 필요한 패키지를 가져옵니다.
import os from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy from haystack.components.writers import DocumentWriter from haystack.components.generators import OpenAIGenerator from haystack.components.builders.prompt_builder import PromptBuilder from haystack.components.embedders import OpenAITextEmbedder, OpenAIDocumentEmbedder from haystack_integrations.document_stores.mongodb_atlas import MongoDBAtlasDocumentStore from haystack_integrations.components.retrievers.mongodb_atlas import MongoDBAtlasEmbeddingRetriever from pymongo import MongoClient from pymongo.operations import SearchIndexModel
환경 변수를 정의합니다.
다음 코드를 실행하고 자리 표시자를 다음 값으로 대체합니다.
사용자의 OpenAI API 키.
MongoDB 클러스터의 연결 문자열.
os.environ["OPENAI_API_KEY"] = "<api-key>" os.environ["MONGO_CONNECTION_STRING"]= "<connection-string>"
참고
<connection-string>
을 Atlas 클러스터 또는 로컬 Atlas 배포서버의 연결 문자열로 교체합니다.
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
자세한 학습은 드라이버를 통해 클러스터에 연결을 참조하세요.
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb://localhost:<port-number>/?directConnection=true
학습 내용은 연결 문자열을 참조하세요.
MongoDB Vector Search 인덱스 만들기
이 섹션에서는 사용자 지정 데이터를 저장 haystack_db
데이터베이스 와 test
컬렉션 만듭니다. 그런 다음 데이터에 대한 벡터 검색 쿼리를 활성화 하려면 MongoDB Vector Search 인덱스 만듭니다.
MongoDB Vector Search 인덱스 정의합니다.
다음 코드를 실행하여 vectorSearch 유형의 인덱스를 만듭니다. embedding
필드에는 OpenAI의 text-embedding-ada-002
임베딩 모델을 사용하여 생성할 임베딩이 포함되어 있습니다. 인덱스 정의는 1536
벡터 차원을 지정하고 cosine
을 사용하여 유사성을 측정합니다.
# Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1536, "similarity": "cosine" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
인덱스 작성에는 약 1분 정도가 소요됩니다. 인덱스가 작성되는 동안 인덱스는 초기 동기화 상태에 있습니다. 빌드가 완료되면 컬렉션의 데이터 쿼리를 시작할 수 있습니다.
MongoDB 에 사용자 지정 데이터 저장
이 섹션에서는 MongoDB 문서 저장 라고도 하는 벡터 데이터베이스 로 인스턴스화합니다. 그런 다음 사용자 지정 데이터에서 벡터 임베딩을 생성하고 이러한 문서를 MongoDB 의 컬렉션 에 저장 . 노트북에 다음 코드 스니펫을 붙여넣고 실행 .
Atlas를 문서 저장소로 인스턴스화합니다.
다음 코드를 실행하여 Atlas를 문서 저장소로 인스턴스화합니다. 이 코드는 Atlas 클러스터에 대한 연결을 설정하고 다음을 지정합니다.
haystack_db
및 문서를 저장하는 데 사용되는 Atlas 데이터베이스 및 컬렉션으로test
를 사용합니다.vector_index
시맨틱 Atlas Search 쿼리를 실행하는 데 사용되는 인덱스로 사용됩니다.
document_store = MongoDBAtlasDocumentStore( database_name="haystack_db", collection_name="test", vector_search_index="vector_index", full_text_search_index="search_index" # Declared but not used in this example )
Atlas cluster에 샘플 데이터를 로드합니다.
이 코드는 몇 가지 샘플 문서를 정의하고 다음 구성 요소를 사용하여 파이프라인을 실행합니다.
# Create some example documents documents = [ Document(content="My name is Jean and I live in Paris."), Document(content="My name is Mark and I live in Berlin."), Document(content="My name is Giorgio and I live in Rome."), ] # Initializing a document embedder to convert text content into vectorized form. doc_embedder = OpenAIDocumentEmbedder() # Setting up a document writer to handle the insertion of documents into the MongoDB collection. doc_writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP) # Creating a pipeline for indexing documents. The pipeline includes embedding and writing documents. indexing_pipe = Pipeline() indexing_pipe.add_component(instance=doc_embedder, name="doc_embedder") indexing_pipe.add_component(instance=doc_writer, name="doc_writer") # Connecting the components of the pipeline for document flow. indexing_pipe.connect("doc_embedder.documents", "doc_writer.documents") # Running the pipeline with the list of documents to index them in MongoDB. indexing_pipe.run({"doc_embedder": {"documents": documents}})
Calculating embeddings: 100%|██████████| 1/1 [00:00<00:00, 4.16it/s] {'doc_embedder': {'meta': {'model': 'text-embedding-ada-002', 'usage': {'prompt_tokens': 32, 'total_tokens': 32}}}, 'doc_writer': {'documents_written': 3}}
팁
샘플 코드를 실행 후 Atlas 사용하는 경우 haystack_db.test
Atlas UI 의 네임스페이스 로이동하여 벡터 임베딩을 확인할 수 있습니다.
데이터에 대한 질문에 답변
이 섹션에서는 MongoDB Vector Search 및 Haystack을 사용하여 애플리케이션에서 RAG 를 구현 방법을 설명합니다.
다음 코드는 다음 구성 요소로 파이프라인을 정의하고 실행합니다.
OpenAITextEmbedder 임베더 를 사용하여 쿼리에서 임베딩을 생성합니다.
MongoDBAtlasEmbeddingRetriever 리트리버 를 사용하여 문서 저장 에서 쿼리 임베딩과 유사한 임베딩을 조회 .
조회된 문서 프롬프트의 컨텍스트로 사용하도록 LLM에 지시하는 프롬프트 템플릿을 전달하는 PromptBuilder 입니다.
OpenAIGenerator 생성기 는 OpenAI의 LLM을 사용하여 컨텍스트 인식 응답을 생성합니다.
이 예시 에서는 샘플 쿼리 Where does Mark live?
을 사용하여 LLM에 프롬프트를 표시합니다. LLM은 Atlas 에 저장한 사용자 지정 데이터로부터 정확한 컨텍스트 인식 응답을 생성합니다.
# Template for generating prompts for a movie recommendation engine. prompt_template = """ You are an assistant allowed to use the following context documents.\nDocuments: {% for doc in documents %} {{ doc.content }} {% endfor %} \nQuery: {{query}} \nAnswer: """ # Setting up a retrieval-augmented generation (RAG) pipeline for generating responses. rag_pipeline = Pipeline() rag_pipeline.add_component("text_embedder", OpenAITextEmbedder()) # Adding a component for retrieving related documents from MongoDB based on the query embedding. rag_pipeline.add_component(instance=MongoDBAtlasEmbeddingRetriever(document_store=document_store,top_k=15), name="retriever") # Building prompts based on retrieved documents to be used for generating responses. rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template, required_variables=["query", "documents"])) # Adding a language model generator to produce the final text output. rag_pipeline.add_component("llm", OpenAIGenerator()) # Connecting the components of the RAG pipeline to ensure proper data flow. rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding") rag_pipeline.connect("retriever", "prompt_builder.documents") rag_pipeline.connect("prompt_builder", "llm") # Run the pipeline query = "Where does Mark live?" result = rag_pipeline.run( { "text_embedder": {"text": query}, "prompt_builder": {"query": query}, }); print(result['llm']['replies'][0])
Mark lives in Berlin.
다음 단계
MongoDB는 다음과 같은 개발자 리소스도 제공합니다.