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

Crie uma implementação de RAG local com Atlas Vector Search

Nesta página

  • Plano de fundo
  • Pré-requisitos
  • Criar uma implantação local do Atlas
  • Configurar o ambiente
  • Gerar incorporações com um modelo local
  • Criar o índice Atlas Vector Search Index
  • Responda a perguntas com um LLM local

Este tutorial demonstra como implementar a geração aumentada de recuperação (RAG) localmente, sem a necessidade de chaves ou créditos deAPI . Para saber mais sobre o RAG, consulte Geração de Recuperação Aumentada (RAG) com Atlas Vector Search .

Especificamente, você executa as seguintes ações:

  1. Crie um sistema do Atlas local.

  2. Configure o ambiente.

  3. Use um modelo de incorporação local para gerar incorporações vetoriais.

  4. Crie um índice de pesquisa do Atlas Vector Search em seus dados.

  5. Implemente um LLM local para responder a perguntas sobre seus dados.

Para concluir este tutorial, você pode criar um sistema local do Atlas usando o Atlas CLI ou implementar um cluster na nuvem. A Atlas CLI é a interface de linha de comando do MongoDB Atlas, e você pode usar a Atlas CLI para interagir com o Atlas a partir do terminal para várias tarefas, incluindo a criação de sistemas locais do Atlas. Para saber mais, consulte Gerenciar sistemas locais e de nuvem a partir do Atlas CLI.

Observação

As implantações locais do Atlas são destinadas apenas para testes. Para ambientes de produção, implemente um cluster.

Você também usa os seguintes modelos de código aberto neste tutorial:

Há várias maneiras de baixar e distribuir LLMs localmente. Neste tutorial, você baixa o 7modelo B do Miscal usando GPT Todos4, um ecossistema de código aberto para o desenvolvimento local de LLM .

Este tutorial também usa LangChain, uma estrutura LLM popular de código aberto, para conectar-se a esses modelos e integrá-los ao Atlas Vector Search. Se você preferir modelos diferentes ou uma estrutura diferente, pode adaptar este tutorial substituindo os nomes dos modelos e os componentes específicos do LangChain por seus equivalentes para sua configuração preferida.

Para saber mais sobre como aproveitar o LangChain em seus aplicativos RAG , consulte Introdução à integração com o LangChain. Para saber mais sobre outras estruturas que você pode usar com o Atlas Vector Search, consulte Integrar a pesquisa vetorial às tecnologias de IA.

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

  • O Atlas CLI instalado e executando v1.14.3 ou posterior.

  • Um bloco de anotações Python interativo que você pode executar localmente. Você pode executar blocos de anotações interativos do Python no código VS. Certifique-se de que seu ambiente execute o Python v3.10 ou posterior.

    Observação

    Se você usa um serviço hospedado como o CoLab, verifique se você tem RAM suficiente para executar este tutorial. Caso contrário, você poderá ter problemas de desempenho.

Nesta seção, você cria um sistema local do Atlas para utilizar como um banco de dados vetorial. Se você tiver um Atlas cluster executando o MongoDB versão 6.0.11, 7.0.2 ou posterior com os dados de amostra carregados, você pode pular esta etapa.

Para criar o sistema local:

1

No seu terminal, execute o atlas auth login para autenticar com suas credenciais de login do Atlas. Para saber mais, consulte Conectar a partir do Atlas CLI.

Observação

Se você não tiver uma conta Atlas existente, execute atlas setup ou crie uma nova conta.

2

Execute o atlas deployments setup e siga as instruções para criar um sistema local.

Para instruções detalhadas, consulte Criar um sistema local do Atlas.

3
  1. Execute o seguinte comando no seu terminal para baixar os dados de amostra:

    curl https://atlas-education.s3.amazonaws.com/sampledata.archive -o sampledata.archive
  2. Execute o seguinte comando para carregar os dados em sua implantação, substituindo <port-number> pela porta em que você está hospedando a implantação:

    mongorestore --archive=sampledata.archive --port=<port-number>

Nesta seção, você configura o ambiente para este tutorial. Crie um bloco de anotações Python interativo salvando um arquivo com a extensão .ipynb e, em seguida, execute os seguintes trechos de código no bloco de anotações.

1

Execute o seguinte comando:

pip install --quiet langchain langchain_community langchain_huggingface langchain-mongodb pymongo sentence-transformers gpt4all
2

Se você estiver utilizando um sistema local do Atlas, execute o seguinte código em seu bloco de anotações, substituindo <port-number> pela porta para seu sistema local.

