PHAROS:4つのエージェント、60秒、1つの医薬品安全性シグナルの見逃しが大惨事に

Elasticsearch Agent Builder ハッカソン

pharos-blog.png

FDAは毎年約200万件の医薬品副作用報告を受けています。製薬会社は、重大な報告を受けてから15暦日以内に安全性シグナルを検出することが法律で義務付けられています。実際には、医薬品安全性監視アナリストは、FDA副作用報告システム(FAERS)、EudraVigilance、電子カルテ(EHR)、ソーシャルメディアなどに散在する文書を手作業で確認しています。検出には数週間から数か月かかり、アナリストは1つのシグナルにつき40時間以上を費やしています。

対応の遅れによる代償は抽象的なものではありません。Merckは、Vioxxの心臓への影響を見逃したことで48億5000万ドルの和解金を支払うこととなりました。たった1つのシグナルを見逃しただけでも1億ドルから10億ドルの罰金が科される可能性があります。しかし、真の代償は、本来警告されるべき薬を服用していたにもかかわらず、誰も迅速に気づけなかった患者たちの存在です。

Prajwal Sutarと申します。独立系開発者として、過去1年間、大規模言語モデル(LLM)ベースのパイプラインを通じて、実際のデータを取り込み、非同期オーケストレーションを行い、マルチエージェントの協調処理に取り組んできました。シグナルの検出、レポートの生成、エスカレーションを1つの自動化されたパイプラインで結びつけられる既存のツールを見つけることができませんでした。そこで、Elasticsearch Agent Builder Hackathonの際に実際に一つ作ってみました。

PHAROSの機能

PHAROS(Pharmacovigilance Autonomous Reasoning and Oversight System)は、FDAのFAERS APIから有害事象レポートを取得し、WHO基準の統計分析を実行して安全性シグナルを見つけ、実際の規制関連書類(MedWatch 3500Aフォーム、PSURセクション、症例ナラティブなど)を作成し、Slack、Jira、電子メールにアラートをプッシュします。

データのインジェストからアラートの送信まで60秒未満で完了します。

エンドツーエンドでの流れは次のとおりです。CARDIVEXという架空の薬剤に関する50件の有害事象報告が届き、いずれも突然の視力喪失が報告されており、その発生地域は日本、韓国、インドに集中しています。これらの報告はインデックス化されます。1分以内に、システムはCARDIVEX/視力喪失の比例報告比(PRR)が18.94であることを検出し、JP/KR/INの地理的クラスターを特定し、MedWatch 3500AフォームとPSURセクションを生成し、#safety-criticalにSlackアラートを送信し、Jira P1チケットを作成し、安全担当者にメールを送信します。すべてのアクションはpharos-audit-logに記録されます。これは、製薬業界では記録がなければ何も起こらなかったことになるためです。

それぞれが異なる役割を持つ4つのエージェントがこれを処理します。

なぜ1つではなく4つのエージェントなのか

それぞれの業務内容が大きく異なるため、一人の担当者では全ての業務を中途半端にこなすことになると考え、システムを分割しました。ボリュームスパイクを監視するスキルは、統計的比率を計算するスキルとは異なり、規制文書を作成するスキルとも異なり、午前2時に誰に連絡を取るかを決めるスキルとも異なります。各エージェントには、特定のタスクと温度設定に合わせて調整されたシステムプロンプトが設定されます。ANALYSTは0.0で実行されます。これは、PRR数値に創意工夫を求めないためです。SCRIBEは制御されたテキスト生成のために0.2で実行します。SENTINELは0.1で実行します。

番人(The sentinel)

SENTINELpharos-adverse-eventsインデックスのボリューム急増を監視します。ES|QLを使用して過去7日間のレポート量を90日間のベースラインと比較します。ある薬剤のレポート量が3倍に急増した場合、SENTINELはElasticワークフローを起動し、ANALYSTを実行します。このCARDIVEXの実行では15倍の急増を検出しました。

アナリスト

ANALYSTは実際の検出が行われる場所です。WHO PRRの計算は薬物-反応ペア全体に対してES|QLで完全に実行され、STATSはカウント、EVALは比率計算、WHEREははしきい値に対応します。次に、BUCKET(report_date, 1 week) で時系列分析を実行し、週ごとのクラスタリング、geo.country_codeでの地理的アグリゲーション、類似の過去シグナルを見つけるためのハイブリッドBM25+高密度ベクトル検索を行います。重大度分類は段階的で、PRR≥5.0かつ5件以上の場合はCRITICAL、PRR≥2.0かつ3件以上の場合はHIGH、1.5を超えるものはすべてMONITORINGの対象となります。確認されたシグナルはpharos-signalsに書き込まれます。

書記(The scribe)

SCRIBEは確認済みのシグナルを検出し、MedWatch 3500A、PSURセクションVI、症例ナラティブの3種類の文書を生成します。有害事象インデックスから最大100件の関連症例レポートを取得し、文書を作成してpharos-regulatory-reportsにインデックス化します。

予告者(The herald)

HERALDはアクションレイヤーです。CRITICALシグナルはSlackアラート(Block Kitフォーマット)、Jira P1チケット、安全担当者と安全担当副社長(VP of Safety)へのメールを受け取ります。HIGHシグナルはSlack、Jira P2、安全担当者へのメールを受け取ります。MONITORINGシグナルは週次ダイジェストに蓄積されます。2時間のエスカレーションタイムアウトにより、CRITICALシグナルが未確認の場合、安全担当副社長(VP of Safety)に再アラートが送信されます。

