GraphRAG: cuando las relaciones entre documentos importan más que el contenido

Grafo de conocimiento mostrando nodos de artículos, tags y autores conectados por aristas de relación

La pregunta que la búsqueda vectorial no puede responder

La búsqueda vectorial es extraordinariamente buena en un tipo específico de pregunta: “encuentra documentos cuyo contenido sea semánticamente similar a esta consulta”. Es la herramienta ideal para recuperar artículos sobre un tema, fragmentos de documentación relevantes para una pregunta técnica o secciones de un manual que describen una funcionalidad específica. Para eso, los embeddings y la similitud coseno funcionan de maravilla.

Pero hay una categoría completa de preguntas que los vectores simplemente no pueden responder bien, y es la pregunta sobre relaciones. “Dame todos los artículos del blog que hablan de RAG publicados después de enero de 2026, ordenados por fecha de publicación y que enlacen al artículo sobre Azure AI Search”. Eso no es una consulta de similitud semántica; es una traversal de grafo con filtros de tiempo y condiciones sobre relaciones entre nodos. Un índice vectorial no tiene una representación de esas relaciones. GraphRAG sí.

Qué es GraphRAG

GraphRAG es el patrón que combina un grafo de conocimiento estructurado con búsqueda vectorial o semántica. El grafo representa las relaciones entre documentos, conceptos, entidades y metadatos. La búsqueda vectorial (o el texto completo) encuentra el punto de entrada inicial en ese grafo. La traversal del grafo navega desde ese punto inicial por las relaciones para recuperar información que está conectada pero que no sería encontrada por similitud semántica.

En el contexto del blog de Azurebrains, el grafo tiene tres tipos principales de nodos. Los nodos Article representan cada artículo publicado, con propiedades como slug, título, fecha, número de palabras y estado. Los nodos Tag representan las etiquetas temáticas, con propiedades como nombre y categoría. Los nodos ExternalResource representan URLs externas enlazadas desde los artículos, con propiedades como dominio, URL completa y tipo de recurso.

Las relaciones entre nodos son: HAS_TAG entre artículo y etiqueta, LINKS_TO entre artículo y recurso externo, RELATED_TO entre artículos (calculada por el sistema cuando dos artículos comparten suficientes tags), y WRITTEN_BY entre artículo y autor (si hay múltiples autores).

Apache AGE sobre Azure PostgreSQL

Para implementar GraphRAG en el sistema de agentes de Azurebrains usamos Apache AGE (A Graph Extension), una extensión de PostgreSQL que añade capacidades de grafo con soporte nativo para consultas Cypher. La ventaja de AGE sobre soluciones de grafo independientes es que convivimos en la misma base de datos relacional que ya usamos para el resto del sistema: no necesitamos una infraestructura separada para el grafo.

La instalación de Apache AGE en Azure Database for PostgreSQL Flexible Server requiere habilitar la extensión:

CREATE EXTENSION IF NOT EXISTS age;
LOAD 'age';
SET search_path = ag_catalog, "$user", public;

La creación del grafo del blog:

SELECT create_graph('azurebrains_blog');

La inserción de un nodo de artículo:

SELECT * FROM cypher('azurebrains_blog', $$
  CREATE (:Article {
    slug: 'rag-fundamentos-recuperacion-aumentada',
    title: 'RAG: Retrieval Augmented Generation y por qué sigue siendo fundamental',
    date: '2025-11-10',
    tags: ['RAG', 'LLM', 'Azure AI Search'],
    word_count: 1800,
    status: 'published'
  })
$$) AS (v agtype);

La creación de una relación entre artículo y tag:

SELECT * FROM cypher('azurebrains_blog', $$
  MATCH (a:Article {slug: 'rag-fundamentos-recuperacion-aumentada'})
  MATCH (t:Tag {name: 'RAG'})
  CREATE (a)-[:HAS_TAG]->(t)
$$) AS (v agtype);

