Grafos de Conocimiento para RAG

6 December 2024| Tags: Inteligencia Artificial, IA, RAG, Grafos, IA Semántica, Bases de Conocimiento con Grafos

Introducción

RAG significa generación aumentada por recuperación. Se trata de una técnica que mejora los modelos de lenguaje grandes (LLM) al proporcionarles información externa (propia) para aumentar su precisión y capacidad de respuesta. Es decir que un RAG permite comnbinar tus propios datos con un LLM y en lugar de enviarle las preguntas directamente, las complementa con esa información relevante de tus fuentes, lo que le permite generar mejores respuestas ya que están contextualizadas con tus datos.

Para ello los RAG suelen usar bases de datos vectoriales que están especializadas para almacenar y consultar incrustaciones vectoriales (embeddings). Se suelen trocear los documentos em chunks y calcular sus embeddings que se utilizan para representar información en un espacio vectorial que permite realizar consultas basadas en su similitud y recuperar información significativa de manera eficiente.

Por otro lado un grafo de conocimiento es una forma de representar la información de manera estructurada utilizando nodos para representar entidades y relaciones para conectarlas y mostrando cómo se relacionan entre sí. Esta estructura, similar a un mapa conceptual, permite capturar la profundidad y contextualidad de la información de una manera que las bases de datos vectoriales tradicionales, que se basan en datos no estructurados, a menudo no pueden.

Para aprender un poco sobre la construcción de RAGs y cómo se pueden utilizar los grafos de conocimiento para mejorarlos vamos a a hacer algunas pruebas utilizando LangChain como framework de desarrollo de LLMs y Neo4j como base de datos de grafos.

Construcción del Grafo de Conocimiento

Para construir un grafo de conocimiento, primero necesitamos definir las entidades y relaciones que queremos representar. En nuestro caso, vamos a construir un grafo de conocimiento que represente información sobre las técnicas de estudio más efectivas y cómo se relacionan entre sí.

Para ello vamos a utilizar la base de datos de grafos Neo4j y su herramienta visual Graph Builder para construir el grafo de conocimiento.

Esta herramienta es capaz de, utilizando IA, extraer los nodos y relacciones los documentos que le proporciones y construir un grafo de conocimiento con ellos.

Nosotros le hemos dado simplemente la página de Wikipedia sobre Técnicas de Estudio y ayudándole un poco (proporcionándole las entidades que queríamos sacar para nuestras pruebas) nos ha construido el siguiente grafo de conocimiento:

Graph

Como vemos el grafo esquematiza, entre otras cosas, las diferentes técnicas de estudio que se pueden utilizar y cómo se relacionan entre sí, subrayado, resumen, elaboración de esquemas, planificación de dicho aprendizaje, repaso, etc

Lo genial de las bases de datos Neo4j es que también se comportan como bases de datos vectoriales y en el mismo proceso anterior, el Graph Builder ha troceado el documento en chunks y ha calculado sus embeddings para poder realizar consultas basadas en similitud, ésto lo almacena en otro Grafo (conectado con el anterior) que se puede ver en la siguiente imagen:

Graph

Acceder al Grafo de Conocimiento desde LangChain

Una vez que hemos construido nuestro grafo de conocimiento en Neo4j nos conectamos a él utilizando LangChain

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import os
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI
from langchain.chains import GraphCypherQAChain
from langchain_community.vectorstores import Neo4jVector
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores.neo4j_vector import remove_lucene_chars
from langchain_core.runnables import ConfigurableField, RunnableParallel, RunnablePassthrough

os.environ["OPENAI_API_KEY"] = "********"
os.environ["NEO4J_URI"] = "neo4j+s://******.databases.neo4j.io"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "********"

graph = Neo4jGraph()

Y podemos directamente crear un Chat que nos conteste a preguntas sobre las técnicas de estudio que hemos guardado en la Base de Conocimiento:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

chain = GraphCypherQAChain.from_llm(
    ChatOpenAI(temperature=0), graph=graph, verbose=True, allow_dangerous_requests=True
)

chain.invoke({"query": "Para qué sirven los dibujos en el proceso de aprendizaje?"})

> Entering new GraphCypherQAChain chain...

{'query': 'Para qué sirven los dibujos en el aprendizaje?',
 'result': 'Los dibujos en el aprendizaje sirven para representar visualmente las ideas, facilitar la memorización de 
 'información clave, y ayudar a reorganizar y recordar el material de estudio de manera efectiva.'
 }

