Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Como implementar o Agentic RAG usando o Claude 3.5 Sonnet, LlamaIndex e MongoDB

Richmond Alake17 min read • Published Jul 02, 2024 • Updated Jul 02, 2024
IAPandasAtlasPython
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
arquitetura de referência para o sistema Agentic
Em 2024 de junho, a Athropic disponibilizou laudo 3.5 Sonnet, um modelo multimodal que superou seus antecessores e concorrentes em raciocínio de nível de pós-graduação, conhecimento em nível de graduação e proficiência em codificação na época de seu lançamento.
As capacidades de raciocínio dos grandes modelos de linguagem (LLMs) estão atingindo níveis que os tornam os principais impulsionadores de sistemas de recomendação e sistemas de agentes com acesso a uma collection de ferramentas para conclusão de tarefas. Embora os chatbots baseados em LLM que usam geração aumentada de recuperação (RAG) continuem sendo o fator de forma proeminente para aplicativos de LLM, os sistemas agentes adicionam uma nova dimensão aos aplicativos de AI.
Os sistemas Agentic aproveitam o uso de ferramentas, o raciocínio e o planejamento das habilidades emergentes dos LLMs para decompor tarefas e fazer seleções de ferramentas para conclusão de tarefas. Nos aplicativos LLM, isso permite que os LLMs decidam quando e de onde obter conhecimento. Isso é possível com a criação de recuperadores de dados como ferramentas dentro do sistema de agentes. Este tutorial mostrará como construir tal sistema e muito mais.
Neste tutorial, você aprenderá o seguinte: *- Construir um sistema RAG de agente com Class 3.5 Sonnet
  • Use o MongoDB dentro de um sistema RAG de agentes como fornecedor de memória
  • Aproveite a integração do LlamaIndex com a Agroup, MongoDB e fornecedores de modelos para desenvolver sistemas de AI
  • Desenvolva agentes de AI com LlamaIndex
  • Use um processo de incorporação detalhado com LlamaIndex*
Veja o código completopara este tutorial.
Não se esqueça de assistir e estrelar o repositório GenAI Showcase para receber atualizações quando novos notebooksforem adicionados.

O que é RAG agente?

Vamos definir um agente AI: um agente é uma entidade computacional artificial ciente de seu ambiente. É equipado com faculdades que permitem a percepção por meio de entrada, ação por meio do uso de ferramentas e habilidades cognitivas por meio de modelos básicos apoiados por memória de longo e curto prazo.
O cenário dos aplicativos LLM e de AI como um todo está passando por outra mudança. Embora não seja abalo, essa mudança introduz novos paradigmas de desenvolvimento de aplicativos que os engenheiros de pilha de AI , os construtores de AI e os desenvolvedores de software devem conhecer.
Como mencionado anteriormente, os chatbots habilitados para RAG são atualmente a forma predominante de aplicativos LLM em produção. No entanto, o escopo dos aplicativos LLM foi ampliado para cobrir a execução de código em sua infraestrutura. Essa expansão se deve ao fato de modelos básicos criados por empresas como OpenAI, Anthropic e Cohere se tornarem mais poderosos, exibindo habilidades emergentes, como uso de ferramentas, planejamento e raciocínio avançados e decomposição de problemas.
O Agentic RAG é um paradigma que aproveita os recursos de roteamento, uso de ferramentas, argumentos e planejamento dos LLMs, juntamente com a recuperação de informações com base na comparação da semântica de dados armazenados e de query. Esse paradigma de sistema permite o desenvolvimento de aplicativos LLM dinâmicos que podem acessar várias ferramentas para executar query, decompor tarefas e resolver problemas complexos.
Os retrievers são um componente fundamental nos pipelines RAG, servindo como interface entre as consultas do usuário e as bases de conhecimento. Para aqueles com experiência em aplicativos LLM, retrievers são um conceito bem estabelecido. Se os retrievers são um conceito novo, eles podem ser entendidos como módulos responsáveis pela execução de pesquisas semânticas (ou outros métodos de recuperação de informações) em um corpus de informações, como um armazenamento de dados. 
Esses módulos empregam vários métodos de recuperação — como similaridade de vetores densos, correspondência lexical esparsa ou abordagens híbridas — para buscar com eficiência dados relevantes de uma fonte de conhecimento estruturada. A função principal do recuperador é identificar e extrair informações contextualmente apropriadas com base na similaridade semântica entre a query de entrada e os dados armazenados; isso então fornece ao LLM um contexto relevante e específico de domínio para gerar respostas relevantes, fundadas e informadas.Os recuperadores podem ser usados em umpipeline RAGsimples ou sistemas de agentes como o criado neste tutorial.
A incorporação de um retriever como uma ferramenta à qual um agente de AI tem acesso permite a utilização dinâmica de fontes de conhecimento externas, aprimorando a capacidade do agente de fornecer respostas precisas e contextualmente relevantes. Essa integração permite que o agente se adapte às informações alteradas ou atualizadas em tempo real acessando os dados mais recentes da base de conhecimento ou usando seu conhecimento paramétrico para responder a consultas simples.

