aiqtech commited on
Commit
624bbb3
Β·
verified Β·
1 Parent(s): 19f25c1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +226 -113
app.py CHANGED
@@ -195,24 +195,32 @@ class LLMCollaborativeSystem:
195
  4. λͺ…ν™•ν•œ κ²°λ‘ κ³Ό λ‹€μŒ 단계λ₯Ό μ œμ‹œν•˜μ„Έμš”
196
  5. 전문적이고 완성도 높은 μ΅œμ’… λ³΄κ³ μ„œ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜μ„Έμš”"""
197
 
198
- def create_evaluator_prompt(self, user_query: str, supervisor_responses: List[str], researcher_response: str, executor_responses: List[str]) -> str:
199
  """ν‰κ°€μž AI ν”„λ‘¬ν”„νŠΈ 생성"""
 
 
 
 
 
 
 
 
200
  return f"""당신은 전체 ν˜‘λ ₯ κ³Όμ •κ³Ό κ²°κ³Όλ₯Ό ν‰κ°€ν•˜λŠ” ν‰κ°€μž AIμž…λ‹ˆλ‹€.
201
 
202
  μ‚¬μš©μž 질문: {user_query}
203
 
204
  κ°λ…μž AI의 뢄석 및 μ§€μ‹œ:
205
  - 초기 뢄석: {supervisor_responses[0]}
206
- - μ‹€ν–‰ μ§€μ‹œ: {supervisor_responses[1]}
207
- - κ²€ν†  ν”Όλ“œλ°±: {supervisor_responses[2]}
208
 
209
  μ‘°μ‚¬μž AI의 쑰사 κ²°κ³Ό:
210
  {researcher_response}
211
 
212
  μ‹€ν–‰μž AI의 κ΅¬ν˜„:
213
  - 초기 κ΅¬ν˜„: {executor_responses[0]}
214
- - μ΅œμ’… λ³΄κ³ μ„œ: {executor_responses[1]}
215
-
216
  μœ„ 전체 과정을 ν‰κ°€ν•˜μ—¬:
217
  1. **ν’ˆμ§ˆ 평가**: 각 AI의 λ‹΅λ³€ ν’ˆμ§ˆκ³Ό μ—­ν•  μˆ˜ν–‰λ„λ₯Ό ν‰κ°€ν•˜μ„Έμš” (10점 만점)
218
  2. **ν˜‘λ ₯ νš¨κ³Όμ„±**: AI κ°„ ν˜‘λ ₯이 μ–Όλ§ˆλ‚˜ νš¨κ³Όμ μ΄μ—ˆλŠ”μ§€ ν‰κ°€ν•˜μ„Έμš”
@@ -485,7 +493,7 @@ class LLMCollaborativeSystem:
485
  generate_content_config = types.GenerateContentConfig(
486
  temperature=0.7,
487
  top_p=0.8,
488
- max_output_tokens=2048,
489
  response_mime_type="text/plain"
490
  )
491
 
@@ -768,7 +776,7 @@ class LLMCollaborativeSystem:
768
  payload = {
769
  "model": self.model_id,
770
  "messages": full_messages,
771
- "max_tokens": 2048,
772
  "temperature": 0.7,
773
  "top_p": 0.8,
774
  "stream": True,
@@ -825,7 +833,7 @@ def process_query_streaming(user_query: str, llm_mode: str):
825
  global internal_history
826
 
827
  if not user_query:
828
- return "", "", "", "", "❌ μ§ˆλ¬Έμ„ μž…λ ₯ν•΄μ£Όμ„Έμš”."
829
 
830
  # LLM λͺ¨λ“œ μ„€μ •
831
  llm_system.set_llm_mode(llm_mode)
@@ -845,7 +853,7 @@ def process_query_streaming(user_query: str, llm_mode: str):
845
  ):
846
  supervisor_initial_response += chunk
847
  supervisor_text = f"[초기 뢄석] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_initial_response}"
848
- yield supervisor_text, "", "", "", "πŸ”„ κ°λ…μž AIκ°€ 뢄석 쀑..."
849
 
850
  all_responses["supervisor"].append(supervisor_initial_response)
851
 
@@ -855,7 +863,7 @@ def process_query_streaming(user_query: str, llm_mode: str):
855
 
856
  # 2단계: 브레이브 검색 μˆ˜ν–‰
857
  researcher_text = "[μ›Ή 검색] πŸ” 검색 쀑...\n"
858
- yield supervisor_text, researcher_text, "", "", "πŸ” μ›Ή 검색 μˆ˜ν–‰ 쀑..."
859
 
860
  search_results = {}
861
  total_search_count = 0
@@ -867,7 +875,7 @@ def process_query_streaming(user_query: str, llm_mode: str):
867
  search_results[keyword] = results
868
  total_search_count += len(results)
869
  researcher_text += f"βœ“ '{keyword}' 검색 μ™„λ£Œ ({len(results)}개 κ²°κ³Ό)\n"
870
- yield supervisor_text, researcher_text, "", "", f"πŸ” '{keyword}' 검색 쀑..."
871
 
872
  # λ™μ˜μ–΄λ‘œ μΆ”κ°€ 검색
873
  synonyms = llm_system.generate_synonyms(keyword)
@@ -877,13 +885,13 @@ def process_query_streaming(user_query: str, llm_mode: str):
877
  search_results[f"{keyword} ({synonym})"] = syn_results
878
  total_search_count += len(syn_results)
879
  researcher_text += f"βœ“ λ™μ˜μ–΄ '{synonym}' 검색 μ™„λ£Œ ({len(syn_results)}개 κ²°κ³Ό)\n"
880
- yield supervisor_text, researcher_text, "", "", f"πŸ” λ™μ˜μ–΄ '{synonym}' 검색 쀑..."
881
 
882
  researcher_text += f"\nπŸ“Š 총 {total_search_count}개의 검색 κ²°κ³Ό μˆ˜μ§‘ μ™„λ£Œ\n"
883
 
884
  # URL μ½˜ν…μΈ  κ°€μ Έμ˜€κΈ° (μƒμœ„ 3개)
885
  researcher_text += "\n[μ½˜ν…μΈ  뢄석] πŸ“– μ£Όμš” μ›ΉνŽ˜μ΄μ§€ λ‚΄μš© 뢄석 쀑...\n"
886
- yield supervisor_text, researcher_text, "", "", "πŸ“– μ›ΉνŽ˜μ΄μ§€ λ‚΄μš© 뢄석 쀑..."
887
 
888
  content_analyzed = 0
889
  for keyword, results in search_results.items():
@@ -898,7 +906,7 @@ def process_query_streaming(user_query: str, llm_mode: str):
898
  result['content_preview'] = content[:500] # 미리보기 μ €μž₯
899
  content_analyzed += 1
900
  researcher_text += f"βœ“ μ½˜ν…μΈ  뢄석 μ™„λ£Œ: {url[:50]}...\n"
901
- yield supervisor_text, researcher_text, "", "", f"πŸ“– 뢄석 쀑: {url[:30]}..."
902
 
903
  # 3단계: μ‘°μ‚¬μž AIκ°€ 검색 κ²°κ³Ό 정리
