Geração Aumentada de Recuperação (RAG) com Atlas Vector Search
Nesta página
A geração aumentada de recuperação (RAG) é uma arquitetura usada para aumentar modelos de linguagem grandes (LLMs) com dados adicionais para que eles possam gerar respostas mais precisas. Você pode implementar RAG em seus aplicativos de IA generativa combinando um LLM com um sistema de recuperação com base no Atlas Vector Search.
Por que usar o RAG?
Ao trabalhar com LLMs, você pode encontrar as seguintes limitações:
Dados obsoletos: os LLMs são treinamentos em um conjunto de dados estático até um determinado ponto no tempo. Isso significa que eles têm uma base de conhecimento limitada e podem usar dados desatualizados.
Sem acesso a dados locais: os LLMs não têm acesso a dados locais ou personalizados. Portanto, eles podem não ter conhecimento sobre domínios específicos.
Alucinação: quando os dados de treinamento estão incompletos ou desatualizados, os LLMs podem gerar informações imprecisas.
Você pode resolver essas limitações seguindo as seguintes etapas para implementar o RAG:
Ingestão: armazene seus dados personalizados comoincorporações vetoriais em um banco de dados vetorial, como o MongoDB Atlas. Isso permite que você crie uma base de conhecimento de dados atualizados e personalizados.
Recuperação: Recupere documentos semanticamente semelhantes do banco de dados com base na pergunta do usuário usando uma solução de pesquisa, como o Atlas Vector Search. Esses documentos ampliam o LLM com dados adicionais relevantes.
Geração: solicitar o LLM. O LLM utiliza os documentos recuperados como contexto para gerar uma resposta mais precisa e relevante, reduzindo as atordoamentos.
Como o RAG habilita tarefas como responder a perguntas e geração de texto, é uma arquitetura eficaz para criar chatbots de IA que fornecem respostas personalizadas e específicas do domínio. Para criar chatbots prontos para produção, você deve configurar um servidor para rotear solicitações e construir uma interface de usuário além da implementação do RAG .
RAG com Atlas Vector Search
Para implementar o RAG com o Atlas Vector Search, você ingere dados no Atlas, recupera documentos com o Atlas Vector Search e gera respostas usando um LLM. Esta seção descreve os componentes de uma implementação básica ou ingênua de RAG com o Atlas Vector Search. Para obter instruções passo a passo, consulte Introdução.
Ingestão
A ingestão de dados para RAG envolve o processamento de seus dados personalizados e o armazenamento em um banco de dados vetorial para prepará-los para a recuperação. Para criar um pipeline de ingestão básico com o Atlas como banco de dados vetorial, faça o seguinte:
Carregue seus dados. Você pode usar ferramentas como carregadores de documentos ou conectores de dados para carregar dados de diferentes formatos e locais de dados.
Processe, ou chunk, seus dados. O chunking envolve a divisão de seus dados em partes menores para melhorar o desempenho.
Converta seus dados em incorporações vetoriais usando um modelo de incorporação. Para saber mais, consulte Como criar incorporações vetoriais.
Armazene estas incorporações no Atlas. Você armazena incorporações como um campo junto com outros dados em sua coleção.
Recuperação
A criação de um sistema de recuperação envolve a pesquisa e a devolução dos documentos mais relevantes do seu banco de dados vetorial para aumentar o LLM . Para recuperar documentos relevantes com o Atlas Vector Search, você converte a pergunta do usuário em incorporações vetoriais e executa uma query de pesquisa vetorial em seus dados no Atlas para encontrar documentos com as incorporações mais semelhantes.
Para executar a recuperação básica com o Atlas Vector Search, faça o seguinte:
Defina um índice do Atlas Vector Search na coleção que contém suas incorporações vetoriais.
Escolha um dos seguintes métodos para recuperar documentos com base na pergunta do usuário:
Use uma integração do Atlas Vector Search com uma estrutura ou serviço popular. Essas integrações incluem bibliotecas e ferramentas internas que permitem criar sistemas de recuperação facilmente com o Atlas Vector Search.
Construa seu próprio sistema de recuperação. Você pode definir suas próprias funções e pipelines para executar queries do Atlas Vector Search específicas para seu caso de uso.
Geração
Para gerar respostas, combine seu sistema de recuperação com um LLM. Depois de realizar uma pesquisa vetorial para recuperar documentos relevantes, você fornece a pergunta do usuário junto com os documentos relevantes como contexto ao LLM para que ele possa gerar uma resposta mais precisa.
Escolha um dos seguintes métodos para se conectar a um LLM:
Use uma integração do Atlas Vector Search com uma estrutura ou serviço popular. Essas integrações incluem bibliotecas e ferramentas integradas para ajudá-lo a se conectar aos LLMs com configuração mínima.
Ligue para a API do LLM. A maioria dos fornecedores de IA oferece APIspara seus modelos generativos que você pode usar para gerar respostas.
Carregue um LLM. Se você não tiver chaves de API ou créditos, poderá usar um LLM de código aberto carregando-o localmente a partir do seu aplicativo.
Começar
O exemplo a seguir demonstra uma implementação básica de RAG com o Atlas Vector Search usando a integração do MongoDB LangChain e o Abraçando a face para carregar e acessar facilmente modelos de incorporação e generativos.
Pré-requisitos
Para concluir este exemplo, você deve ter o seguinte:
Uma conta Atlas com um cluster executando o MongoDB versão 6.0.11 ou 7.0.2 e posterior. Para saber mais, consulte Criar um cluster.
Um token de acesso ao face com acesso de leitura.
Um ambiente para executar blocos de anotações interativos do Python, como o CoLab.
Procedimento
Configure o ambiente.
Crie um bloco de anotações Python interativo salvando um arquivo com a extensão .ipynb
e, em seguida, execute o seguinte código no bloco de anotações para instalar as dependências:
pip install --quiet pymongo langchain langchain_community langchain_mongodb langchain_huggingface pypdf sentence_transformers
Faça a ingestão de dados no Atlas.
Nesta seção, você ingere dados de amostra no Atlas aos quais os LLMs não têm acesso. O código a seguir usa a integração LangChain e o driver PyMongo para fazer o seguinte:
Carregue um PDF que contenha o último relatório de rendimentos do MongoDB.
Divida os dados em blocos, especificando o tamanho do bloco (número de caracteres) e a sobreposição do bloco (número de caracteres sobrepostos entre blocos consecutivos).
Carregar o nomic-embed-text-v1 modelo incorporado do centro de modelos do Abraçando a face.
Crie incorporações vetoriais a partir dos dados e armazene estas incorporações na coleção do
rag_db.test
no seu agrupamento do Atlas.
Cole e execute o seguinte código em seu bloco de anotações, substituindo <connection-string>
por sua connection string do Atlas:
from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_mongodb import MongoDBAtlasVectorSearch from pymongo import MongoClient # Load the PDF loader = PyPDFLoader("https://investors.mongodb.com/node/12236/pdf") data = loader.load() # Split the data into chunks text_splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=20) docs = text_splitter.split_documents(data) # Load the embedding model (https://huggingface.co/nomic-ai/nomic-embed-text-v1") model = HuggingFaceEmbeddings(model_name="nomic-ai/nomic-embed-text-v1", model_kwargs={ "trust_remote_code": True }) # Connect to your Atlas cluster client = MongoClient("<connection-string>") collection = client["rag_db"]["test"] # Store the data as vector embeddings in Atlas vector_store = MongoDBAtlasVectorSearch.from_documents( documents = docs, embedding = model, collection = collection, index_name = "vector_index" )
Dica
Depois de executar o código, você pode visualizar suas incorporações vetoriais na interface do usuário do Atlas navegando até a coleção rag_db.test
em seu cluster.
Utilize o Atlas Vector Search para recuperar documentos.
Nesta seção, você configura o Atlas Vector Search para recuperar documentos do seu banco de dados vetorial. Conclua as seguintes etapas:
Crie um índice do Atlas Vector Search em suas incorporações vetoriais.
Para clusters gratuitos e compartilhados, siga as etapas para criar um índice por meio da UI do Atlas. Dê um nome ao índice
vector_index
e use a seguinte definição de índice:{ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 768, "similarity": "euclidean" } ] } Para clusters dedicados, você pode criar o índice diretamente de seu aplicativo usando o driver PyMongo. Cole e execute o seguinte código no seu bloco de notas:
pymongo.operations import SearchIndexModel # Create your index model, then create the search index search_index_model = SearchIndexModel( definition = { "fields": [ { "type": "vector", "numDimensions": 768, "path": "embedding", "similarity": "cosine" } ] }, name = "vector_index", type = "vectorSearch" ) collection.create_search_index(model=search_index_model) Configure o Atlas Vector Search como um recuperador.
Em seu bloco de anotações, execute o seguinte código para configurar seu sistema de recuperação e execute uma query de pesquisa semântica de exemplo usando a integração LangChain:
# Instantiate Atlas Vector Search as a retriever retriever = vector_store.as_retriever( search_type = "similarity" ) # Run a sample query in order of relevance retriever.invoke("AI technology") [Document(metadata={'_id': '66a910ba7f78f7ec6760ceba', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 0}, page_content="more of our customers. We also see a tremendous opportunity to win more legacy workloads, as AI has now become a catalyst to modernize these\napplications. MongoDB's document-based architecture is particularly well-suited for the variety and scale of data required by AI-powered applications."), Document(metadata={'_id': '66a910ba7f78f7ec6760ced6', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 1}, page_content='artificial intelligence, in our offerings or partnerships; the growth and expansion of the market for database products and our ability to penetrate that\nmarket; our ability to integrate acquired businesses and technologies successfully or achieve the expected benefits of such acquisitions; our ability to'), Document(metadata={'_id': '66a910ba7f78f7ec6760cec3', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 0}, page_content='MongoDB continues to expand its AI ecosystem with the announcement of the MongoDB AI Applications Program (MAAP),'), Document(metadata={'_id': '66a910ba7f78f7ec6760cec4', 'source': 'https://investors.mongodb.com/node/12236/pdf', 'page': 1}, page_content='which provides customers with reference architectures, pre-built partner integrations, and professional services to help\nthem quickly build AI-powered applications. Accenture will establish a center of excellence focused on MongoDB projects,\nand is the first global systems integrator to join MAAP.')]
Gere respostas com o LLM.
Nesta seção, você gera respostas solicitando a um LLM que use os documentos recuperados como contexto. O código a seguir usa o LangChain para fazer o seguinte:
Acesse a instrução Miscal B 7 modelo do hub de modelos do Abraçando Face.
Instrua o LLM a incluir a pergunta do usuário e os documentos recuperados no prompt usando um modelo de prompte cadeia.
Informe o LLM sobre os últimos anúncios de IA do MongoDB.
Cole e execute o seguinte código no seu bloco de anotações, substituindo <token>
pelo seu token de acesso do Abraçando a Face. A resposta gerada pode variar.
from langchain_huggingface import HuggingFaceEndpoint from langchain.prompts import PromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser import os # Authenticate to your Hugging Face account os.environ["HF_TOKEN"] = "<token>" # Access the LLM (https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2) llm = HuggingFaceEndpoint(repo_id="mistralai/Mistral-7B-Instruct-v0.2") # Create prompt and RAG workflow prompt = PromptTemplate.from_template(""" Answer the following question based on the given context. Question: {question} Context: {context} """) rag_chain = ( { "context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) # Prompt the LLM question = "In a few sentences, what are MongoDB's latest AI announcements?" answer = rag_chain.invoke(question) print(answer)
Answer: MongoDB recently announced the MongoDB AI Applications Program (MAAP) as part of their efforts to expand their AI ecosystem. The document-based architecture of MongoDB is particularly well-suited for AI-powered applications, offering an opportunity to win more legacy workloads. These announcements were made at MongoDB.local NYC.
Próximos passos
Para tutoriais RAG mais detalhados, use os seguintes recursos:
Para saber como implementar o RAG com estruturas populares do LLM e serviços de IA, consulte Integrar pesquisa vetorial a tecnologias de IA.
Para saber como implementar o RAG usando uma implantação local do Atlas e modelos locais, consulte Criar uma implementação local do RAG com o Atlas Vector Search.
Para tutoriais baseados em casos de uso e blocos de anotações interativos do Python, consulte Repositório de casos de uso de IA generativa.
Para começar a criar chatbots prontos para produção com o Atlas Vector Search, você pode usar a estrutura de chatbot do MongoDB . Essa framework fornece um conjunto de bibliotecas que permitem construir rapidamente aplicativos de chatbot com IA.
Ajuste fino
Para otimizar e ajustar seus aplicativos RAG , você pode experimentar diferentes modelos de incorporação, estratégias de chunking e LLMs. Para saber mais, consulte os seguintes recursos:
Como escolher o modelo de incorporação correto para seu aplicativo LLM
Como escolher a estratégia de chunking certa para seu aplicativo LLM
Além disso, o Atlas Vector Search suporta sistemas avançados de recuperação. Como é possível indexar dados vetoriais junto com outros dados no Atlas, você pode ajustar os resultados da recuperação pré-filtrando em outros campos em sua coleção ou executando a pesquisa híbrida para combinar a pesquisa semântica com os resultados da pesquisa de texto completo.