Implementação do RAG agente com laudo 3.5 Sonnet

Esta seção aborda a implementação do sistema RAG da agente usando o Athropic como provedor de modelo, o OpenAI como provedor de modelo de incorporação, o LlamaIndex como a estrutura de dados LLM e o MongoDB como o provedor de memória para o sistema de agente. 
Abaixo está um detalhamento das etapas de implementação do sistema RAG agente:
  1. Configuração do ambiente e da biblioteca: instale bibliotecas como llama-index, PyMongo, etc. Esta etapa também inclui a configuração de variáveis de ambiente para chaves de API (Antrópico, Abraçando Face, OpenAI).
  2. Configuração do LLM e do modelo de incorporação 3 Inicializar o A título de exemplo .5 Sonnet LLM e o modelo de incorporação OpenAI.
  3. Carregamento e processamento de dados: carregue o conjunto de dados do Airbnb, converta-o em um formato adequado para LlamaIndex (nós e documentos) e lide com os metadados adequadamente.
  4. Geração de incorporação: Gere incorporações para cada nó usando o modelo de incorporação escolhido (OpenAI, neste caso, devido à sua ampla adoção).
  5. Configuração do MongoDB: estabeleça uma conexão com o MongoDB Atlas e crie um banco de dados e uma collection para armazenar os dados do Airbnb.
  6. Integração com o Banco de Dados de Vetor: Utilize o MongoDB Atlas Vector Search para criar um armazenamento de vetor e indexar as incorporações.
  7. Criação da ferramenta Retriever: crie um QueryEngineTool que aproveita o repositório de vetores para recuperar informações relevantes com base nas consultas do usuário.
  8. Criação de agente AI: instancie um FunctionCallingAgentWorker e converta-o em um agente que possa interagir com o usuário e usar a ferramenta de recuperação.
  9. Interação com o usuário: interaja com o agente de AI fazendo perguntas ou solicitações e observando as respostas geradas com base na base de conhecimento e no laudo 3.5 Recursos do Sonnet LLM.
As partes principais deste tutorial são as operações abordadas nas etapas 7 e 8. Essas etapas concernem a todos os procedimentos para criar o agente e as ferramentas de AI . 

Etapa 1: configuração do ambiente e da biblioteca

Para começar a configurar nosso agente de AI, precisaremos instalar várias bibliotecas de chaves. O trecho de código abaixo instala os pacotes necessários.
1!pip install --quiet llama-index  # main llamaindex library
2
3!pip install --quiet llama-index-vector-stores-MongoDB # mongodb vector database
4
5!pip install --quiet llama-index-llms-anthropic # anthropic LLM provider
6
7!pip install --quiet llama-index-embeddings-openai # openai embedding provider
8
9!pip install --quiet pymongo pandas datasets # others
Vamos detalhar os pacotes e bibliotecas que estamos instalando:
  1. llama-index: esta é a biblioteca principal que usaremos para criar nosso agente de AI. Ele fornece ferramentas e funcionalidades fundamentais para integração de grandes modelos de linguagem com fontes de dados externas.
  2. llama-index-vector-stores-mongodb: Este pacote nos permite usar o MongoDB como nosso banco de dados de vetor, o que será crucial para armazenar e recuperar com eficiência as incorporações de vetor. Este pacote integra o MongoDB à biblioteca Python LlamaIndex.
  3. llama-index-llms-anthropic: Este módulo nos permite integrar os modelos de linguagem da Anthropic — especificamente, Claude 3.5 Sonnet — em nosso pipeline LlamaIndex.
  4. llama-index-embeddings-openai: Usaremos isso para aproveitar os modelos de incorporação do OpenAI para criar representações vetoriais de nossos dados de texto.
  5. pymongo, pandase datasets: essas bibliotecas adicionais nos ajudarão com a conexão e operações do MongoDB database, manipulação eficiente de dados e acesso a conjuntos de dados hospedados no Abraçando a Face.
