Menu Docs
Página inicial do Docs
/
Atlas
/ /

Introdução à integração do Haystack

Você pode integrar o MongoDB Vector Search ao haystack para criar aplicativos personalizados com LLMs e implementar a geração aumentada de recuperação (RAG). Este tutorial demonstra como começar a usar o MongoDB Vector Search com o Haystack para executar pesquisas semânticas em seus dados e criar uma implementação de RAG. Especificamente, você executa as seguintes ações:

  1. Configure o ambiente.

  2. Crie um índice do MongoDB Vector Search .

  3. Armazene dados personalizados no MongoDB.

  4. Implemente o RAG usando o MongoDB Vector Search para responder a perguntas sobre seus dados.

Trabalhe com uma versão executável deste tutorial como um notebook Python.

OHaystack é uma estrutura para criar aplicativos personalizados com LLMs, modelos de incorporação e pesquisa vetorial. Ao integrar o MongoDB Vector Search com o Haystack, você pode usar o MongoDB como um banco de dados vetorial e usar o MongoDB Vector Search para implementar RAG, recuperando documentos semanticamente semelhantes de seus dados. Para saber mais sobre RAG, consulte Geração Aumentada de Recuperação (RAG) com o MongoDB.

Para concluir este tutorial, você deve ter o seguinte:

  • Um dos seguintes tipos de cluster MongoDB :

  • Uma chave de API da OpenAI. Você deve ter uma conta da OpenAI com créditos disponíveis para solicitações de API. Para aprender mais sobre como registrar uma conta OpenAI, consulte o website de API OpenAI.

  • Uma chave de API da Voyage AI. Para criar uma conta e uma chave de API, consulte o site da Voyage AI.

  • Um bloco de anotações para executar seu projeto Python, como o CoLab.

Configure o ambiente para este tutorial. Crie um bloco de anotações Python interativo salvando um arquivo com a extensão .ipynb. Este bloco de anotações permite que você execute trechos de código Python individualmente, e você o usará para executar o código neste tutorial.

Para configurar seu ambiente de bloco de anotações:

1
  1. Execute o seguinte comando:

    pip install --quiet --upgrade mongodb-atlas-haystack voyage-embedders-haystack pymongo
  2. Execute o seguinte código para importar os pacotes necessários:

    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
2

Execute o código a seguir, substituindo os espaços reservados pelos seguintes valores:

  • Sua chave de API do Voyage AI.

  • Sua chave de API da OpenAI.

  • A string de conexão do cluster MongoDB .

os.environ["VOYAGE_API_KEY"] = "<voyage-api-key>"
os.environ["OPENAI_API_KEY"] = "<openai-api-key>"
os.environ["MONGO_CONNECTION_STRING"]= "<connection-string>"

Observação

Substitua <connection-string> pela string de conexão do seu cluster do Atlas ou da implantação local do Atlas.

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

Para saber mais, consulte Conectar a um cluster via drivers.

Sua string de conexão deve usar o seguinte formato:

mongodb://localhost:<port-number>/?directConnection=true

Para saber mais, consulte Connection strings.

Nesta seção, você cria o banco de dados do haystack_db e a coleção do test para armazenar seus dados personalizados. Em seguida, para habilitar queries de pesquisa vetorial em seus dados, você cria um índice de Vector Search do MongoDB .

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

Execute o seguinte código para criar seu banco de banco de dados haystack_db e coleção 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

Execute o seguinte código para criar um índice do tipo vectorSearch. O campo embedding contém as incorporações que você criará usando o modelo de incorporação voyage-3-large do Voyage AI. A definição de índice especifica 1024 dimensões vetoriais e mede a similaridade usando 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)

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Nesta seção, você instancia o MongoDB como um banco de dados vetorial, também chamado de armazenamento de documento . Em seguida, crie incorporações vetoriais a partir de dados personalizados e armazene esses documentos em uma coleção no MongoDB. Cole e execute os seguintes trechos de código em seu bloco de anotações.

1

Execute o código a seguir para instanciar o Atlas como um armazenamento de documentos. Este código estabelece uma ligação ao seu cluster do Atlas e especifica o seguinte:

  • haystack_db e test como banco de dados e coleção do Atlas usados para armazenar os documentos.

  • vector_index como o índice usado para executar queries semânticas 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
)
2

Este código define alguns documentos de amostra e executa um pipeline com os seguintes componentes:

  • Um incorporador da OpenAI para converter seu documento em incorporações vetoriais.

  • Um gravador de documentos para preencher seu armazenamento de documentos com os documentos de amostra e suas incorporações.

# 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}}

