Carlos Tapia
← Todas las notas

Encontrar duplicados y verificar citas piden búsquedas opuestas

· 4 min de lectura

Una noche, cuatro afirmaciones de mis agentes que citaban una fuente se cayeron al abrir la fuente:

La citaLo que decía la fuente
Un paper sobre integral windup, citado para el bucle de control de un agenteEl paper es de lazos de control físicos. La afirmación venía de un blog sobre él
”La referencia dice 50–100k”La referencia citaba otro documento, que no estaba en la biblioteca
”El ADR la declara hecha”Ese ADR arregló el problema. Se citó el estado anterior al arreglo
”Está decidido así, ver el ADR”El ADR se escribió para revertir esa decisión

TABLA 1 · Un ADR (architecture decision record) es el documento corto donde queda escrita una decisión de arquitectura con su motivo.

Los agentes tenían dos formas de buscar: exacta, con grep o un índice de texto completo que respeta los identificadores tal como están escritos, y semántica, con embeddings, que devuelven lo más parecido en significado. La semántica la usaba para detectar reportes de problema duplicados, y quería saber cuál sirve para qué.

Encontrar duplicados

El patrón documentado para código es la búsqueda agéntica con grep en vez de embeddings (Agentic Search Over Vector Embeddings); su propio catálogo anota como costo más tokens y una comprensión semántica limitada. El código tiene identificadores exactos. Mi caso era prosa: dos reportes de roles distintos sobre el mismo problema pueden no compartir ni una palabra.

MotorDuplicados encontradosNo duplicados descartadosTotal correcto
Nulo (control, siempre “distintos”)0/68/88/14
Solapamiento de términos0/68/88/14
Búsqueda exacta de texto1/68/89/14
Embeddings, umbral laxo6/60/86/14
Embeddings, umbral ajustadosin registrosin registro10/14

TABLA 2 · 14 pares etiquetados: 6 duplicados y 8 problemas distintos. Del umbral ajustado solo quedó registrado el total.

Los mismos 14 pares, según el motor

Las barras se cruzan. Lo que encuentra duplicados falla al rechazar los que no lo son, y al revés.

Duplicados encontrados (de 6) No-duplicados rechazados (de 8)
Solapamiento de términos Duplicados encontrados (de 6): 0/6 0/6 No-duplicados rechazados (de 8): 8/8 8/8 Texto exacto Duplicados encontrados (de 6): 1/6 1/6 No-duplicados rechazados (de 8): 8/8 8/8 Embeddings, laxo Duplicados encontrados (de 6): 6/6 6/6 No-duplicados rechazados (de 8): 0/8 0/8

FIG. 1 · La búsqueda exacta rechaza todos los no-duplicados y no encuentra casi ningún duplicado. Los embeddings laxos hacen exactamente lo inverso. El umbral ajustado queda fuera: de él solo quedó registrado el total (10 de 14), no el desglose.

La búsqueda exacta casi no se equivoca cuando dice “es lo mismo”, pero casi nunca lo dice. Los embeddings con umbral laxo encuentran todos los duplicados y marcan todo lo demás también. El umbral ajustado se eligió sobre estos mismos 14 pares, y le gana al control nulo por 2 pares de 14.

Verificar una cita

Comprobar “¿este ADR dice X?” es búsqueda exacta en un archivo conocido. Un motor semántico devuelve lo que más se parece a la afirmación, incluido un pasaje que dice lo contrario, porque comparte los sustantivos. En este corpus, pares que eran problemas distintos llegaron a 0,77 de similitud de coseno. Dos nombres de servicio interno que se diferencian en una palabra quedaron a 0,930: los embeddings borronean justo el identificador que los separa.

Por eso separé los trabajos. La búsqueda semántica queda para los duplicados. El chequeo de citas, que solo comprobaba que el documento citado se pudiera encontrar, quedó para extenderse y comprobar con búsqueda exacta que el documento dice lo que se le atribuye.

Lo que cuesta verificar

La búsqueda agéntica, en que el agente itera con grep hasta dar con la línea, gasta tool calls:

una búsqueda agéntica  ≈  5–10 tool calls × ~15 s   ≈  75–150 s
un turno mediano       ≈  372 s
                       →  20% a 40% de un turno, por búsqueda

Los 5–10 tool calls son una estimación de la literatura; los 15 segundos y el turno mediano de 372 segundos son de mis equipos. Los agentes corren con una suscripción que tiene un cupo por ventana de 5 horas, y los tool calls se lo comen. Verificar una cita pasa de vez en cuando y puede pagar la búsqueda agéntica. Detectar duplicados corre cada vez que se abre un reporte, así que va por el índice.

Cómo se midió. Cuatro motores de retrieval sobre un conjunto de 14 pares etiquetados de reportes de problema escritos por agentes en roles distintos (6 duplicados, 8 no), más similitudes de coseno del mismo corpus. El umbral ajustado de los embeddings se eligió sobre esos mismos 14 pares.

Relacionadas