Após a instalação das bibliotecas necessárias, o próximo passo é configurar nossas variáveis de ambiente.
1import os
2os.environ["ANTHROPIC_API_KEY"] = ""
3os.environ["HF_TOKEN"] = ""
4os.environ["OPENAI_API_KEY"] = ""
5# WARNING: Never commit API keys or sensitive information to public repositories
Vamos detalhar o que cada uma dessas variáveis de ambiente representa:
  1. ANTHROPIC_API_KEY: Este é o seu identificador exclusivo para acessar os modelos de AI da Anthropic, incluindo Claude 3.5 Soneto. Acesse ou crie sua chave API antrópica.
  2. HF_TOKEN: Esse token está associado à sua conta Hugging Face. É necessário acessar conjuntos de dados e modelos hospedados na plataforma HuggingFace.
  3. OPENAI_API_KEY: essa chave permite o acesso aos serviços do OpenAI, especialmente aos seus modelos de incorporação, que usaremos para gerar representações vetoriais de dados de texto.

Etapa 2: configuração do LLM e do modelo de incorporação

Com nossas variáveis de ambiente em vigor, agora podemos configurar o LLM e os modelos de incorporação. Esta etapa é crucial para configurar os principais componentes do nosso sistema RAG agênico, que é o cérebro do agente.
1from llama_index.embeddings.openai import OpenAIEmbedding
2from llama_index.llms.anthropic import Anthropic
3from llama_index.core import Settings
4llm = Anthropic(model="claude-3-5-sonnet-20240620")
5
6embed_model = OpenAIEmbedding(
7    model="text-embedding-3-small"
8    dimensions=256,
9    embed_batch_size=10
10    openai_api_key=os.environ["OPENAI_API_KEY"]
11)
12
13Settings.embed_model = embed_model
14Settings.llm = llm
Veja o que cada parte do trecho de código acima faz:
  1. Importe as classes necessárias do LlamaIndex para trabalhar com nossos modelos escolhidos.
  2. Inicialize o Athropic LLM, especificamente usando o modelo "clude-3-5-sonnet-20240620". Esse modelo servirá como o núcleo do agente de AI, lidando com argumentos complexos, tarefas de geração, uso de ferramentas e chamada de funções.
  3. Para nosso modelo de incorporação, estamos usando o "text-embedding-3-small" da OpenAI. Este modelo é configurado com os seguintes parâmetros:
    • dimensions=256: especifica o tamanho dos nossos vetores de incorporação.
    • embed_batch_size=10: define quantos itens são processados em um único lote, otimizando a eficiência.
    • Recupere com segurança a chave da API OpenAI de nossas variáveis de ambiente.
  4. Finalmente, definimos esses modelos como nosso padrão LlamaIndex Settings. Isso garante que todos os processos downstream do sistema agente usarão esses modelos, a menos que sejam explicitamente substituídos.

Etapa 3: carregamento e processamento de dados

Agora que os modelos estão configurados, a próxima etapa é carregar e preparar o conjunto de dados. Este tutorial usa um subconjunto do conjunto de dados de incorporação do Airbnb do Hugging Face. Aqui está um detalhamento do processo de carregamento de dados:
1from datasets import load_dataset
2import pandas as pd
3
4# https://huggingface.co/datasets/MongoDB/airbnb_embeddings
5dataset = load_dataset("MongoDB/airbnb_embeddings", split="train", streaming=True)
6dataset = dataset.take(4000)
7# Convert the dataset to a pandas dataframe
8dataset_df = pd.DataFrame(dataset)
9dataset_df.head(5)
Vamos destacar as principais partes do trecho de código acima:
  1. Importe as bibliotecas necessárias: load_dataset da biblioteca de conjuntos de dados do Hugging Face e pandas paramanipulação de dados.
  2. Use o load_dataset() métodoto fetch the "MongoDB/airbnb_embeddings" dataset. The split="trainparameter specifies we want the training split, and streaming=True" permite carregar iterativamente o conjunto de dados no ambiente de desenvolvimento sem carregar todo o seu conteúdo.
  3. Para gerenciar o tamanho do conjunto de dados deste tutorial, usamos dataset.take(4000) para limitar nossa amostra a 4000 entradas. Isso nos permite trabalhar com um subconjunto gerenciável e, ao mesmo tempo, ter dados suficientes para demonstrar os recursos do sistema.
  4. Converta o conjunto de dados em um DataFrame Pandas usando pd.DataFrame(dataset). Essa transformação nos dá acesso às poderosas ferramentas de manipulação de dados dos Pandas.
  5. Por fim, exibimos as cinco primeiras linhas do DataFrame com dataset_df.head(5) para obter uma visão geral rápida dos nossos dados.