Dica

Depois de executar o código de amostra, se estiver usando o Atlas, poderá verificar suas incorporações vetoriais navegando até o namespace haystack_db.test na interface do usuário do Atlas.

Esta seção demonstra como implementar RAG em seu aplicação com a Vector Search do MongoDB e o mongoDB.

O código a seguir define e executa um pipeline com os seguintes componentes:

Neste exemplo, você solicita ao LLM a query de exemplo Where does Mark live?. O LLM gera uma resposta precisa e sensível ao contexto a partir dos dados personalizados armazenados no 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.

Para concluir este tutorial, você deve ter o seguinte:

  • Um dos seguintes tipos de cluster MongoDB :

  • Uma chave de API da OpenAI. Você deve ter uma conta da OpenAI com créditos disponíveis para solicitações de API. Para aprender mais sobre como registrar uma conta OpenAI, consulte o website de API OpenAI.

  • Um bloco de anotações para executar seu projeto Python, como o CoLab.

Configure o ambiente para este tutorial. Crie um bloco de anotações Python interativo salvando um arquivo com a extensão .ipynb. Este bloco de anotações permite que você execute trechos de código Python individualmente, e você o usará para executar o código neste tutorial.

Para configurar seu ambiente de bloco de anotações:

1
  1. Execute o seguinte comando:

    pip install --quiet --upgrade mongodb-atlas-haystack pymongo
  2. Execute o seguinte código para importar os pacotes necessários:

    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
2

Execute o código a seguir, substituindo os espaços reservados pelos seguintes valores:

  • Sua chave de API da OpenAI.

  • A string de conexão do cluster MongoDB .

os.environ["OPENAI_API_KEY"] = "<api-key>"
os.environ["MONGO_CONNECTION_STRING"]= "<connection-string>"

Observação

Substitua <connection-string> pela string de conexão do seu cluster do Atlas ou da implantação local do Atlas.

Sua string de conexão deve usar o seguinte formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

Para saber mais, consulte Conectar a um cluster via drivers.

Sua string de conexão deve usar o seguinte formato:

mongodb://localhost:<port-number>/?directConnection=true

Para saber mais, consulte Connection strings.

Nesta seção, você cria o banco de dados do haystack_db e a coleção do test para armazenar seus dados personalizados. Em seguida, para habilitar queries de pesquisa vetorial em seus dados, você cria um índice de Vector Search do MongoDB .

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

Execute o seguinte código para criar seu banco de banco de dados haystack_db e coleção 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

Execute o código a seguir para criar um índice do tipo VectorSearch. O campo embedding contém as incorporações que você criará utilizando o modelo de incorporação text-embedding-ada-002 do OpenAI. A definição de índice especifica 1536 dimensões vetoriais e mede a similaridade utilizando 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)

O índice deve levar cerca de um minuto para ser criado. Enquanto ele é compilado, o índice está em um estado de sincronização inicial. Quando a construção estiver concluída, você poderá começar a fazer query nos dados em sua coleção.

Nesta seção, você instancia o MongoDB como um banco de dados vetorial, também chamado de armazenamento de documento . Em seguida, crie incorporações vetoriais a partir de dados personalizados e armazene esses documentos em uma coleção no MongoDB. Cole e execute os seguintes trechos de código em seu bloco de anotações.

1

Execute o código a seguir para instanciar o Atlas como um armazenamento de documentos. Este código estabelece uma ligação ao seu cluster do Atlas e especifica o seguinte:

  • haystack_db e test como banco de dados e coleção do Atlas usados para armazenar os documentos.

  • vector_index como o índice usado para executar queries semânticas 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
)
2

Este código define alguns documentos de amostra e executa um pipeline com os seguintes componentes:

  • Um incorporador da OpenAI para converter seu documento em incorporações vetoriais.

  • Um gravador de documentos para preencher seu armazenamento de documentos com os documentos de amostra e suas incorporações.

# 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}}

Dica

Depois de executar o código de amostra, se estiver usando o Atlas, poderá verificar suas incorporações vetoriais navegando até o namespace haystack_db.test na interface do usuário do Atlas.

Esta seção demonstra como implementar RAG em seu aplicação com a Vector Search do MongoDB e o mongoDB.

O código a seguir define e executa um pipeline com os seguintes componentes:

Neste exemplo, você solicita ao LLM a query de exemplo Where does Mark live?. O LLM gera uma resposta precisa e sensível ao contexto a partir dos dados personalizados armazenados no 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.

O MongoDB também fornece os seguintes recursos para desenvolvedores:

Voltar

Integração C#

Nesta página