Consultas Cypher para el Reuser Agent

El Reuser Agent del sistema de Azurebrains usa GraphRAG para tres tipos de consultas que la búsqueda vectorial no resuelve de forma confiable.

Artículos relacionados por overlap de tags. Antes de que el Writer genere un nuevo artículo sobre RAG 2.0, el Reuser necesita saber qué artículos existentes tratan temas relacionados para proponer enlaces internos y evitar redundancias:

SELECT * FROM cypher('azurebrains_blog', $$
  MATCH (candidate:Article {slug: $new_slug})-[:HAS_TAG]->(t:Tag)<-[:HAS_TAG]-(existing:Article)
  WHERE existing.status = 'published'
  WITH existing, COUNT(t) AS shared_tags
  WHERE shared_tags >= 2
  RETURN existing.slug, existing.title, existing.date, shared_tags
  ORDER BY shared_tags DESC, existing.date DESC
  LIMIT 10
$$) AS (slug agtype, title agtype, date agtype, shared_tags agtype);

Artículos que enlazan recursos del mismo dominio. Para identificar qué artículos del blog ya enlazan a los mismos recursos externos que el nuevo artículo va a referenciar:

SELECT * FROM cypher('azurebrains_blog', $$
  MATCH (a:Article)-[:LINKS_TO]->(r:ExternalResource)
  WHERE r.domain IN ['learn.microsoft.com', 'techcommunity.microsoft.com']
  AND a.status = 'published'
  RETURN a.slug, a.title, COLLECT(r.url) AS external_links
  ORDER BY a.date DESC
  LIMIT 5
$$) AS (slug agtype, title agtype, external_links agtype);

Detección de artículos que podrían quedar obsoletos. El Improver Agent puede consultar el grafo para encontrar qué artículos del blog enlazan a un servicio que ha sufrido cambios recientes:

SELECT * FROM cypher('azurebrains_blog', $$
  MATCH (a:Article)-[:LINKS_TO]->(r:ExternalResource)
  WHERE r.domain = 'learn.microsoft.com'
  AND r.url CONTAINS '/azure-cognitive-services/'
  AND a.status = 'published'
  RETURN a.slug, a.title, a.date, r.url
  ORDER BY a.date DESC
$$) AS (slug agtype, title agtype, date agtype, url agtype);

Esta última consulta es especialmente valiosa: Azure Cognitive Services fue renombrado a Azure AI Services, y todos los artículos que enlazan URLs del dominio antiguo necesitan actualización. Una búsqueda vectorial no encontraría este patrón; la traversal de grafo sí.

Integración con el pipeline de RAG vectorial

GraphRAG en el sistema de Azurebrains no reemplaza la búsqueda vectorial de Foundry IQ: la complementa. El flujo del Reuser Agent es secuencial: primero ejecuta las consultas Cypher sobre el grafo para encontrar artículos relacionados por estructura, y después usa la lista de slugs resultante como filtro en la consulta a Foundry IQ para obtener los fragmentos de texto más relevantes de esos artículos específicos.

Esta combinación permite resolver preguntas complejas que ninguno de los dos sistemas puede responder solo. “Dame los fragmentos más relevantes sobre configuración de HNSW de los artículos del blog que tratan Azure AI Search y fueron publicados en los últimos seis meses” requiere primero el grafo para el filtro temporal y de tags, y después los vectores para encontrar los fragmentos específicos sobre HNSW dentro de esos artículos.

La sesión LTG158 del AI Tour 2026 entra en detalle sobre los operadores semánticos de PostgreSQL y su integración con agentes, complementando lo expuesto aquí con casos de uso de búsqueda semántica nativa en la capa de base de datos. Para la arquitectura completa del sistema de agentes que usa GraphRAG como parte de su pipeline, el artículo RAG 2.0 y Foundry IQ describe el contexto arquitectónico completo.