youngtsai commited on
Commit
f606555
·
1 Parent(s): 1e97db8

def get_ai_content(password, video_id, df_string, topic, grade, level, specific_feature, content_type, source="gcs"):

Browse files
Files changed (1) hide show
  1. app.py +95 -39
app.py CHANGED
@@ -906,37 +906,6 @@ def generate_summarise(df_string):
906
 
907
  return df_summarise
908
 
909
- def generate_questions(df_string):
910
- # 使用 OpenAI 生成基于上传数据的问题
911
-
912
- sys_content = "你是一個擅長資料分析跟影片教學的老師,user 為學生,請精讀資料文本,自行判斷資料的種類,並用既有資料為本質猜測用戶可能會問的問題,使用 zh-TW"
913
- user_content = f"請根據 {df_string} 生成三個問題,並用 JSON 格式返回 questions:[q1的敘述text, q2的敘述text, q3的敘述text]"
914
- messages = [
915
- {"role": "system", "content": sys_content},
916
- {"role": "user", "content": user_content}
917
- ]
918
- response_format = { "type": "json_object" }
919
-
920
- print("=====messages=====")
921
- print(messages)
922
- print("=====messages=====")
923
-
924
-
925
- request_payload = {
926
- "model": "gpt-4-1106-preview",
927
- "messages": messages,
928
- "max_tokens": 4000,
929
- "response_format": response_format
930
- }
931
-
932
- response = OPEN_AI_CLIENT.chat.completions.create(**request_payload)
933
- questions = json.loads(response.choices[0].message.content)["questions"]
934
- print("=====json_response=====")
935
- print(questions)
936
- print("=====json_response=====")
937
-
938
- return questions
939
-
940
  def get_questions(video_id, df_string, source="gcs"):
941
  if source == "gcs":
942
  # 去 gcs 確認是有有 video_id_questions.json
@@ -989,6 +958,37 @@ def get_questions(video_id, df_string, source="gcs"):
989
  print("=====get_questions=====")
990
  return q1, q2, q3
991
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
992
  def change_questions(password, df_string):
993
  verify_password(password)
994
 
@@ -1005,7 +1005,63 @@ def change_questions(password, df_string):
1005
 
1006
 
1007
  # AI 生成教學素材
1008
- def on_generate_ai_content(password, df_string, topic, grade, level, specific_feature, content_type):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1009
  verify_password(password)
1010
  material = EducationalMaterial(df_string, topic, grade, level, specific_feature, content_type)
1011
  prompt = material.generate_content_prompt()
@@ -1018,7 +1074,7 @@ def on_generate_ai_content(password, df_string, topic, grade, level, specific_fe
1018
  "max_tokens": 4000 # 举例,实际上您可能需要更详细的配置
1019
  }
1020
  ai_content = material.send_ai_request(OPEN_AI_CLIENT, request_payload)
1021
- return ai_content, ai_content, prompt, prompt
1022
 
1023
  def generate_exam_fine_tune_result(password, exam_result_prompt , df_string_output, exam_result, exam_result_fine_tune_prompt):
1024
  verify_password(password)
@@ -1850,18 +1906,18 @@ with gr.Blocks() as demo:
1850
 
1851
  # 教師版 學習單
1852
  worksheet_content_btn.click(
1853
- on_generate_ai_content,
1854
- inputs=[password, df_string_output, content_topic, content_grade, content_level, worksheet_algorithm, worksheet_content_type_name],
1855
  outputs=[worksheet_exam_result_original, worksheet_exam_result, worksheet_prompt, worksheet_exam_result_prompt]
1856
  )
1857
  lesson_plan_btn.click(
1858
- on_generate_ai_content,
1859
- inputs=[password, df_string_output, content_topic, content_grade, content_level, lesson_plan_time, lesson_plan_content_type_name],
1860
  outputs=[lesson_plan_exam_result_original, lesson_plan_exam_result, lesson_plan_prompt, lesson_plan_exam_result_prompt]
1861
  )
1862
  exit_ticket_btn.click(
1863
- on_generate_ai_content,
1864
- inputs=[password, df_string_output, content_topic, content_grade, content_level, exit_ticket_time, exit_ticket_content_type_name],
1865
  outputs=[exit_ticket_exam_result_original, exit_ticket_exam_result, exit_ticket_prompt, exit_ticket_exam_result_prompt]
1866
  )
1867
 
 
906
 
907
  return df_summarise
908
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
909
  def get_questions(video_id, df_string, source="gcs"):
910
  if source == "gcs":
911
  # 去 gcs 確認是有有 video_id_questions.json
 
958
  print("=====get_questions=====")
959
  return q1, q2, q3
960
 
961
+ def generate_questions(df_string):
962
+ # 使用 OpenAI 生成基于上传数据的问题
963
+
964
+ sys_content = "你是一個擅長資料分析跟影片教學的老師,user 為學生,請精讀資料文本,自行判斷資料的種類,並用既有資料為本質猜測用戶可能會問的問題,使用 zh-TW"
965
+ user_content = f"請根據 {df_string} 生成三個問題,並用 JSON 格式返回 questions:[q1的敘述text, q2的敘述text, q3的敘述text]"
966
+ messages = [
967
+ {"role": "system", "content": sys_content},
968
+ {"role": "user", "content": user_content}
969
+ ]
970
+ response_format = { "type": "json_object" }
971
+
972
+ print("=====messages=====")
973
+ print(messages)
974
+ print("=====messages=====")
975
+
976
+
977
+ request_payload = {
978
+ "model": "gpt-4-1106-preview",
979
+ "messages": messages,
980
+ "max_tokens": 4000,
981
+ "response_format": response_format
982
+ }
983
+
984
+ response = OPEN_AI_CLIENT.chat.completions.create(**request_payload)
985
+ questions = json.loads(response.choices[0].message.content)["questions"]
986
+ print("=====json_response=====")
987
+ print(questions)
988
+ print("=====json_response=====")
989
+
990
+ return questions
991
+
992
  def change_questions(password, df_string):
