実装ハンズオン

【n8n】ClinicalTrials.govの治験情報を自然言語で取得するAIワークフロー Part1:症例に関連する治験10件を要約して返す

更新:

連載シリーズ

ClinicalTrials.gov 治験情報を自然言語で取得するAIワークフロー

全4回・n8n × ClinicalTrials.gov API・Slackで聞いてCSVで受け取る

  1. 概要:背景とAPIの基礎
  2. API検索とデータ整形
  3. 検索条件の抽出と要約生成
  4. CSV生成とSlack返信

目次

ワークフローの全体イメージ

検索 結果 UI
Part 1 自然言語からAPI検索を実施して要約 単語での検索 要約 Slack
Part 2 自然言語からAPI検索を行い、生成AIが要約まで実施 文章での検索 要約 Slack
Part 3 検索結果の一覧からcsvファイルと要約を生成する 文章での検索 要約 + csvファイル Slack

Part1. 打ち込んだ症例に関連する治験情報10件分を要約して返す

STAGE1. 打ち込んだ症例に関連する治験情報10件分を要約して返す

入力と回答のゴールイメージ

Part1で目指すゴールは「単語で検索」して「単語に紐づく症例の論文を検索する」までです。

文章での検索や論文リスト(csv)の作成はPart2以降で解説します。

Slack上での質問 得られる回答のイメージ
@ボットのメンション diabetes ご質問ありがとうございます。「糖尿病」に関連するClinicalTrials.govに登録されている臨床試験について、取得したデータに基づいてご説明いたします。提供されたデータによると、糖尿病に関連する様々な側面(診断、治療、合併症など)を対象とした複数の試験が実施されていることがわかります。これらには、観察研究と介入研究の両方が含まれており、中には既に完了したものや、これから参加者募集を開始する予定の試験もあります。
以下に、抽出された疾患名や条件をもとに、具体的な試験内容を要約してご紹介します。
### 1. 糖尿病性心血管合併症に関する研究
Diabetic Cardiovascular Complications: Multi-Omics Analysis
(ID: NCT06824233)
概要: 糖尿病患者における心血管合併症について、マルチオミクス解析を用いて研究する観察研究です。糖尿病が心血管系に与える影響を多角的に解析することを目指しています。
ステータス: 2025年3月1日から募集開始予定
(NOT_YET_RECRUITING)です。
詳細https://clinicaltrials.gov/study/NCT06824233
Genetic Markers of Coronary Heart Disease in Type 2
…(中略)
### まとめ
現在、ClinicalTrials.govには、糖尿病の診断、様々な合併症(心血管疾患、足潰瘍、網膜症、神経障害など)の治療法開発、特定の糖尿病タイプ(1型、2型、前糖尿病)への介入、および血糖モニタリング技術の評価など、多岐にわたる研究が登録されています。ほとんどの試験は既に完了していますが、「Diabetic Cardiovascular Complications: Multi-Omics Analysis (ID: NCT06824233)」は2025年3月から募集開始予定です。
これらの情報が、糖尿病に関する臨床試験の理解の一助となれば幸いです。

<ワークフローの流れ>

  1. Slack Trigger: Slackへのメンションをトリガーにワークフローを開始。
  2. HTTP Request: Slackから受け取った疾患名でClinicalTrials.gov APIを検索。
  3. Code in JavaScript: 取得した臨床試験データを整形し、AI向けに要約。
  4. Message a model: Geminiモデルが要約されたデータとユーザーの質問に基づき回答を生成。
  5. Send a message: 生成された回答をSlackに返信。

1. Slack Triggerノードでワークフロー起動

Slack Triggerノードでワークフロー起動
Slack Trigger

このノードは、ワークフローの起点となる部分です。

設定項目 役割
Trigger On Bot / App Mention Slack上でこのn8nボットにメンションがあったときにワークフローを起動します。
Watch Whole Workspace true(スライダーを緑にしておく) このスイッチをONにしておくことで、どのSlackチャンネルでボットをメンションしてもn8nのワークフローが動く様になります。
  • 役割: Slack上にインストールされたn8nボットアカウントに対してメンションを行うことで、ワークフローを起動します。
  • 期待するメッセージ形式:
@ボットのアカウント名
diabetes
  • 注意点:
    • メンションの後、必ず改行を入れてから検索したい疾患名(条件)を入力してください。
    • ClinicalTrials.govの検索条件となるため、症例・条件は英語で入力する必要があります。
      • Part2以降は、日本語で検索可能となります。

2. HTTP RequestノードでAPIを検索

HTTP RequestノードでAPIを検索
HTTP Requestノード

Slackから受け取った疾患名を使い、「ClinicalTrials.gov」のAPIを呼び出し、臨床試験データを取得します。

設定項目 役割
URL https://clinicaltrials.gov/api/v2/studies ClinicalTrials.govのAPIエンドポイントです。
Send Query true クエリパラメータを付けてリクエストを送信します。
Query Parameters 2つのパラメータを設定

◆クエリパラメータの詳細

Name Value 役割
query.cond ={{$json.text.split(‘\n’)[1] }} 検索条件となる疾患名(Conditions)を指定します。Slack Triggerノードから渡されたメッセージ( $json.text )を改行文字( \n )で分 割し、2番目の要素(インデックス [1] 、つまり改行以降の文字)を抽出して検索クエリとします。
pageSize 10 取得する試験結果の数を10件に制限します。
  •  役割: Slackで入力された疾患名(例: diabetes )をAPIの検索クエリに変換し、最新の臨床試験データをJSON形式で取得します。
  • ポイント: ここで、前述のSlackメッセージ形式の注意点(改行と2行目に条件)が活かされています。

3. Code in JavaScriptノードでデータを整形

Code in JavaScriptノードでデータを整形

以下はコードブロックにてJavascriptを使っていますが、ワークフローの稼働を優先したい方はコードをそのままコピー&ペーストしてください。

Code in JavaScriptノード

HTTP Requestノードで取得した生データを、AIが処理しやすいように、また最終的な回答に含めるために必要な情報だけを抽出・整形します。

const studies = $input.all()[0].json.studies;
const textSummary = studies.map(study ⇒ {
const idMod  = study.protocolSection.identificationModule;
const status = study.protocolSection.statusModule;
const condMod = study.protocolSection.conditionsModule;
const design = study.protocolSection.designModule;

return `
▼ ${idMod.briefTitle}
ID: ${idMod.nctId}
Status: ${status.overallStatus} / Type: ${design.studyType} / Phase: ${(design.phases || []).join('|')}
Conditions: ${(condMod.conditions || []).join('|')}
Enrollment: ${design.enrollmentInfo.count}
Dates: ${status.startDateStruct.date} 〜 ${status.completionDateStruct.date}
URL: https://clinicaltrials.gov/study/${idMod.nctId}
`.trim();
}).join('\n\n');

return [{json: {summary: textSummary}}];
  • 役割: APIから返された複数の試験データ( studies )をループ処理し、各試験のタイトル、ID、ステータス、フェーズ、条件、登録者数、期間、URLなどの主要情報を抽出し、読みやすいテキスト形式に結合します。
  • 出力形式:

▼ [試験のタイトル]
ID: [NCT ID]
Status: [全体ステータス] / Type: [研究タイプ] / Phase: [フェーズ]
Conditions: [条件1|条件2…]
Enrollment: [登録者数]
Dates: [開始日] 〜 [完了予定日]
URL: https://clinicaltrials.gov/study/\[NCT ID]


… (次の試験データへ続く)

  • 格納先: 整形されたテキストは、 summary というキーを持つJSONオブジェクトとして次のノードに渡されます。

4.  Message a modelノードでAIが回答を生成

Message a modelノードでAIが回答を生成
Message a modelノード

整形された臨床試験データとユーザーの元の質問に基づき、Google Geminiモデルが専門家として回答文を生成します。

設定項目 役割
Model ID models/gemini-2.5-flash 使用するAIモデルを指定します。
Messages 2つのプロンプトを設定 AIへの指示と入力データを渡します。

◆ プロンプト(AIへの指示とデータ)の詳細

  1. システムプロンプト (役割と指示):
#Role
あなたは医療・臨床試験の専門家です。

#Instruction
これからユーザーの質問内容とClinicalTrials.gov APIから取得した試験データを渡します。
ユーザーの疑問やニーズに対して、取得したデータを根拠に、分かりやすく丁寧に答えてください。
回答では、抽出された疾患名や条件をもとにClinicalTrials.govの試験内容を要約し、質問に沿って解説してくださ
い。
与えられた情報以外の情報は絶対に含めないでください。専門家として確実に正しい根拠のある情報のみを提出してください。
仮に、与えられたデータで回答することが困難な場合は、ユーザーに別の質問方法を促してください。
文章は必ず日本語で生成してください。
治験のタイトルなども示しながら、どのような治験が存在するかを説明してください。

AIに医療・臨床試験の専門家としての役割を与え、与えられたデータのみに基づき、分かりやすく根拠のある回答を生成するように厳しく指示しています。

  1. ユーザープロンプト (入力データ):
#input_data
$('Code in JavaScript').item.json.summary }}

URLを使って根拠を示す場合は以下を用いる
(#input_data内に示されたnctIdとURL接尾辞のIDが対応しているため、
根拠を示す場合は必ずこの対応関係を用いる。誤った根拠の提供は決しておこなわない)

#user_query
$('Slack Trigger').item.json.text.split('\n')[1]}}
  • #input_data : 前のノードで整形された臨床試験の要約テキストを渡します。
  • #user_query : Slack Triggerから受け取った元のメッセージから、ボットのメンション部分
    • split(ʼ\nʼ) で改行を起点に単語を分割し、2つ目の要素を取得
  • 役割: AIが専門的な知識と具体的なデータ(ClinicalTrials.govの結果)を組み合わせて、ユーザーの質問に対する質の高い回答を生成します。

5. Send a messageノードでSlackに返信

Send a messageノードでSlackに返信
Send a messageノード

AIが生成した回答を、元のメッセージが投稿されたチャンネルとスレッドに返信します。

設定項目 役割
Send Message To Channel 投稿先としてチャンネルを指定します。
Channel By ID ={{$(‘SlackTrigger’).item.json.channel }} 元のメッセージが投稿されたチャンネルのIDを取得し、返信先とします。
Message Text ={{$json.content.parts[0].text }} AIノード(Message a model)で生成された回答テキストを取得します。
Reply To a Message ={{$(‘Slack Trigger’).item.json.ts }} まずは、画面下部にあるAdd Optionから「Reply To a Message」を追加します。
その後、一番最初のメッセージのタイムスタンプ( ts )を取得し、スレッドへの返信として投稿します。
  • 役割: AIによって生成された最終回答を、ユーザーがメンションしたSlackチャンネル内の元のメッセージのスレッドに投稿し、会話を完結させます。

ここまで作成すると、Slackから単語で検索するだけでClinicalTrials.govで治験情報の検索を行う簡単なワークフローが完成します。

Part2では「文章でボットに質問をするだけで、文章からパラメータを抽出して治験情報を検索する」ワークフローについて解説します

連載シリーズ

ClinicalTrials.gov 治験情報を自然言語で取得するAIワークフロー

全4回・n8n × ClinicalTrials.gov API・Slackで聞いてCSVで受け取る

  1. 概要:背景とAPIの基礎
  2. API検索とデータ整形
  3. 検索条件の抽出と要約生成
  4. CSV生成とSlack返信