In this tutorial, we will show how to create a knowledge graph from an unstructured document using LLM. While traditional NLP methods have been used to extract entities and relationships, large language models (LLMs) such as GPT-4O-Mini make this process more accurate and context-aware. LLMS is especially useful when using confusing, unstructured data. Using Python, Mirascope, and OpenAI’s GPT-4O-Mini, we’ll build a simple knowledge graph from the sample medical logs.
Install dependencies
!pip install "mirascope[openai]" matplotlib networkx
OpenAI API Keys
To obtain the OpenAI API key, access and generate a new key. If you are a new user, you may need to add billing details and pay a minimum of $5 to activate API access. View full Code here.
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass('Enter OpenAI API Key: ')
Define graph pattern
Before extracting information, we need a structure to represent it. In this step, we define a simple knowledge graph architecture for using Pydantic. Modes include:
- Node: Represents an entity with an ID, type (such as “Doctor” or “Drug”) and optional attributes.
- Edge: represents the relationship between two nodes.
- Knowledge graph: Containers for all nodes and edges.
View full Code here.
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]
Define the patient log
Now we have a pattern that lets define the unstructured data we will use to generate knowledge graphs. Below is a sample patient log written in natural language. It contains key events, symptoms and observations related to patients named Mary. View full Code here.
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.
"""
Generate knowledge map
To convert unstructured patient records into structured insights, we used the LLM-driven feature of extracting knowledge graphs. Each patient’s entry was analyzed to identify entities (e.g., people, symptoms, events) and their relationships (e.g., “report”, “symptomatic”.
The Generate_KG function is decorated by @OpenAi.Call, utilizing the GPT-4O-MINI model and the previously defined knowledge graph pattern. This prompt clearly indicates how the model maps logs to nodes and edges. View full Code here.
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)
Query diagram
Once a knowledge graph is generated through the unstructured patient log, we can use it to answer medical or behavioral queries. We define a function run() that takes natural language problems and structured graphs and passes them to LLM’s prompts for interpretation and response. View full Code here.
@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))
Visualization
Finally, we use render_graph (kg) to generate a clear and interactive visual representation of the knowledge graph, helping us better understand the patient’s condition and the link between observed symptoms, behaviors, and medical problems.
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)
Check Code. All credits for this study are to the researchers on the project. Also, please stay tuned for us twitter And don’t forget to join us 100K+ ml reddit And subscribe Our newsletter.

I am a civil engineering graduate in Islamic Islam in Jamia Milia New Delhi (2022) and I am very interested in data science, especially neural networks and their applications in various fields.
