人気ブログランキング | 話題のタグを見る
ブログトップ

EARLの医学ノート

drmagician.exblog.jp

敗血症をメインとした集中治療,感染症,呼吸器のノート.医療におけるAIについても

【AI】ChatGPTとAPIを使って網羅的なPubMed検索できるGPT「PubMed Searcher」

■論文検索が可能なAIには,Consensus,Elicit,Perplexityなどがあり便利ではあるが,当然ながら完璧ではなく(漏れがでる),手動でのPubMed検索が一番網羅的で精度が高いことは変わらない.そこでPubMedというデータベースとその検索機能をChatGPTがダイレクトに操作してくれれば手動の精度を維持したまま網羅的検索を簡便に行える上に,その検索結果のファイル化,論文抽出,解説までChatGPTのユーザーインターフェース上で行うことができる

■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
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
・コピペしたスキーマには「Your NCBI API Key.」と書かれている部分(上のボックス内で赤字で示している部分)が3か所あるので,その部分を取得したAPIキーに置き換える
追加設定:設定は不要
・右上の「更新する」を押す.公開範囲は「自分のみ」とする.

3.GPT「PubMed Researcher」でできること

■このGPTでは上記のベースの指示により以下のことが可能である.

(1)Clinical Questionに応じたPubMed検索式の生成
Clinical Question(その他の質問でもよいが)を質問すると,その質問に応じて網羅的なPubMed検索式を生成する.網羅的検索ができるように設定しているため,各用語についてできるだけ多くの同義語を検索式に加えるようにしており,感度が高く,特異度が低い検索式となっている.回答の最後に「この検索式でPubMed検索していいか?」と聞かれるので,修正が必要であればそこで修正内容を伝える.
【AI】ChatGPTとAPIを使って網羅的なPubMed検索できるGPT「PubMed Searcher」_e0255123_12375758.png
(2)ESearchを用いた検索
■PubMed検索を指示すると,GPTはまずAPIキーを使ってESearchで検索結果としてヒットした論文のPMIDを取得する.これにより論文のヒット数とPMIDが入手される.この際,「〇件の論文がヒットした」と回答される.このPMIDをもとに,各論文のより詳しい内容をESummaryやEFetchで取得することができる.
【AI】ChatGPTとAPIを使って網羅的なPubMed検索できるGPT「PubMed Searcher」_e0255123_12382730.png
(3)ESummaryを用いた論文情報取得
■ESummaryは論文タイトル,論文が掲載されているジャーナル・年・巻号・頁の情報を取得できる.このESummaryを使って,(2)でESearchから得た論文のPMIDから論文情報を取得する.ただし,網羅的検索ではかなりの論文数がヒットされる可能性があるため,GPTの回答出力の限界もあることから,論文数が4件以上の場合はAdvanced Data Analysis(旧Code Interpreter)を使って自動的にExcelファイルにまとめるよう設定されている(この件数を変更したい場合は,GPT編集で指示を変更する).Excelファイルに提示される情報は,PMID,PubMedでのその論文Abstractへのリンク,論文タイトルの3つである(ジャーナル名等まで入れると処理しきれずタイムアウトしてしまう).また,ChatGPTの処理の限界から,取得できる論文情報は多くとも200件程度までと考えた方がよい.これ以下に論文数をおさえるなら検索式の特異度を高める必要がある.
【AI】ChatGPTとAPIを使って網羅的なPubMed検索できるGPT「PubMed Searcher」_e0255123_12385102.png
■応用として,GPTに指示して,このExcelファイルから自分の目的にあった論文タイトルの論文だけを抽出して再度ファイル化してもらうことも可能である(ただし,ChatGPTは「選択」というタスクが苦手であり,その抽出精度は感度が高く特異度が低めである).

(4)EFetchを用いた論文Abstractの取得
■EFetchは論文Abstractやdoiも含めたより詳細な論文の情報を取得することができる.これにより,ダイレクトにAbstractの内容をGPTに解説してもらったりすることも可能である.
【AI】ChatGPTとAPIを使って網羅的なPubMed検索できるGPT「PubMed Searcher」_e0255123_12430125.png

by DrMagicianEARL | 2024-05-18 12:44 | 医学・医療とAI

by DrMagicianEARL