Fundamentando Nosso Chat em Resultados do Towards Data Science
Esta é a terceira parte de uma série. As duas primeiras publicações apresentam uma implementação básica de um chatbot usando apenas banco de dados vetorial com Milvus e uma implementação do chatbot com LlamaIndex. Continuamos usando LlamaIndex nesta edição, mas adicionaremos algo para “fundamentar” nossos resultados. A TruEra tem um ótimo comentário sobre fundamentação e uma breve descrição em um de seus blogs de avaliação de RAG.
Neste artigo, abordaremos como fundamentar nossos resultados de RAG para a Towards Data Science via LlamaIndex em três seções:
Configuração para fundamentar nossos resultados de RAG
Definindo os parâmetros do nosso chatbot da Towards Data Science
Fundamentando nossos resultados por meio de citações
Configuração para fundamentar nossos resultados de RAG
Como em qualquer aplicativo, o primeiro passo é configurar os pré-requisitos. Para este exemplo, começamos instalando quatro bibliotecas diferentes. Precisamos de llama-index, python-dotenv, pymilvus e openai. Essas quatro bibliotecas nos ajudam a orquestrar nosso LLM com recuperação, gerenciar nossas variáveis de ambiente, trabalhar com um banco de dados vetorial e trabalhar com a OpenAI, respectivamente.
! pip install llama-index python-dotenv openai pymilvus
Este próximo bloco de código configura a OpenAI e a Zilliz (o banco de dados vetorial Milvus gerenciado). Usamos a função load_dotenv para obter nossas variáveis de ambiente, normalmente armazenadas no arquivo '.env'. Em seguida, passamos os nomes das variáveis necessários usando os para obter os valores. A OpenAI é nosso LLM, e a Zilliz é nosso banco de dados vetorial. Neste exemplo, usamos a Zilliz e uma coleção armazenada na nuvem para persistir nossos dados em várias versões do aplicativo.
import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
zilliz_uri = os.getenv("ZILLIZ_URI")
zilliz_token = os.getenv("ZILLIZ_TOKEN")
Definindo os parâmetros para nosso chatbot da Towards Data Science
Em seguida, definimos os parâmetros do nosso chatbot de RAG. Precisamos configurar três itens: o modelo de embeddings, o banco de dados vetorial Milvus e as abstrações de passagem de dados do LlamaIndex. Primeiro, configuramos nosso modelo de embedding. Para este exemplo, usamos o modelo de embedding que usamos em meu blog anterior para extrair e embutir os dados, que é o modelo HuggingFace MiniLM L12. Podemos carregar esses dados via LlamaIndex usando o módulo HuggingFaceEmbedding.
from llama_index.embeddings import HuggingFaceEmbedding
embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L12-v2")
Segundo, configuramos o banco de dados vetorial. Como o Zilliz Cloud é uma versão totalmente gerenciada e otimizada do Milvus, podemos conectá-lo usando o módulo MilvusVectorStore. Fornecemos o URI, o token, o nome da coleção, a métrica de similaridade e a chave de texto para nos conectar à nossa instância do Milvus hospedada no Zilliz Cloud.
Obtivemos nosso URI e tokens da Zilliz anteriormente a partir de nossas variáveis de ambiente. O nome da coleção, a métrica de similaridade e a chave de texto são herdados da primeira parte desta série de blogs, na qual criamos a coleção durante a ingestão.
from llama_index.vector_stores import MilvusVectorStore
vdb = MilvusVectorStore(
uri = zilliz_uri,
token = zilliz_token,
collection_name = "tds_articles",
similarity_metric = "L2",
text_key="paragraph"
)
Por fim, reunimos nossas abstrações de dados do LlamaIndex. Os dois nativos de que precisamos são o contexto de serviço, que passa alguns serviços predefinidos, e o índice de armazenamento vetorial, que cria um “índice” do LlamaIndex a partir de um armazenamento vetorial. Usamos o contexto de serviço para passar nosso modelo de embeddings neste caso. Em seguida, passamos o banco de dados vetorial Milvus existente e o contexto de serviço criado para criar nosso índice vetorial.
from llama_index import VectorStoreIndex, ServiceContext
service_context = ServiceContext.from_defaults(embed_model=embed_model)
vector_index = VectorStoreIndex.from_vector_store(vector_store=vdb, service_context=service_context)
Fundamentando nossos resultados por meio de citações no LlamaIndex
Citações e atribuições são uma adição importante ao seu RAG. Elas permitem que você saiba de onde as respostas estão vindo no seu corpus de documentos e avalie quão fundamentados estão os resultados do seu RAG.
O LlamaIndex fornece uma maneira fácil de implementar citações por meio do módulo CitationQueryEngine. É super fácil começar a usar este módulo. Usando from_args e passando o índice vetorial, podemos instanciar um mecanismo de consulta com citações. Definimos o campo de texto no índice vetorial anteriormente, então não precisamos adicionar nada.
from llama_index.query_engine import CitationQueryEngine
query_engine = CitationQueryEngine.from_args(
vector_index
)
Depois de termos um mecanismo de consulta, só precisamos enviar uma consulta. Para este exemplo, perguntei: “What is a large language model?” Esta é uma resposta que esperamos conseguir obter da Towards Data Science. Também adicionei pprint para imprimir a saída de forma bonita.
res = query_engine.query("What is a large language model?")
from pprint import pprint
pprint(res)
A imagem abaixo mostra um exemplo de como seria uma resposta. Ela tem a resposta e cita suas fontes no texto. Ela nos permite saber que a resposta está fundamentada e de onde veio.
Resumo da fundamentação dos resultados de RAG por meio de citações e atribuições
Este tutorial é o terceiro de uma série sobre a criação de um chatbot via RAG. Usamos os mesmos dados da Towards Data Science em todos estes tutoriais. Este tutorial usa citações e atribuições para garantir que seus resultados estejam fundamentados.
Citações e atribuição resolvem dois problemas que o RAG tradicionalmente tem. Primeiro, elas nos permitem saber de onde estamos extraindo os dados. Segundo, elas nos permitem ver quão “verdadeiras” as respostas são de acordo com os dados. Esse conceito também é chamado de “fundamentação.”
Usamos LlamaIndex e Zilliz Cloud para criar este tutorial de RAG. O LlamaIndex nos permite criar facilmente um mecanismo que extrairá as citações, desde que elas existam no armazenamento vetorial. O Zilliz Cloud nos permite persistir dados facilmente em vários projetos.
Para ler novamente toda a série Chat Towards Data Science, aqui estão os links:
Continue lendo

Zilliz Skills Breakdown: How AI Agents Master Vector Databases
Zilliz's Milvus Skill (pymilvus, 7 files) and Zilliz Cloud Skill (zilliz-cli, 14 modules) bring vector-DB dev and ops into one Claude Code session.
Milvus/Zilliz + Surveillance: How Vector Databases Transform Multi-Camera Tracking
See how Milvus vector database enhances multi-camera tracking with similarity-based matching for better surveillance in retail, warehouses and transport hubs.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.