Esta clase de LangChain lo que ha hecho internamente es contruir una consulta al grafo (Lenguaje Cypher) y darle el resultado como contexto al LLM para que pueda responder a la pregunta de manera más precisa.

Consultas a la “Base de Datos Vectorial”

Vector Index de los Documentos

Además de las consultas a la base de datos de grafos, también podemos realizar consultas a la base de datos vectorial para recuperar información importante de manera eficiente.

En concreto el Graph Builder ha creado un vector index de los documentos que ha troceado en Chunks y calculado sus embeddings que se pueden consultar vectorialmente.

Primero recuperamos el vector index de los documentos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from sentence_transformers import SentenceTransformer
from langchain.embeddings import HuggingFaceEmbeddings

model = SentenceTransformer('all-MiniLM-L6-v2')  # EL que ha utilizado el Graph Builder para construirlo

hf_embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")

vector_index = Neo4jVector.from_existing_graph(
    embedding=hf_embeddings,
    search_type="vector",
    node_label="Chunk",
    text_node_properties=["text"],
    embedding_node_property="embedding"
)

Y luego le hacemos una consulta para recuperar los chunks más significativos para una pregunta dada:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
query = "Qué técnicas me recomiendas para mejorar mi aprendizaje?"

docs_with_score = vector_index.similarity_search_with_score(query, k=4)

print(docs_with_score)

[(Document(metadata={'position': 131, 'content_offset': 16418, 'fileName': 'es.wikipedia.org-Técnicas de estudio.txt', 
'length': 98}, page_content="\ntext: Asimilar significativamente los contenidos y recuperarlos para nuevos aprendizajes" 
"Procedimientos:"), 0.8310031890869141), (Document(metadata={'position': 49, 'content_offset': 7001, 'fileName': "es.wikipedia."
"org-Técnicas de estudio.txt", 'length': 257}, page_content="\ntext: Una técnica de trabajo se asocia con una estrategia de" 
"aprendizaje previa que tenga en cuenta diferentes factores que intervengan; se busca obtener una acción estratégica, eficaz y" 
"adecuada. No hay técnica de estudio perfecta; una técnica es una herramienta"), 0.8196570873260498), (Document(metadata=
{'position': 4, 'content_offset': 147, 'fileName': 'es.wikipedia.org-Técnicas de estudio.txt', 'length': 245}, 
page_content="\ntext: al aprendizaje general. Hay una variedad de técnicas de estudio, que pueden enfocarse en el proceso de" 
"organizar, tomar y retener nueva información, o superar exámenes.Estas técnicas incluyen mnemotecnia(s), que ayudan a la" 
"retención de listas 2"), 0.807748556137085), (Document(metadata={'position': 31, 'content_offset': 6409, 'fileName': 'es."
"wikipedia.org-Técnicas de estudio.txt", 'length': 187}, page_content="\ntext: y es una técnica especializada a la aprobación" 
"de dichas pruebas. Sin embargo ya sea una técnica especializada o general, todas comparten características esenciales que" 
"ayudan al estudio."), 0.8026809692382812)]

Lo que ha hecho el método vector_index.similarity_search_with_score es crear los embeddings de la pregunta y buscar los chunks que contienen información más similar a las palabras que la forman.

Vector Index sobre nodos del Grafo

También podemos crear un vector index sobre los nodos del grafo de conocimiento para recuperar información significativa.

Por ejemplo si lo creamos sobre los nodos de las técnicas de estudio que hemos definido en el grafo de conocimiento:

1
2
3
4
5
6
7
8
vector_tecnica_index = Neo4jVector.from_existing_graph(
    embedding=hf_embeddings,
    index_name="vector_tecnica",
    search_type="vector",
    node_label="Técnica",
    text_node_properties=["id"],
    embedding_node_property="embedding",
)

Y realizamos la misma consulta que antes:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

query = "Qué técnicas me recomiendas para mejorar mi aprendizaje?"

docs_with_score = vector_tecnica_index.similarity_search_with_score(query, k=4)

print(docs_with_score)