ATLAS_CONNECTION_STRING = ("mongodb://localhost:<port-number>/?directConnection=true")

Se você estiver usando um Atlas cluster, execute o seguinte código em seu bloco de anotações, substituindo <connection-string> pela connection string SRVdo Atlas cluster:

ATLAS_CONNECTION_STRING = ("<connection-string>")

Observação

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

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

Nesta seção, você carrega um modelo de incorporação localmente e cria incorporações vetoriais usando dados do banco de dados sample_airbnb , que contém uma única coleção chamada listingsAndReviews. O seguinte trecho de código executa as seguintes ações:

  • Estabelece uma conexão com sua implantação local do Atlas ou seu cluster Atlas e a coleção sample_airbnb.listingsAndReviews .

  • Carrega o modelo de incorporação bge-large-en-v1.5 da biblioteca HuggingFaceEmbeddings do LangChain.

  • Cria um filtro para incluir somente documentos que tenham um campo summary e não tenham um campo embeddings .

  • Para cada documento na collection que satisfaz o filtro:

    • Gera uma incorporação a partir do campo summary do documento usando o modelo de incorporação bge-large-en-v1.5 .

    • Atualiza o documento criando um novo campo chamado embeddings que contém a incorporação.

Execute o seguinte código no seu bloco de anotações:

from langchain_huggingface import HuggingFaceEmbeddings
from pymongo import MongoClient
# Connect to your local Atlas deployment or Atlas Cluster
client = MongoClient(ATLAS_CONNECTION_STRING)
# Select the sample_airbnb.listingsAndReviews collection
collection = client["sample_airbnb"]["listingsAndReviews"]
# Specify local embedding model (https://huggingface.co/sentence-transformers/baai/bge-large-en-v1.5)
model = HuggingFaceEmbeddings(model_name="baai/bge-large-en-v1.5")
# Filters for only documents with a summary field and without an embeddings field
filter = { '$and': [ { 'summary': { '$exists': True, '$ne': None } }, { 'embeddings': { '$exists': False } } ] }
count = 0
totalCount = collection.count_documents(filter)
# Creates embeddings and updates the documents in the collection
for document in collection.find(filter):
text = document['summary']
embedding = model.embed_query(text)
collection.update_one({ '_id': document['_id'] }, { "$set": { 'embeddings': embedding } }, upsert = True)
count+=1
print("Documents updated: {}/{} ".format(count, totalCount))

Este código leva algum tempo para ser executado. Depois de concluído, você poderá se conectar ao sistema local a partir do mongosh ou ao seu aplicativo usando a connection string do sistema. Em seguida, para visualizar suas incorporações vetoriais, execute operações de leitura na coleção sample_airbnb.listingsAndReviews .

Este código leva algum tempo para ser executado. Depois de concluído, você pode visualizar suas incorporações vetoriais na interface do usuário do Atlas navegando até a coleção sample_airbnb.listingsAndReviews em seu cluster e expandindo os campos em um documento.

Para habilitar a pesquisa vetorial na collection sample_airbnb.listingsAndReviews , crie um índice do Atlas Vector Search.

Se você estiver utilizando um sistema local do Atlas, complete as seguintes etapas:

1

Crie um arquivo denominado vector-index.json e cole a seguinte definição de índice no arquivo.

Esta definição de índice especifica a indexação do campo embeddings em um índice do tipo vectorSearch para a coleção sample_airbnb.listingsAndReviews . Este campo contém as incorporações criadas utilizando o modelo de incorporação bge-large-en-v1.5 . A definição de índice especifica 1024 dimensões vetoriais e mede a similaridade usando cosine.

{
"database": "sample_airbnb",
"collectionName": "listingsAndReviews",
"type": "vectorSearch",
"name": "vector_index",
"fields": [
{
"type": "vector",
"path": "embeddings",
"numDimensions": 1024,
"similarity": "cosine"
}
]
}
2
  1. Salve o arquivo e, em seguida, execute o seguinte comando em seu terminal, substituindo <path-to-file> pelo caminho para o arquivo vector-index.json que você criou.

    atlas deployments search indexes create --file <path-to-file>

Observação

Para criar um Atlas Vector Search índice de pesquisa, você deve ter acesso Project Data Access Admin ou superior ao Atlas projeto.

Se você estiver utilizando um cluster do Atlas, complete as seguintes etapas:

1
  1. Se ainda não estiver exibido, selecione a organização que contém o projeto desejado no Menu Organizations na barra de navegação.

  2. Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.

  3. Se a página Clusters ainda não estiver exibida, clique em Database na barra lateral.

    A página Clusters é exibida.