904
  researcher_prompt = llm_system.create_researcher_prompt(user_query, supervisor_initial_response, search_results)
@@ -911,12 +919,57 @@ def process_query_streaming(user_query: str, llm_mode: str):
911
  ):
912
  researcher_response += chunk
913
  researcher_text = f"[쑰사 κ²°κ³Ό 정리] - {datetime.now().strftime('%H:%M:%S')}\n{researcher_response}"
914
- yield supervisor_text, researcher_text, "", "", "πŸ“ μ‘°μ‚¬μž AIκ°€ 정리 쀑..."
915
 
916
  all_responses["researcher"].append(researcher_response)
917
 
918
- # 4단계: κ°λ…μž AIκ°€ 쑰사 λ‚΄μš© 기반으둜 μ‹€ν–‰ μ§€μ‹œ
919
- supervisor_execution_prompt = llm_system.create_supervisor_execution_prompt(user_query, researcher_response)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
920
  supervisor_execution_response = ""
921
 
922
  supervisor_text += "\n\n---\n\n[μ‹€ν–‰ μ§€μ‹œ] πŸ”„ 생성 쀑...\n"
@@ -927,11 +980,11 @@ def process_query_streaming(user_query: str, llm_mode: str):
927
  supervisor_execution_response += chunk
928
  temp_text = f"{all_responses['supervisor'][0]}\n\n---\n\n[μ‹€ν–‰ μ§€μ‹œ] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_execution_response}"
929
  supervisor_text = f"[초기 뢄석] - {datetime.now().strftime('%H:%M:%S')}\n{temp_text}"
930
- yield supervisor_text, researcher_text, "", "", "🎯 κ°λ…μž AIκ°€ μ§€μ‹œ 쀑..."
931
 
932
  all_responses["supervisor"].append(supervisor_execution_response)
933
 
934
- # 5단계: μ‹€ν–‰μž AIκ°€ 쑰사 λ‚΄μš©κ³Ό μ§€μ‹œλ₯Ό 기반으둜 초기 κ΅¬ν˜„
935
  executor_prompt = llm_system.create_executor_prompt(user_query, supervisor_execution_response, researcher_response)
936
  executor_response = ""
937
 
@@ -942,41 +995,117 @@ def process_query_streaming(user_query: str, llm_mode: str):
942
  ):
943
  executor_response += chunk
944
  executor_text = f"[초기 κ΅¬ν˜„] - {datetime.now().strftime('%H:%M:%S')}\n{executor_response}"
945
- yield supervisor_text, researcher_text, executor_text, "", "πŸ”§ μ‹€ν–‰μž AIκ°€ κ΅¬ν˜„ 쀑..."
946
 
947
  all_responses["executor"].append(executor_response)
948
 
949
- # 6단계: κ°λ…μž AI κ²€ν†  및 ν”Όλ“œλ°±
950
- review_prompt = f"""당신은 κ±°μ‹œμ  κ΄€μ μ—μ„œ λΆ„μ„ν•˜κ³  μ§€λ„ν•˜λŠ” κ°λ…μž AIμž…λ‹ˆλ‹€.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
951
 
952
  μ‚¬μš©μž 질문: {user_query}
953
 
954
- μ‹€ν–‰μž AI의 λ‹΅λ³€:
955
  {executor_response}
956
 
957
- 이 닡변을 κ²€ν† ν•˜κ³  κ°œμ„ μ κ³Ό μΆ”κ°€ 고렀사항을 μ œμ‹œν•΄μ£Όμ„Έμš”. ꡬ체적이고 μ‹€ν–‰ κ°€λŠ₯ν•œ κ°œμ„  λ°©μ•ˆμ„ μ œμ‹œν•˜μ„Έμš”."""
 
 
 
 
 
 
958
 
959
- review_response = ""
960
- supervisor_text = f"[초기 뢄석] - {datetime.now().strftime('%H:%M:%S')}\n{all_responses['supervisor'][0]}\n\n---\n\n[μ‹€ν–‰ μ§€μ‹œ] - {datetime.now().strftime('%H:%M:%S')}\n{all_responses['supervisor'][1]}\n\n---\n\n[κ²€ν†  및 ν”Όλ“œλ°±] πŸ”„ 생성 쀑...\n"
961
 
962
  for chunk in llm_system.call_llm_streaming(
963
- [{"role": "user", "content": review_prompt}],
964
  "supervisor"
965
  ):
966
- review_response += chunk
967
- temp_text = f"{all_responses['supervisor'][0]}\n\n---\n\n[μ‹€ν–‰ μ§€μ‹œ] - {datetime.now().strftime('%H:%M:%S')}\n{all_responses['supervisor'][1]}\n\n---\n\n[κ²€ν†  및 ν”Όλ“œλ°±] - {datetime.now().strftime('%H:%M:%S')}\n{review_response}"
968
  supervisor_text = f"[초기 뢄석] - {datetime.now().strftime('%H:%M:%S')}\n{temp_text}"
969
- yield supervisor_text, researcher_text, executor_text, "", "πŸ”„ κ°λ…μž AIκ°€ κ²€ν†  쀑..."
970
 
971
- all_responses["supervisor"].append(review_response)
972
 
