Skip to main content
Herramientas como NotebookLM cambiaron lo que la gente espera de una pila de material de investigación. Agregas fuentes, haces preguntas y obtienes respuestas que remiten al material, y luego generas una conversación entre dos presentadores que puedes escuchar mientras paseas. Esta guía construye eso en unas doscientas líneas de Python, sobre cinco endpoints de Venice. Nada se almacena fuera de tu máquina salvo las propias peticiones, y Venice no las retiene.

Ejecuta este cuaderno en Google Colab

Cada paso de abajo como un cuaderno ejecutable, con el resumen reproduciéndose en línea. Nada que instalar.

Cómo funciona

Cinco endpoints, cada uno con una tarea: La recuperación aquí es deliberadamente sencilla: vectores en una lista de Python, similitud coseno en un bucle. Esa es la cantidad justa de maquinaria para unas pocas docenas de fuentes y mantiene visibles las piezas móviles. Cuando te quedes corto, Cómo construir un bot RAG privado cubre el mismo pipeline con una base de datos vectorial real y un paso de reordenación.

Preparación

Una dependencia y una clave desde la página de configuración de la API.
Crea notebook.py y empieza con los imports y la configuración. Las dos listas al final son todo el estado del cuaderno: sources registra lo que has añadido y chunks contiene las piezas indexables.
HOSTS asigna un nombre de presentador a una voz. Ambas voces provienen de tts-xai-v1, y eso importa: las voces pertenecen a los modelos, y enviar una voz de una familia a un modelo de otra es el error más habitual al usar por primera vez el endpoint de voz.

Elegir un modelo que no se quede obsoleto

Fijar un modelo de chat en el código garantiza que el proyecto envejezca. Venice publica qué modelo ocupa actualmente cada rol a través de /models/traits, así que puedes pedir el valor por defecto vigente en lugar de nombrar uno.
Hay otros rasgos disponibles si este cuaderno no encaja con lo que quieres. most_intelligent te da un modelo más potente para el resumen intensivo en razonamiento, y default_reasoning te ofrece uno que piensa en voz alta. Consulta Modelos para ver la lista completa.

Añadir fuentes

Una fuente es una URL o un archivo en disco, y Venice tiene un endpoint para cada uno. Ambos devuelven texto plano, que es de lo que se trata: al resto del cuaderno no le importa de dónde vino una fuente.
/augment/scrape devuelve Markdown en lugar de HTML crudo, por lo que no hay que escribir código para eliminar plantillas repetitivas. /augment/text-parser acepta PDF, Word, Excel y texto plano hasta 25 MB, y devuelve un conteo de tokens junto al texto. Procesamiento de documentos cubre todas sus opciones.

Fragmentación e incrustaciones

Incrustar un documento entero produce un vector que es un promedio de todo lo que dice, algo demasiado tosco para recuperar una afirmación concreta. Dividirlo produce vectores que sí significan algo. Divide por límites de párrafo en lugar de por un número fijo de caracteres. Un fragmento que se corta a mitad de frase se recupera mal, porque la incrustación es de un fragmento roto.
embed procesa por lotes porque el endpoint acepta una lista, y una petición para sesenta y cuatro fragmentos es mucho más barata en tiempo real que sesenta y cuatro peticiones. text-embedding-bge-m3 devuelve 1024 dimensiones y maneja bien las fuentes multilingües. Añadir una fuente ahora consiste en leer, dividir, incrustar y registrar. La magnitud de cada vector se almacena junto a él porque nunca cambia y recalcularla dentro del bucle de similitud es trabajo desperdiciado.
El number es lo que más adelante hace posible la cita. Cada fragmento recuerda de qué fuente vino, de modo que una respuesta puede remitir a ella.

Recuperar los pasajes correctos

Similitud coseno entre el vector de la pregunta y cada vector de fragmento, ordenados, los k mejores. Para unos pocos miles de fragmentos esto se ejecuta más rápido que la llamada de red que produjo el vector de la pregunta.

Responder con citas

La diferencia entre una respuesta fundamentada y una conjetura segura de sí misma está por entero en el prompt. Dos instrucciones hacen el trabajo: responder solo desde las notas, y decirlo cuando las notas se queden cortas. Sin la segunda, un modelo llenará el hueco silenciosamente desde la memoria, que es precisamente el modo de fallo que quieres eliminar por diseño. Numerar las notas en el prompt le da al modelo un vocabulario de citación. Escribe [2], y tú puedes resolver eso a una fuente.
Extraer los corchetes vale la pena por esa única línea. Te dice qué fuentes cargaron realmente con la respuesta, que es como te das cuenta de que una fuente que creías central nunca acaba siendo citada.