2

Você pode acessar a página Atlas Search na barra lateral, o Data Explorer ou a página de detalhes do cluster.

  1. Na barra lateral, clique em Atlas Search sob o título Services .

  2. Na lista suspensa Select data source , selecione seu cluster e clique em Go to Atlas Search.

    A página Atlas Search é exibida.

  1. Clique no botão Browse Collections para o seu cluster.

  2. Expanda o banco de dados e selecione a coleção.

  3. Clique na aba Search Indexes da collection.

    A página Atlas Search é exibida.

  1. Clique no nome do cluster.

  2. Clique na aba Atlas Search.

    A página Atlas Search é exibida.

3
  1. Clique em Create Search Index.

  2. Em Atlas Vector Search, selecione JSON Editor e clique em Next.

  3. Na seção Database and Collection, localize o banco de dados sample_airbnb e selecione a coleção listingsAndReviews.

  4. No campo Index Name, digite vector_index.

  5. Substitua a definição padrão pela seguinte definição de índice e clique em Next.

    Esta definição de índice especifica a indexação do campo embeddings em um índice do tipo vectorSearch para a coleção sample_airbnb.listingsAndReviews . Este campo contém as incorporações criadas utilizando o modelo de incorporação bge-large-en-v1.5 . A definição de índice especifica 1024 dimensões vetoriais e mede a similaridade usando cosine.

    {
    "fields":[
    {
    "type": "vector",
    "path": "embeddings",
    "numDimensions": 1024,
    "similarity": "cosine"
    }
    ]
    }
4

Uma janela modal é exibida para que você saiba que seu índice está construindo.

5

O índice deve levar cerca de um minuto para ser criado. Enquanto é compilado, a coluna Status mostra Initial Sync. Quando a compilação terminar, a coluna Status mostrará Active.

Esta seção demonstra uma implementação de RAG de amostra que você pode executar localmente usando Atlas Vector Search, LangChain e GPT4Todos. Em seu bloco de anotações interativo do Python, execute os seguintes trechos de código:

1

O código a seguir usa a integração LangChain com o Atlas Vector Search para instanciar sua implantação local do Atlas ou seu cluster do Atlas como um banco de dados vetorial, também chamado de armazenamento vetorial.

from langchain_mongodb import MongoDBAtlasVectorSearch
# Instantiate vector store
vector_store = MongoDBAtlasVectorSearch(
collection=collection,
embedding=model,
index_name="vector_index",
embedding_key="embeddings",
text_key="summary")

Você também pode executar o seguinte código para executar uma query de pesquisa semântica de exemplo:

import pprint
query = "beach house"
results = vector_store.similarity_search(query)
pprint.pprint(results)
[Document(page_content='Beach house with contemporary interior', metadata={'_id': '22123688', 'listing_url': 'https://www.airbnb.com/rooms/22123688', 'name': 'Bungan Beach House', ... }),
Document(page_content="Well done !!! you won't find a better location in Manly. The “Beach House” Apartments overlook Cabbage Tree Bay Aquatic Reserve between Manly and Shelly Beach, in one of Manly's premier locations Swim, dive, snorkel, surf, paddle board, coastal walkways, ocean pool, restaurants, all literally at your doorstep, or simply chill and unwind. Manly is amazing, I look forward to welcoming you", metadata={'_id': '18917022', 'listing_url': 'https://www.airbnb.com/rooms/18917022', 'name': 'Beach House Manly Apartment 4', ... }]}),
Document(page_content='Beautiful spacious two story beach house that has an amazing private gated grass area fronting Makaha beach. Perfect for family BBQ,s while watching the sun set into the ocean. Room for 10 people. Four night minimum stay required', metadata={'_id': '7099038', 'listing_url': 'https://www.airbnb.com/rooms/7099038', 'name': 'Ocean front Beach House in Makaha', ... }]}),
Document(page_content='Beautifully finished, newly renovated house with pool. The ultimate in indoor/outdoor living. Excellent finishes and a short stroll to the beach.', metadata={'_id': '19768051', 'listing_url': 'https://www.airbnb.com/rooms/19768051', 'name': 'Ultra Modern Pool House Maroubra', ... }]})]

Dica

Veja também:

2
  1. Clique no botão abaixo para baixar o 7modelo Miscal B da GPT4All. Para explorar outros modelos, consulte o site da GPT All.4

    Download
  2. Cole o seguinte código no seu bloco de anotações para configurar o LLM. Antes de executar, substitua <path-to-model> pelo caminho onde você salvou o LLM localmente.

    from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
    from langchain_community.llms import GPT4All
    # Configure the LLM
    local_path = "<path-to-model>"
    # Callbacks support token-wise streaming
    callbacks = [StreamingStdOutCallbackHandler()]
    # Verbose is required to pass to the callback manager
    llm = GPT4All(model=local_path, callbacks=callbacks, verbose=True)