É importante observar que você precisará de um token Hugging Face (HF_TOKEN) em seu ambiente de desenvolvimento para acessar esse conjunto de dados. Se você ainda não configurou isso, você pode obter um token.
Este conjunto de dados de incorporação do Airbnb é particularmente adequado para nosso sistema RAG agente, pois já inclui incorporações de texto e imagem pré-computadas. Essas incorporações representam vários recursos dos anúncios do Airbnb, permitindo que nosso sistema realize pesquisas semânticas de forma eficiente usando informações visuais ou baseadas em texto. Usando esse conjunto de dados, estamos simulando um cenário real em que um agente de AI pode precisar recuperar e analisar rapidamente informações sobre várias propriedades e realizar uma tarefa de recomendação. 
1# Dataset comes with embeddings created with OpenAI, but we will recreate new ones
2dataset_df = dataset_df.drop(columns=['text_embeddings'])
O trecho de código acima remove as incorporações de texto preexistentes e se prepara para criar novas. Este tutorial usa essa abordagem para mostrar a seleção de atributos de dados para a criação de incorporação vetorial usando as funcionalidades do LlamaIndex. Além disso, em cenários mais práticos e aplicativos de produção, você desejaria ter mais controle sobre o processo de incorporação e garantir a consistência com o modelo de incorporação escolhido. 

Etapa 4: Incorporando geração

Essa etapa gera novos embeddings de vetor usando o modelo de embedding configurado do OpenAI. Isso envolve o processamento dos campos de texto relevantes do nosso conjunto de dados do Airbnb (como descrições, títulos ou avaliações) para criar representações vetoriais que capturam o significado semântico de cada anúncio.
Essa etapa transforma nosso conjunto de dados em um formato otimizado para nosso sistema RAG baseado em LlamaIndex. Esse processo envolve a conversão de nosso DataFrame de Pandas em uma lista de objetos de Documento LlamaIndex. 
O snippet de código abaixo executa o processo de criação de documentos LlamaIndex, seleção de atributos de dados para incorporação e configuração do processo de incorporação.
1import json
2from llama_index.core import Document
3from llama_index.core.schema import MetadataMode
4
5documents_json = dataset_df.to_json(orient='records')
6documents_list = json.loads(documents_json)
7
8llama_documents = []
9
10for document in documents_list:
11 # Convert complex objects to JSON strings
12 for field in ["amenities", "images", "host", "address", "availability", "review_scores", "reviews", "image_embeddings"]:
13 document[field] = json.dumps(document[field])
14
15 # Create a Document object
16 llama_document = Document(
17 text=document["description"],
18 metadata=document,
19 excluded_llm_metadata_keys=["_id", "transit", "minimum_nights", "maximum_nights", "cancellation_policy", "last_scraped", "calendar_last_scraped", "first_review", "last_review", "security_deposit", "cleaning_fee", "guests_included", "host", "availability", "reviews", "image_embeddings"],
20 excluded_embed_metadata_keys=["_id", "transit", "minimum_nights", "maximum_nights", "cancellation_policy", "last_scraped", "calendar_last_scraped", "first_review", "last_review", "security_deposit", "cleaning_fee", "guests_included", "host", "availability", "reviews", "image_embeddings"],
21 metadata_template="{key}=>{value}",
22 text_template="Metadata: {metadata_str}\n-----\nContent: {content}",
23 )
24 llama_documents.append(llama_document)
25
26# Observing input examples
27print("\nThe LLM sees this: \n", llama_documents[0].get_content(metadata_mode=MetadataMode.LLM))
28print("\nThe Embedding model sees this: \n", llama_documents[0].get_content(metadata_mode=MetadataMode.EMBED))
Aqui está uma descrição mais técnica das operações no trecho de código:
  1. Converta o DataFrame para JSON e, em seguida, volte para uma lista de dicionários Python. Esta etapa garante que todos os dados estejam em um formato que possa ser facilmente manipulado.
  2. Itere cada documento, convertendo objetos aninhados complexos (como listas e dicionários) em strings JSON. Isso é crucial porque os valores de metadados em documentos LlamaIndex devem ser de tipos simples (str, int, float ou None).
  3. Para cada listagem, criamos um objeto Document LlamaIndex. O campotexté definido como a descrição da listagem, que será o conteúdo principal para nossos embeddings e processamento de LLM.
  4. Configure listas de exclusão de metadados para o modelo LLM e de incorporação. Isso nos permite controlar quais campos são usados em diferentes contextos, otimizando a relevância e a eficiência do processo de incorporação.
  5. Especifique o uso de modelos personalizados para formatação de metadados e texto. Isso garante que nossos dados sejam apresentados em um formato consistente e facilmente analisável para o LLM e o modelo de incorporação.
  6. Finalmente, demonstramos como os dados formatados parecem da perspectiva do LLM e do modelo de incorporação.
