Haystack 통합 시작하기
Atlas Vector Search를 Haystack 통합하여 LLM을 사용하고 검색 기반 생성(RAG)을 구현한 커스텀 애플리케이션을 구축할 수 있습니다. 이 튜토리얼에서는 Haystack과 함께 Atlas Vector Search를 사용하여 데이터에 대한 시멘틱 검색을 수행하고 RAG 구현을 구축하는 방법을 보여줍니다. 구체적으로 다음 작업을 수행할 수 있습니다.
환경을 설정합니다.
Atlas Vector Search 인덱스를 생성합니다.
Atlas에 사용자 지정 데이터를 저장합니다.
Atlas Vector Search를 사용하여 RAG 를 구현하여 데이터에 대한 질문에 답변하세요.
배경
Haystack은 LLM, 임베딩 모델 및 벡터 검색을 사용하여 맞춤형 애플리케이션을 구축하기 위한 프레임워크입니다. Atlas Vector Search를 Haystack과 통합하면 Atlas를 벡터 데이터베이스로 사용하고 Atlas Vector Search를 사용하여 데이터에서 의미상 유사한 문서를 검색하여 RAG 를 구현할 수 있습니다. RAG에 대해 자세히 알아보려면 Atlas Vector Search를 사용한 검색 증강 생성(RAG)을 참조하세요.
전제 조건
이 튜토리얼을 완료하려면 다음 조건을 충족해야 합니다.
환경 설정
먼저 이 튜토리얼을 위한 환경을 설정해야 합니다. .ipynb
확장명으로 파일을 저장하여 대화형 Python Notebook을 만든 다음, Notebook에서 다음 코드 조각을 실행합니다.
종속성을 설치하고 가져옵니다.
다음 명령을 실행합니다:
pip --quiet install mongodb-atlas-haystack pymongo 다음 코드를 실행하여 필요한 패키지를 가져옵니다.
import getpass, 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 키.
Atlas cluster의 SRV 연결 string 입니다.
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:") os.environ["MONGO_CONNECTION_STRING"]=getpass.getpass("MongoDB Atlas Connection String:")
참고
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Atlas Vector Search 인덱스 만들기
참고
Atlas Vector Search 검색 인덱스를 만들려면 Atlas 프로젝트에 대한 Project Data Access Admin
이상의 액세스 권한이 있어야 합니다.
이 섹션에서는 haystack_db
데이터베이스를 만들고 컬렉션을 test
사용자 지정 데이터를 저장합니다. 그런 다음 데이터에 대한 벡터 검색 쿼리를 활성화하기 위해 Atlas Vector Search 인덱스를 생성합니다.
Atlas 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분 정도가 소요됩니다. 인덱스가 작성되는 동안 인덱스는 초기 동기화 상태에 있습니다. 빌드가 완료되면 컬렉션의 데이터 쿼리를 시작할 수 있습니다.
Atlas에 사용자 지정 데이터 저장
이 섹션에서는 Atlas를 벡터 데이터베이스(문서 저장소라고도 함)로 인스턴스화합니다. 그런 다음, 사용자 지정 데이터에서 벡터 임베딩을 만들고 이러한 문서를 Atlas의 컬렉션에 저장합니다. 노트북에 다음 코드 스니펫을 붙여넣고 실행합니다.
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", )
Atlas cluster에 샘플 데이터를 로드합니다.
이 코드는 몇 가지 샘플 문서를 정의하고 다음 구성 요소를 사용하여 파이프라인을 실행합니다.
OpenAI의 임베더가 문서를 벡터 임베딩으로 변환합니다.
# 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}}
팁
샘플 코드를 실행한 후 haystack_db.test
cluster의 collection으로 이동 하여 Atlas UI에서 벡터 임베딩을 볼 수 있습니다.
데이터에 대한 질문에 답변
이 섹션에서는 Atlas Vector Search 및 Haystack을 사용하여 애플리케이션에 RAG를 구현하는 방법을 보여줍니다.
다음 코드는 다음 구성 요소로 파이프라인을 정의하고 실행합니다.
OpenAITextEmbedder 임베더를 사용하여 쿼리에서 임베딩을 생성합니다.
MongoDBAtlasEmbeddingRetriever 조회기는 문서 저장소에서 쿼리 임베딩과 유사한 임베딩을 조회합니다.
PromptBuilder는 LLM 에 조회된 문서를 프롬프트의 컨텍스트로 사용하도록 지시하는 프롬프트 템플릿을 전달합니다.
OpenAI의 LLM을 사용하여 문맥을 이해하는 응답을 생성하는 OpenAIGenerator 생성기입니다.
이 예제에서는 샘플 쿼리 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(instance=PromptBuilder(template=prompt_template), name="prompt_builder") # Adding a language model generator to produce the final text output. rag_pipeline.add_component(instance=OpenAIGenerator(), name="llm") # 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는 다음과 같은 개발자 리소스도 제공합니다.