File size: 4,566 Bytes
6aa59d5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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()