3

Execute o seguinte código para concluir sua implementação de RAG . Este código faz o seguinte:

  • Instancia o Atlas Vector Search como um recuperador para fazer query de documentos semelhantes.

  • Cria os seguintes componentes específicos do LangChain:

    • Um modelo de prompt para instruir o LLM a usar os documentos recuperados como contexto para sua query. O LangChain passa esses documentos para a {context} variável de entrada e sua query para a {question} variável .

    • Uma cadeia que especifica o Atlas Vector Search como o recuperador, o modelo de prompt que você escreveu e o LLM local que você configurou para gerar uma resposta sensível ao contexto.

  • Solicita ao LLM uma query de amostra e retorna a resposta. A resposta gerada pode variar.

from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# Instantiate Atlas Vector Search as a retriever
retriever = vector_store.as_retriever()
# Define prompt template
template = """
Use the following pieces of context to answer the question at the end.
{context}
Question: {question}
"""
custom_rag_prompt = PromptTemplate.from_template(template)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
# Create chain
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| custom_rag_prompt
| llm
| StrOutputParser()
)
# Prompt the chain
question = "Can you recommend me a few AirBnBs that are beach houses? Include a link to the listings."
answer = rag_chain.invoke(question)
# Return source documents
documents = retriever.invoke(question)
print("\nSource documents:")
pprint.pprint(documents)
Answer: Yes, I can recommend a few AirBnBs that are beach houses. Here are some links to their respective listings:
1. Oceanfront home on private, gated property - https://www.airbnb.com/rooms/15073739
2. Ground Floor, Oceanfront condo with complete remodeling - https://www.airbnb.com/rooms/14687148
3. 4 bedroom house in a great location with ocean views and free salt water pool - https://www.airbnb.ca/s?host_id=740644
Source documents:
[Document(page_content='Please look for Airbnb numb (Phone number hidden by Airbnb) to book with us. We do not take bookings through this one. It is live for others to read reviews. Oceanfront home on private, gated property. This unique property offers year-round swimming, private beach access and astounding ocean and mountain views. Traveling with a large group? Another 3 bedroom home is available for rent on this spacious property. Visit https://www.airbnb.com/rooms/15073739 or contact us for more information.', metadata={'_id': '14827972', 'listing_url': 'https://www.airbnb.com/rooms/14827972', 'name': 'Oceanfront Beach House Makai', ... }]}),
Document(page_content='This GROUND FLOOR, OCEANFRONT condo is just feet from ocean access. Completely remodeled kitchen, bathroom and living room, with queen size bed in the bedroom, and queen size convertible sofa bed in the living room. Relax with the 55" SMART blue ray DVD, cable, and free WiFi. With ceiling fans in each room and trade winds, this condo rarely need the air conditioning unit in the living room. Airbnb charges a reservation fee to all guests at the time of booking. Please see "Other Things to Note"', metadata={'_id': '18173803', 'listing_url': 'https://www.airbnb.com/rooms/18173803', 'name': 'Papakea A108', ... }]}),
Document(page_content='2 minutes to bus stop, beach - Cafes, Sun, Surf & Sand. 4 Secure rooms in older style, 4 bedroom house. Can squeeze in up to 15 guests (9 beds, 2 sofa beds in lounge & a single sofa mattress) BUT is best suited to 10-12 people Wireless Internet, under cover parking, unlimited street parking.', metadata={'_id': '2161945', 'listing_url': 'https://www.airbnb.com/rooms/2161945', 'name': 'Sand Sun Surf w Parking. City 9km', ... }]}),
Document(page_content='High Quality for a third of the price! Great Location & Ocean Views! FREE Salt Water Roof-Deck Pool, Activities & Rental Car Desk! Hassle-Free Self Check-In via Lockbox. Located In Famous Waikiki: Easily walk to Beaches, Shops/all Restaurants! Hawaiian Convention Center is only 2 Blocks Away! On-Site Garage $. See my similar listings if your dates are not available. https://www.airbnb.ca/s?host_id=740644', metadata={'_id': '13146333', 'listing_url': 'https://www.airbnb.com/rooms/13146333', 'name': '~TROPICAL DREAM VACATION~ Ocean View', ... }]})]

Voltar

Pesquisa híbrida

Próximo

Integrações de IA