import gradio as gr import pandas as pd import itertools import tempfile import os import requests from chatgpt_api import get_chatgpt_response def process_csv(csv_file): # CSVファイルを読み込む df = pd.read_csv(csv_file.name) # 新しいDataFrameを作成 new_df = pd.DataFrame(columns=['ID', 'prompt', 'quantity', 'output']) # 変数の配列からすべての組み合わせを生成し、新しいpromptを作成 for index, row in df.iterrows(): # 変数の値をリストとして取得、数値の場合は文字列に変換 variables_lists = [ str(row[f'変数{i}(var{i})']).split(',') if pd.notna(row[f'変数{i}(var{i})']) else [''] for i in range(1, 6) ] # 数値を含む可能性のある列の値を文字列に変換 variables_lists = [[str(value).strip() for value in values] for values in variables_lists] # 変数の配列からすべての組み合わせを生成 variables_combinations = list(itertools.product(*variables_lists)) for combination in variables_combinations: # プロンプトテンプレートに変数の値を埋め込む formatted_prompt = row['プロンプト'].format(var1=combination[0], var2=combination[1], var3=combination[2], var4=combination[3], var5=combination[4]) new_prompt = "以下の要件で問題を作ってください。" + formatted_prompt # 新しい行をDataFrameに追加 new_row = pd.DataFrame([{ 'ID': row['ID'], 'prompt': new_prompt, 'quantity': row['作成問題数'], 'output': '' }], columns=['ID', 'prompt', 'quantity', 'output']) new_df = pd.concat([new_df, new_row], ignore_index=True) # 新しいDataFrameのprompt列をChatGPTに送信し、応答をoutput列に保存 new_df['output'] = new_df['prompt'].apply(get_chatgpt_response) with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as tmp: new_df.to_csv(tmp.name, index=False) output_path = tmp.name # ファイル名を変更 new_path = os.path.join(os.path.dirname(output_path), "output.csv") os.rename(output_path, new_path) return new_path def create_choice_question(csv_file): # CSVファイルを読み込む df = pd.read_csv(csv_file.name) # プロンプトを作成 prompt_df = pd.DataFrame(columns=['ステージ', 'レベル', 'カテゴリ', '問題形式','複製パターン','テーマ','prompt','quantity']) # dfを反復処理 for index, row in df.iterrows(): # 'カテゴリ'カラムの文字列をリストに変換 try: themes = ast.literal_eval(row['カテゴリ']) except ValueError: # ast.literal_evalに失敗した場合(例: 空の文字列、不正な形式など) themes = [] for theme in themes: # プロンプトとカテゴリを組み合わせて新しいpromptを作成 new_prompt = "以下の形式の英語のリスニング問題を"+row["問題数"]+"問、作成して。各問題は、[問題1][問題2]という形式で始めて。ただし、スクリプトの内容は、"+theme+"に関するスクリプトにして。" # prompt_dfに新しい行を追加 new_row = { 'ステージ': row['ステージ'], 'レベル': row['レベル'], 'カテゴリ': row['カテゴリ'], '問題形式': row['問題形式'], '複製パターン': row['複製パターン'], 'テーマ': theme, 'prompt': new_prompt, # 新しいプロンプト 'quantity': row['問題数'] } prompt_df = pd.concat([prompt_df,new_row],ignore_index=True) with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as tmp: prompt_df.to_csv(tmp.name, index=False) output_path = tmp.name # ファイル名を変更 new_path = os.path.join(os.path.dirname(output_path), "output.csv") os.rename(output_path, new_path) return new_path # 変数の配列からすべての組み合わせを生成し、新しいpromptを作成 for index, row in df.iterrows(): # 変数の値をリストとして取得、数値の場合は文字列に変換 variables_lists = [ str(row[f'変数{i}(var{i})']).split(',') if pd.notna(row[f'変数{i}(var{i})']) else [''] for i in range(1, 6) ] # 数値を含む可能性のある列の値を文字列に変換 variables_lists = [[str(value).strip() for value in values] for values in variables_lists] # 変数の配列からすべての組み合わせを生成 variables_combinations = list(itertools.product(*variables_lists)) for combination in variables_combinations: # プロンプトテンプレートに変数の値を埋め込む formatted_prompt = row['プロンプト'].format(var1=combination[0], var2=combination[1], var3=combination[2], var4=combination[3], var5=combination[4]) new_prompt = "以下の要件で問題を作ってください。" + formatted_prompt # 新しい行をDataFrameに追加 new_row = pd.DataFrame([{ 'ID': row['ID'], 'prompt': new_prompt, 'quantity': row['作成問題数'], 'output': '' }], columns=['ID', 'prompt', 'quantity', 'output']) new_df = pd.concat([new_df, new_row], ignore_index=True) # 新しいDataFrameのprompt列をChatGPTに送信し、応答をoutput列に保存 new_df['output'] = new_df['prompt'].apply(get_chatgpt_response) with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as tmp: new_df.to_csv(tmp.name, index=False) output_path = tmp.name # ファイル名を変更 new_path = os.path.join(os.path.dirname(output_path), "output.csv") os.rename(output_path, new_path) return new_path # interface = gr.Interface( # fn=process_csv, # inputs=gr.File(label="CSVファイルをアップロード"), # outputs=gr.File(label="ダウンロード", file_count="singular"), # allow_flagging="never", # title="問題生成ツール", # article="問題生成FMTはこちらからダウンロードしてください。" # ) title = "英語生成ツール" with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown( f""" # {title} """ ) with gr.Tab("問題生成(選択肢)"): with gr.Column(): with gr.Row(): inputs=gr.File(label="CSVファイルをアップロード") outputs=gr.File(label="ダウンロード", file_count="singular") gr.Button("校正スタート").click( create_choice_question, inputs=[inputs], outputs=[outputs] ) with gr.Tab("問題生成(並び替え)"): with gr.Column(): with gr.Row(): inputs=gr.File(label="CSVファイルをアップロード") outputs=gr.File(label="ダウンロード", file_count="singular") gr.Button("校正スタート").click( create_choice_question, inputs=[inputs], outputs=[outputs] ) demo.launch(share=True)