La generación aumentada por recuperación de grafos (RAG de grafos) es una técnica emergente y poderosa para las aplicaciones de IA generativa para utilizar los conocimientos específicos del dominio y la información relevante. El RAG de grafos es una alternativa a los métodos de búsqueda vectorial que utilizan una base de datos vectorial.
Los grafos de conocimiento son sistemas de conocimiento en los que las bases de datos de grafos, como Neo4j o Amazon Neptune, pueden representar datos estructurados. En un grafo de conocimiento, las relaciones entre los puntos de datos, llamadas aristas, son tan significativas como las conexiones entre los puntos de datos, llamados vértices o, a veces, nodos. Un grafo de conocimiento facilita atravesar una red y procesar consultas complejas sobre datos conectados. Los grafos de conocimiento son especialmente adecuados para casos de uso que involucran chatbots, resolución de identidades, análisis de redes, motores de recomendación, Customer 360 y detección de fraude.
Un enfoque de RAG de grafos aprovecha la naturaleza estructurada de las bases de datos de grafos para dar mayor profundidad y contexto a la información recuperada sobre redes o relaciones complejas. Una base de datos de grafos se combina con un modelo de lenguaje grande (LLM) y un desarrollador puede automatizar partes significativas del proceso de creación de grafos a partir de datos no estructurados, como texto. Un LLM puede procesar datos de texto e identificar entidades, comprender sus relaciones y representarlas en una estructura de grafos.
Hay muchas formas de crear una aplicación de RAG de grafos, por ejemplo, GraphRAG de Microsoft, o emparejar GPT4 con LlamaIndex. En este tutorial, utilizará Memgraph, una solución de base de datos de grafos de código abierto para crear un sistema RAG mediante Llama-3 de Meta en watsonx. Memgraph utiliza Cypher, un lenguaje de consulta declarativo. Comparte algunas similitudes con SQL, pero se centra en nodos y relaciones en lugar de tablas y filas. Llama 3 creará y completará su base de datos de grafos a partir de texto no estructurado e información de consulta en la base de datos.
Si bien puede elegir entre varias herramientas, este tutorial lo guiará a través de cómo configurar una cuenta de IBM para usar un Jupyter Notebook.
Inicie sesión en watsonx.ai con su cuenta de IBM Cloud.
Cree un proyecto watsonx.ai.
Obtiene su ID de proyecto desde dentro de su proyecto. Haga clic en la pestaña Manage. Luego, copie el ID del proyecto de la sección Details de la página General. Necesita este ID de proyecto para este tutorial.
A continuación, asocie su proyecto con watsonx.ai Runtime.
a. Cree una instancia de servicio watsonx.ai Runtime (elija el plan Lite, que es una instancia gratuita).
b. Genere una clave de API en watsonx.ai Runtime. Guarde esta clave de API para usarla en este tutorial.
c. Vaya a su proyecto y seleccione la pestaña Manage.
d. En la pestaña izquierda, seleccione Services and Integrations.
e. Seleccione los servicios de IBM.
f. Seleccione Associate service y elija watsonx.ai® Runtime.
g. Asocie watsonx.ai Runtime al proyecto que creó en watsonx.ai.
Ahora, deberá instalar Docker.
Una vez que haya instalado Docker, instale Memgraph utilizando su contenedor Docker. En OSX o Linux, puede usar este comando en una terminal:
En una computadora con Windows, use:
Siga los pasos de instalación para poner en marcha el motor Memgraph y el Memgraph lab.
En su computadora, cree un virtualenv nuevo para este proyecto:
En el entorno de Python para su notebook, instale las siguientes bibliotecas de Python:
Ahora está listo para conectarse a Memgraph.
Si configuró Memgraph para usar un nombre de usuario y una contraseña, configúrelos aquí; de lo contrario, puede usar los valores predeterminados de no tener ninguno. No es una buena práctica para una base de datos de producción, pero para un entorno de desarrollo local que no almacena datos confidenciales, no es un problema.
Ahora cree una cadena de muestra que describa un conjunto de datos de relaciones que pueda usar para probar las capacidades de generación de gráficos de su sistema LLM. Puede utilizar fuentes de datos más complejas, pero este sencillo ejemplo nos ayuda a demostrar el algoritmo.
Ingrese la clave de API de watsonx que creó en el primer paso:
Ahora configure una instancia de watsonxLLM para generar texto. La temperatura debe ser bastante baja y la cantidad de tokens alta para alentar al modelo a generar tantos detalles como sea posible sin alucinar entidades o relaciones que no están presentes.
El LLMGraphTransformer le permite establecer qué tipos de nodos y relaciones le gustaría que genere el LLM. En su caso, el texto describe a los empleados de una empresa, los grupos en los que trabajan y sus puestos. Restringir el LLM a solo esas entidades hace que sea más probable que obtenga una buena representación del conocimiento en un grafo.
La llamada a convert_to_graph_documents hace que LLMGraphTransformer cree un grafo de conocimiento a partir del texto. Este paso genera la sintaxis correcta de Neo4j para insertar la información en la base de datos de grafos para representar el contexto y las entidades relevantes.
Ahora borre cualquier dato antiguo de la base de datos de Memgraph e inserte los nuevos nodos y bordes.
La sintaxis de Cypher generada se almacena en los objetos graph_documents. Puede inspeccionarlo simplemente imprimiéndolo como una cadena.
El esquema y los tipos de datos creados por Cypher se pueden ver en la propiedad 'get_schema' de los grafos.
Esto se imprime:
También puede ver la estructura del gráfico en el visor de Memgraph labs:
El LLM ha hecho un trabajo razonable al crear los nodos y las relaciones correctos. Ahora es el momento de consultar el grafo de conocimiento.
Solicitar correctamente el LLM requiere cierta ingeniería rápida. LangChain proporciona una FewShotPromptTemplate que se puede usar para dar ejemplos al LLM en la instrucción para garantizar que escriba la sintaxis de Cypher correcta y concisa. El siguiente código ofrece varios ejemplos de preguntas y consultas que debe utilizar el LLM. También muestra cómo restringir la salida del modelo solo a la consulta. Un LLM que habla demasiado podría agregar información adicional que daría lugar a consultas Cypher no válidas, por lo que la instrucción le pide al modelo que genere solo el resultado en sí.
Agregar un prefijo instructivo también ayuda a restringir el comportamiento del modelo y hace que sea más probable que el LLM proporcione resultados correctos de sintaxis Cypher.
A continuación, creará una instrucción para controlar cómo el LLM responde a la pregunta con la información devuelta por Memgraph. Le daremos al LLM varios ejemplos e instrucciones sobre cómo responder una vez que tenga información de contexto de la base de datos de grafos.
Ahora es el momento de crear la cadena de preguntas y respuestas. MemgraphQACain le permite establecer qué LLM le gustaría usar, el esquema gráfico que se usará y la información sobre la depuración. El uso de una temperatura de 0 y una penalización de longitud anima al LLM a mantener la instrucción de Cypher breve y directa.
Ahora puede invocar la cadena con una pregunta en lenguaje natural (tenga en cuenta que sus respuestas pueden ser ligeramente diferentes porque los LLM no son puramente deterministas).
Esto generará el siguiente resultado:
> Entering new MemgraphQAChain chain...
Generated Cypher:
MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id
Full Context:
[{'t.id': 'Director of the Digital Marketing Group'}]
> Finished chain.
{'query': 'What is Johns title?',
'result': ' \nAnswer: Director of the Digital Marketing Group.',
'intermediate_steps': [{'query': " MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id"},
{'context': [{'t.id': 'Director of the Digital Marketing Group'}]}]}
En la siguiente pregunta, haga a la cadena una pregunta un poco más compleja:
Esto debería devolver:
La respuesta correcta está contenida en la respuesta. En algunos casos, puede haber texto adicional que desee eliminar antes de devolver la respuesta a un usuario final.
Puede preguntar a la cadena Memgraph sobre las relaciones grupales:
Esto devolverá:
Esta es la respuesta correcta.
Finalmente, haga una pregunta a la cadena con dos resultados:
Esto debería generar el siguiente resultado:
La cadena identifica correctamente a ambos colaboradores.
En este tutorial, creó una aplicación de RAG de grafos utilizando Memgraph y watsonx para generar las estructuras de datos de gráficos y consultarlas. Con un LLM a través de watsonx, extrajo información de nodos y aristas del texto fuente del lenguaje natural y generó sintaxis de consulta Cypher para completar una base de datos de grafos. Luego utilizó watsonx para convertir preguntas de lenguaje natural sobre ese texto de origen en consultas Cypher que extraían información de la base de datos de gráficos. Mediante ingeniería rápida, el LLM convirtió los resultados de la base de datos Memgraph en respuestas de lenguaje natural.