CreaRack-SL

Candidatos semánticos (Vectorize) en wiki_enrich_related

Funcionalidaddraftcreado Fri Jul 03

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:

  1. Embedding del título: el título de la página candidata se convierte a vector mediante embedTexts (Workers AI).
  2. Búsqueda en chunks: se consultan los chunks del corpus wiki (D1, sourceType='doc') usando searchChunks, que devuelve coincidencias ordenadas por similitud coseno.
  3. Deduplicación y filtrado: se extraen los slugs únicos de cada chunk, se validan contra la DB (bib_wiki_pages, solo status='active'), y se mantiene el orden de relevancia.
  4. Validación de candidatos: Haiku elige 2-4 de los candidatos + grounding valida.

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 sourcePath del 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.

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_related en functions/api/mcp/handlers/wiki.ts.
  • Tool MCP wiki_enrich_related en functions/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]]