O próximo conjunto de operações gera incorporações para nossos documentos preparados, transformando nossos dados de texto em representações vetoriais adequadas para pesquisa semântica.
1from llama_index.core.node_parser import SentenceSplitter, SemanticSplitterNodeParser
2from llama_index.core.schema import MetadataMode
3from tqdm import tqdm
4
5# semantic_splitter = SemanticSplitterNodeParser(
6# buffer_size=10, breakpoint_percentile_threshold=95, embed_model=embed_model
7# )
8
9base_splitter = SentenceSplitter(chunk_size=5000, chunk_overlap=200)
10
11nodes = base_splitter.get_nodes_from_documents(llama_documents)
12
13# Progress bar
14pbar = tqdm(total=len(nodes), desc="Embedding Progress", unit="node")
15
16for node in nodes:
17 node_embedding = embed_model.get_text_embedding(
18 node.get_content(metadata_mode=MetadataMode.EMBED)
19 )
20 node.embedding = node_embedding
21
22 # Update the progress bar
23 pbar.update(1)
24
25# Close the progress bar
26pbar.close()
27
28print("Embedding process completed!")
Aqui está uma explicação detalhada do trecho de código acima:
  1. Importe os componentes necessários do LlamaIndex e tqdm para o rastreamento do progresso.
  2. Inicialize um SentenceSplitter com um chunk_size de 5000 e chunk_overlap de 200. Esse divisor divide nossos documentos em partes gerenciáveis, garantindo que cada parte seja pequena o suficiente para um processamento eficiente, mantendo o contexto por meio da sobreposição.
  3. Aplique o divisor ao llama_documents, criando uma lista de nodes. Cada nó representa um bloco de texto de nossos documentos originais.
  4. Configure uma barra de progresso usando tqdm para visualizar o processo de incorporação, o que é especialmente útil para grandes conjuntos de dados que podem demorar um pouco para incorporar todos os nós gerados.
  5. Iterar por cada nó, gerando uma incorporação usando nosso embed_modelconfigurado anteriormente ( "text-embedding-3-small" da OpenAI). O método get_contentcom MetadataMode.EMBED garante que somente as partes relevantes de cada nó pré-selecionadas anteriormente sejam incorporadas.
  6. Atribua a incorporação gerada ao nó, vinculando cada bloco de texto e metadados à sua representação vetorial.
É importante notar que comentamos um SemanticSplitterNodeParser. Esse divisor alternativo pode ser usado para uma divisão mais detalhada de documentos com base em relações semânticas entre frases, o que pode beneficiar determinados documentos ou casos de uso.

Etapa 5: configuração do MongoDB

O MongoDB atua como um banco de dados operacional e vetorial para o sistema RAG. O MongoDB Atlas fornece especificamente uma solução de banco de dados que armazena, consulta e recupera incorporações vetoriais com eficiência. No geral, o MongoDB atua como o fornecedor de memória dentro de um sistema de agentes.
A criação de um banco de dados e de uma coleção no MongoDB é simplificada com o MongoDB Atlas.
  1. Primeiro, registre-se para obter uma conta do MongoDB Atlas. Usuários existentes podem entrar no MongoDB Atlas.
  2. Siga as instruções. Selecione Atlas UI como o procedimento para implantar seu primeiro cluster.
  3. Crie o banco de dados: airbnb.
  4. No banco de dados airbnb, crie a collection listings_reviews.
  5. Crie um índice de pesquisa vetorial chamado vector_index para a coleçãolistings_reviews . Esse índice permite que a aplicação RAG recupere registros como contexto adicional para complementar as consultas do usuário por meio da pesquisa vetorial. Abaixo está a definição JSON do índice de pesquisa vetorial da coleção de dados .
