<НА ГЛАВНУЮ

Создание медицинского графа знаний с помощью GPT-4o-mini из неструктурированных данных

В этом руководстве показано, как с помощью GPT-4o-mini и Python построить медицинский граф знаний из неструктурированных журналов пациентов для эффективного извлечения и визуализации медицинской информации.

Использование LLM для построения графа знаний

Большие языковые модели, такие как GPT-4o-mini, существенно улучшили извлечение значимой информации из неструктурированных документов. В отличие от традиционных методов обработки естественного языка, LLM обеспечивают лучшую контекстуальную осведомленность и точность, особенно при работе с естественным языком и неупорядоченными данными. В этом руководстве показано, как создать граф знаний из неструктурированного медицинского журнала пациента с помощью Python, Mirascope и GPT-4o-mini от OpenAI.

Настройка окружения

Для начала установите необходимые библиотеки, включая Mirascope для работы с OpenAI, matplotlib для визуализации и networkx для обработки графов:

!pip install "mirascope[openai]" matplotlib networkx

Также потребуется API-ключ OpenAI. Создайте его на платформе OpenAI и настройте в переменных окружения:

import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass('Введите OpenAI API ключ: ')

Определение схемы графа знаний

Для представления сущностей и их связей из текста нужна структурированная схема. С помощью моделей Pydantic определим узлы, представляющие сущности (например, "Доктор" или "Лекарство"), ребра — отношения, и контейнер KnowledgeGraph:

from pydantic import BaseModel
 
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]

Пример журнала пациента

Входные данные — неструктурированный журнал пациента, описывающий события и симптомы, связанные с пациенткой Мэри:

patient_log = """
Мэри позвонила за помощью в 3:45 утра, сообщив, что упала, когда шла в ванную. Это второй случай падения за неделю. Она жаловалась на головокружение перед падением.
 
Ранее в тот же день Мэри замечали, как она бродила по коридору и выглядела сбитой с толку при ответах на простые вопросы. Она не могла вспомнить названия своих лекарств и задавала один и тот же вопрос несколько раз.
 
Мэри пропустила обед и ужин, заявив, что не чувствует голода. Когда медсестра проверила её комнату вечером, Мэри лежала в кровати с лёгкими синяками на левой руке и жаловалась на боль в бедре.
 
Показатели жизненных функций, снятые в 9:00 вечера, показали слегка повышенное кровяное давление и небольшую лихорадку (99.8°F). Медсестра также отметила усиление забывчивости и возможные признаки обезвоживания.
 
Это поведение похоже на предыдущие эпизоды, зарегистрированные в прошлом месяце.
"""

Извлечение графа знаний с помощью GPT-4o-mini

Основная часть — функция, декорированная для вызова модели GPT-4o-mini, которая обрабатывает журнал пациента и возвращает узлы и ребра в виде объекта KnowledgeGraph. Системный запрос инструктирует модель выделять сущности, симптомы, события и их связи:

from mirascope.core import openai, prompt_template
 
@openai.call(model="gpt-4o-mini", response_model=KnowledgeGraph)
@prompt_template(
    """
    SYSTEM:
    Извлеките граф знаний из журнала пациента.
    Используйте узлы для представления людей, симптомов, событий и наблюдений.
    Используйте ребра для обозначения отношений, таких как "имеет симптом", "сообщил", "отмечено" и т.д.
 
    Журнал:
    {log_text}
 
    Пример:
    Мэри сказала помогите, я упала.
    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)

Запросы к графу знаний

После создания графа можно задавать вопросы на естественном языке и получать ответы, используя граф и возможности LLM для логического вывода:

@openai.call(model="gpt-4o-mini")
@prompt_template(
    """
    SYSTEM:
    Используйте граф знаний для ответа на вопрос пользователя.
 
    Граф:
    {knowledge_graph}
 
    ПОЛЬЗОВАТЕЛЬ:
    {question}
    """
)
def run(question: str, knowledge_graph: KnowledgeGraph): ...
 
question = "Какие риски для здоровья или проблемы демонстрирует Мэри на основе её недавнего поведения и жизненных показателей?"
print(run(question, kg))

Визуализация графа знаний

Визуализация помогает наглядно понять связи в данных пациента. С помощью matplotlib и networkx строится интерактивный граф:

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("Граф знаний по здравоохранению", fontsize=15)
    plt.show()
 
render_graph(kg)

Такой подход демонстрирует возможности LLM в преобразовании неструктурированных медицинских заметок в структурированные знания, что улучшает анализ данных и принятие решений в здравоохранении.

🇬🇧

Switch Language

Read this article in English

Switch to English