Crie uma implementação de RAG local com Atlas Vector Search
Nesta página
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:
Crie um sistema do Atlas local.
Configure o ambiente.
Use um modelo de incorporação local para gerar incorporações vetoriais.
Crie um índice de pesquisa do Atlas Vector Search em seus dados.
Implemente um LLM local para responder a perguntas sobre seus dados.
Plano de fundo
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:
bge-large-en-v1.5 modelo de incorporação
Mistra 7B modelo generativo
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.
Pré-requisitos
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.
Criar uma implantação local do Atlas
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:
Conecte-se a partir da Atlas CLI.
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.
Crie um sistema local usando o Atlas CLI.
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.
Carregue os dados de amostra em seu sistema.
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 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>
Configurar o ambiente
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.
Defina sua connection string Atlas.
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
Gerar incorporações com um modelo local
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 bibliotecaHuggingFaceEmbeddings
do LangChain.Cria um filtro para incluir somente documentos que tenham um campo
summary
e não tenham um campoembeddings
.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çãobge-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.
Criar o índice Atlas Vector Search Index
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:
Defina o índice do Atlas Vector Search.
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" } ] }
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:
No Atlas, acesse a Clusters página do seu projeto.
Se ainda não estiver exibido, selecione a organização que contém o projeto desejado no Menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.
Se a página Clusters ainda não estiver exibida, clique em Database na barra lateral.
A página Clusters é exibida.
Acesse a página do Atlas Search do seu cluster.
Você pode acessar a página Atlas Search na barra lateral, o Data Explorer ou a página de detalhes do cluster.
Na barra lateral, clique em Atlas Search sob o título Services .
Na lista suspensa Select data source , selecione seu cluster e clique em Go to Atlas Search.
A página Atlas Search é exibida.
Clique no botão Browse Collections para o seu cluster.
Expanda o banco de dados e selecione a coleção.
Clique na aba Search Indexes da collection.
A página Atlas Search é exibida.
Clique no nome do cluster.
Clique na aba Atlas Search.
A página Atlas Search é exibida.
Defina o índice do Atlas Vector Search.
Clique em Create Search Index.
Em Atlas Vector Search, selecione JSON Editor e clique em Next.
Na seção Database and Collection, localize o banco de dados
sample_airbnb
e selecione a coleçãolistingsAndReviews
.No campo Index Name, digite
vector_index
.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çãosample_airbnb.listingsAndReviews
. Este campo contém as incorporações criadas utilizando o modelo de incorporaçãobge-large-en-v1.5
. A definição de índice especifica1024
dimensões vetoriais e mede a similaridade usandocosine
.{ "fields":[ { "type": "vector", "path": "embeddings", "numDimensions": 1024, "similarity": "cosine" } ] }
Responda a perguntas com um LLM local
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:
Instanciar o Atlas como um banco de dados vetorial.
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', ... }]})]
Baixe e configure o LLM local .
Clique no botão abaixo para baixar o 7modelo Miscal B da GPT4All. Para explorar outros modelos, consulte o site da GPT All.4
DownloadCole 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)
Responda a perguntas sobre seus dados.
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', ... }]})]