973
- # 7단계: μ‹€ν–‰μž AI μ΅œμ’… λ³΄κ³ μ„œ (ν”Όλ“œλ°± 반영)
974
- final_executor_prompt = llm_system.create_executor_final_prompt(
975
- user_query,
976
- executor_response,
977
- review_response,
978
- researcher_response
 
979
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
980
  final_executor_response = ""
981
 
982
  executor_text += "\n\n---\n\n[μ΅œμ’… λ³΄κ³ μ„œ] πŸ”„ μž‘μ„± 쀑...\n"
@@ -987,95 +1116,50 @@ def process_query_streaming(user_query: str, llm_mode: str):
987
  final_executor_response += chunk
988
  temp_text = f"[초기 κ΅¬ν˜„] - {datetime.now().strftime('%H:%M:%S')}\n{all_responses['executor'][0]}\n\n---\n\n[μ΅œμ’… λ³΄κ³ μ„œ] - {datetime.now().strftime('%H:%M:%S')}\n{final_executor_response}"
989
  executor_text = temp_text
990
- yield supervisor_text, researcher_text, executor_text, "", "πŸ“„ μ΅œμ’… λ³΄κ³ μ„œ μž‘μ„± 쀑..."
991
 
992
  all_responses["executor"].append(final_executor_response)
993
 
994
- # 8단계: ν‰κ°€μž AIκ°€ 전체 κ³Όμ • 평가
995
- evaluator_prompt = llm_system.create_evaluator_prompt(
996
- user_query,
997
- all_responses["supervisor"],
998
- all_responses["researcher"][0],
999
- all_responses["executor"]
1000
- )
1001
- evaluator_response = ""
1002
-
1003
- evaluator_text = "[전체 평가] πŸ”„ 평가 쀑...\n"
1004
- for chunk in llm_system.call_llm_streaming(
1005
- [{"role": "user", "content": evaluator_prompt}],
1006
- "evaluator"
1007
- ):
1008
- evaluator_response += chunk
1009
- evaluator_text = f"[전체 평가] - {datetime.now().strftime('%H:%M:%S')}\n{evaluator_response}"
1010
- yield supervisor_text, researcher_text, executor_text, evaluator_text, "πŸ“Š ν‰κ°€μž AIκ°€ 평가 쀑..."
1011
-
1012
- all_responses["evaluator"].append(evaluator_response)
1013
-
1014
  # μ΅œμ’… κ²°κ³Ό 생성 (μ΅œμ’… λ³΄κ³ μ„œλ₯Ό λ©”μΈμœΌλ‘œ)
1015
  final_summary = f"""## 🎯 μ΅œμ’… μ’…ν•© λ³΄κ³ μ„œ
1016
 
1017
  ### πŸ“Œ μ‚¬μš©μž 질문
1018
  {user_query}
1019
 
1020
- ### πŸ“„ μ΅œμ’… λ³΄κ³ μ„œ (μ‹€ν–‰μž AI - ν”Όλ“œλ°± 반영)
1021
  {final_executor_response}
1022
 
1023
  ---
1024
 
1025
  ### πŸ“Š 전체 ν”„λ‘œμ„ΈμŠ€ 평가 (ν‰κ°€μž AI)
1026
- {evaluator_response}
1027
 
1028
  ---
1029
 
1030
- <details>
1031
- <summary>πŸ“‹ 전체 ν˜‘λ ₯ κ³Όμ • 보기</summary>
1032
-
1033
- #### πŸ” κ±°μ‹œμ  뢄석 (κ°λ…μž AI)
1034
- {all_responses['supervisor'][0]}
1035
-
1036
- #### πŸ“š 쑰사 κ²°κ³Ό (μ‘°μ‚¬μž AI)
1037
- {researcher_response}
1038
-
1039
- #### 🎯 μ‹€ν–‰ μ§€μ‹œ (κ°λ…μž AI)
1040
- {all_responses['supervisor'][1]}
1041
-
1042
- #### πŸ’‘ 초기 κ΅¬ν˜„ (μ‹€ν–‰μž AI)
1043
- {executor_response}
1044
-
1045
- #### ✨ κ²€ν†  및 κ°œμ„ μ‚¬ν•­ (κ°λ…μž AI)
1046
- {review_response}
1047
-
1048
- </details>
1049
 
1050
  ---
1051
- *이 λ³΄κ³ μ„œλŠ” {'Gemini 2.5 Pro' if llm_system.use_gemini else 'κΈ°λ³Έ LLM'}λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή 검색과 AI ν˜‘λ ₯을 톡해 μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.*"""
 
 
 
 
1052
 
1053
  # λ‚΄λΆ€ νžˆμŠ€ν† λ¦¬ μ—…λ°μ΄νŠΈ (UIμ—λŠ” ν‘œμ‹œν•˜μ§€ μ•ŠμŒ)
1054
  internal_history.append((user_query, final_summary))
1055
 
1056
- # μ΅œμ’… μš”μ•½λ§Œ ν‘œμ‹œ
1057
- display_summary = f"""## 🎯 μ΅œμ’… κ²°κ³Ό
1058
-
1059
- ### πŸ“„ μ‹€ν–‰ λ³΄κ³ μ„œ
1060
- {final_executor_response}
1061
-
1062
- ### πŸ“Š 평가 μš”μ•½
1063
- {evaluator_response.split('### 5️⃣')[1] if '### 5️⃣' in evaluator_response else evaluator_response[-500:]}
1064
-
1065
- ---
1066
- *{'Gemini 2.5 Pro' if llm_system.use_gemini else 'κΈ°λ³Έ LLM'} μ‚¬μš© | 4개 AI ν˜‘λ ₯ μ™„λ£Œ*"""
1067
-
1068
- yield supervisor_text, researcher_text, executor_text, evaluator_text, "βœ… μ΅œμ’… λ³΄κ³ μ„œ μ™„μ„±!"
1069
 
1070
  except Exception as e:
1071
  error_msg = f"❌ 처리 쀑 였λ₯˜: {str(e)}"
1072
- yield "", "", "", "", error_msg
1073
 
1074
  def clear_all():
1075
  """λͺ¨λ“  λ‚΄μš© μ΄ˆκΈ°ν™”"""
1076
  global internal_history
1077
  internal_history = []
1078
- return "", "", "", "", "πŸ”„ μ΄ˆκΈ°ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€."
1079
 
1080
  # Gradio μΈν„°νŽ˜μ΄μŠ€
1081
  css = """
@@ -1102,12 +1186,22 @@ css = """
1102
  padding-left: 10px !important;
1103
  background-color: #fffbeb !important;
1104
  }
 
 
 
 
 
 
 
 
1105
  """
1106
 
1107
- with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css) as app:
1108
  gr.Markdown(
1109
  f"""
1110
- # 🀝 ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ (4-AI ν˜‘μ—… + ν‰κ°€μž)
 
 
1111
  """
1112
  )
1113
 
@@ -1122,10 +1216,13 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1122
  - **ν‰κ°€μž AI**: 전체 κ³Όμ • 평가와 κ°œμ„ μ  μ œμ‹œ
1123
 
1124
  ### 🌟 μ£Όμš” κΈ°λŠ₯
 
1125
  - 20개 검색 결과와 λ™μ˜μ–΄ 검색
1126
  - 신뒰도 기반 정보 평가
1127
- - μ‹€μ‹œκ°„ ν˜‘μ—…κ³Ό ν”Όλ“œλ°± 반영
1128
- - 쒅합적인 ν’ˆμ§ˆ 평가
 
 
1129
  """)
1130
 
1131
  # LLM 선택 μ˜΅μ…˜
@@ -1150,7 +1247,20 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1150
  label="μƒνƒœ",
1151
  interactive=False,
1152
  value="λŒ€κΈ° 쀑...",
1153
- max_lines=1
 
 
 
 
 
 
 
 
 
 
 
 
 
1154
  )
1155
 
1156
  # AI 좜λ ₯λ“€ - 2x2 κ·Έλ¦¬λ“œ
@@ -1160,8 +1270,8 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1160
  gr.Markdown("### 🧠 κ°λ…μž AI (κ±°μ‹œμ  뢄석)")
1161
  supervisor_output = gr.Textbox(
1162
  label="",
1163
- lines=15,
1164
- max_lines=20,
1165
  interactive=False,
1166
  elem_classes=["supervisor-box"]
1167
  )
@@ -1170,8 +1280,8 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1170
  gr.Markdown("### πŸ” μ‘°μ‚¬μž AI (μ›Ή 검색 & 정리)")
1171
  researcher_output = gr.Textbox(
1172
  label="",
1173
- lines=15,
1174
- max_lines=20,
1175
  interactive=False,
1176
  elem_classes=["researcher-box"]
1177
  )
@@ -1182,8 +1292,8 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1182
  gr.Markdown("### πŸ‘οΈ μ‹€ν–‰μž AI (λ―Έμ‹œμ  κ΅¬ν˜„)")
1183
  executor_output = gr.Textbox(
1184
  label="",
1185
- lines=15,
1186
- max_lines=20,
1187
  interactive=False,
1188
  elem_classes=["executor-box"]
1189
  )
@@ -1192,8 +1302,8 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1192
  gr.Markdown("### πŸ“Š ν‰κ°€μž AI (전체 평가)")
