Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
from OpenAITools.FetchTools import fetch_clinical_trials, fetch_clinical_trials_jp | |
from langchain_openai import ChatOpenAI | |
from langchain_groq import ChatGroq | |
from OpenAITools.CrinicalTrialTools import QuestionModifierEnglish, TumorNameExtractor, SimpleClinicalTrialAgent, GraderAgent | |
# モデルとエージェントの初期化 | |
groq = ChatGroq(model_name="llama3-70b-8192", temperature=0) | |
modifier = QuestionModifierEnglish(groq) | |
extractor = TumorNameExtractor(groq) | |
CriteriaCheckAgent = SimpleClinicalTrialAgent(groq) | |
grader_agent = GraderAgent(groq) | |
# データフレームを生成する関数 | |
def generate_dataframe_from_question(ex_question): | |
modified_question = modifier.modify_question(ex_question) | |
tumor_name = extractor.extract_tumor_name(ex_question) | |
df = fetch_clinical_trials(tumor_name) | |
df['AgentJudgment'] = None | |
df['AgentGrade'] = None | |
NCTIDs = list(df['NCTID']) | |
progress = gr.Progress(track_tqdm=True) | |
for i, nct_id in enumerate(NCTIDs): | |
target_criteria = df.loc[df['NCTID'] == nct_id, 'Eligibility Criteria'].values[0] | |
agent_judgment = CriteriaCheckAgent.evaluate_eligibility(target_criteria, modified_question) | |
agent_grade = grader_agent.evaluate_eligibility(agent_judgment) | |
df.loc[df['NCTID'] == nct_id, 'AgentJudgment'] = agent_judgment | |
df.loc[df['NCTID'] == nct_id, 'AgentGrade'] = agent_grade | |
progress((i + 1) / len(NCTIDs)) | |
columns_order = ['NCTID', 'AgentGrade', 'Title', 'AgentJudgment', 'Japanes Locations', | |
'Primary Completion Date', 'Cancer', 'Summary', 'Eligibility Criteria'] | |
df = df[columns_order] | |
return df, df | |
# AgentGradeが特定の値(yes, no, unclear)の行だけを選択する関数 | |
def filter_rows_by_grade(original_df, grade): | |
df_filtered = original_df[original_df['AgentGrade'] == grade] | |
return df_filtered, df_filtered | |
# フィルタ結果をCSVとして保存しダウンロードする関数 | |
def download_filtered_csv(df): | |
file_path = "filtered_data.csv" | |
df.to_csv(file_path, index=False) | |
return file_path | |
# 全体結果をCSVとして保存しダウンロードする関数 | |
def download_full_csv(df): | |
file_path = "full_data.csv" | |
df.to_csv(file_path, index=False) | |
return file_path | |
# Gradioインターフェースの作成 | |
with gr.Blocks() as demo: | |
gr.Markdown("## 質問を入力して、患者さんが参加可能な臨床治験の情報を収集。参加可能か否かを判断根拠も含めて提示します。結果はcsvとしてダウンロード可能です") | |
question_input = gr.Textbox(label="質問を入力してください", placeholder="例: 65歳男性でBRCA遺伝子の変異がある前立腺癌患者さんが参加できる臨床治験を教えて下さい。") | |
dataframe_output = gr.DataFrame() | |
original_df = gr.State() | |
filtered_df = gr.State() | |
generate_button = gr.Button("日本で行われている患者さんの癌腫の臨床治験を全て取得する") | |
yes_button = gr.Button("AI Agentが患者さんが参加可能であると判断した臨床治験のみを表示") | |
no_button = gr.Button("AI Agentが患者さんが参加不可であると判断した臨床治験のみを表示") | |
unclear_button = gr.Button("AI Agentが与えられた情報だけでは判断不可能とした臨床治験のみを表示") | |
download_filtered_button = gr.Button("フィルタ結果をCSVとしてダウンロード") | |
download_full_button = gr.Button("全体結果をCSVとしてダウンロード") | |
download_filtered_output = gr.File(label="フィルタ結果のCSVダウンロード") | |
download_full_output = gr.File(label="全体結果のCSVダウンロード") | |
generate_button.click(fn=generate_dataframe_from_question, inputs=question_input, outputs=[dataframe_output, original_df]) | |
yes_button.click(fn=filter_rows_by_grade, inputs=[original_df, gr.State("yes")], outputs=[dataframe_output, filtered_df]) | |
no_button.click(fn=filter_rows_by_grade, inputs=[original_df, gr.State("no")], outputs=[dataframe_output, filtered_df]) | |
unclear_button.click(fn=filter_rows_by_grade, inputs=[original_df, gr.State("unclear")], outputs=[dataframe_output, filtered_df]) | |
download_filtered_button.click(fn=download_filtered_csv, inputs=filtered_df, outputs=download_filtered_output) | |
download_full_button.click(fn=download_full_csv, inputs=original_df, outputs=download_full_output) | |
if __name__ == "__main__": | |
demo.launch() | |