[(Document(metadata={}, page_content='\nid: técnica especializada'), 0.7936904430389404), (Document(metadata={},
page_content='\nid: técnica de trabajo'), 0.7878389358520508), (Document(metadata={}, page_content="\nid: utilizar dibujos" 
"para representar ideas"), 0.7397592067718506), (Document(metadata={}, page_content='\nid: técnicas motivacionales'), 0.7373077869415283)]

Lo que ha hecho ahora el método vector_tecnica_index.similarity_search_with_score es también buscar la información más similar pero solo dentro de los nodos del grafo que almacenan las técnicas de estudio.

Consultas a la Base de Datos de Grafos

También podemos realizar consultas a la base de datos de grafos para recuperar información relevante de manera estructurada.

Por ejemplo si queremos recuperar las técnicas de estudio y todas sus relaciones podemos hacer la siguiente consulta:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
QUERY = """
MATCH (TécnicaEstudio)-[r:!(MENTIONS|SIMILAR|HAS_ENTITY|NEXT_CHUNK)]->(neighbor)
RETURN TécnicaEstudio.id + ' - ' + type(r) + ' -> ' + neighbor.id AS output
UNION ALL
MATCH (TécnicaEstudio)<-[r:!(MENTIONS|SIMILAR|HAS_ENTITY|NEXT_CHUNK)]-(neighbor)
RETURN neighbor.id + ' - ' + type(r) + ' -> ' +  TécnicaEstudio.id AS output
"""

graph.query(QUERY)

 {'output': 'Técnicas de estudio - INCLUDES -> técnicas motivacionales'},
 {'output': 'Técnicas de estudio - INCLUDES -> mnemotecnia'},
 {'output': 'Técnicas de estudio - INCLUDES -> toma de notas efectiva'},
 {'output': 'Técnicas de estudio - INCLUDES -> repaso'},
 {'output': 'Técnicas de estudio - INCLUDES -> subrayado'},
 {'output': 'Técnicas de estudio - INCLUDES -> toma de apuntes'},
 {'output': 'Técnicas de estudio - INCLUDES -> resumen'},
 {'output': 'Técnicas de estudio - INCLUDES -> elaboración de esquemas'},
 {'output': 'Técnicas de estudio - INCLUDES -> realización de trabajos escolares'},
 {'output': 'Técnicas de estudio - INCLUDES -> técnicas de administración del tiempo'},
 {'output': 'Técnicas de estudio - INCLUDES -> planificación de la actividad'},
 {'output': 'Técnicas de estudio - IMPROVES -> habilidad para estudiar y superar exámenes'},
 {'output': 'subrayado - ES_PARTE_DE -> técnicas de estudio'},
 {'output': 'práctica educativa - CONSIDERS -> modelado y moldeado docente'},
 {'output': 'práctica educativa - CONSIDERA -> moldeado docente'},
 {'output': 'práctica educativa - CONSIDERA -> modelado'},
 {'output': 'técnicas de administración del tiempo - INCLUIDO_EN -> técnica de estudio'},
 {'output': 'psicología del aprendizaje - CONSIDERS -> modelado y moldeado docente'},
 {'output': 'psicología del aprendizaje - CONSIDERA -> moldeado docente'},
 {'output': 'psicología del aprendizaje - CONSIDERA -> modelado'},
 ....................
 

Consultas Combinadas

Si elaboramos un poco más las consultas anteriores y hacemos los siguientes pasos:

  • 1.- Generamos un prompt que automáticamente recupere las entidades más importantes en la pregunta del usuario
  • 2.- Recuperamos los chunks más similares para cada una de esas entidades.
  • 3.- Obtenemos todas las reglas del grafo que involucren a cada una de ellas.
  • 4.- Combinamos toda esta información como contexto para el LLM