1193
  evaluator_output = gr.Textbox(
1194
  label="",
1195
- lines=15,
1196
- max_lines=20,
1197
  interactive=False,
1198
  elem_classes=["evaluator-box"]
1199
  )
@@ -1202,10 +1312,13 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1202
  gr.Examples(
1203
  examples=[
1204
  "κΈ°κ³„ν•™μŠ΅ λͺ¨λΈμ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” μ΅œμ‹  방법은?",
1205
- "2024λ…„ 효과적인 ν”„λ‘œμ νŠΈ 관리 도ꡬ와 μ „λž΅μ€?",
1206
  "지속 κ°€λŠ₯ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λͺ¨λΈμ˜ μ΅œμ‹  νŠΈλ Œλ“œλŠ”?",
1207
  "μ΅œμ‹  데이터 μ‹œκ°ν™” 도ꡬ와 기법은?",
1208
- "원격 νŒ€μ˜ 생산성을 λ†’μ΄λŠ” κ²€μ¦λœ 방법은?"
 
 
 
1209
  ],
1210
  inputs=user_input,
1211
  label="πŸ’‘ 예제 질문"
@@ -1215,7 +1328,7 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1215
  submit_btn.click(
1216
  fn=process_query_streaming,
1217
  inputs=[user_input, llm_mode],
1218
- outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, status_text]
1219
  ).then(
1220
  fn=lambda: "",
1221
  outputs=[user_input]
@@ -1224,7 +1337,7 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1224
  user_input.submit(
1225
  fn=process_query_streaming,
1226
  inputs=[user_input, llm_mode],
1227
- outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, status_text]
1228
  ).then(
1229
  fn=lambda: "",
1230
  outputs=[user_input]
@@ -1232,7 +1345,7 @@ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ", theme=gr.themes.Soft(), css=css)
1232
 
1233
  clear_btn.click(
1234
  fn=clear_all,
1235
- outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, status_text]
1236
  )
1237
 
1238
 
 
195
  4. λͺ…ν™•ν•œ κ²°λ‘ κ³Ό λ‹€μŒ 단계λ₯Ό μ œμ‹œν•˜μ„Έμš”
196
  5. 전문적이고 완성도 높은 μ΅œμ’… λ³΄κ³ μ„œ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜μ„Έμš”"""
197
 
198
+ def create_evaluator_prompt(self, user_query: str, supervisor_responses: List[str], researcher_response: str, executor_responses: List[str], evaluator_responses: List[str] = None) -> str:
199
  """ν‰κ°€μž AI ν”„λ‘¬ν”„νŠΈ 생성"""
200
+ evaluator_history = ""
201
+ if evaluator_responses and len(evaluator_responses) > 0:
202
+ evaluator_history = f"""
203
+ ν‰κ°€μž AI의 이전 평가듀:
204
+ - 쑰사 κ²°κ³Ό 평가: {evaluator_responses[0] if len(evaluator_responses) > 0 else 'N/A'}
205
+ - 초기 κ΅¬ν˜„ 평가: {evaluator_responses[1] if len(evaluator_responses) > 1 else 'N/A'}
206
+ """
207
+
208
  return f"""당신은 전체 ν˜‘λ ₯ κ³Όμ •κ³Ό κ²°κ³Όλ₯Ό ν‰κ°€ν•˜λŠ” ν‰κ°€μž AIμž…λ‹ˆλ‹€.
209
 
210
  μ‚¬μš©μž 질문: {user_query}
211
 
212
  κ°λ…μž AI의 뢄석 및 μ§€μ‹œ:
213
  - 초기 뢄석: {supervisor_responses[0]}
214
+ - μ‹€ν–‰ μ§€μ‹œ: {supervisor_responses[1] if len(supervisor_responses) > 1 else 'N/A'}
215
+ - κ°œμ„  μ§€μ‹œ: {supervisor_responses[2] if len(supervisor_responses) > 2 else 'N/A'}
216
 
217
  μ‘°μ‚¬μž AI의 쑰사 κ²°κ³Ό:
218
  {researcher_response}
219
 
220
  μ‹€ν–‰μž AI의 κ΅¬ν˜„:
221
  - 초기 κ΅¬ν˜„: {executor_responses[0]}
222
+ - μ΅œμ’… λ³΄κ³ μ„œ: {executor_responses[1] if len(executor_responses) > 1 else 'N/A'}
223
+ {evaluator_history}
224
  μœ„ 전체 과정을 ν‰κ°€ν•˜μ—¬:
225
  1. **ν’ˆμ§ˆ 평가**: 각 AI의 λ‹΅λ³€ ν’ˆμ§ˆκ³Ό μ—­ν•  μˆ˜ν–‰λ„λ₯Ό ν‰κ°€ν•˜μ„Έμš” (10점 만점)
226
  2. **ν˜‘λ ₯ νš¨κ³Όμ„±**: AI κ°„ ν˜‘λ ₯이 μ–Όλ§ˆλ‚˜ νš¨κ³Όμ μ΄μ—ˆλŠ”μ§€ ν‰κ°€ν•˜μ„Έμš”
 
493
  generate_content_config = types.GenerateContentConfig(
494
  temperature=0.7,
495
  top_p=0.8,
496
+ max_output_tokens=4096,
497
  response_mime_type="text/plain"
498
  )
499
 
 
776
  payload = {
777
  "model": self.model_id,
778
  "messages": full_messages,
779
+ "max_tokens": 4096,
780
  "temperature": 0.7,
781
  "top_p": 0.8,
782
  "stream": True,
 
833
  global internal_history
834
 
835
  if not user_query:
836
+ return "", "", "", "", "", "❌ μ§ˆλ¬Έμ„ μž…λ ₯ν•΄μ£Όμ„Έμš”."
837
 
838
  # LLM λͺ¨λ“œ μ„€μ •
839
  llm_system.set_llm_mode(llm_mode)
 
853
  ):
854
  supervisor_initial_response += chunk
855
  supervisor_text = f"[초기 뢄석] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_initial_response}"
856
+ yield supervisor_text, "", "", "", "", "πŸ”„ κ°λ…μž AIκ°€ 뢄석 쀑..."
857
 
858
  all_responses["supervisor"].append(supervisor_initial_response)
859
 
 
863
 
864
  # 2단계: 브레이브 검색 μˆ˜ν–‰
865
  researcher_text = "[μ›Ή 검색] πŸ” 검색 쀑...\n"
866
+ yield supervisor_text, researcher_text, "", "", "", "πŸ” μ›Ή 검색 μˆ˜ν–‰ 쀑..."
867
 
868
  search_results = {}
869
  total_search_count = 0
 
875
  search_results[keyword] = results
876
  total_search_count += len(results)
877
  researcher_text += f"βœ“ '{keyword}' 검색 μ™„λ£Œ ({len(results)}개 κ²°κ³Ό)\n"
878
+ yield supervisor_text, researcher_text, "", "", "", f"πŸ” '{keyword}' 검색 쀑..."
879
 
880
  # λ™μ˜μ–΄λ‘œ μΆ”κ°€ 검색
881
  synonyms = llm_system.generate_synonyms(keyword)
 
885
  search_results[f"{keyword} ({synonym})"] = syn_results