Seu índice vetorial do Atlas Search criado no MongoDB Atlas deve ter a seguinte aparência:
1{
2 "fields": [
3 {
4 "numDimensions": 256,
5 "path": "embedding",
6 "similarity": "cosine",
7 "type": "vector"
8 }
9 ]
10}
Siga as etapas do MongoDB para obter a connection string a partir da UI do Atlas . Armazene o URI com segurança em seu ambiente de desenvolvimento depois de configurar o banco de dados e obter o URI de conexão do Atlas cluster. Essa configuração é essencial para habilitar recursos semânticas eficientes do Atlas Search em nosso sistema RAG . 
1import pymongo
2
3os.environ["MONGO_URI"] = ""
4
5def get_mongo_client(mongo_uri):
6 """Establish and validate connection to the MongoDB."""
7
8 client = pymongo.MongoClient(mongo_uri, appname="devrel.showcase.python")
9
10 # Validate the connection
11 ping_result = client.admin.command('ping')
12 if ping_result.get('ok') == 1.0:
13 # Connection successful
14 print("Connection to MongoDB successful")
15 return client
16 else:
17 print("Connection to MongoDB failed")
18 return None
19
20
21mongo_client = get_mongo_client(mongo_uri)
22
23DB_NAME = "airbnb"
24COLLECTION_NAME = "listings_reviews"
25
26db = mongo_client.get_database(DB_NAME)
27collection = db.get_collection(COLLECTION_NAME)
Veja uma explicação detalhada de cada parte:
  1. Comece definindo a variável de ambienteMONGO_URI . Essa variável deve ser armazenada com segurança e não codificada em um ambiente de produção.
  2. Importe pymongo, o driver Python para MongoDB.
  3. Defina uma função get_mongo_clientque crie um objeto de MongoDB database usando o URI fornecido.
  4. Recupere o MONGO_URI das variáveis de ambiente e verifique se ele está definido.
  5. Use a função get_mongo_client para estabelecer uma conexão com o MongoDB.
  6. Defina o nome do banco de dados (airbnb) e o nome da coleção ( listings_reviews).
  7. Por fim, usamos o cliente MongoDB para obter referências ao nosso banco de dados e coleção específicos.
É importante observar algumas melhores práticas aqui:
  • Seu código deve manter o MONGO_URI seguro e não expô-lo. Considere usar um sistema de gerenciamento de segredos em um ambiente de produção.
  • É preferívelusar os métodos get_database() e get_collection() em vez do acesso no estilo dicionário (db['collection']), pois é menos propenso a erros.
O último código abaixo para esta etapa garante que comecemos com uma collection nova e vazia. Isso é particularmente útil em ambientes de desenvolvimento e teste em que queremos evitar a mistura de dados novos e antigos.
1# To ensure we are working with a fresh collection
2# delete any existing records in the collection
3collection.delete_many({})

Etapa 6: integração do banco de dados vetorial

Esta etapa aproveita a integração MongoDB do LlamaIndex para criar uma instância do banco de dados vetorial MongoDB.
1from llama_index.vector_stores.mongodb import MongoDBAtlasVectorSearch
2
3vector_store = MongoDBAtlasVectorSearch(
4 mongo_client,
5 db_name=DB_NAME,
6 collection_name=COLLECTION_NAME,
7 index_name="vector_index"
8)
Aqui está uma explicação mais técnica do processo:
  1. Importe MongoDBAtlasVectorSearch da integração MongoDB do LlamaIndex. Esta classe fornece uma interface entre o LlamaIndex e o MongoDB Atlas Vector Search.
  2. Crie uma instância de MongoDBAtlasVectorSearch e atribua-a à variável vector_store. Este objeto servirá como nossa interface principal para operações de pesquisa vetorial.
  3. Passe vários parâmetros para inicializar o armazenamento de vetores:
    • mongo_client: Nossa conexão de cliente MongoDB estabelecida anteriormente.
    • db_name: O nome do nosso banco de dados (neste caso, "airbnb").
    • collection_name: o nome da nossa coleção ("listings_reviews").
    • index_name: O nome do nosso índice vetorial do Atlas Search ("vector_index").
É importante observar que, para que isso funcione corretamente:
  • Seu MongoDB Atlas cluster deve ser configurado com um índice de pesquisa vetorial criado.
  • O "vector_index" mencionado aqui deve corresponder ao nome do índice vetorial que você criou no MongoDB Atlas cluster. Este índice deve ser configurado para indexar o campo onde seus embeddings estão armazenados.
O processo de ingestão dos nós — que contêm os metadados, chunks e embeddings — para um banco de MongoDB database é feito em uma única linha devido à integração intuitiva do LlamaIndex com o MongoDB. Essa solução economiza várias linhas de código de implementação, simplificando significativamente o processo de ingestão de dados.
1vector_store.add(nodes)
Embora seja apenas uma linha de código, veja o que essa operação realiza:
  1. Ingestão de dados: este comando pega o nodes (que contém nossos dados de listagem do Airbnb e suas incorporações correspondentes) e os adiciona ao nosso armazenamento de vetores do MongoDB Atlas.
  2. Indexação de vetores: o MongoDB Atlas indexa automaticamente os vetores de incorporação à medida que os nós são adicionados, deixando-os prontos para pesquisas eficientes de similaridade.
  3. Armazenamento de metadados: Junto com as incorporações, todos os metadados associados de nossos nós (como detalhes de listagem) também são armazenados, permitindo uma recuperação rica e contextual em processos downstream.
