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 cita | Lo que decía la fuente |
|---|---|
| Un paper sobre integral windup, citado para el bucle de control de un agente | El 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.
| Motor | Duplicados encontrados | No duplicados descartados | Total correcto |
|---|---|---|---|
| Nulo (control, siempre “distintos”) | 0/6 | 8/8 | 8/14 |
| Solapamiento de términos | 0/6 | 8/8 | 8/14 |
| Búsqueda exacta de texto | 1/6 | 8/8 | 9/14 |
| Embeddings, umbral laxo | 6/6 | 0/8 | 6/14 |
| Embeddings, umbral ajustado | sin registro | sin registro | 10/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.
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
- Mi verificador daba 100% de conformidad hasta que medí cuánto rechaza 718 de 718 rondas siguieron el proceso declarado, pero un verificador que acepta casi todo también da 100%. Un control con trazas barajadas mostró que el número se sostiene en un equipo de seis.
- El 86% del código de mis agentes sigue ahí, y la mayor parte de la caída vino de una semana Supervivencia de líneas en un repositorio de producción escrito por agentes: 85,9%, desde 92,7% dos días antes. La mayoría de las líneas perdidas entremedio son de una semana y de un commit de 2.408 líneas que sobrevivió en cero.