886
  total_search_count += len(syn_results)
887
  researcher_text += f"βœ“ λ™μ˜μ–΄ '{synonym}' 검색 μ™„λ£Œ ({len(syn_results)}개 κ²°κ³Ό)\n"
888
+ yield supervisor_text, researcher_text, "", "", "", f"πŸ” λ™μ˜μ–΄ '{synonym}' 검색 쀑..."
889
 
890
  researcher_text += f"\nπŸ“Š 총 {total_search_count}개의 검색 κ²°κ³Ό μˆ˜μ§‘ μ™„λ£Œ\n"
891
 
892
  # URL μ½˜ν…μΈ  κ°€μ Έμ˜€κΈ° (μƒμœ„ 3개)
893
  researcher_text += "\n[μ½˜ν…μΈ  뢄석] πŸ“– μ£Όμš” μ›ΉνŽ˜μ΄μ§€ λ‚΄μš© 뢄석 쀑...\n"
894
+ yield supervisor_text, researcher_text, "", "", "", "πŸ“– μ›ΉνŽ˜μ΄μ§€ λ‚΄μš© 뢄석 쀑..."
895
 
896
  content_analyzed = 0
897
  for keyword, results in search_results.items():
 
906
  result['content_preview'] = content[:500] # 미리보기 μ €μž₯
907
  content_analyzed += 1
908
  researcher_text += f"βœ“ μ½˜ν…μΈ  뢄석 μ™„λ£Œ: {url[:50]}...\n"
909
+ yield supervisor_text, researcher_text, "", "", "", f"πŸ“– 뢄석 쀑: {url[:30]}..."
910
 
911
  # 3단계: μ‘°μ‚¬μž AIκ°€ 검색 κ²°κ³Ό 정리
912
  researcher_prompt = llm_system.create_researcher_prompt(user_query, supervisor_initial_response, search_results)
 
919
  ):
920
  researcher_response += chunk
921
  researcher_text = f"[쑰사 κ²°κ³Ό 정리] - {datetime.now().strftime('%H:%M:%S')}\n{researcher_response}"
922
+ yield supervisor_text, researcher_text, "", "", "", "πŸ“ μ‘°μ‚¬μž AIκ°€ 정리 쀑..."
923
 
924
  all_responses["researcher"].append(researcher_response)
925
 
926
+ # 4단계: ν‰κ°€μž AIκ°€ 쑰사 κ²°κ³Ό 평가
927
+ evaluator_research_prompt = f"""당신은 전체 ν˜‘λ ₯ κ³Όμ •κ³Ό κ²°κ³Όλ₯Ό ν‰κ°€ν•˜λŠ” ν‰κ°€μž AIμž…λ‹ˆλ‹€.
928
+
929
+ μ‚¬μš©μž 질문: {user_query}
930
+
931
+ κ°λ…μž AI의 초기 뢄석:
932
+ {supervisor_initial_response}
933
+
934
+ μ‘°μ‚¬μž AI의 쑰사 κ²°κ³Ό:
935
+ {researcher_response}
936
+
937
+ μœ„ 쑰사 κ²°κ³Όλ₯Ό ν‰κ°€ν•˜μ—¬:
938
+ 1. μ‘°μ‚¬μ˜ 좩싀도와 신뒰성을 ν‰κ°€ν•˜μ„Έμš”
939
+ 2. λˆ„λ½λœ μ€‘μš” 정보가 μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”
940
+ 3. 쑰사 결과의 ν™œμš© κ°€λŠ₯성을 ν‰κ°€ν•˜μ„Έμš”
941
+ 4. κ°œμ„ μ΄ ν•„μš”ν•œ 뢀뢄을 ꡬ체적으둜 μ œμ‹œν•˜μ„Έμš”"""
942
+
943
+ evaluator_research_response = ""
944
+ evaluator_text = "[쑰사 κ²°κ³Ό 평가] πŸ”„ 평가 쀑...\n"
945
+
946
+ for chunk in llm_system.call_llm_streaming(
947
+ [{"role": "user", "content": evaluator_research_prompt}],
948
+ "evaluator"
949
+ ):
950
+ evaluator_research_response += chunk
951
+ evaluator_text = f"[쑰사 κ²°κ³Ό 평가] - {datetime.now().strftime('%H:%M:%S')}\n{evaluator_research_response}"
952
+ yield supervisor_text, researcher_text, "", evaluator_text, "", "πŸ“Š ν‰κ°€μž AIκ°€ 쑰사 κ²°κ³Ό 평가 쀑..."
953
+
954
+ all_responses["evaluator"].append(evaluator_research_response)
955
+
956
+ # 5단계: κ°λ…μž AIκ°€ 평가λ₯Ό λ°˜μ˜ν•œ μ‹€ν–‰ μ§€μ‹œ
957
+ supervisor_execution_prompt = f"""당신은 κ±°μ‹œμ  κ΄€μ μ—μ„œ λΆ„μ„ν•˜κ³  μ§€λ„ν•˜λŠ” κ°λ…μž AIμž…λ‹ˆλ‹€.
958
+
959
+ μ‚¬μš©μž 질문: {user_query}
960
+
961
+ μ‘°μ‚¬μž AIκ°€ μ •λ¦¬ν•œ 쑰사 λ‚΄μš©:
962
+ {researcher_response}
963
+
964
+ ν‰κ°€μž AI의 쑰사 κ²°κ³Ό 평가:
965
+ {evaluator_research_response}
966
+
967
+ μœ„ 쑰사 λ‚΄μš©κ³Ό 평가λ₯Ό 기반으둜 μ‹€ν–‰μž AIμ—κ²Œ μ•„μ£Ό ꡬ체적인 μ§€μ‹œλ₯Ό λ‚΄λ €μ£Όμ„Έμš”:
968
+ 1. ν‰κ°€μžμ˜ ν”Όλ“œλ°±μ„ λ°˜μ˜ν•˜μ—¬ μ§€μ‹œλ₯Ό κ°œμ„ ν•˜μ„Έμš”
969
+ 2. μ‘°μ‚¬λœ 정보λ₯Ό μ–΄λ–»κ²Œ ν™œμš©ν• μ§€ λͺ…ν™•νžˆ μ§€μ‹œν•˜μ„Έμš”
970
+ 3. μ‹€ν–‰ κ°€λŠ₯ν•œ 단계별 μž‘μ—…μ„ ꡬ체적으둜 μ œμ‹œν•˜μ„Έμš”
971
+ 4. μ˜ˆμƒλ˜λŠ” 결과물의 ν˜•νƒœλ₯Ό ꡬ체적으둜 μ„€λͺ…ν•˜μ„Έμš”"""
972
+
973
  supervisor_execution_response = ""
974
 
975
  supervisor_text += "\n\n---\n\n[μ‹€ν–‰ μ§€μ‹œ] πŸ”„ 생성 쀑...\n"
 
980
  supervisor_execution_response += chunk
981
  temp_text = f"{all_responses['supervisor'][0]}\n\n---\n\n[μ‹€ν–‰ μ§€μ‹œ] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_execution_response}"
982
  supervisor_text = f"[초기 뢄석] - {datetime.now().strftime('%H:%M:%S')}\n{temp_text}"