Podemos obtener un contexto mucho más rico que le permite al LLM generar respuestas más detalladas y contextualizadas.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
..........
Structured data:
Técnicas De Estudio - APLICADAS_AL -> Perspectivas
Técnicas De Estudio - APLICADAS_AL -> Aprendizaje
Técnicas De Estudio - APLICADAS_AL -> Información
Técnicas De Estudio - APLICADAS_AL -> Exámenes
Técnicas De Estudio - INCLUYEN -> Mnemotecnia
Técnicas De Estudio - INCLUYEN -> Toma De Notas
Técnicas De Estudio - INCLUYEN -> Planificación
Técnicas De Estudio - INCLUYEN -> Subrayado
Técnicas De Estudio - INCLUYEN -> Resumen
Técnicas De Estudio - INCLUYEN -> Elaboración De Esquemas
Técnicas De Estudio - INCLUYEN -> Repaso
Técnicas De Estudio - COMPLEMENTARIAS -> Toma De Apuntes
Técnicas De Estudio - COMPLEMENTARIAS -> Trabajos Escolares
Técnicas De Estudio - DISPONIBLES_EN -> Libros
Técnicas De Estudio - DISPONIBLES_EN -> Sitios Web
Técnicas De Estudio - INFLUENCES -> Tony Buzan
Técnicas De Estudio - INCLUDES -> Mnemotecnias
Técnicas De Estudio - INCLUDES -> Toma De Notas Efectiva
ed20226490c251915c98cd5fdb55f819 - MENTIONS -> Técnicas De Estudio
Estudio - INCORPORAR -> Técnicas De Estudio
Habilidad - INCLUYE -> Técnica De Estudio
Unstructured data:

==Document
text:  el propio proceso de estudio; tales como la planificación de dicha actividad, el subrayado, el resumen, la elaboración 
de esquemas, el repaso, entre otros.; así como otras estrategias que tienen un carácter más complementario, como pueden ser la 
toma de apuntes o la realización de trabajos escolares.
En cuanto a la enseñanza de estas técnicas, tanto la psicología de aprendizaje (particularmente la concepción 
constructivista procedente de la psicología cognitiva), como la práctica educativa, coinciden en considerar el modelado y el 
moldeado docente como las estrategias didácticas más idóneas a la hora de promover un aprendizaje eficaz y profundo de dichas 
estrategias.
Aunque frecuentemente se les deja al estudiante y a su red personal de soporte, se está incrementando la enseñanza de las 
técnicas de estudio a nivel de la escuela secundaria y universidad. Existe disponible un gran número de libros y sitios web, 
que abarcan desde trabajos acerca de técnicas específicas, tales como los libros de Tony Buzan sobre mapas mentales, hasta 
guías generales para un estudio exitoso.
Más ampliamente, una técnica que mejora la habilidad de una persona para estudiar y superar exámenes puede ser denominada 
técnica de estudio, y esto puede incluir ===Document 
text: El estudio es el conjunto de técnicas y estrategias puestas en práctica por un sujeto, denominado estudiante, para 
incorporar conocimientos de una determinada disciplina o de las relaciones entre estos y otros conocimientos. En el ámbito más 
general de aprendizaje, es característica la voluntad que pone en práctica el estudiante para abordar un tema específico.

== Técnicas de estudio ==


== Véase también ==
Investigación
Memorización


== Referencias ==


== Enlaces externos ==Document 
text: Las técnicas de estudio o estrategias de estudio son distintas perspectivas aplicadas al aprendizaje general**1** Hay una 
variedad de técnicas de estudio, que pueden enfocarse en el proceso de organizar, tomar y retener nueva información, o superar 
exámenes.Estas técnicas incluyen mnemotecnia, que ayudan a la retención de listas de información, y toma de notas efectiva.**2**

Es una manera formulada que de este modo y bajo esta denominación, se integran y agrupan técnicas directamente implicadas en el 
propio proceso de estudio; tales como la planificación de dicha actividad, el subrayado, el resumen, la elaboración de 
esquemas, el repaso, entre otros.; así como otras estrategias que tienen un carácter más complementario, como pueden ser la 
toma de apuntes o la realización de trabajos escolares.
En cuanto a la enseñanza de estas técnicas, tanto la psicología de aprendizaje (particularmente la concepción 
constructivista procedente de la psicología cognitiva), como la práctica educativa, coinciden en considerar el modelado y el 
moldeado docente como las estrategias didácticas más idóneas a la hora de promover un aprendizaje eficaz y profundo de dichas 
estrategias.
Aunque frecuentemente se les deja al estudiante y a su red personal de soporte, se está incrementando la enseñanza de las 
técnicas de estudio a nivel de la escuela secundaria y universidad. Existe disponible un gran número de libros y sitios web, 
que abarcan ==Document 
text: . Existe disponible un gran número de libros y sitios web, que abarcan desde trabajos acerca de técnicas específicas, 
tales como los libros de Tony Buzan sobre mapas mentales, hasta guías generales para un estudio exitoso.
Más ampliamente, una técnica que mejora la habilidad de una persona para estudiar y superar exámenes puede ser denominada 
técnica de estudio, y esto puede incluir técnicas de administración de tiempo y motivacionales.
Las técnicas de estudio son técnicas discretas que pueden ser aprendidas, generalmente en un período corto, y ser aplicadas a 
todos o casi todos los campos de estudio. En consecuencia debe identificarse de las que son específicas para un campo 
particular de estudio, por ejemplo la música o la tecnología, y de habilidades inherentes al estudiante, tales como aspectos de inteligencia y estilo de aprendizaje.