エージェント間の引き継ぎはすべてElasticワークフローを通じて行われます。合計9つのワークフローがあり、エージェント間の連携、cronスケジュールによる毎晩のFAERSデータの取り込み、Slack/Jira/メールによる配信、監査ログの記録、エスカレーションのタイムアウトなどを網羅しています。

統計をElasticsearch内に保持

PRRの計算をPythonに取り込むのではなく、ES|QL内で行うという意図的な選択をしました。始めるにあたって、統計処理にはpandasが必要になるだろうと想定していましたが、間違いでした。

完全なWHO PRR式、カウント、比率計算、しきい値、時間的バケット化はすべてES|QLクエリとして実行されます。エージェントはES|QLツールを呼び出し、結果に基づいて推論を行い、結果を書き戻します。pandasも外部コンピューティングもデータ転送のボトルネックも発生しません。統計情報はクラスターに合わせてスケールします。

ES|QLは、任意の分析を行うにはpandasほど柔軟ではありません。しかし、WHOの計算式や週ごとのBUCKET集計に関しては、きちんと処理してくれます。中間層のPythonを削除したことで、予想以上にアーキテクチャが簡素化されました。エージェントはクエリと推論だけを行うため、問題が発生する可能性のある箇所が1つ減りました。

機能するインデックス・デザイン

PHAROSは4つのElasticsearch Serverlessインデックスで動作しますが、主要なpharos-adverse-eventsに最も多くの設計時間を費やしました。

ナラティブ検索用のスノーボールステミングを備えたカスタムのclinical_text_analyzer、完全一致の薬物マッチング用のdrug_name_analyzer、ナラティブ埋め込み用のdense_vectorフィールド(1,536次元)、地理的クラスタリング用のgeo_point、リアクション用のnestedマッピングがあります。エージェントが必要とするすべてのクエリ、あいまいなナラティブ検索、完全一致の薬物検索、地理的アグリゲーション、意味的類似性はインデックス設計によってサポートされています。他の3つのインデックスはもっと単純で、pharos-signalsは検出されたシグナルをPRRスコアとアナリストの推論チェーンで格納し、pharos-regulatory-reportsには生成されたレポートが格納され、pharos-audit-logはエージェントのすべてのアクションにタイムスタンプを付けます。

パイプラインを壊しかけた地味な問題

LLMから構造化されたJSONを確実に返させることが想定外の難題となりました。

LLMにJSONを要求すると、3段落の説明に包まれたJSON、マークダウンのコードフェンス内のJSON、または会話の前文に続いてJSONと有用なまとめが返ってきます。エージェントは互いに構造化データを渡し合うため、すべての対応は正しく解析される必要があります。ANALYSTの出力がSCRIBEによって確実に読み取れない場合、シグナル検出の精度がどれほど優れていても意味がありません。

システムプロンプトの調整に多くの時間を費やし、最終的に生のJSON、マークダウンコードフェンス、そして自然言語内に埋め込まれたJSONを処理するJSON抽出関数を書きました。面白い作業ではないですが、マルチエージェントパイプラインが実際に動作するか、それとも単にデモとして見栄えが良いだけかを決定づける類のものです。

まず最初に直したい点

PRRの計算は現在、点推定値に基づいています。実際の医薬品安全性監視システムには、カイ二乗信頼区間とベイズICスコアリングが必要です。データモデルにはすでにic_scoreフィールドが設定されていますが、適切なベイズ計算ではなく近似値を使用しています。時間があれば、まずそこを修正したいところです。

このシステムは、「視界のぼやけ」と「視力喪失」を別々の事象として扱います。次のステップは、MedDRAのオントロジーを意識したリアクションのグループ化です。これにより、システムは、各文字列を独立したものとして扱うのではなく、関連する用語間のシグナルをキャッチできます。その後、大陸間の相関関係を調べるために、FAERSのデータに加えてEudraVigilanceのデータも取得します。

より広い視点

毎年200万件の有害事象レポートが誰かの机に届く中、現時点での解決策はより多くのアナリストがより多くの手動レビューを実行することですが、PHAROSは、WHOの統計データを処理し、必要な書類を作成し、適切な担当者に問題をエスカレーションするエージェントが、アナリストがノートパソコンを開く前にすべてを完了させるという解決策を提示します。

PHAROSはMITのオープンソースです。医薬品安全性監視や薬事規制の分野に関わっており、これを実際のデータで検証してみたいという方がいらっしゃいましたら、ぜひご連絡ください。

Prajwal Sutar

独立系開発者 ,

Prajwal Sutarは、AIシステムと大規模なデータパイプラインに焦点を当てた独立系開発者です。

GitHub ·デモ · LinkedIn

本記事に記述されているあらゆる機能ないし性能のリリースおよびタイミングは、Elasticの単独裁量に委ねられます。現時点で提供されていないあらゆる機能ないし性能は、すみやかに提供されない可能性、または一切の提供が行われない可能性があります。

このブログ記事では、それぞれのオーナーが所有・運用するサードパーティの生成AIツールを使用したり、参照している可能性があります。Elasticはこれらのサードパーティのツールについていかなる権限も持たず、これらのコンテンツ、運用、使用、またはこれらのツールの使用により生じた損失や損害について、一切の責任も義務も負いません。個人情報または秘密/機密情報についてAIツールを使用する場合は、十分に注意してください。提供したあらゆるデータはAIの訓練やその他の目的に使用される可能性があります。提供した情報の安全や機密性が確保される保証はありません。生成AIツールを使用する前に、プライバシー取り扱い方針や利用条件を十分に理解しておく必要があります。

Elastic、Elasticsearch、および関連するマークは、米国およびその他の国におけるElasticsearch B.V.の商標、ロゴ、または登録商標です。他のすべての会社名および製品名は、各所有者の商標、ロゴ、登録商標です。