983
+ yield supervisor_text, researcher_text, "", evaluator_text, "", "🎯 κ°λ…μž AIκ°€ μ§€μ‹œ 쀑..."
984
 
985
  all_responses["supervisor"].append(supervisor_execution_response)
986
 
987
+ # 6단계: μ‹€ν–‰μž AIκ°€ 쑰사 λ‚΄μš©κ³Ό μ§€μ‹œλ₯Ό 기반���둜 초기 κ΅¬ν˜„
988
  executor_prompt = llm_system.create_executor_prompt(user_query, supervisor_execution_response, researcher_response)
989
  executor_response = ""
990
 
 
995
  ):
996
  executor_response += chunk
997
  executor_text = f"[초기 κ΅¬ν˜„] - {datetime.now().strftime('%H:%M:%S')}\n{executor_response}"
998
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, "", "πŸ”§ μ‹€ν–‰μž AIκ°€ κ΅¬ν˜„ 쀑..."
999
 
1000
  all_responses["executor"].append(executor_response)
1001
 
1002
+ # 7단계: ν‰κ°€μž AIκ°€ 초기 κ΅¬ν˜„ 평가
1003
+ evaluator_execution_prompt = f"""당신은 전체 ν˜‘λ ₯ κ³Όμ •κ³Ό κ²°κ³Όλ₯Ό ν‰κ°€ν•˜λŠ” ν‰κ°€μž AIμž…λ‹ˆλ‹€.
1004
+
1005
+ μ‚¬μš©μž 질문: {user_query}
1006
+
1007
+ μ‹€ν–‰μž AI의 초기 κ΅¬ν˜„:
1008
+ {executor_response}
1009
+
1010
+ κ°λ…μž AI의 μ§€μ‹œμ‚¬ν•­:
1011
+ {supervisor_execution_response}
1012
+
1013
+ μœ„ 초기 κ΅¬ν˜„μ„ ν‰κ°€ν•˜μ—¬:
1014
+ 1. μ§€μ‹œμ‚¬ν•­μ΄ μ–Όλ§ˆλ‚˜ 잘 λ°˜μ˜λ˜μ—ˆλŠ”μ§€ ν‰κ°€ν•˜μ„Έμš”
1015
+ 2. κ΅¬ν˜„μ˜ μ‹€ν–‰ κ°€λŠ₯μ„±κ³Ό ꡬ체성을 ν‰κ°€ν•˜μ„Έμš”
1016
+ 3. λˆ„λ½λœ μ€‘μš” μš”μ†Œκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”
1017
+ 4. κ°œμ„ μ΄ ν•„μš”ν•œ 뢀뢄을 ꡬ체적으둜 μ œμ‹œν•˜μ„Έμš”"""
1018
+
1019
+ evaluator_execution_response = ""
1020
+ evaluator_text += "\n\n---\n\n[초기 κ΅¬ν˜„ 평가] πŸ”„ 평가 쀑...\n"
1021
+
1022
+ for chunk in llm_system.call_llm_streaming(
1023
+ [{"role": "user", "content": evaluator_execution_prompt}],
1024
+ "evaluator"
1025
+ ):
1026
+ evaluator_execution_response += chunk
1027
+ temp_text = f"{all_responses['evaluator'][0]}\n\n---\n\n[초기 κ΅¬ν˜„ 평가] - {datetime.now().strftime('%H:%M:%S')}\n{evaluator_execution_response}"
1028
+ evaluator_text = f"[쑰사 κ²°κ³Ό 평가] - {datetime.now().strftime('%H:%M:%S')}\n{temp_text}"
1029
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, "", "πŸ“Š ν‰κ°€μž AIκ°€ κ΅¬ν˜„ 평가 쀑..."
1030
+
1031
+ all_responses["evaluator"].append(evaluator_execution_response)
1032
+
1033
+ # 8단계: κ°λ…μž AIκ°€ 평가λ₯Ό λ°˜μ˜ν•œ κ°œμ„  μ§€μ‹œ
1034
+ supervisor_improvement_prompt = f"""당신은 κ±°μ‹œμ  κ΄€μ μ—μ„œ λΆ„μ„ν•˜κ³  μ§€λ„ν•˜λŠ” κ°λ…μž AIμž…λ‹ˆλ‹€.
1035
 
1036
  μ‚¬μš©μž 질문: {user_query}
1037
 
1038
+ μ‹€ν–‰μž AI의 초기 κ΅¬ν˜„:
1039
  {executor_response}
1040
 
1041
+ ν‰κ°€μž AI의 κ΅¬ν˜„ 평가:
1042
+ {evaluator_execution_response}
1043
+
1044
+ μœ„ 평가λ₯Ό λ°˜μ˜ν•˜μ—¬ μ΅œμ’… λ³΄κ³ μ„œ μž‘μ„±μ„ μœ„ν•œ κ°œμ„  μ§€μ‹œλ₯Ό λ‚΄λ €μ£Όμ„Έμš”:
1045
+ 1. ν‰κ°€μžκ°€ μ§€μ ν•œ λͺ¨λ“  κ°œμ„ μ‚¬ν•­μ„ ꡬ체적으둜 λ°˜μ˜ν•˜μ„Έμš”
1046
+ 2. μΆ”κ°€λ‘œ ν•„μš”ν•œ ꡬ체적인 λ‚΄μš©μ„ μ§€μ‹œν•˜μ„Έμš”
1047
+ 3. μ΅œμ’… λ³΄κ³ μ„œμ˜ ꡬ쑰와 포함해야 ν•  μš”μ†Œλ₯Ό λͺ…ν™•νžˆ μ œμ‹œν•˜μ„Έμš”"""
1048
 
1049
+ supervisor_improvement_response = ""
1050
+ supervisor_text += "\n\n---\n\n[κ°œμ„  μ§€μ‹œ] πŸ”„ 생성 쀑...\n"
1051
 
1052
  for chunk in llm_system.call_llm_streaming(
1053
+ [{"role": "user", "content": supervisor_improvement_prompt}],
1054
  "supervisor"
1055
  ):
1056
+ supervisor_improvement_response += chunk
1057
+ temp_text = f"{all_responses['supervisor'][0]}\n\n---\n\n[μ‹€ν–‰ μ§€μ‹œ] - {datetime.now().strftime('%H:%M:%S')}\n{all_responses['supervisor'][1]}\n\n---\n\n[κ°œμ„  μ§€μ‹œ] - {datetime.now().strftime('%H:%M:%S')}\n{supervisor_improvement_response}"
1058
  supervisor_text = f"[초기 뢄석] - {datetime.now().strftime('%H:%M:%S')}\n{temp_text}"
1059
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, "", "πŸ”„ κ°λ…μž AIκ°€ κ°œμ„  μ§€μ‹œ 쀑..."
1060
 
1061
+ all_responses["supervisor"].append(supervisor_improvement_response)
1062
 
1063
+ # 9단계: ν‰κ°€μž AIκ°€ 전체 κ³Όμ • μ΅œμ’… 평가
1064
+ evaluator_final_prompt = llm_system.create_evaluator_prompt(
1065
+ user_query,
1066
+ all_responses["supervisor"],
1067
+ all_responses["researcher"][0],
1068
+ all_responses["executor"],
1069
+ all_responses["evaluator"] # 이전 평가듀도 전달
1070
  )