== Descripción ==
Las técnicas de estudio o estrategias de estudio son distintas perspectivas aplicadas al aprendizaje general. .1 Hay una 
variedad de técnicas de estudio, que pueden enfocarse en el proceso de organizar, tomar y retener nueva información, o superar 
exámenes. Estas técnicas incluyen mnemotecnias, que ayudan a la retención de listas de información, y toma de notas efectiva.2
Es una manera formulada que de este modo y bajo esta denominación, se integran y agrupan técnicas directamente implicadas en el 
propio proceso de estudio; tales como la planificación de dicha activid
    

Pero además hay otros métodos de combinar ambas búsquedas que son útiles en diferentes escenarios:

Búsqueda vectorial inicial seguida de un filtrado basado en grafos: Este método utiliza una base de datos vectorial para una recuperación inicial rápida de información relevante, y luego filtrar los resultados utilizando consultas al grafo.

Extracción de entidades de la consulta y enriquecimiento con el grafo: Se extraen las entidades de la consulta del usuario utilizando un LLM. Estas entidades se pueden enriquecer con información del grafo, como sinónimos y términos más específicos. La información resultante se puede utilizar para realizar una búsqueda más precisa en la base de datos vectorial.

Análisis semántico de la consulta y generación de subconsultas: Se puede utilizar un LLM para analizar la consulta del usuario y dividirla en partes semánticas. Cada parte semántica se puede traducir en una subconsulta que se puede ejecutar en la base de datos vectorial o en el grafo de conocimiento. Los resultados de las subconsultas se pueden combinar para generar una respuesta más completa.

Utilizar el grafo para controlar el acceso a la información: El grafo de conocimiento se puede utilizar para implementar control de acceso a la información en tiempo de consulta

Conclusión

En este post hemos hemos visto cómo se pueden crear RAGs combinando bases vectoriales con grafos de conocimiento. Hemos utilizado LangChain y Neo4j para construir un RAG y comprobado cómo se pueden utilizar los grafos de conocimiento para mejorar la calidad de las respuestas de los modelos de lenguaje.

Las ventajas que nos ofrece esta combinación son:

  • Facilidad para representar información heterogénea e interconectada*: Los grafos de conocimiento pueden representar sin esfuerzo relaciones complejas y atributos a través de diversos tipos de datos, algo con lo que las bases de datos vectoriales, centradas en datos no estructurados, suelen tener dificultades.
  • Explicabilidad y control: Los grafos de conocimiento ofrecen una mayor explicabilidad y control sobre los resultados de búsqueda. Se puede rastrear el razonamiento detrás de las respuestas, ya que los resultados se basan en relaciones y propiedades explícitas dentro del grafo.
  • Mitigación de la “intoxicación del contexto” que ocurre cuando se incluye información irrelevante en la solicitud a un LLM, lo que lleva a respuestas engañosas. Los grafos de conocimiento, al permitir filtrar los resultados de la búsqueda vectorial, ayudan a mitigar este problema, asegurando que la información utilizada para la generación de respuestas sea concreta y precisa.
  • Enriquecimiento de datos y control de acceso: Los grafos de conocimiento permiten un “enriquecimiento de datos mejorado”, donde se pueden usar los términos y relaciones del grafo para expandir o refinar los términos de búsqueda. También facilitan el control de acceso a la información en tiempo de consulta, permitiendo, por ejemplo, restringir el acceso a ciertos nodos o relaciones en función de la identidad del usuario.

Referencias

SO WHAT DO YOU THINK ?

Contact us and challenge us with a problem
+34 644 237 135
hola@taniwa.es

SOMOS PYME INNOVADORA
Sello PYME INNOVADORA 06/11/2027 escudo de MEIC 06/11/2027

CONTACT TANIWA