
Cómo funciona un bot RAG moderno
Una buena pipeline de RAG es más que “meter documentos en una base de datos vectorial”. El flujo básico se ve así:
El paso de re-ranking es el upgrade que hace que esto sea más útil que una demo básica de RAG. La búsqueda vectorial es rápida y buena encontrando chunks semánticamente similares, pero aún puede devolver pasajes adyacentes al tema en lugar de directamente útiles. Un cross-encoder lee la pregunta y cada chunk candidato juntos, y luego puntúa qué tan bien ese chunk responde realmente la pregunta.
Instalar las dependencias
Usaremos el SDK de Python de OpenAI porque Venice expone una API compatible con OpenAI. También usaremos el cliente de Python de Qdrant con soporte para FastEmbed:requirements.txt con los mismos paquetes:
Eligiendo los modelos
Crea un archivo llamadorag_bot.py y empieza añadiendo los imports, las estructuras de datos, la URL de la API y los nombres de modelo:
base_url y la API key.
Puedes listar los modelos disponibles de Venice con:
Creando los clientes de Venice y Qdrant
Crea un cliente compatible con OpenAI de Venice tanto para embeddings como para chat completions:
Para un bot local privado, empieza con una ruta local en disco de Qdrant:
Cargando y chunkeando documentos
Para este tutorial, dejaremos que el bot ingiera archivos o carpetas locales. Empieza con archivos.md, .rst y .txt:
1000 caracteres con 150 caracteres de solapamiento es un buen valor por defecto para documentos mixtos de Markdown y texto. Chunks más pequeños pueden mejorar la precisión. Chunks más grandes pueden preservar más contexto. El ajuste correcto a menudo dependerá de los tipos de documentos que estés almacenando.
Hacer embedding de documentos con Venice
Una vez tenemos los chunks, los embedemos por lotes:Almacenar vectores en Qdrant
Antes de insertar puntos, crea una colección de Qdrant con el tamaño de vector adecuado. La forma más fácil de conocer el tamaño del vector es embed del primer lote y luego usarlen(embeddings[0]).
source, chunk_index y el contenido. Eso hace que la ingesta repetida sea idempotente para chunks que no han cambiado.
Recuperando chunks candidatos
En tiempo de pregunta, el bot hace embed de la pregunta del usuario y pide a Qdrant los mejores matches vectoriales:limit aquí es el número de candidatos. Suele ser mayor que el número de chunks que planeas enviar al modelo, porque el siguiente paso los va a re-ranquear. Un buen valor por defecto es recuperar 8 candidatos y enviar los mejores 4 al modelo de chat.
Re-ranking con FastEmbed
Ahora añadimos la parte que hace que la recuperación se sienta mucho más inteligente.- Recuperar un conjunto mayor de candidatos con búsqueda vectorial.
- Re-ranquear solo esos candidatos localmente.
- Enviar los pocos mejores chunks al modelo de lenguaje.
candidate_k=8 y top_k=4. Aumenta candidate_k si la fuente correcta a menudo está cerca pero no llega al contexto final.
Responder con Venice Chat Completions
Una vez seleccionado el contexto, formatéalo con números de fuente:Ejecutando el bot
Una vez que ensambles las piezas en un script, guárdalo comorag_bot.py. Una primera ejecución simple puede usar unos pocos documentos de muestra integrados para que puedas verificar la pipeline antes de ingerir tus propios archivos:
Opciones útiles de CLI
Expón los principales mandos de recuperación como opciones de CLI para que puedas ajustar el bot sin editar código:
Para desarrollo local repetido, un flujo común es:
Notas de privacidad
Para una configuración RAG privada, piensa en cada capa por separado:
El default más privado para este tutorial es Venice para inferencia, Qdrant local en disco y re-ranking local con FastEmbed. Eso te da un bot RAG práctico sin enviar los payloads de tu base de datos vectorial a un store vectorial de terceros.
Errores comunes a gestionar de antemano
Si cambias de modelos de embedding, recrea la colección de Qdrant. Distintos modelos de embedding pueden producir vectores con distintas dimensiones y las colecciones de Qdrant esperan un tamaño de vector fijo.
A dónde ir después
Una vez tengas la línea base funcionando, las mejoras de mayor impacto suelen ser:- Añadir loaders específicos para PDFs, HTML, tickets o páginas internas de wiki.
- Almacenar metadatos más ricos como títulos, encabezados, fechas, propietarios y URLs.
- Ajustar
candidate_k,top_k, tamaño de chunk y solapamiento con preguntas reales. - Añadir preguntas de evaluación para poder medir la calidad de la recuperación antes y después de los cambios.
- Hacer streaming del chat completion final de Venice para una mejor experiencia de chat interactivo.