1071
+ evaluator_final_response = ""
1072
+
1073
+ evaluator_text += "\n\n---\n\n[전체 κ³Όμ • μ΅œμ’… 평가] πŸ”„ 평가 쀑...\n"
1074
+ for chunk in llm_system.call_llm_streaming(
1075
+ [{"role": "user", "content": evaluator_final_prompt}],
1076
+ "evaluator"
1077
+ ):
1078
+ evaluator_final_response += chunk
1079
+ temp_text = f"{all_responses['evaluator'][0]}\n\n---\n\n[초기 κ΅¬ν˜„ 평가] - {datetime.now().strftime('%H:%M:%S')}\n{all_responses['evaluator'][1]}\n\n---\n\n[전체 κ³Όμ • μ΅œμ’… 평가] - {datetime.now().strftime('%H:%M:%S')}\n{evaluator_final_response}"
1080
+ evaluator_text = f"[쑰사 κ²°κ³Ό 평가] - {datetime.now().strftime('%H:%M:%S')}\n{temp_text}"
1081
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, "", "πŸ“Š ν‰κ°€μž AIκ°€ μ΅œμ’… 평가 쀑..."
1082
+
1083
+ all_responses["evaluator"].append(evaluator_final_response)
1084
+
1085
+ # 10단계: μ‹€ν–‰μž AI μ΅œμ’… λ³΄κ³ μ„œ (λͺ¨λ“  ν”Όλ“œλ°± 반영)
1086
+ final_executor_prompt = f"""당신은 세뢀적인 λ‚΄μš©μ„ κ΅¬ν˜„ν•˜λŠ” μ‹€ν–‰μž AIμž…λ‹ˆλ‹€.
1087
+
1088
+ μ‚¬μš©μž 질문: {user_query}
1089
+
1090
+ μ‘°μ‚¬μž AI의 쑰사 λ‚΄μš©:
1091
+ {researcher_response}
1092
+
1093
+ λ‹Ήμ‹ μ˜ 초기 κ΅¬ν˜„:
1094
+ {executor_response}
1095
+
1096
+ κ°λ…μž AI의 κ°œμ„  μ§€μ‹œ:
1097
+ {supervisor_improvement_response}
1098
+
1099
+ ν‰κ°€μž AI의 전체 평가:
1100
+ {evaluator_final_response}
1101
+
1102
+ μœ„ λͺ¨λ“  ν”Όλ“œλ°±μ„ μ™„μ „νžˆ λ°˜μ˜ν•˜μ—¬ μ΅œμ’… λ³΄κ³ μ„œλ₯Ό μž‘μ„±ν•˜μ„Έμš”:
1103
+ 1. λͺ¨λ“  κ°œμ„ μ‚¬ν•­κ³Ό μ§€μ‹œμ‚¬ν•­μ„ 빠짐없이 λ°˜μ˜ν•˜μ„Έμš”
1104
+ 2. 쑰사 λ‚΄μš©μ„ μ΅œλŒ€ν•œ ꡬ체적으둜 ν™œμš©ν•˜μ„Έμš”
1105
+ 3. μ‹€ν–‰ κ°€λŠ₯성을 λ†’μ΄λŠ” μ„ΈλΆ€ κ³„νšμ„ ν¬ν•¨ν•˜μ„Έμš”
1106
+ 4. λͺ…ν™•ν•œ κ²°λ‘ κ³Ό λ‹€μŒ 단계λ₯Ό μ œμ‹œν•˜μ„Έμš”
1107
+ 5. 전문적이고 완성도 높은 μ΅œμ’… λ³΄κ³ μ„œ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•˜μ„Έμš”"""
1108
+
1109
  final_executor_response = ""
1110
 
1111
  executor_text += "\n\n---\n\n[μ΅œμ’… λ³΄κ³ μ„œ] πŸ”„ μž‘μ„± 쀑...\n"
 
1116
  final_executor_response += chunk
1117
  temp_text = f"[초기 κ΅¬ν˜„] - {datetime.now().strftime('%H:%M:%S')}\n{all_responses['executor'][0]}\n\n---\n\n[μ΅œμ’… λ³΄κ³ μ„œ] - {datetime.now().strftime('%H:%M:%S')}\n{final_executor_response}"
1118
  executor_text = temp_text
1119
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, "", "πŸ“„ μ΅œμ’… λ³΄κ³ μ„œ μž‘μ„± 쀑..."
1120
 
1121
  all_responses["executor"].append(final_executor_response)
1122
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1123
  # μ΅œμ’… κ²°κ³Ό 생성 (μ΅œμ’… λ³΄κ³ μ„œλ₯Ό λ©”μΈμœΌλ‘œ)
1124
  final_summary = f"""## 🎯 μ΅œμ’… μ’…ν•© λ³΄κ³ μ„œ
1125
 
1126
  ### πŸ“Œ μ‚¬μš©μž 질문
1127
  {user_query}
1128
 
1129
+ ### πŸ“„ μ΅œμ’… λ³΄κ³ μ„œ (μ‹€ν–‰μž AI - λͺ¨λ“  ν”Όλ“œλ°± 반영)
1130
  {final_executor_response}
1131
 
1132
  ---
1133
 
1134
  ### πŸ“Š 전체 ν”„λ‘œμ„ΈμŠ€ 평가 (ν‰κ°€μž AI)
1135
+ {evaluator_final_response}
1136
 
1137
  ---
1138
 
1139
+ ### πŸ” 핡심 쑰사 κ²°κ³Ό (μ‘°μ‚¬μž AI)
1140
+ {researcher_response[:800]}...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1141
 
1142
  ---
1143
+ ### πŸ“‹ ν”„λ‘œμ„ΈμŠ€ μ™„λ£Œ
1144
+ - **μ‚¬μš© λͺ¨λΈ**: {'Gemini 2.5 Pro' if llm_system.use_gemini else 'κΈ°λ³Έ LLM'}
1145
+ - **ν”„λ‘œμ„ΈμŠ€**: 감독→쑰사→평가→감독→싀행→평가→감독→평가→싀행
1146
+ - **총 9단계 ν˜‘λ ₯ μ™„λ£Œ**
1147
+ - **생성 μ‹œκ°„**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"""
1148
 
1149
  # λ‚΄λΆ€ νžˆμŠ€ν† λ¦¬ μ—…λ°μ΄νŠΈ (UIμ—λŠ” ν‘œμ‹œν•˜μ§€ μ•ŠμŒ)
1150
  internal_history.append((user_query, final_summary))
1151
 
1152
+ yield supervisor_text, researcher_text, executor_text, evaluator_text, final_summary, "βœ… μ΅œμ’… λ³΄κ³ μ„œ μ™„μ„±!"
 
 
 
 
 
 
 
 
 
 
 
 
1153
 
1154
  except Exception as e:
1155
  error_msg = f"❌ 처리 쀑 였λ₯˜: {str(e)}"
1156
+ yield "", "", "", "", error_msg, error_msg
1157
 
1158
  def clear_all():
1159
  """λͺ¨λ“  λ‚΄μš© μ΄ˆκΈ°ν™”"""