Alguns pontos importantes a serem lembrados:
  • Essa operação pode levar algum tempo, dependendo do número de nós e do tamanho do seu conjunto de dados. Para conjuntos de dados grandes, você pode querer considerar o lote desta operação.
  • Garanta que sua instância do MongoDB tenha capacidade de armazenamento suficiente para seus dados e índice.
  • O desempenho dessa operação pode afetar o tempo geral de configuração do seu sistema RAG, mas é um custo único que permite uma rápida recuperação posterior.

Etapa 7: criação da ferramenta de recuperação

Nesta parte do tutorial, é criada a principal ferramenta para o agente utilizar na recuperação de dados relevantes do MongoDB database. A criação da ferramenta de recuperação envolve duas etapas, aproveitando os recursos avançados de indexação e consulta do LlamaIndex:
  1. Criando um índice de armazenamento de vetores
  2. Criar um mecanismo de consulta a partir do índice para recuperar documentos do banco de dados
Finalmente, esse mecanismo de consulta é encapsulado em um QueryEngineTool. Essa interface de nível superior transforma o mecanismo de consulta em uma ferramenta para o agente AI, juntamente com metadados que fornecem informações adicionais sobre sua funcionalidade e quando deve ser utilizado.
1from llama_index.core import VectorStoreIndex
2from llama_index.core.tools import QueryEngineTool, ToolMetadata
3
4index = VectorStoreIndex.from_vector_store(vector_store)
5query_engine = index.as_query_engine(similarity_top_k=5, llm=llm)
6
7query_engine_tool = QueryEngineTool(
8 query_engine=query_engine,
9 metadata=ToolMetadata(
10 name="knowledge_base",
11 description=(
12 "Provides information about Airbnb listings and reviews."
13 "Use a detailed plain text question as input to the tool."
14 ),
15 ),
16)
Veja o que cada parte do trecho de código acima faz:
  1. Importe as classes necessárias do LlamaIndex para criar a ferramenta de mecanismo de índice e query.
  2. Crie um VectorStoreIndex a partir de vector_store. Este índice fornece uma interface de alto nível para consultar nosso armazenamento de vetores.
  3. Converta o índice em um mecanismo de query, especificando o seguinte:
    • similarity_top_k=5: isso significa que as queries retornarão os cinco principais resultados mais semelhantes.
    • llm=llm: passe nosso modelo de idioma configurado anteriormente (Cláudio 3.5 Soneto) para o mecanismo de consulta.
  4. Criamos um QueryEngineTool, que envolve nosso mecanismo de query com metadados. Nosso agente pode usar esta ferramenta para interagir com a base de conhecimento.
A descrição que demos à ferramenta é particularmente importante:
  • "Fornece informações sobre os anúncios e avaliações do Airbnb": isso indica explicitamente que tipo de informação a ferramenta pode fornecer.
  • " Use uma pergunta detalhada em texto simples como entrada para a ferramenta ": Isso orienta o agente sobre como formular consultas para essa ferramenta.
Essa configuração forma o núcleo da capacidade do nosso sistema RAG de recuperar informações relevantes. Quando um usuário faz uma pergunta sobre anúncios do Airbnb, nosso agente pode usar essa ferramenta para:
  1. Converta a pergunta em uma representação vetorial.
  2. Encontre os documentos mais semelhantes em nossa loja de vetores.
  3. Recupere esses documentos e seus metadados associados.
  4. Use essas informações para formular uma resposta informada.

Etapa 8: criação do agente de AI

Esta é a etapa final do processo de criação do sistema de agentes. As operações nessa etapa visam criar um agente de chamada de função capaz de usar ferramentas definidas para executar tarefas e, ao mesmo tempo, aproveitar as propriedades emergentes de raciocínio e planejamento de seu LLM para decompor tarefas complexas e atribuir sua conclusão a ferramentas específicas.
1from llama_index.core.agent import FunctionCallingAgentWorker
2
3agent_worker = FunctionCallingAgentWorker.from_tools(
4 [query_engine_tool], llm=llm, verbose=True
5)
6agent = agent_worker.as_agent()
Abaixo estão as operações no trecho de código acima:
  1. Importe o FunctionCallingAgentWorker do LlamaIndex, projetado para criar um agente capaz de usar ferramentas (como nosso mecanismo de query) para realizar tarefas.
  2. Crie uma instância de FunctionCallingAgentWorker usando o método from_tools. Passe em:
    • query_engine_tool como uma lista de ferramentas disponíveis
    • O modelo de idioma configurado (llm)
    • verbose=True para permitir o registro detalhado das ações do agente
  3. Converta o trabalhador do agente em um agente usando o métodoas_agent().

Etapa 9: interação com o usuário

