如果你想在外送平台(如 UberEats)點餐,你必須給外送員一個精準的地址,例如:「台北市信義區某某路 100 號 5 樓」。如果地址寫錯,外送員就找不到地方。
在查詢 DNA 基因變異時也是一模一樣的道理!人類基因組有 30 億個字母,如果我們要讓 Google 的 AlphaGenome API 幫我們查詢某個特質或疾病變異,我們也必須給它一套標準的 「基因組全球定位系統(GPS 地址)」!
今天,我們就要向 AlphaGenome 的 1 PB 預計算資料庫發出第一道正式查詢指令,教你如何用 Python 程式碼把複雜的 JSON 數據包拆開,秒速挖出最有價值的 AVI 評分與致病機制!
要讓 AI 知道你想查哪一個字母發生了突變,我們必須使用生醫資訊界通用的「國際地址簿」——人類參考基因組(目前主流版本為 GRCh38,簡稱 hg38)。
在股票 App 裡查詢台積電,我們會輸入股票代號 2330.TW;而在呼叫 AlphaGenome API 時,我們的查詢字串(Query String)必須嚴格遵守以下格式:
[\text{染色體 (chr)} : \text{位置 (pos)} : \text{原始字母 (ref)} : \text{突變字母 (alt)}]
chr9:13345678:A:G
chr9:代表第 9 號染色體(像行政區)。13345678:代表第 13,345,678 個鹼基位置(像門牌號碼)。A:原本健康的 DNA 字母(野生型 Reference)。G:突變後的 DNA 字母(變異型 Alternative)。只要輸入這串格式完美的「基因地址」,AlphaGenome 就能在 1 秒內找到該位點的全部預測數據!
當你把地址送出去後,AlphaGenome API 不會只回傳一個簡單的數字,而是會打包一個龐大且深層的 JSON 格式數據包。這個數據包裡面裝滿了我們在 Day 08 提到的多模態軌跡(如各種細胞的 RNA 剪接、轉錄信號等)。
為了不被幾千行的數據淹沒,我們的後端程式碼第一步必須學會**「抓大放小」**,重點提取以下三個核心欄位:
| JSON 節點路徑 | 白話欄位意義 | 臨床與工程價值 |
|---|---|---|
variant_id |
變異標準地址名稱 | 確認 API 沒有查錯地址,作為資料庫的主鍵(Primary Key)。 |
avi_score.percentile |
AVI 綜合評分 PR 值 (0-30) | 決定這個變異是否夠危險、能不能進入前 50 名重點候選名單(降維打擊)。 |
feature_attribution.top_drivers |
前三大核心致病機制 | 讓醫生秒懂這個高分是因為「RNA 剪接破壞」還是「染色質關閉」。 |
query_snv.py)寫單點變異查詢器 (SNV Query Client)
打開程式碼編輯器,建立一個 Python 腳本 query_snv.py,寫一段能從「JSON 深海中撈出珍珠」的自動化查詢腳本。假設這正是那顆引發六週大幼兒癲癇的 DNM1 隱藏剪接變異(這裡以一組虛擬座標作為演示):
import os
from dotenv import load_dotenv
import alphagenome as ag
# 載入隱藏設定檔中的憑證
load_dotenv()
def query_and_parse_variant(variant_query):
# 1. 初始化 AlphaGenome 客戶端
client = ag.Client()
print(f"🔍 正在向 1 PB 資料庫查詢基因地址: {variant_query} ...")
try:
# 2. 呼叫 API 獲取該變異的完整註解資料
response = client.get_variant_annotation(variant_query)
# 3. 從 JSON 數據包中抓取三大核心節點
variant_id = response.get('variant_id')
avi_score = response.get('avi_score', {}).get('percentile', 0)
top_drivers = response.get('feature_attribution', {}).get('top_drivers', [])
# 4. 在終端機印出漂亮且直覺的總結報告
print("\n" + "="*45)
print(f"🧬 變異標準地址 : {variant_id}")
print(f"🎯 AVI 風險評分 : {avi_score} / 30 (數值越高代表越罕見且破壞力越強)")
print(f"⚠️ 主要致病機制 (Top Drivers):")
for idx, driver in enumerate(top_drivers, 1):
feature_name = driver.get('feature_name')
contribution = driver.get('contribution_weight')
print(f" {idx}. {feature_name} (機制影響權重: {contribution:.2f})")
print("="*45 + "\n")
except Exception as e:
print(f"❌ 查詢失敗!請檢查輸入格式或網路連線。錯誤訊息: {e}")
if __name__ == "__main__":
# 測試查詢格式:染色體:位置:原始字母:突變字母
test_query = "chr9:13345678:A:G"
query_and_parse_variant(test_query)
當這段腳本被執行,終端機將印出清晰的總結報告。不再需要盯著幾千行的 JSON 看到眼花,系統已經自動把「這顆變異高達 22 分,且高達 85% 的異常信號來自 RNA 剪接破壞」的結論萃取出來了。
接著,繼續往下深挖這個 JSON 物件。如呵將提取出不同組織(如大腦 vs. 血液)的細部預測數值,並且算出突變前後的 「Delta Score (差異信號)」,為繪製動態對比圖做準備!