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:
Configure o ambiente.
Crie um índice do MongoDB Vector Search .
Armazene dados personalizados no MongoDB.
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.
Plano de fundo
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.
Procedimento
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Um dos seguintes tipos de cluster MongoDB :
Um cluster do Atlas executando a versão 6.0.11 do MongoDB, 7.0.2, ou posterior. Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas.
Um sistema local do Atlas criado utilizando o Atlas CLI. Para saber mais, consulte Criar uma implantação de Atlas local.
Um cluster MongoDB Community ou Enterprise com Search e Vector Search instalados.
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.
Configurar o ambiente
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:
Instalar e importar dependências.
Execute o seguinte comando:
pip install --quiet --upgrade mongodb-atlas-haystack voyage-embedders-haystack pymongo 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
Defina as variáveis de ambiente.
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.
Crie o índice de Vector Search do MongoDB
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 .
Crie a coleção haystack_db.test
.
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]
Defina o índice do AMongoDB Vector Search .
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.
Armazenar dados personalizados no MongoDB
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.
Instancie o Atlas como um armazenamento de documento.
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
etest
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 )
Carregue dados de amostra em seu cluster Atlas.
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.
Responda a perguntas sobre seus dados
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:
O incorporador OpenAITextEmbedder para criar incorporações a partir de sua query.
O MongoDBAtlasEmbeddingRetriever recuperador para recuperar incorporações do seu armazenamento de documentos que sejam semelhantes à incorporação da consulta.
Um PromptBuilder que passa um modelo de prompt para instruir o LLM a usar o documento recuperado como contexto para o seu prompt.
O gerador OpenAIGenerator para gerar uma resposta sensível ao contexto usando um LLM da OpenAI.
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.
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Um dos seguintes tipos de cluster MongoDB :
Um cluster do Atlas executando a versão 6.0.11 do MongoDB, 7.0.2, ou posterior. Certifique-se de que seu endereço IP esteja incluído na lista de acesso do seu projeto Atlas.
Um sistema local do Atlas criado utilizando o Atlas CLI. Para saber mais, consulte Criar uma implantação de Atlas local.
Um cluster MongoDB Community ou Enterprise com Search e Vector Search instalados.
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.
Configurar o ambiente
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:
Instalar e importar dependências.
Execute o seguinte comando:
pip install --quiet --upgrade mongodb-atlas-haystack pymongo 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
Defina as variáveis de ambiente.
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.
Crie o índice de Vector Search do MongoDB
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 .
Crie a coleção haystack_db.test
.
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]
Defina o índice do MongoDB Vector Search .
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.
Armazenar dados personalizados no MongoDB
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.
Instancie o Atlas como um armazenamento de documento.
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
etest
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 )
Carregue dados de amostra em seu cluster Atlas.
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.
Responda a perguntas sobre seus dados
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:
O incorporador OpenAITextEmbedder para criar incorporações a partir de sua query.
O MongoDBAtlasEmbeddingRetriever recuperador para recuperar incorporações do seu armazenamento de documentos que sejam semelhantes à incorporação da consulta.
Um PromptBuilder que passa um modelo de prompt para instruir o LLM a usar o documento recuperado como contexto para o seu prompt.
O gerador OpenAIGenerator para gerar uma resposta sensível ao contexto usando um LLM da OpenAI.
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.
Próximos passos
O MongoDB também fornece os seguintes recursos para desenvolvedores: