Construindo um Repositório Vetorial FHIR com InterSystems IRIS e Python através do módulo IRIStool
Introdução
Em um artigo anterior, apresentei o módulo IRIStool, que integra de forma transparente a biblioteca pandas do Python com o banco de dados IRIS. Agora, estou explicando como podemos usar o IRIStool para aproveitar o InterSystems IRIS como base para buscas inteligentes e semânticas sobre dados de saúde no formato FHIR.
Este artigo cobre o que fiz para criar o banco de dados de outro dos meus projetos, o FHIR Data Explorer. Ambos os projetos são candidatos no concurso atual da InterSystems, então, por favor, vote neles se os achar úteis.
Você pode encontrá-los no Open Exchange:
Neste artigo, abordaremos:
- Conexão ao banco de dados InterSystems IRIS através do Python
- Criação de um esquema de banco de dados preparado para FHIR
- Importação de dados FHIR com embeddings vetoriais para busca semântica
Pré-requisitos
Instale o IRIStool a partir da página do GitHub do IRIStool e Data Manager.
1. Configuração da Conexão com o IRIS
Comece configurando sua conexão através de variáveis de ambiente em um arquivo .env:
IRIS_HOST=localhost
IRIS_PORT=9092
IRIS_NAMESPACE=USER
IRIS_USER=_SYSTEM
IRIS_PASSWORD=SYSConecte-se ao IRIS usando o gerenciador de contexto do IRIStool:
from utils.iristool import IRIStool
import os
from dotenv import load_dotenv
load_dotenv()
with IRIStool(
host=os.getenv('IRIS_HOST'),
port=os.getenv('IRIS_PORT'),
namespace=os.getenv('IRIS_NAMESPACE'),
username=os.getenv('IRIS_USER'),
password=os.getenv('IRIS_PASSWORD')
) as iris:
# IRIStool manages the connection automatically
pass2. Criando o Esquema FHIR
Primeiro, crie uma tabela para armazenar os dados FHIR e, ao extrair dados dos bundles FHIR, crie tabelas com recursos de busca vetorial para cada um dos recursos FHIR extraídos (como Patient, Observability, etc.).
O IRIStool simplifica a criação de tabelas e índices!
Tabela do Repositório FHIR
# Create main repository table for raw FHIR bundles
if not iris.table_exists("FHIRrepository", "SQLUser"):
iris.create_table(
table_name="FHIRrepository",
columns={
"patient_id": "VARCHAR(200)",
"fhir_bundle": "CLOB"
}
)
iris.quick_create_index(
table_name="FHIRrepository",
column_name="patient_id"
)Tabela Patient com Suporte a Vetores
# Create Patient table with vector column for semantic search
if not iris.table_exists("Patient", "SQLUser"):
iris.create_table(
table_name="Patient",
columns={
"patient_row_id": "INT AUTO_INCREMENT PRIMARY KEY",
"patient_id": "VARCHAR(200)",
"description": "CLOB",
"description_vector": "VECTOR(FLOAT, 384)",
"full_name": "VARCHAR(200)",
"gender": "VARCHAR(30)",
"age": "INTEGER",
"birthdate": "TIMESTAMP"
}
)
# Create standard indexes
iris.quick_create_index(table_name="Patient", column_name="patient_id")
iris.quick_create_index(table_name="Patient", column_name="age")
# Create HNSW vector index for similarity search
iris.create_hnsw_index(
index_name="patient_vector_idx",
table_name="Patient",
column_name="description_vector",
distance="Cosine"
)3. Importando Dados FHIR com Vetores
Gere embeddings vetoriais a partir das descrições de pacientes FHIR e insira-os no IRIS com facilidade:
from sentence_transformers import SentenceTransformer
# Initialize transformer model
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Example: Process patient data
patient_description = "45-year-old male with hypertension and type 2 diabetes"
patient_id = "patient-123"
# Generate vector embedding
vector = model.encode(patient_description, normalize_embeddings=True).tolist()
# Insert patient data with vector
iris.insert(
table_name="Patient",
patient_id=patient_id,
description=patient_description,
description_vector=str(vector),
full_name="John Doe",
gender="male",
age=45,
birthdate="1979-03-15"
)4. Realizando Busca Semântica
Uma vez que seus dados estejam carregados, você pode realizar buscas por similaridade:
# Search query
search_text = "patients with diabetes"
query_vector = model.encode(search_text, normalize_embeddings=True).tolist()
# define sql query
query = f"""
SELECT TOP 5
patient_id,
full_name,
description,
VECTOR_COSINE(description_vector, TO_VECTOR(?)) as similarity
FROM Patient
ORDER BY similarity DESC
"""
# define query parameters
parameters = [str(query_vector)]
# Find similar patients using vector search
results = iris.query(query, parameters)
# print DataFrame data
if not results.empty:
print(f"{results['full_name']}: {results['similarity']:.3f}")Conclusões
-
O IRIStool simplifica a integração com o IRIS com métodos Python intuitivos para criação de tabelas e índices.
-
O IRIS oferece suporte nativo a armazenamento híbrido SQL + vetorial, permitindo consultas tradicionais e busca semântica.
-
Embeddings vetoriais possibilitam buscas inteligentes em dados de saúde FHIR usando linguagem natural.
-
Índices HNSW fornecem buscas por similaridade eficientes em escala.
Essa abordagem demonstra como o InterSystems IRIS pode servir como uma base poderosa para construir aplicações de saúde inteligentes com capacidades de busca semântica sobre dados FHIR.