1160
  global internal_history
1161
  internal_history = []
1162
+ return "", "", "", "", "", "πŸ”„ μ΄ˆκΈ°ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€."
1163
 
1164
  # Gradio μΈν„°νŽ˜μ΄μŠ€
1165
  css = """
 
1186
  padding-left: 10px !important;
1187
  background-color: #fffbeb !important;
1188
  }
1189
+ .final-report-box textarea {
1190
+ border: 2px solid #3b82f6 !important;
1191
+ border-radius: 8px !important;
1192
+ padding: 20px !important;
1193
+ background-color: #eff6ff !important;
1194
+ margin-top: 10px !important;
1195
+ font-size: 16px !important;
1196
+ }
1197
  """
1198
 
1199
+ with gr.Blocks(title="ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ - 닀단계 평가", theme=gr.themes.Soft(), css=css) as app:
1200
  gr.Markdown(
1201
  f"""
1202
+ # 🀝 ν˜‘λ ₯적 LLM μ‹œμŠ€ν…œ (닀단계 평가 ν”„λ‘œμ„ΈμŠ€)
1203
+
1204
+ ### πŸ“‹ ν”„λ‘œμ„ΈμŠ€: 감독(뢄석) β†’ 쑰사(검색) β†’ 평가(쑰사) β†’ 감독(μ§€μ‹œ) β†’ μ‹€ν–‰(μ΄ˆμ•ˆ) β†’ 평가(μ΄ˆμ•ˆ) β†’ 감독(κ°œμ„ ) β†’ 평가(μ΅œμ’…) β†’ μ‹€ν–‰(μ™„μ„±)
1205
  """
1206
  )
1207
 
 
1216
  - **ν‰κ°€μž AI**: 전체 κ³Όμ • 평가와 κ°œμ„ μ  μ œμ‹œ
1217
 
1218
  ### 🌟 μ£Όμš” κΈ°λŠ₯
1219
+ - μ΅œλŒ€ 4096 토큰 지원 (κΈ΄ 응닡 κ°€λŠ₯)
1220
  - 20개 검색 결과와 λ™μ˜μ–΄ 검색
1221
  - 신뒰도 기반 정보 평가
1222
+ - 닀단계 평가와 ν”Όλ“œλ°± 반영
1223
+
1224
+ ### πŸ“‹ ν”„λ‘œμ„ΈμŠ€
1225
+ 감독 β†’ 쑰사 β†’ 평가 β†’ 감독 β†’ μ‹€ν–‰ β†’ 평가 β†’ 감독 β†’ 평가 β†’ μ‹€ν–‰
1226
  """)
1227
 
1228
  # LLM 선택 μ˜΅μ…˜
 
1247
  label="μƒνƒœ",
1248
  interactive=False,
1249
  value="λŒ€κΈ° 쀑...",
1250
+ max_lines=2
1251
+ )
1252
+
1253
+ # μ΅œμ’… κ²°κ³Ό μ„Ήμ…˜ μΆ”κ°€
1254
+ with gr.Row():
1255
+ with gr.Column():
1256
+ gr.Markdown("### πŸ“Š μ΅œμ’… μ’…ν•© λ³΄κ³ μ„œ")
1257
+ final_report = gr.Textbox(
1258
+ label="",
1259
+ lines=25,
1260
+ max_lines=35,
1261
+ interactive=False,
1262
+ value="*μ΅œμ’… λ³΄κ³ μ„œκ°€ 여기에 ν‘œμ‹œλ©λ‹ˆλ‹€.*",
1263
+ elem_classes=["final-report-box"]
1264
  )
1265
 
1266
  # AI 좜λ ₯λ“€ - 2x2 κ·Έλ¦¬λ“œ
 
1270
  gr.Markdown("### 🧠 κ°λ…μž AI (κ±°μ‹œμ  뢄석)")
1271
  supervisor_output = gr.Textbox(
1272
  label="",
1273
+ lines=12,
1274
+ max_lines=18,
1275
  interactive=False,
1276
  elem_classes=["supervisor-box"]
1277
  )
 
1280
  gr.Markdown("### πŸ” μ‘°μ‚¬μž AI (μ›Ή 검색 & 정리)")
1281
  researcher_output = gr.Textbox(
1282
  label="",
1283
+ lines=12,
1284
+ max_lines=18,
1285
  interactive=False,
1286
  elem_classes=["researcher-box"]
1287
  )
 
1292
  gr.Markdown("### πŸ‘οΈ μ‹€ν–‰μž AI (λ―Έμ‹œμ  κ΅¬ν˜„)")
1293
  executor_output = gr.Textbox(
1294
  label="",
1295
+ lines=12,
1296
+ max_lines=18,
1297
  interactive=False,
1298
  elem_classes=["executor-box"]
1299
  )
 
1302
  gr.Markdown("### πŸ“Š ν‰κ°€μž AI (전체 평가)")
1303
  evaluator_output = gr.Textbox(
1304
  label="",
1305
+ lines=12,
1306
+ max_lines=18,
1307
  interactive=False,
1308
  elem_classes=["evaluator-box"]
1309
  )
 
1312
  gr.Examples(
1313
  examples=[
1314
  "κΈ°κ³„ν•™μŠ΅ λͺ¨λΈμ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” μ΅œμ‹  방법은?",
1315
+ "2025λ…„ 효과적인 ν”„λ‘œμ νŠΈ 관리 도ꡬ와 μ „λž΅μ€?",
1316
  "지속 κ°€λŠ₯ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λͺ¨λΈμ˜ μ΅œμ‹  νŠΈλ Œλ“œλŠ”?",
1317
  "μ΅œμ‹  데이터 μ‹œκ°ν™” 도ꡬ와 기법은?",
1318
+ "원격 νŒ€μ˜ 생산성을 λ†’μ΄λŠ” κ²€μ¦λœ 방법은?",
1319
+ "μŠ€νƒ€νŠΈμ—…μ„ μœ„ν•œ 효과적인 λ§ˆμΌ€νŒ… μ „λž΅μ€?",
1320
+ "AI μœ€λ¦¬μ™€ 규제의 μ΅œμ‹  동ν–₯은?",
1321
+ "ν΄λΌμš°λ“œ λ„€μ΄ν‹°λΈŒ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 λͺ¨λ²” μ‚¬λ‘€λŠ”?"
1322
  ],
1323
  inputs=user_input,
1324
  label="πŸ’‘ 예제 질문"
 
1328
  submit_btn.click(
1329
  fn=process_query_streaming,
1330
  inputs=[user_input, llm_mode],
1331
+ outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, final_report, status_text]
1332
  ).then(
1333
  fn=lambda: "",
1334
  outputs=[user_input]
 
1337
  user_input.submit(
1338
  fn=process_query_streaming,
1339
  inputs=[user_input, llm_mode],
1340
+ outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, final_report, status_text]
1341
  ).then(
1342
  fn=lambda: "",
1343
  outputs=[user_input]
 
1345
 
1346
  clear_btn.click(
1347
  fn=clear_all,
1348
+ outputs=[supervisor_output, researcher_output, executor_output, evaluator_output, final_report, status_text]
1349
  )
1350
 
1351