【AI】GPT「PubMed Searcher」のアップデートVer.1.1
PubMed Searcher Ver.1.1バージョンアップ内容■2024年5月18日にPubMedの網羅的検索をChatGPTのユーザーインターフェース上で行えるGPTの作成方法を考案し,公開した.今回はそのアップデートである.
・回答精度をあげるための指示の修正
・論文リストから目的に合った論文に緩く絞り込むスクリーニングプロンプト追加
・Elinkエンドポイントの追加による指示・アクションスキーマの変更(関連論文,引用論文,被引用論文の取得)
【AI】ChatGPTとAPIを使って網羅的なPubMed検索できるGPT「PubMed Searcher」■私が行ったのはGPTの提供ではなく,雛型の提供であり,各自でGPTを作成するぶん,自分で指示やアクションをカスタマイズできる.今回はその私なりのカスタマイズであるマイナーアップデート(Ver.1.1)で,あくまでも「網羅的検索」を想定しているもので,検索結果をむしろ絞りたい方は絞る指示に変えるとよい.
EARLの医学ノート
https://drmagician.exblog.jp/31031028/
今回のアップデートの変更点
■実際に使用してみた方は分かるかもしれないが,GPTは確率的な動作を行う仕様の関係上,どうしても指示通りの回答出力にならないこともある.例えば,検索式が網羅的ではない,検索式に日本語が混じってしまう,ANDとORの使い方を間違う,検索結果が4件以上なら全論文をExcelファイルにまとめる指示なのに最初の20件しかまとめない,ESummeryを使う指示の場面でEfetchを使う,Excelにまとめるべきところで論文リストを回答に羅列する,などが挙げられる.これらの適切でない回答出力を減らすため,GPTの指示を改訂した.
(1)temperatureの指示
■全体を通して回答出力のtemperatureを低めにするよう指示している.これは,GPT自体にtemperatureというパラメーターがあり,このパラメーター値が低いほどブレのない回答になり,高いほど独創性が高い回答となる.ChatGPTやGPTsではこのパラメーターの設定はできない仕様であるが,ChatGPTにパラメーター指示を与えると,そのパラメーター値を模倣する性質をもっている.PubMed Searcherでは独創性は不要で,指示への忠実さが必要となるため,低くするよう指示した.
(2)検索式作成
■検索式を作成する際に日本語が混じることがあったため,日本語を含まないよう指示した.また,薬剤名に関しては,同クラスの一般名,薬理学名や化学名等をすべて含めることとした(例えば,Clinical Questionにステロイドがあっても,グルココルチコイドやプレドニゾロンといった名称が検索式に含まれないことがあった).また,AND,OR,()を適切に使用できていないことがよくあったため,明記した.
(3)検索結果の表示方法選択提示
■GPTが検索(ESearch)を行い,「〇件がヒットしました.」という回答の後に,これまではそのままESummaryでの詳細情報取得に移っていたが,この際に,「4件以上ある場合は表示せずExcelファイルにまとめる」が守られずに表示されていったり,「ヒットした論文をすべてExcelファイルにまとめる」が守られず10件または20件しかファイル化されない,ということも起こっているため,段階を踏んで指示遵守率を上げるため,一旦ESearchによる検索結果でのヒット数を提示し,その後の論文リスト提示方法(ChatGPT上で表示するか,Excelファイル化するか)をユーザーが選択できるようにした.
(4)関連論文,引用論文,被引用論文の取得
■新たにアクションのスキーマにおいて,ELinkのエンドポイントを追加し,特定の論文の関連論文,引用論文,被引用論文の情報も入手できるようにした(同時に指示も追加).ただし,PubMed掲載がかなり新しいものについてはこれらの情報は入手できないことに注意が必要である.
(5)目的に応じた論文リストのスクリーニングプロンプト
■試作段階のものであるが,論文リスト(Excelファイル)を,PICOなどに合致する論文に絞り込むスクリーニングを行うためのコードをプロンプトに追加した.論文リストを提示した上で,タイトルスクリーニングまたはアブストラクトスクリーニングを指示すれば動く.もともとGPTは「選択」というタスクが苦手なため,スクリーニングによる絞り込みはあまり得意ではないが,目的の論文がはじかれないようなプロンプトにしているため,絞り込みとしてはだいぶ緩めである.
■改訂したGPT指示(Instructions)は以下の通りである.GPTの指示の部分にコピペでOK.
This GPT will assist the user in retrieving literature information from PubMed.■追加改訂したアクションのスキーマは以下の通りである.「新しいアクション」ではなく,作成済みの「eutils.ncbi.nlm.nih.gov」を選択し,既に入力済みのスキーマの下に以下をコピペでOK.なお,「Your NCBI API key」と赤字で書かれた部分はAPIキーに置き換える.
It should be able to search PubMed using a specific query provided by the user and return relevant article information GPT should leverage NCBI account details and API keys to access PubMed data.
temperature:
Keep the temperature parameter low when outputting responses.
response_to_clinical_question:
steps:
- Extract as many all relevant terms (synonym or quasi-synonym) as possible from the Clinical Question provided by the user according to the following rules.
- Terms to be included in the search formula should not be in Japanese.
- When the pharmacological or chemical class name of a drug is specified, include the pharmacological, chemical, or generic name of the drug.
- Create your search query according to the following rules.
- Enclose terms in double quotation marks.
- Use "AND", "OR", "()" operators for tech theory.
For example, in a search formula to find studies of drug X for septic DIC in adults, for the part corresponding to Participants, instead of (“adults” OR “sepsis” OR “DIC”), use ((“term 1 for adults” OR “term 2 for adults” OR...) AND (“term 1 for sepsis” OR “term 2 for sepsis” OR...) AND (“term 1 for DIC” OR “term 2 for DIC” OR...) (OR...) AND (“term 1 for DIC” OR “term 2 for DIC” OR...))
- Ensure the search query is highly sensitive but not highly specific.
- Ask the user for confirmation before performing the search.
search_results:
- Indicate the number of search results and ask the user if he/she would like to compile the list of papers into an Excel file or output them in a table in the GPT response before proceeding to the next ESummary step.
- At this point you should not output detailed paper information without permission.
esummary_step:
- Obtain article information with ESummary.
- If the user wishes to view the results on ChatGPT, a table with the PMID, article title of all results will be presented.
- If the user wishes to compile all results into an Excel file, do not display article details in the response.
excel_file:
- Include all articles in the Excel file without setting a limit on the number of articles.
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 you need information on abstracts, authors or doi.
elink:
usage: Use ELink and ESummery when you need information of similar papers, referenced papers or cited reference papers.
title_or_abstract_screening:
If you are instructed to screen a list of papers, the following algorithm is used.
import pandas as pd
# Read the input file
input_file = "path_to_input_excel_file.xlsx"
df = pd.read_excel(input_file)
# Extraction criteria (example with specified P, I, S)
P = "specified Population"
I = "specified Intervention"
S = "RCT" # Change if a different Study Design is specified
# Exclusion criteria (if S is RCT)
exclude_terms = ["retrospective", "cohort study", "review", "meta analysis", "cross sectional", "observational study"]
# Paper extraction function
def extract_relevant_papers(df, P, I, S=None):
extracted_df = df[df['Paper Title'].str.contains(P, case=False) & df['Paper Title'].str.contains(I, case=False)]
if S:
if S == "RCT":
for term in exclude_terms:
extracted_df = extracted_df[~extracted_df['Paper Title'].str.contains(term, case=False)]
else:
extracted_df = extracted_df[extracted_df['Paper Title'].str.contains(S, case=False)]
return extracted_df
extracted_df = extract_relevant_papers(df, P, I, S)
# Save the output file
output_file = "path_to_output_excel_file.xlsx"
extracted_df.to_excel(output_file, index=False)
print(f"The extracted list of papers has been saved to {output_file}.")
/elink.fcgi/similar:
get:
operationId: fetchSimilarArticles
summary: Fetches similar articles for a specified UID.
parameters:
- name: dbfrom
in: query
required: true
schema:
type: string
example: pubmed
description: The originating database (e.g., pubmed).
- name: db
in: query
required: true
schema:
type: string
example: pubmed
description: The database to link to (e.g., pubmed).
- name: id
in: query
required: true
schema:
type: string
description: A comma-separated list of UIDs of the articles.
- name: cmd
in: query
required: true
schema:
type: string
example: neighbor
description: Command to run (e.g., neighbor).
- name: api_key
in: query
required: true
schema:
type: string
description: Your NCBI API key.
responses:
'200':
description: Similar articles information
content:
application/json:
schema:
type: object
properties:
linksets:
type: array
items:
type: object
properties:
dbfrom:
type: string
linksetdbs:
type: array
items:
type: object
properties:
dbto:
type: string
linkname:
type: string
links:
type: array
items:
type: string
/elink.fcgi/references:
get:
operationId: fetchReferences
summary: Fetches references for a specified UID.
parameters:
- name: dbfrom
in: query
required: true
schema:
type: string
example: pubmed
description: The originating database (e.g., pubmed).
- name: linkname
in: query
required: true
schema:
type: string
example: pubmed_pubmed_refs
description: The name of the link (e.g., pubmed_pubmed_refs).
- name: id
in: query
required: true
schema:
type: string
description: A comma-separated list of UIDs of the articles.
- name: api_key
in: query
required: true
schema:
type: string
description: Your NCBI API key.
responses:
'200':
description: References information
content:
application/json:
schema:
type: object
properties:
linksets:
type: array
items:
type: object
properties:
dbfrom:
type: string
linksetdbs:
type: array
items:
type: object
properties:
dbto:
type: string
linkname:
type: string
links:
type: array
items:
type: string
/elink.fcgi/citedby:
get:
operationId: fetchCitedBy
summary: Fetches cited references for a specified UID.
parameters:
- name: dbfrom
in: query
required: true
schema:
type: string
example: pubmed
description: The originating database (e.g., pubmed).
- name: linkname
in: query
required: true
schema:
type: string
example: pubmed_pubmed_citedin
description: The name of the link (e.g., pubmed_pubmed_citedin).
- name: id
in: query
required: true
schema:
type: string
description: A comma-separated list of UIDs of the articles.
- name: api_key
in: query
required: true
schema:
type: string
description: Your NCBI API key.
responses:
'200':
description: Cited references information
content:
application/json:
schema:
type: object
properties:
linksets:
type: array
items:
type: object
properties:
dbfrom:
type: string
linksetdbs:
type: array
items:
type: object
properties:
dbto:
type: string
linkname:
type: string
links:
type: array
items:
type: string