Spaces:
Running
Running
Update app.py
Browse files
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 |
-
-
|
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=
|
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":
|
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λ¨κ³:
|
919 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
#
|
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 |
-
#
|
950 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
951 |
|
952 |
μ¬μ©μ μ§λ¬Έ: {user_query}
|
953 |
|
954 |
-
μ€νμ AIμ
|
955 |
{executor_response}
|
956 |
|
957 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
958 |
|
959 |
-
|
960 |
-
supervisor_text
|
961 |
|
962 |
for chunk in llm_system.call_llm_streaming(
|
963 |
-
[{"role": "user", "content":
|
964 |
"supervisor"
|
965 |
):
|
966 |
-
|
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[
|
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(
|
972 |
|
973 |
-
#
|
974 |
-
|
975 |
-
user_query,
|
976 |
-
|
977 |
-
|
978 |
-
|
|
|
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 |
-
{
|
1027 |
|
1028 |
---
|
1029 |
|
1030 |
-
|
1031 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
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 μμ€ν
(
|
|
|
|
|
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=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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=
|
1164 |
-
max_lines=
|
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=
|
1174 |
-
max_lines=
|
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=
|
1186 |
-
max_lines=
|
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=
|
1196 |
-
max_lines=
|
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 |
-
"
|
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 |
|