993
  verify_password(password)
994
 
 
1005
 
1006
 
1007
  # AI 生成教學素材
1008
+ def get_ai_content(password, video_id, df_string, topic, grade, level, specific_feature, content_type, source="gcs"):
1009
+ verify_password(password)
1010
+ if source == "gcs":
1011
+ print("===get_ai_content on gcs===")
1012
+ gcs_client = GCS_CLIENT
1013
+ bucket_name = 'video_ai_assistant'
1014
+ file_name = f'{video_id}_ai_content_list.json'
1015
+ blob_name = f"{video_id}/{file_name}"
1016
+ # 检查檔案是否存在
1017
+ is_file_exists = GCS_SERVICE.check_file_exists(bucket_name, blob_name)
1018
+ if not is_file_exists:
1019
+ # 先建立一個 ai_content_list.json
1020
+ ai_content_list = []
1021
+ ai_content_text = json.dumps(ai_content_list, ensure_ascii=False, indent=2)
1022
+ upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, ai_content_text)
1023
+ print("ai_content_list [] 已上傳到GCS")
1024
+
1025
+ # 此時 ai_content_list 已存在
1026
+ ai_content_list_string = download_blob_to_string(gcs_client, bucket_name, blob_name)
1027
+ ai_content_list = json.loads(ai_content_list_string)
1028
+ # by key 找到 ai_content (topic, grade, level, specific_feature, content_type)
1029
+ target_kvs = {
1030
+ "topic": topic,
1031
+ "grade": grade,
1032
+ "level": level,
1033
+ "specific_feature": specific_feature,
1034
+ "content_type": content_type
1035
+ }
1036
+ ai_content_json = [
1037
+ item for item in ai_content_list
1038
+ if all(item[k] == v for k, v in target_kvs.items())
1039
+ ]
1040
+
1041
+ if len(ai_content_json) == 0:
1042
+ ai_content, prompt = generate_ai_content(password, df_string, topic, grade, level, specific_feature, content_type)
1043
+ ai_content_json = {
1044
+ "content": str(ai_content),
1045
+ "prompt": prompt,
1046
+ "topic": topic,
1047
+ "grade": grade,
1048
+ "level": level,
1049
+ "specific_feature": specific_feature,
1050
+ "content_type": content_type
1051
+ }
1052
+
1053
+ ai_content_list.append(ai_content_json)
1054
+ ai_content_text = json.dumps(ai_content_list, ensure_ascii=False, indent=2)
1055
+ upload_file_to_gcs_with_json_string(gcs_client, bucket_name, blob_name, ai_content_text)
1056
+ print("ai_content已上傳到GCS")
1057
+ else:
1058
+ ai_content_json = ai_content_json[0]
1059
+ ai_content = ai_content_json["content"]
1060
+ prompt = ai_content_json["prompt"]
1061
+
1062
+ return ai_content, ai_content, prompt, prompt
1063
+
1064
+ def generate_ai_content(password, df_string, topic, grade, level, specific_feature, content_type):
1065
  verify_password(password)
1066
  material = EducationalMaterial(df_string, topic, grade, level, specific_feature, content_type)
1067
  prompt = material.generate_content_prompt()
 
1074
  "max_tokens": 4000 # 举例,实际上您可能需要更详细的配置
1075
  }
1076
  ai_content = material.send_ai_request(OPEN_AI_CLIENT, request_payload)
1077
+ return ai_content, prompt
1078
 
1079
  def generate_exam_fine_tune_result(password, exam_result_prompt , df_string_output, exam_result, exam_result_fine_tune_prompt):
1080
  verify_password(password)
 
1906
 
1907
  # 教師版 學習單
1908
  worksheet_content_btn.click(
1909
+ get_ai_content,
1910
+ inputs=[password, video_id, df_string_output, content_topic, content_grade, content_level, worksheet_algorithm, worksheet_content_type_name],
1911
  outputs=[worksheet_exam_result_original, worksheet_exam_result, worksheet_prompt, worksheet_exam_result_prompt]
1912
  )
1913
  lesson_plan_btn.click(
1914
+ get_ai_content,
1915
+ inputs=[password, video_id, df_string_output, content_topic, content_grade, content_level, lesson_plan_time, lesson_plan_content_type_name],
1916
  outputs=[lesson_plan_exam_result_original, lesson_plan_exam_result, lesson_plan_prompt, lesson_plan_exam_result_prompt]
1917
  )
1918
  exit_ticket_btn.click(
1919
+ get_ai_content,
1920
+ inputs=[password, video_id, df_string_output, content_topic, content_grade, content_level, exit_ticket_time, exit_ticket_content_type_name],
1921
  outputs=[exit_ticket_exam_result_original, exit_ticket_exam_result, exit_ticket_prompt, exit_ticket_exam_result_prompt]
1922
  )
1923