Anclando nuestro chat hacia resultados de ciencia de datos
Esta es la tercera entrega de una serie. Las dos primeras publicaciones presentan una implementación básica de un chatbot basada únicamente en una base de datos vectorial usando Milvus y una implementación del chatbot con LlamaIndex. Seguimos usando LlamaIndex en esta edición, pero añadiremos algo para “fundamentar” nuestros resultados. TruEra tiene un excelente comentario sobre la fundamentación y una breve descripción en uno de sus blogs de evaluación de RAG.
En este artículo, cubriremos cómo fundamentar nuestros resultados de RAG para Towards Data Science mediante LlamaIndex en tres secciones:
Configuración para fundamentar nuestros resultados de RAG
Definición de los parámetros de nuestro chatbot de Towards Data Science
Fundamentación de nuestros resultados mediante citas
Configuración para fundamentar nuestros resultados de RAG
Como con cualquier app, el primer paso es configurar los prerrequisitos. Para este ejemplo, comenzamos instalando cuatro bibliotecas diferentes. Necesitamos llama-index, python-dotenv, pymilvus y openai. Estas cuatro bibliotecas nos ayudan a orquestar nuestro LLM con la recuperación, gestionar nuestras variables de entorno, trabajar con una base de datos vectorial y trabajar con OpenAI, respectivamente.
! pip install llama-index python-dotenv openai pymilvus
Este siguiente bloque de código configura OpenAI y Zilliz (la base de datos vectorial Milvus gestionada). Usamos la función load_dotenv para extraer nuestras variables de entorno, normalmente almacenadas en el archivo '.env'. Luego, pasamos los nombres de variables necesarios usando os para obtener los valores. OpenAI es nuestro LLM, y Zilliz es nuestra base de datos vectorial. En este ejemplo, usamos Zilliz y una colección almacenada en la nube para persistir nuestros datos en varias versiones de la app.
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")
Definición de los parámetros para nuestro chatbot de Towards Data Science
A continuación, definimos los parámetros de nuestro chatbot RAG. Debemos configurar tres elementos: el modelo de embeddings, la base de datos vectorial Milvus y las abstracciones de paso de datos de LlamaIndex. Primero, configuramos nuestro modelo de embeddings. Para este ejemplo, usamos el modelo de embeddings que utilizamos en mi blog anterior para extraer e incrustar los datos, que es el modelo HuggingFace MiniLM L12. Podemos cargar estos datos mediante LlamaIndex usando el módulo HuggingFaceEmbedding.
from llama_index.embeddings import HuggingFaceEmbedding
embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L12-v2")
En segundo lugar, configuramos la base de datos vectorial. Dado que Zilliz Cloud es una versión de Milvus completamente gestionada y optimizada, podemos conectarla usando el módulo MilvusVectorStore. Proporcionamos el URI, el token, el nombre de la colección, la métrica de similitud y la clave de texto para conectarnos a nuestra instancia de Milvus alojada en Zilliz Cloud.
Obtuvimos nuestro URI y tokens de Zilliz anteriormente de nuestras variables de entorno. El nombre de la colección, la métrica de similitud y la clave de texto se heredan de la primera parte de esta serie de blogs, donde creamos la colección durante la ingesta.
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 último, reunimos nuestras abstracciones de datos de LlamaIndex. Los dos elementos nativos que necesitamos son el contexto de servicio, que pasa algunos servicios predefinidos, y el índice de almacén vectorial, que crea un “índice” de LlamaIndex a partir de un almacén vectorial. Usamos el contexto de servicio para pasar nuestro modelo de embeddings en este caso. Luego pasamos la base de datos vectorial Milvus existente y el contexto de servicio creado para crear nuestro índice vectorial.
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)
Fundamentar nuestros resultados mediante citas en LlamaIndex
Las citas y atribuciones son una adición importante a tu RAG. Te permiten saber de dónde provienen las respuestas en tu corpus de documentos y evaluar qué tan fundamentados están tus resultados de RAG.
LlamaIndex proporciona una forma sencilla de implementar citas mediante su módulo CitationQueryEngine. Es muy fácil empezar con este módulo. Usando from_args y pasando el índice vectorial, podemos instanciar un motor de consultas con citas. Definimos antes el campo de texto en el índice vectorial, así que no necesitamos añadir nada.
from llama_index.query_engine import CitationQueryEngine
query_engine = CitationQueryEngine.from_args(
vector_index
)
Una vez que tenemos un motor de consultas, solo necesitamos enviar una consulta. Para este ejemplo, he preguntado: “¿Qué es un modelo de lenguaje grande?” Esta es una respuesta que esperamos poder obtener de Towards Data Science. También he añadido pprint para imprimir la salida de forma legible.
res = query_engine.query("What is a large language model?")
from pprint import pprint
pprint(res)
La imagen de abajo muestra un ejemplo de cómo sería una respuesta. Tiene la respuesta y cita sus fuentes en el texto. Nos permite saber que la respuesta está fundamentada y de dónde provino.
Resumen de la fundamentación de resultados de RAG mediante citas y atribuciones
Este tutorial es el tercero de una serie en torno a la creación de un chatbot mediante RAG. Usamos los mismos datos de Towards Data Science para todos estos tutoriales. Este tutorial usa citas y atribuciones para asegurar que tus resultados estén fundamentados.
Las citas y la atribución resuelven dos problemas que RAG tradicionalmente tiene. Primero, nos permiten saber de dónde estamos extrayendo datos. Segundo, nos permiten ver qué tan “verdaderas” son nuestras respuestas según los datos. Este concepto también se llama “fundamentación”.
Usamos LlamaIndex y Zilliz Cloud para crear este tutorial de RAG. LlamaIndex nos permite poner en marcha fácilmente un motor que extraerá las citas siempre que existan en el almacén vectorial. Zilliz Cloud nos permite persistir datos fácilmente entre múltiples proyectos.
Para leer de nuevo toda la serie Chat Towards Data Science, aquí están los enlaces:
Sigue leyendo

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.

Vector Databases vs. Time Series Databases
Use a vector database for similarity search and semantic relationships; use a time series database for tracking value changes over time.