A etapa final é processar uma query de usuário e gerar uma resposta. Invocar o método de bate-papo do agente criado inicia uma interação com o agente, simulando um cenário do mundo real em que um usuário está buscando informações sobre anúncios do Airbnb em Nova York. 
O agente aproveita seus recursos sofisticados de argumento, com base em Class 3.5 Sonnet, para interpretar a query, recuperar informações relevantes do armazenamento de vetores do MongoDB e sincroniza uma resposta abrangente.
1response = agent.chat("Tell me the best listing for a place in New York")
2print(str(response))
Exemplo de saída do Agentic RAG criado com Class 3.5
Veja o que o trecho de código faz:
  1. Use o métodochatdo agente , passando a query: "Diga-me a melhor listagem para um lugar em Nova York."
  2. O agente processa esta consulta usando as seguintes etapas:
    • Ele analisa a query para entender a solicitação do usuário.
    • Ele determina que precisa usar a ferramenta da base de conhecimento para encontrar informações sobre as listagens de Nova York.
    • Ele usa o query_engine_tool para pesquisar listagens relevantes na loja de vetores.
    • Ele sintetiza as informações recuperadas para responder à "melhor" listagem.
  3. A resposta do agente é armazenada na response variável .

Conclusão

Este tutorial guiou você pelo processo abrangente de criação de um sistema RAG agencial usando Claude 3.5 Soneto, LlamaIndex e MongoDB. Desde a configuração do ambiente até a criação de um agente de AI capaz de raciocínio complexo e uso de ferramentas, exploramos o formato mais recente dos aplicativos LLM.
O Agentic RAG representa uma etapa no desenvolvimento de aplicativos LLM, indo além da simples resposta a perguntas para permitir a resolução dinâmica de problemas em várias etapas e a chamada de funções. Ao combinar as habilidades emergentes de grandes modelos de linguagem, como raciocínio e planejamento, com a flexibilidade do uso de ferramentas e a eficiência da pesquisa vetorial, aplicativos de IA intuitivos e eficientes podem ser criados. Essa abordagem melhora a precisão e a relevância das respostas de AI e lança as bases para sistemas de AI mais autônomos e adaptáveis. 
Para continuar sua maneira de explorar sistemas de agentes, recomendamos que você mergulhe em tutoriais relacionados, como "Construir agentes de AI com memória", que expandirão ainda mais sua compreensão e suas capacidades nesse campo em rápida evolução.

Perguntas frequentes

1. O que é RAG agente e como ele difere dos sistemas RAG tradicionais?
O Agentic RAG é um paradigma avançado que combina a geração aumentada de recuperação (RAG) com os recursos do agente de AI. Ao contrário dos sistemas RAG tradicionais, o RAG agente aproveita as capacidades de roteamento, uso de ferramentas, argumentos e planejamento dos LLMs, juntamente com a recuperação de informações. Isso permite uma solução de problemas mais dinâmica e complexa, permitindo que o sistema decomponha tarefas, faça seleções de ferramentas e execute queries de forma mais eficaz.
2. Como o MongoDB pode ser usado como um provedor de memória em um sistema RAG de agente?
O MongoDB serve como um banco de dados operacional e vetorial em um sistema RAG agêntico. Ele armazena, consulta e recupera com eficiência incorporações vetoriais, atuando como a memória do sistema. Ao utilizar o MongoDB Atlas Vector Search, o sistema pode realizar pesquisas semânticas rápidas em dados armazenados, permitindo que o AI acesse informações relevantes rapidamente e aprimore seu processo de tomada de decisão.
3. Quais componentes principais são necessários para criar um sistema RAG de agente com laudo 3.5 Sonnet?
Para construir um sistema RAG agente com Class 3.5 Sonnet, você precisa de:
  • 3 5 Sonnet como o modelo de linguagem principal.
  • LlamaIndex para integrar LLMs com fontes de dados externas.
  • MongoDB para armazenamento e recuperação vetorial.
  • Um modelo de incorporação (por exemplo, o text-embedding-3-small do OpenAI).
  • Uma ferramenta de recuperação para buscar informações relevantes.
  • Um trabalhador de agente de chamada de função para lidar com queries complexas.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Inicie um fluxo de trabalho RAG totalmente gerenciado com o MongoDB Atlas e o Amazon Bedrock


May 08, 2024 | 6 min read
Tutorial

Como escolher o melhor modelo de incorporação para seu aplicativo LLM


Nov 07, 2024 | 16 min read
exemplo de código

Apresentando o planejador de passeios com a Vector Search do MongoDB


Sep 24, 2024 | 5 min read
Tutorial

IoT e MongoDB: impulsionando a análise de séries temporais do consumo doméstico de energia


Aug 28, 2024 | 6 min read
Sumário