
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í:| Paso | Qué ocurre |
|---|---|
| Cargar | Lee archivos locales Markdown, texto o reStructuredText |
| Chunkear | Divide documentos largos en secciones con solapamiento |
| Embed | Usa embeddings de Venice para convertir los chunks en vectores |
| Almacenar | Guarda los vectores y metadatos de origen en Qdrant |
| Recuperar | Embed de la pregunta del usuario y haz búsqueda vectorial |
| Re-ranquear | Usa un cross-encoder para volver a puntuar los mejores candidatos |
| Responder | Envía el mejor contexto a un modelo de chat de Venice con instrucciones de citación |
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:| Modo | Cuándo usarlo |
|---|---|
QdrantClient(":memory:") | Demos y tests locales rápidos |
QdrantClient(path="./qdrant_data") | Almacenamiento local persistente |
QdrantClient(url=..., api_key=...) | Un clúster Qdrant remoto o gestionado |
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:| Opción | Predeterminado | Qué controla |
|---|---|---|
--candidate-k | 8 | Número de resultados de búsqueda vectorial a re-ranquear |
--top-k | 4 | Número de chunks re-ranqueados enviados al modelo de chat |
--chunk-size | 1000 | Tamaño máximo del chunk antes del solapamiento |
--chunk-overlap | 150 | Caracteres repetidos entre chunks vecinos |
--embedding-batch-size | 32 | Número de chunks por solicitud de embeddings de Venice |
--qdrant-path | sin establecer | Ruta de almacenamiento persistente local de Qdrant |
--qdrant-url | sin establecer | URL remota de Qdrant |
--skip-ingest | false | Consulta una colección existente sin recargar docs |
--recreate-collection | false | Elimina y reconstruye la colección de Qdrant |
Notas de privacidad
Para una configuración RAG privada, piensa en cada capa por separado:| Capa | Consideración de privacidad |
|---|---|
| Embeddings de Venice | Los chunks de documentos se envían a Venice para crear vectores |
| Chat de Venice | El contexto recuperado se envía a Venice para responder la pregunta |
| Qdrant local | Los vectores y payloads se quedan en tu máquina |
| Qdrant remoto | Los vectores y payloads se almacenan donde se ejecute tu servidor Qdrant |
| Re-ranker FastEmbed | El re-ranking se ejecuta localmente después de que el modelo esté disponible |
Errores comunes a gestionar de antemano
| Síntoma | Lo que suele significar | Qué hacer |
|---|---|---|
Set VENICE_API_KEY before running this example. | Falta la variable de entorno | Exporta VENICE_API_KEY antes de ejecutar el script |
Document path does not exist | Una ruta pasada a --docs está mal | Comprueba la ruta del archivo o carpeta |
| Resultados de recuperación vacíos | No se ingirió nada, o se está consultando la colección equivocada | Elimina --skip-ingest o confirma --collection y --qdrant-path |
| Error de tamaño de vector de Qdrant | La colección se creó con un modelo de embedding diferente | Recrea la colección tras cambiar de modelos de embedding |
| Primer re-rank lento | FastEmbed puede estar descargando o inicializando el cross-encoder | Deja terminar la primera ejecución; las siguientes deberían ser más rápidas |
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.