Создание графа знаний с помощью большой языковой модели

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

Установка зависимостей

Для работы нам понадобятся:

  • Python;

  • Mirascope;

  • OpenAI’s GPT-4o-mini.

Чтобы получить ключ API OpenAI, посетите https://platform.openai.com/settings/organization/api-keys и сгенерируйте новый ключ. Если вы новый пользователь, вам может потребоваться добавить платёжные данные и совершить минимальный платёж в размере 5 долларов для активации доступа к API.

“`python
import os
from getpass import getpass
os.environ[“OPENAIAPIKEY”] = getpass(‘Введите ключ API OpenAI: ‘)
“`

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

Прежде чем извлекать информацию, нам нужна структура для её представления. На этом этапе мы определяем простую схему для нашего графа знаний с помощью Pydantic. Схема включает в себя:

  • Node: представляет сущность с идентификатором, типом (например, «Doctor» или «Medication») и необязательными свойствами.

  • Edge: представляет связь между двумя узлами.

  • KnowledgeGraph: контейнер для всех узлов и рёбер.

“`python
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]
“`

Определение журнала пациента

Теперь, когда у нас есть схема, давайте определим неструктурированные данные, которые мы будем использовать для создания графа знаний. Ниже представлен образец журнала пациента, написанный на естественном языке. Он содержит ключевые события, симптомы и наблюдения, связанные с пациенткой Мэри.

“`python
patient_log = “””
Мэри позвонила за помощью в 3:45 утра, сообщив, что упала, когда шла в ванную. Это второй инцидент падения за неделю. Она жаловалась на головокружение перед падением.

Ранее в тот же день Мэри была замечена блуждающей по коридору и казалась растерянной, когда ей задавали простые вопросы. Она не могла вспомнить названия своих лекарств и задавала один и тот же вопрос несколько раз.

Мэри пропустила и обед, и ужин, заявив, что не чувствует голода. Когда медсестра проверила её комнату вечером, Мэри лежала в постели с лёгкими ушибами на левой руке и жаловалась на боль в бедре.

Показатели жизнедеятельности, измеренные в 9:00 вечера, показали слегка повышенное кровяное давление и небольшую температуру (99,8°F). Медсестра также отметила повышенную забывчивость и возможные признаки обезвоживания.

Такое поведение похоже на предыдущие эпизоды, о которых сообщалось в прошлом месяце.
“””
“`

Генерация графа знаний

Чтобы преобразовать неструктурированные журналы пациентов в структурированные сведения, мы используем функцию на базе LLM, которая извлекает граф знаний. Каждая запись пациента анализируется для выявления сущностей (например, людей, симптомов, событий) и их взаимосвязей (например, «сообщил», «имеет симптом»).

“`python
from mirascope.core import openai, prompt_template

@openai.call(model=”gpt-4o-mini”, response_model=KnowledgeGraph)
@prompt_template(
“””
СИСТЕМА:
Извлеките граф знаний из этого журнала пациента.
Используйте узлы для представления людей, симптомов, событий и наблюдений.
Используйте рёбра для представления отношений, таких как «имеет симптом», «сообщил», «отмечено» и т. д.

Журнал:
{log_text}

Пример:
Мэри сказала: «Помогите, я упала».
Node(id=”Мэри”, type=”Пациент”, properties={{}})
Node(id=”Инцидент падения 1″, type=”Событие”, properties={{“time”: “3:45 AM”}})
Edge(source=”Мэри”, target=”Инцидент падения 1″, relationship=”reported”)
“””
)
def generatekg(logtext: str) -> openai.OpenAIDynamicConfig:
return {“logtext”: logtext}
kg = generatekg(patientlog)
print(kg)
“`

Запрос графа

После того как граф знаний был создан из неструктурированного журнала пациента, мы можем использовать его для ответа на медицинские или поведенческие вопросы. Мы определяем функцию run(), которая принимает вопрос на естественном языке и структурированный граф, а затем передаёт их в запрос для LLM, чтобы интерпретировать и ответить.

“`python
@openai.call(model=”gpt-4o-mini”)
@prompt_template(
“””
СИСТЕМА:
Используйте граф знаний, чтобы ответить на вопрос пользователя.

Граф:
{knowledge_graph}

ПОЛЬЗОВАТЕЛЬ:
{question}
“””
)
def run(question: str, knowledge_graph: KnowledgeGraph): …
“`

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

Наконец, мы используем render_graph(kg) для создания чёткого и интерактивного визуального представления графа знаний, что помогает нам лучше понять состояние пациента и связи между наблюдаемыми симптомами, поведением и медицинскими проблемами.

“`python
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.drawnetworkxnodes(G, pos, nodesize=2000, nodecolor=”lightgreen”)
nx.drawnetworkxedges(G, pos, arrowstyle=”->”, arrowsize=20)
nx.drawnetworkxlabels(G, pos, fontsize=12, fontweight=”bold”)
edgelabels = nx.getedge_attributes(G, “label”)
nx.drawnetworkxedgelabels(G, pos, edgelabels=edgelabels, fontcolor=”blue”)
plt.title(“Граф знаний в здравоохранении”, fontsize=15)
plt.show()

render_graph(kg)
“`

1. Какие инструменты и библиотеки используются для создания графа знаний из неструктурированных данных в статье?

В статье упоминаются Python, Mirascope и OpenAI’s GPT-4o-mini.

2. Какие преимущества даёт использование больших языковых моделей (LLM) при создании графа знаний по сравнению с традиционными методами обработки естественного языка (NLP)?

LLM, такие как GPT-4o-mini, делают процесс извлечения сущностей и отношений более точным и учитывающим контекст, особенно при работе с запутанными, неструктурированными данными.

3. Какие основные компоненты включает в себя схема графа знаний, определённая в статье?

Схема графа знаний включает в себя три основных компонента: Node (узел), представляющий сущность с идентификатором, типом и свойствами; Edge (ребро), представляющее связь между двумя узлами; KnowledgeGraph (граф знаний), контейнер для всех узлов и рёбер.

4. Какие шаги необходимо выполнить для генерации графа знаний из неструктурированного журнала пациента?

Для генерации графа знаний необходимо выполнить следующие шаги: определить схему графа, определить неструктурированные данные (журнал пациента), использовать функцию на базе LLM для извлечения графа знаний.

5. Какие возможности предоставляет визуализированный граф знаний в здравоохранении?

Визуализированный граф знаний помогает лучше понять состояние пациента и связи между наблюдаемыми симптомами, поведением и медицинскими проблемами.

Источник

Оставьте комментарий