Candidatos semánticos (Vectorize) en wiki_enrich_related
Problema
La versión anterior de wiki_enrich_related extraía candidatos para el campo related[] de una página wiki basándose en similitud de tags o type de página. Este enfoque producía sugerencias tangenciales: dos pages con el mismo tag podían hablar de áreas completamente distintas, generando backlinks débiles que no añadían valor semántico real.
El dry-run confirmó: muchas sugerencias carecían de coherencia temática (ej. dos pages con tag #security pero en dominios no relacionados).
Solución
Implementar búsqueda semántica basada en embeddings:
- Embedding del título: el título de la página candidata se convierte a vector mediante
embedTexts(Workers AI). - Búsqueda en chunks: se consultan los chunks del corpus wiki (D1,
sourceType='doc') usandosearchChunks, que devuelve coincidencias ordenadas por similitud coseno. - Deduplicación y filtrado: se extraen los slugs únicos de cada chunk, se validan contra la DB (
bib_wiki_pages, solostatus='active'), y se mantiene el orden de relevancia. - Validación de candidatos: Haiku elige 2-4 de los candidatos +
groundingvalida.
Beneficios:
- Candidatos temáticamente relevantes (no solo coincidencia de tags).
- Orden de relevancia real (basado en similitud semántica).
- Escalable: funciona con cualquier página, sea cual sea su estructura de tags.
Implementación
Cambios en wikiEnrichRelated
- Retira: fallback tag/type que buscaba por tags o por type.
- Añade: bloque try/catch que:
- Llama
embedTexts(env.AI, [t.title])para vectorizar el título. - Consulta
searchChunks(env, vec, 18, { sourceType: 'doc' })(límite: 18 chunks). - Parsea cada
sourcePathdel chunk con regex/^(?:src\/content\/)?wiki\/(.+?)\.md$/para extraer el slug. - Deduplica con Set (no repetir slug del propio candidato).
- Ordena candidatos en función del orden de aparición en
matches(= orden de relevancia Vectorize). - Consulta DB para obtener slug + title de cada candidato, limitando a
MAX_CANDIDATES=25.
- Llama
Nueva dependencia
Requiere env.AI binding (Workers AI). Si no está configurado, retorna error 'Workers AI binding not configured (semantic candidates)'.
Funciones auxiliares retiradas
safeJsonArray: helper para parsear JSON de tags, ya no utilizado. Eliminado.
Llamada de integración
wiki_enrich_related se invoca desde:
- Handler MCP
wiki_enrich_relatedenfunctions/api/mcp/handlers/wiki.ts. - Tool MCP
wiki_enrich_relatedenfunctions/api/mcp/tools.ts.
Retorna lista de candidatos sugeridos + razonamiento (error si falla, ej. search_error:<msg>).
Véase también
- [[entity—functions—handler—wiki-enrich-related]]
- [[entity—biblioteca—tool—wiki-enrich-related]]
- [[feature—biblioteca—wiki-hardening-4-enrich]]