19whbtszruyfyd0hmtt2ptq.png

Si le preguntaras a GPT, ¿cómo crear un gráfico de conocimiento a partir de un texto determinado? puede sugerir un proceso como el siguiente.

  1. Extraer conceptos y entidades del cuerpo del trabajo. Estos son los nodos.
  2. Extraer relaciones entre los conceptos. Estos son los bordes.
  3. Complete nodos (conceptos) y aristas (relaciones) en una estructura de datos de gráficos o una base de datos de gráficos.
  4. Visualice, al menos para obtener alguna gratificación artística.

Los pasos 3 y 4 suenan comprensibles. Pero, ¿cómo se logran los pasos 1 y 2?

A continuación se muestra un diagrama de flujo del método que ideé para extraer un gráfico de conceptos de cualquier corpus de texto determinado. Es similar al método anterior pero con algunas diferencias menores.

Diagrama creado por el autor usando draw.io
  1. Divida el corpus de texto en fragmentos. Asigne un chunk_id a cada uno de estos fragmentos.
  2. Para cada fragmento de texto, extraiga conceptos y sus relaciones semánticas utilizando un LLM. Asignemos a esta relación una ponderación de W1. Puede haber múltiples relaciones entre un mismo par de conceptos. Cada relación de este tipo es una ventaja entre un par de conceptos.
  3. Considere que los conceptos que aparecen en el mismo fragmento de texto también están relacionados por su proximidad contextual. Asignemos a esta relación una ponderación de W2. Tenga en cuenta que el mismo par de conceptos puede aparecer en varios fragmentos.
  4. Agrupe pares similares, sume sus pesos y concatene sus relaciones. Así que ahora tenemos sólo una ventaja entre cualquier par de conceptos distintos. El borde tiene un cierto peso y una lista de relaciones como nombre.

Puedes ver la implementación de este método como código Python, en el repositorio de GitHub que comparto en este artículo. Repasemos brevemente las ideas clave de la implementación en las siguientes secciones.

Para demostrar el método aquí, estoy utilizando el siguiente artículo de revisión publicado en PubMed/Cureus bajo los términos de la Licencia de Atribución Creative Commons. Crédito a los autores al final de este artículo.

El Mistral y el Rápido

El paso 1 del diagrama de flujo anterior es sencillo. Langchain proporciona una gran cantidad de divisores de texto que podemos usar para dividir nuestro texto en fragmentos.

El paso 2 es donde comienza la verdadera diversión. Para extraer los conceptos y sus relaciones, estoy utilizando el modelo Mistral 7B. Antes de decidirnos por la variante del modelo más adecuada para nuestro propósito, experimenté con lo siguiente:

Instrucción Mistral
Mistral OpenOrcay
Zephyr (versión Hugging Face derivada de Mistral)

Utilicé la versión cuantificada de 4 bits de estos modelos, para que mi Mac no empiece a odiarme, alojada localmente en Ollama.

Todos estos modelos son modelos ajustados por instrucciones con un mensaje del sistema y un mensaje del usuario. Todos hacen un buen trabajo siguiendo las instrucciones y formateando la respuesta claramente en JSON si se lo indicamos.

Después de algunas rondas de golpes y pruebas, finalmente convergí en el modelo céfiro con las siguientes indicaciones.

SYS_PROMPT = (
"You are a network graph maker who extracts terms and their relations from a given context. "
"You are provided with a context chunk (delimited by ```) Your task is to extract the ontology "
"of terms mentioned in the given context. These terms should represent the key concepts as per the context. \n"
"Thought 1: While traversing through each sentence, Think about the key terms mentioned in it.\n"
"\tTerms may include object, entity, location, organization, person, \n"
"\tcondition, acronym, documents, service, concept, etc.\n"
"\tTerms should be as atomistic as possible\n\n"
"Thought 2: Think about how these terms can have one on one relation with other terms.\n"
"\tTerms that are mentioned in the same sentence or the same paragraph are typically related to each other.\n"
"\tTerms can be related to many other terms\n\n"
"Thought 3: Find out the relation between each such related pair of terms. \n\n"
"Format your output as a list of json. Each element of the list contains a pair of terms"
"and the relation between them, like the follwing: \n"
"[\n"
" {\n"
' "node_1": "A concept from extracted ontology",\n'
' "node_2": "A related concept from extracted ontology",\n'
' "edge": "relationship between the two concepts, node_1 and node_2 in one or two sentences"\n'
" }, {...}\n"
"]"
)

USER_PROMPT = f"context: ```{input}``` \n\n output: "

Si pasamos nuestra canción infantil (no apta para) con este mensaje, aquí está el resultado.

[
{
"node_1": "Mary",
"node_2": "lamb",
"edge": "owned by"
},
{
"node_1": "plate",
"node_2": "food",
"edge": "contained"
}, . . .
]

Tenga en cuenta que incluso adivinó «comida» como un concepto, que no se menciona explícitamente en el texto. ¿No es esto maravilloso?

Si ejecutamos esto en cada fragmento de texto de nuestro artículo de ejemplo y convertimos el json en un marco de datos de Pandas, así es como se ve.