Docs Menu
Docs Home
/
MongoDB Atlas
/ /

Haystack 통합 시작하기

이 페이지의 내용

  • 배경
  • 전제 조건
  • 환경 설정
  • Atlas Vector Search 인덱스 만들기
  • Atlas에 사용자 지정 데이터 저장
  • 데이터에 대한 질문에 답변
  • 다음 단계

Atlas Vector Search를 Haystack 통합하여 LLM을 사용하고 검색 기반 생성(RAG)을 구현한 커스텀 애플리케이션을 구축할 수 있습니다. 이 튜토리얼에서는 Haystack과 함께 Atlas Vector Search를 사용하여 데이터에 대한 시멘틱 검색을 수행하고 RAG 구현을 구축하는 방법을 보여줍니다. 구체적으로 다음 작업을 수행할 수 있습니다.

  1. 환경을 설정합니다.

  2. Atlas Vector Search 인덱스를 생성합니다.

  3. Atlas에 사용자 지정 데이터를 저장합니다.

  4. Atlas Vector Search를 사용하여 RAG 를 구현하여 데이터에 대한 질문에 답변하세요.

Haystack은 LLM, 임베딩 모델 및 벡터 검색을 사용하여 맞춤형 애플리케이션을 구축하기 위한 프레임워크입니다. Atlas Vector Search를 Haystack과 통합하면 Atlas를 벡터 데이터베이스로 사용하고 Atlas Vector Search를 사용하여 데이터에서 의미상 유사한 문서를 검색하여 RAG 를 구현할 수 있습니다. RAG에 대해 자세히 알아보려면 Atlas Vector Search를 사용한 검색 증강 생성(RAG)을 참조하세요.

이 튜토리얼을 완료하려면 다음 조건을 충족해야 합니다.

  • Atlas cluster 버전 6.0.11을 실행하는 MongoDB, 7.0.2 이상( RC 포함).

  • OpenAI API 키입니다. API 요청에 사용할 수 있는 크레딧이 있는 유료 OpenAI 계정이 있어야 합니다.

  • Colab과같은 Python 프로젝트를 실행하기 위한 노트북입니다.

    참고

    Colab을 사용하는 경우 노트북 세션의 IP 주소가 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요.

먼저 이 튜토리얼을 위한 환경을 설정해야 합니다. .ipynb 확장명으로 파일을 저장하여 대화형 Python Notebook을 만든 다음, Notebook에서 다음 코드 조각을 실행합니다.

1
  1. 다음 명령을 실행합니다:

    pip --quiet install mongodb-atlas-haystack pymongo
  2. 다음 코드를 실행하여 필요한 패키지를 가져옵니다.

    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
2

다음 코드를 실행하고 메시지가 표시되면 다음을 제공합니다.

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 프로젝트에 대한 Project Data Access Admin 이상의 액세스 권한이 있어야 합니다.

이 섹션에서는 haystack_db 데이터베이스를 만들고 컬렉션을 test 사용자 지정 데이터를 저장합니다. 그런 다음 데이터에 대한 벡터 검색 쿼리를 활성화하기 위해 Atlas Vector Search 인덱스를 생성합니다.

1
client = MongoClient(os.environ.get("MONGO_CONNECTION_STRING"))
2

다음 코드를 실행하여 haystack_db 데이터베이스와 test 컬렉션을 생성하세요.

# Create your database and collection
db_name = "haystack_db"
collection_name = "test"
database = client[db_name]
database.create_collection(collection_name)
# Define collection
collection = client[db_name][collection_name]
3

다음 코드를 실행하여 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의 컬렉션에 저장합니다. 노트북에 다음 코드 스니펫을 붙여넣고 실행합니다.

1

다음 코드를 실행하여 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",
)
2

이 코드는 몇 가지 샘플 문서를 정의하고 다음 구성 요소를 사용하여 파이프라인을 실행합니다.

  • 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를 구현하는 방법을 보여줍니다.

다음 코드는 다음 구성 요소로 파이프라인을 정의하고 실행합니다.

이 예제에서는 샘플 쿼리 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는 다음과 같은 개발자 리소스도 제공합니다.

다음도 참조하세요.

돌아가기

시맨틱 커널