Creación de un gráfico de conocimiento utilizando un LLM

En este tutorial, mostraremos cómo crear un gráfico de conocimiento a partir de un documento no estructurado utilizando un LLM. Si bien los métodos tradicionales de PNL se han utilizado para extraer entidades y relaciones, los modelos de lenguaje grande (LLM) como GPT-4O-Mini hacen que este proceso sea más preciso y consciente del contexto. Los LLM son especialmente útiles cuando se trabajan con datos desordenados y no estructurados. Usando Python, Mirascope y el GPT-4O-Mini de OpenAI, construiremos un gráfico de conocimiento simple a partir de un registro médico de muestra.

Instalación de las dependencias

!pip install "mirascope[openai]" matplotlib networkx 

Clave de API de OpenAI

Para obtener una llave de API de OpenAI, visite https://platform.openai.com/settings/organization/api-keys y generar una nueva clave. Si es un nuevo usuario, es posible que deba agregar detalles de facturación y realizar un pago mínimo de $ 5 para activar el acceso a la API. Mira el completo Codos aquí.

import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass('Enter OpenAI API Key: ')

Definición del esquema de gráficos

Antes de extraer información, necesitamos una estructura para representarla. En este paso, definimos un esquema simple para nuestro gráfico de conocimiento usando Pydantic. El esquema incluye:

  • Nodo: representa una entidad con una ID, un tipo (como “médico” o “medicamento”) y propiedades opcionales.
  • Edge: representa una relación entre dos nodos.
  • KnowledgeGraph: un contenedor para todos los nodos y bordes.

Mira el completo Codos aquí.

from pydantic import BaseModel, Field

class Edge(BaseModel):
    source: str
    target: str
    relationship: str

class Node(BaseModel):
    id: str
    type: str
    properties: dict | None = None

class KnowledgeGraph(BaseModel):
    nodes: list[Node]
    edges: list[Edge]

Definición del registro del paciente

Ahora que tenemos un esquema, definamos los datos no estructurados que usaremos para generar nuestro gráfico de conocimiento. A continuación se muestra un registro de pacientes de muestra, escrito en lenguaje natural. Contiene eventos clave, síntomas y observaciones relacionadas con un paciente llamado Mary. Mira el completo Codos aquí.

patient_log = """
Mary called for help at 3:45 AM, reporting that she had fallen while going to the bathroom. This marks the second fall incident within a week. She complained of dizziness before the fall.

Earlier in the day, Mary was observed wandering the hallway and appeared confused when asked basic questions. She was unable to recall the names of her medications and asked the same question multiple times.

Mary skipped both lunch and dinner, stating she didn't feel hungry. When the nurse checked her room in the evening, Mary was lying in bed with mild bruising on her left arm and complained of hip pain.

Vital signs taken at 9:00 PM showed slightly elevated blood pressure and a low-grade fever (99.8°F). Nurse also noted increased forgetfulness and possible signs of dehydration.

This behavior is similar to previous episodes reported last month.
"""

Generando el gráfico de conocimiento

Para transformar los registros de pacientes no estructurados en ideas estructuradas, utilizamos una función con motor LLM que extrae un gráfico de conocimiento. Cada entrada del paciente se analiza para identificar entidades (como personas, síntomas, eventos) y sus relaciones (como “reportadas”, “tiene síntomas”).

La función Generate_KG está decorada con @OpenAI.call, aprovechando el modelo GPT-4O-Mini y el esquema de Graph KnowledgeGraph anteriormente. El indicador instruye claramente al modelo sobre cómo mapear el registro en nodos y bordes. Mira el completo Codos aquí.

from mirascope.core import openai, prompt_template

@openai.call(model="gpt-4o-mini", response_model=KnowledgeGraph)
@prompt_template(
    """
    SYSTEM:
    Extract a knowledge graph from this patient log.
    Use Nodes to represent people, symptoms, events, and observations.
    Use Edges to represent relationships like "has symptom", "reported", "noted", etc.

    The log:
    {log_text}

    Example:
    Mary said help, I've fallen.
    Node(id="Mary", type="Patient", properties={{}})
    Node(id="Fall Incident 1", type="Event", properties={{"time": "3:45 AM"}})
    Edge(source="Mary", target="Fall Incident 1", relationship="reported")
    """
)
def generate_kg(log_text: str) -> openai.OpenAIDynamicConfig:
    return {"log_text": log_text}
kg = generate_kg(patient_log)
print(kg)

Consulta del gráfico

Una vez que se ha generado el conocimiento de conocimiento a partir del registro de pacientes no estructurado, podemos usarlo para responder consultas médicas o de comportamiento. Definimos una función run () que toma una pregunta de lenguaje natural y el gráfico estructurado, y los pasa a un aviso para que la LLM interprete y responda. Mira el completo Codos aquí.

@openai.call(model="gpt-4o-mini")
@prompt_template(
    """
    SYSTEM:
    Use the knowledge graph to answer the user's question.

    Graph:
    {knowledge_graph}

    USER:
    {question}
    """
)
def run(question: str, knowledge_graph: KnowledgeGraph): ...
question = "What health risks or concerns does Mary exhibit based on her recent behavior and vitals?"
print(run(question, kg))

Visualizando el gráfico

Por fin, usamos Render_Graph (kg) para generar una representación visual clara e interactiva del gráfico de conocimiento, ayudándonos a comprender mejor la condición del paciente y las conexiones entre los síntomas, comportamientos y preocupaciones médicas observadas.

import matplotlib.pyplot as plt
import networkx as nx

def render_graph(kg: KnowledgeGraph):
    G = nx.DiGraph()

    for node in kg.nodes:
        G.add_node(node.id, label=node.type, **(node.properties or {}))

    for edge in kg.edges:
        G.add_edge(edge.source, edge.target, label=edge.relationship)

    plt.figure(figsize=(15, 10))
    pos = nx.spring_layout(G)
    nx.draw_networkx_nodes(G, pos, node_size=2000, node_color="lightgreen")
    nx.draw_networkx_edges(G, pos, arrowstyle="->", arrowsize=20)
    nx.draw_networkx_labels(G, pos, font_size=12, font_weight="bold")
    edge_labels = nx.get_edge_attributes(G, "label")
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color="blue")
    plt.title("Healthcare Knowledge Graph", fontsize=15)
    plt.show()

render_graph(kg)

Mira el Codos. Todo el crédito por esta investigación va a los investigadores de este proyecto. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín.


Soy un graduado de ingeniería civil (2022) de Jamia Millia Islamia, Nueva Delhi, y tengo un gran interés en la ciencia de datos, especialmente las redes neuronales y su aplicación en varias áreas.