Escribir el guion del resumen

Aquí es donde el cuaderno deja de ser una caja de búsqueda. Un resumen es algo que se lee; un overview es algo que se escucha, y ambos piden una prosa distinta. El diálogo funciona mejor en audio porque el turno de palabra ya marca el ritmo, y una pregunta de un presentador es una forma natural de introducir la siguiente idea. Importan tres restricciones, y las tres vienen del audio y no del texto:
  • Nada de markdown, nada de URLs. Un modelo de voz lee https://docs.venice.ai un carácter a la vez.
  • Deletrea las abreviaturas. T E E la primera vez, no tee.
  • Varía la duración de los turnos. Turnos de tamaño uniforme suenan como dos personas leyéndose una lista.
Pedir JSON con un esquema es lo que hace que el resultado sea renderizable. El texto libre necesitaría parseo, y las etiquetas de hablante son justo el tipo de cosa con la que un modelo se pone creativo. El enum en speaker garantiza que cada turno mapea a una voz que tienes.
El resumen cubre las fuentes de manera amplia en lugar de responder a una pregunta, así que spread muestrea fragmentos a lo largo de toda la colección en vez de recuperar por similitud. Tomar cada enésimo fragmento es tosco y funciona bien: alcanza el final de documentos largos, cosa que tomar los primeros doce nunca lograría. Trata la cantidad de turnos como una pista, no como una instrucción. Pedir dieciséis ha producido aquí entre dieciséis y veintiocho, según cuánto tengan que decir las fuentes. Si necesitas un tope estricto, trunca turns antes de renderizar en lugar de discutir con el prompt.

Renderizar dos voces en una sola pista

Cada turno se convierte en una petición de voz, con la voz elegida por quien habla.
Leer los frames de cada clip, en lugar de guardar veinte archivos y unirlos después, es lo que mantiene limpia la unión. Concatenar audio codificado como MP3 no funciona de forma fiable, porque cada archivo lleva sus propias cabeceras. Los frames decodificados son solo muestras, así que unirlos es simplemente añadir bytes. Dos detalles hacen que el resultado suene intencionado. La cabecera del archivo de salida viene del primer clip y no de constantes, así que la frecuencia de muestreo siempre es la correcta para el modelo que hayas elegido. Y un cuarto de segundo de silencio entre turnos le da al oído un tiempo para registrar que el hablante ha cambiado. Sin él, los presentadores se pisan los finales.
pool.map preserva el orden de entrada, así que los turnos vuelven en el orden en que se escribieron sin importar cuál termine primero. Cuatro workers es un techo deliberado, no un máximo: más concurrencia empezará a devolver 429 en niveles bajos, y el trabajo ya está dominado por el turno individual más largo.

Ejecutarlo

Ingerir y responder tarda unos segundos. El audio es la parte lenta y varía con la carga: unos seis minutos de habla tardan entre medio minuto y tres minutos en renderizarse.

Cómo hacerlo tuyo

Las fuentes lo son todo. Todo lo que viene después está limitado por lo que hayas metido. Las páginas raspadas arrastran su navegación y sus pies de página, algo inofensivo para responder pero que en un resumen aparece como un presentador debatiendo con seriedad un índice de documentación. Si eso pasa, descarta los fragmentos por debajo de un umbral de longitud o filtra los adornos obvios antes de incrustar. Cambia las voces. HOSTS son dos entradas en un diccionario. tts-xai-v1 incluye veintiséis voces, y otras familias tienen las suyas; GET /models?type=tts lista voices por modelo. Dos voces que contrastan con claridad son más fáciles de seguir que dos que simplemente son distintas. Clona la tuya. Clonación de voz convierte una muestra corta en un identificador de voz que puedes colocar directamente en HOSTS. Añade un tercer participante. Nada en el pipeline asume dos hablantes salvo el enum del esquema. Añadir un entrevistador que solo hace preguntas cambia bastante la sensación. Conserva el guion. Guardar turns en un archivo JSON junto al audio cuesta dos líneas y te ahorra un nuevo renderizado cada vez que quieras retocar una frase.

A dónde ir después

Bot RAG privado

El mismo pipeline de recuperación con una base de datos vectorial real y reordenación.

Respuestas citadas con búsqueda web

Encuentra las fuentes automáticamente en lugar de nombrarlas tú mismo.

Texto a voz

Referencia del endpoint de voz, sus voces y el streaming.

Procesamiento de documentos

Todo lo que acepta el analizador de texto y lo que devuelve.