Más allá de la búsqueda de vectores: construcción de un sistema Graph-RAG determinista de 3 niveles

En este artículo, aprenderá cómo construir un sistema de generación de recuperación aumentada de varios niveles y determinista utilizando gráficos de conocimiento y bases de datos vectoriales.

Los temas que cubriremos incluyen:

Diseño de una jerarquía de recuperación de tres niveles para lograr precisión objetiva. Implementación de un gráfico de conocimiento ligero. Usar reglas aplicadas rápidamente para resolver conflictos de recuperación de manera determinista.

Más allá de la búsqueda de vectores: construcción de un sistema Graph-RAG determinista de 3 niveles
Imagen del editor

Introducción: los límites del Vector RAG

Las bases de datos vectoriales se han convertido desde hace mucho tiempo en la piedra angular de los procesos modernos de recuperación de generación aumentada (RAG), sobresaliendo en la recuperación de texto de formato largo basado en similitud semántica. Sin embargo, las bases de datos vectoriales tienen notoriamente "pérdidas" cuando se trata de hechos atómicos, números y relaciones estrictas entre entidades. Un sistema RAG vectorial estándar podría confundir fácilmente en qué equipo juega actualmente un jugador de baloncesto, por ejemplo, simplemente porque aparecen varios equipos cerca del nombre del jugador en el espacio latente. Para resolver esto, necesitamos una arquitectura federada de múltiples índices.

En este tutorial, presentaremos dicha arquitectura, utilizando un backend de tienda cuádruple para implementar un gráfico de conocimiento para hechos atómicos, respaldado por una base de datos vectorial para un contexto difuso de cola larga.

Pero aquí está el giro: en lugar de depender de un enrutamiento algorítmico complejo para elegir la base de datos correcta, consultaremos todas las bases de datos, volcaremos los resultados en la ventana de contexto y usaremos reglas de fusión aplicadas mediante indicaciones para forzar al modelo de lenguaje (LM) a resolver conflictos de manera determinista. El objetivo es intentar eliminar las alucinaciones relacionales y construir una previsibilidad determinista absoluta donde más importa: los hechos atómicos.

Descripción general de la arquitectura: la jerarquía de 3 niveles

Nuestro canal aplica una estricta jerarquía de datos utilizando tres niveles de recuperación:

Prioridad 1 (hechos gráficos absolutos): un gráfico de conocimiento simple de Python QuadStore que contiene verdades fundamentales verificadas e inmutables estructuradas en formato Sujeto-Predicado-Objeto más Contexto (SPOC). Prioridad 2 (datos del gráfico estadístico): un QuadStore secundario que contiene estadísticas agregadas o datos históricos. Este nivel está sujeto a la anulación de Prioridad 1 en caso de conflictos (por ejemplo, un dato del equipo actual de Prioridad 1 anula una estadística histórica del equipo de Prioridad 2). Prioridad 3 (documentos vectoriales): una base de datos vectorial densa estándar (ChromaDB) para documentos de texto generales, que solo se utiliza como alternativa si los gráficos de conocimiento carecen de la respuesta.

Configuración del entorno y requisitos previos

Para seguir adelante, necesitará un entorno que ejecute Python, una infraestructura LM local y un modelo servido (usamos Ollama con llama3.2) y las siguientes bibliotecas principales:

chromadb: para el nivel de base de datos vectorial spaCy: para el reconocimiento de entidades nombradas (NER) para consultar las solicitudes de gráficos: para interactuar con nuestro punto final de inferencia LM local QuadStore: para el nivel de gráficos de conocimiento (consulte el repositorio de QuadStore)

Puede descargar manualmente la implementación simple de Python QuadStore desde el repositorio de QuadStore y colocarla en algún lugar de su sistema de archivos local para importarla como un módulo.

⚠️ Nota: La implementación completa del código del proyecto está disponible en este repositorio de GitHub.

Una vez resueltos estos requisitos previos, profundicemos en la implementación.

Paso 1: construir una tienda cuádruple liviana (el gráfico)

Para implementar los datos de Prioridad 1 y Prioridad 2, utilizamos un gráfico de conocimiento en memoria ligero y personalizado llamado almacén cuádruple. Este gráfico de conocimiento se aleja de las incrustaciones semánticas hacia un esquema estricto de nodo-borde-nodo conocido internamente como SPOC (Sujeto-Predicado-Objeto más Contexto).

Este módulo QuadStore funciona como un motor de almacenamiento altamente indexado. Debajo del capó, asigna todas las cadenas a ID enteros para evitar la sobrecarga de la memoria, mientras mantiene un índice de diccionario de cuatro vías (spoc, pocs, ocsp, cspo) para permitir búsquedas en tiempo constante en cualquier dimensión. Si bien no profundizaremos aquí en los detalles de la estructura interna del motor, utilizar la API en nuestro script RAG es increíblemente sencillo.

¿Por qué utilizar esta implementación simple en lugar de una base de datos gráfica más sólida como Neo4j o ArangoDB? Sencillez y rapidez. Esta implementación es increíblemente liviana y rápida, además de tener el beneficio adicional de ser fácil de entender. Esto es todo lo que se necesita para este caso de uso específico sin tener que aprender una API de base de datos de gráficos compleja.

En realidad, solo hay un par de métodos de QuadStore que debes comprender:

agregar (sujeto, predicado, objeto, contexto): agrega un nuevo hecho al gráfico de conocimiento. consulta (sujeto, predicado, objeto, contexto): consulta el gráfico de conocimiento en busca de hechos que coincidan con el sujeto, predicado, objeto y contexto dados.

Inicialicemos QuadStore actuando como nuestro modelo de verdad absoluta de Prioridad 1: