【AI】ChatGPTとAPIを使って網羅的なPubMed検索できるGPT「PubMed Searcher」
■ChatGPTにはBingを用いたウェブアクセス機能が備わっているが,ChatGPTで論文検索を行う上では特定の論文検索エンジンを使用することをプロンプトで指示した方がよい.しかしながら,ChatGPTはPubMedのサイトをうまく読み込めず,以下のようなトラブルが発生しやすい.
・PubMed検索結果を読み込めずハルシネーションを起こす(偽の結果を表示する)■このようなことが起こるのは以下のことが原因である.
・論文Abstractのページをうまく読み込めない
・論文検索結果で表示された1ページ分しか読み込めない
(1)動的コンテンツ
■PubMedのウェブサイトは動的にコンテンツを生成することが多く,JavaScriptを使用して情報を表示する.これにより,ウェブスクレイピングツールが正確に情報を取得するのが難しくなる.
(2)ページ構造の複雑さ
■PubMedのウェブページの構造が複雑であり,多くのリンクやデータベースクエリが絡み合っている.このため,特定の情報を正確に抽出するのが難しい場合がある.
(3)制限や防御策
■PubMedは自動化されたツールによる過度なアクセスを防ぐための制限や防御策を持っているため,情報取得が制限されることがある.
■そこで,PubMedのサイトにアクセスするのではなく,API経由で情報を取得するようにすればこのようなトラブルを回避することができる.以下では,API経由でPubMed検索結果を取得するGPT「PubMed Searcher」を筆者が作ったので紹介する.
1.GPT「PubMed Searcher」の仕組み
■ChatGPTの有料ユーザー(Plus会員:月$20のサブスクリプション)は,自分専用のbotであるGPTを作成することができる.このGPTでPubMed Searcherを作成する(個別にAPIキーが必要となるため,他者には公開せず自分のみの使用となる).また,PubMedはAPIを無料公開している(厳密にはNCBIが提供するEntrezのAPIのデータベースを選択するパラメータとしてPubMedを指定できる).APIはApplication Programming Interfaceの略で,ソフトウェア同士が通信するためのインターフェースであり,いわゆる「情報をやりとりするための鍵」である.このAPIを用いてPubMedのデータベースにChatGPTが直接アクセスして論文情報を引っ張ってくることができる.
■PubMedのAPIはNCBIにアカウントを作成した上で,自分だけのAPIキーを入手する必要がある.つまり,このGPTを作成しても他人が使用することは避けなければならず,自分だけが使用するものである.このため,作成したPubMed SearcherがGPT storeに置かれているわけではなく,各自で作成しなければならない.といっても,筆者が作成した以下の手順通りやれば作成できるので,さほど難しくはなく,スマホからも作成可能である.
2.GPT「PubMed Searcher」を作成する手順
(1)ncbiのアカウントを作成する
■まず,以下のURLにアクセスし,ncbiのアカウントを作成する.
https://www.ncbi.nlm.nih.gov/account/(2)APIキーを取得する
■アカウントを取得したら,以下のアカウント設定ページにアクセスし,一番下にあるAPI Key ManagementにあるAPIキーを取得する.このAPIキーは自分だけのものなので他人に公開しないこと.
https://www.ncbi.nlm.nih.gov/account/settings/(3)GPTを作成する
■ウェブ版のChatGPTにアクセスし,左側のバーから「GPTを探す(GPT explore)」をクリックし,右上の「+作成する」をクリックするとGPT builderが立ち上がる.一番上のバーで真ん中の「構成」を選択し,以下のように設定する.
・アイコン画像:好きな画像を設定できる.DALL-E3に頼んで画像生成してもらうことも可能
・名前:好きな名前に設定する(例:PubMed Researcher)
・説明:GPTを開いた時に表示される短い説明文.好きな説明文を入れる(例:PubMedでの網羅的検索を目的としたGPTです)
・指示:以下をコピペする(構造化された情報を提供する必要がある部分について,精度を高めるためにYAMLを使用した指示となっている).
このGPTはPubMedから文献情報を検索することでユーザーを支援します。ユーザーが提供する特定のクエリを使ってPubMedを検索し、関連する論文情報を返すことができなければなりません。GPTはPubMedデータへのアクセスにNCBIのアカウント詳細とAPIキーを活用してください。・会話の開始者:特に設定は不要
Clinical Questionへの対応:
```yaml
clinical_question:
steps:
- Extract as many all relevant terms (synonym or quasi-synonym) as possible from the Clinical Question provided by the user.
- Create a PubMed search query using these terms, enclosed in double quotes.
- Ensure the search query is highly sensitive but not highly specific.
- Ask the user for confirmation before performing the search.
search_results:
steps:
- Indicate the number of results found.
- If ESearch results exceed 3, do not display article details in the response.
- Use ESummary to compile all results into an Excel file.
- Include all articles in the Excel file without setting a limit on the number of articles.
excel_file:
columns:
- PMID
- URL: Create a hyperlink to the article's PubMed page in the format https://pubmed.ncbi.nlm.nih.gov/PMID/
- Title
upload:
steps:
- Verify that the number of articles in the file matches the number of search results.
- Ensure each article includes all required information.
- Redo the process if any information is missing.
efetch:
usage: Use EFetch only when abstract information is needed.
・知識:特に設定は不要
・機能:「ウェブ参照」と「コードインタープリター」にチェックを入れる
・アクション:「新しいアクションを作成する」をクリックし,「スキーマ」に以下をコピペする
openapi: 3.0.0・コピペしたスキーマには「Your NCBI API Key.」と書かれている部分(上のボックス内で赤字で示している部分)が3か所あるので,その部分を取得したAPIキーに置き換える
info:
title: PubMed API
description: API to search and retrieve literature from PubMed using esearch, esummary, and efetch endpoints.
version: 1.0.0
servers:
- url: https://eutils.ncbi.nlm.nih.gov/entrez/eutils
description: NCBI E-utilities server
paths:
/esearch.fcgi:
get:
operationId: searchLiterature
summary: Searches for literature in PubMed.
parameters:
- name: db
in: query
required: true
schema:
type: string
description: The database to search (e.g., pubmed).
- name: term
in: query
required: true
schema:
type: string
description: The search term(s).
- name: retmax
in: query
required: false
schema:
type: integer
description: The maximum number of results to return.
- name: retmode
in: query
required: false
schema:
type: string
description: The return mode (e.g., xml, json).
- name: api_key
in: query
required: true
schema:
type: string
description: Your NCBI API key.
responses:
'200':
description: Search results
content:
application/json:
schema:
type: object
properties:
count:
type: integer
retmax:
type: integer
retstart:
type: integer
ids:
type: array
items:
type: string
/esummary.fcgi:
get:
operationId: getSummary
summary: Retrieves the summary of literature based on search results.
parameters:
- name: db
in: query
required: true
schema:
type: string
description: The database to search (e.g., pubmed).
- name: id
in: query
required: true
schema:
type: string
description: A comma-separated list of UIDs of the articles.
- name: retmode
in: query
required: false
schema:
type: string
description: The return mode (e.g., xml, json).
- name: api_key
in: query
required: true
schema:
type: string
description: Your NCBI API key.
responses:
'200':
description: Summary details of the search results
content:
application/json:
schema:
type: object
properties:
uid:
type: string
title:
type: string
source:
type: string
pubdate:
type: string
authors:
type: array
items:
type: string
volume:
type: string
issue:
type: string
pages:
type: string
doi:
type: string
/efetch.fcgi:
get:
operationId: fetchDetails
summary: Fetches the details including abstracts for specified UIDs.
parameters:
- name: db
in: query
required: true
schema:
type: string
description: The database to search (e.g., pubmed).
- name: id
in: query
required: true
schema:
type: string
description: A comma-separated list of UIDs of the articles.
- name: rettype
in: query
required: false
schema:
type: string
description: The return type (e.g., abstract).
- name: retmode
in: query
required: false
schema:
type: string
description: The return mode (e.g., xml, text).
- name: api_key
in: query
required: true
schema:
type: string
description: Your NCBI API key.
responses:
'200':
description: Detailed information including abstracts
content:
text/plain:
schema:
type: string
・追加設定:設定は不要
・右上の「更新する」を押す.公開範囲は「自分のみ」とする.
3.GPT「PubMed Researcher」でできること
■このGPTでは上記のベースの指示により以下のことが可能である.
(1)Clinical Questionに応じたPubMed検索式の生成
■Clinical Question(その他の質問でもよいが)を質問すると,その質問に応じて網羅的なPubMed検索式を生成する.網羅的検索ができるように設定しているため,各用語についてできるだけ多くの同義語を検索式に加えるようにしており,感度が高く,特異度が低い検索式となっている.回答の最後に「この検索式でPubMed検索していいか?」と聞かれるので,修正が必要であればそこで修正内容を伝える.
■PubMed検索を指示すると,GPTはまずAPIキーを使ってESearchで検索結果としてヒットした論文のPMIDを取得する.これにより論文のヒット数とPMIDが入手される.この際,「〇件の論文がヒットした」と回答される.このPMIDをもとに,各論文のより詳しい内容をESummaryやEFetchで取得することができる.
■ESummaryは論文タイトル,論文が掲載されているジャーナル・年・巻号・頁の情報を取得できる.このESummaryを使って,(2)でESearchから得た論文のPMIDから論文情報を取得する.ただし,網羅的検索ではかなりの論文数がヒットされる可能性があるため,GPTの回答出力の限界もあることから,論文数が4件以上の場合はAdvanced Data Analysis(旧Code Interpreter)を使って自動的にExcelファイルにまとめるよう設定されている(この件数を変更したい場合は,GPT編集で指示を変更する).Excelファイルに提示される情報は,PMID,PubMedでのその論文Abstractへのリンク,論文タイトルの3つである(ジャーナル名等まで入れると処理しきれずタイムアウトしてしまう).また,ChatGPTの処理の限界から,取得できる論文情報は多くとも200件程度までと考えた方がよい.これ以下に論文数をおさえるなら検索式の特異度を高める必要がある.
(4)EFetchを用いた論文Abstractの取得
■EFetchは論文Abstractやdoiも含めたより詳細な論文の情報を取得することができる.これにより,ダイレクトにAbstractの内容をGPTに解説してもらったりすることも可能である.