Создание медицинского графа знаний с помощью 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