Update app.py
Browse files
app.py
CHANGED
|
@@ -351,7 +351,7 @@ class QualityChecker:
|
|
| 351 |
class OptimizedStreaming:
|
| 352 |
"""μ€νΈλ¦¬λ° λ²νΌ μ΅μ ν"""
|
| 353 |
|
| 354 |
-
def __init__(self, chunk_size: int =
|
| 355 |
self.chunk_size = chunk_size
|
| 356 |
self.flush_interval = flush_interval
|
| 357 |
self.buffer = ""
|
|
@@ -421,7 +421,7 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 421 |
AgentRole.FINALIZER: """[μ΅μ’
ν΅ν©]
|
| 422 |
λͺ¨λ μ견 μ’
ν©βμ΅μ λ΅λ³
|
| 423 |
λͺ
νꡬ쑰+μ€μ©μ 보+μ°½μκ· ν
|
| 424 |
-
λ°λ‘ ν΅μ¬ λ΄μ©λΆν° μμ. λΆνμν ν€λλ λ§ν¬μ
μμ΄."""
|
| 425 |
}
|
| 426 |
|
| 427 |
async def parallel_process_agents(
|
|
@@ -449,7 +449,7 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 449 |
try:
|
| 450 |
# === 1λ¨κ³: κ°λ
μ + κ²μ λ³λ ¬ μ€ν ===
|
| 451 |
if show_progress:
|
| 452 |
-
agent_thoughts = "
|
| 453 |
agent_thoughts += "π κ°λ
μ λΆμ + π μΆκ° κ²μ λμ μ§ν...\n\n"
|
| 454 |
yield accumulated_response, agent_thoughts
|
| 455 |
|
|
@@ -474,12 +474,12 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 474 |
async for chunk in self.streaming.buffer_and_yield(supervisor_task):
|
| 475 |
supervisor_response += chunk
|
| 476 |
if show_progress and len(supervisor_response) < 300:
|
| 477 |
-
agent_thoughts = f"
|
| 478 |
yield accumulated_response, agent_thoughts
|
| 479 |
|
| 480 |
# === 2λ¨κ³: μ°½μμ± + λΉν μ€λΉ λ³λ ¬ ===
|
| 481 |
if show_progress:
|
| 482 |
-
agent_thoughts += "
|
| 483 |
yield accumulated_response, agent_thoughts
|
| 484 |
|
| 485 |
# μ°½μμ± μμ± μμ
|
|
@@ -524,7 +524,7 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 524 |
|
| 525 |
if show_progress:
|
| 526 |
display_creative = creative_response[:400] + "..." if len(creative_response) > 400 else creative_response
|
| 527 |
-
agent_thoughts = f"
|
| 528 |
yield accumulated_response, agent_thoughts
|
| 529 |
|
| 530 |
# λΉνμ κ²°κ³Ό λκΈ°
|
|
@@ -532,7 +532,7 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 532 |
critic_response = await critic_task
|
| 533 |
|
| 534 |
if show_progress:
|
| 535 |
-
agent_thoughts += f"
|
| 536 |
yield accumulated_response, agent_thoughts
|
| 537 |
|
| 538 |
# === 3λ¨κ³: νμ§ μ²΄ν¬ λ° μ‘°κΈ° μ’
λ£ ===
|
|
@@ -545,7 +545,7 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 545 |
accumulated_response = creative_response
|
| 546 |
|
| 547 |
if show_progress:
|
| 548 |
-
agent_thoughts += f"
|
| 549 |
|
| 550 |
# μΊμ μ μ₯
|
| 551 |
self.cache.set(query, {
|
|
@@ -558,7 +558,7 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 558 |
|
| 559 |
# === 4λ¨κ³: μ΅μ’
ν΅ν© (μ€νΈλ¦¬λ°) ===
|
| 560 |
if show_progress:
|
| 561 |
-
agent_thoughts += "
|
| 562 |
yield accumulated_response, agent_thoughts
|
| 563 |
|
| 564 |
final_prompt = f"""
|
|
@@ -566,7 +566,7 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 566 |
μ°½μμ±λ΅λ³: {creative_response}
|
| 567 |
λΉννΌλλ°±: {critic_response}
|
| 568 |
κ°λ
μꡬ쑰: {supervisor_response}
|
| 569 |
-
|
| 570 |
|
| 571 |
final_task = self.llm.chat_stream_async(
|
| 572 |
messages=[
|
|
@@ -577,36 +577,38 @@ class SpeedOptimizedMultiAgentSystem:
|
|
| 577 |
max_tokens=2500
|
| 578 |
)
|
| 579 |
|
| 580 |
-
# μ΅μ’
λ΅λ³ μ€νΈλ¦¬λ°
|
| 581 |
accumulated_response = ""
|
| 582 |
-
|
| 583 |
|
| 584 |
-
async for chunk in
|
| 585 |
-
|
| 586 |
-
|
| 587 |
-
|
| 588 |
-
|
| 589 |
-
#
|
| 590 |
-
|
| 591 |
-
|
| 592 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
| 596 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 597 |
|
| 598 |
-
#
|
| 599 |
-
accumulated_response = temp_buffer
|
| 600 |
yield accumulated_response, agent_thoughts
|
| 601 |
|
| 602 |
-
# μ΅μ’
μ 리
|
| 603 |
-
if "| --- # π± **μ΅μ’
ν΅ν© λ΅λ³:" in accumulated_response:
|
| 604 |
-
accumulated_response = accumulated_response.split("| --- # π± **μ΅μ’
ν΅ν© λ΅λ³:")[1]
|
| 605 |
-
|
| 606 |
-
if "**βμ€λ₯: ---" in accumulated_response:
|
| 607 |
-
accumulated_response = accumulated_response.split("**βμ€λ₯: ---")[0]
|
| 608 |
-
|
| 609 |
-
# μλ€ κ³΅λ°± μ κ±°
|
| 610 |
accumulated_response = accumulated_response.strip()
|
| 611 |
|
| 612 |
# μ²λ¦¬ μκ° μΆκ°
|
|
@@ -671,7 +673,7 @@ def create_optimized_gradio_interface():
|
|
| 671 |
show_agent_thoughts: bool,
|
| 672 |
search_count: int
|
| 673 |
):
|
| 674 |
-
"""μ΅μ νλ 쿼리 μ²λ¦¬ -
|
| 675 |
|
| 676 |
if not message:
|
| 677 |
yield history, "", ""
|
|
@@ -682,23 +684,7 @@ def create_optimized_gradio_interface():
|
|
| 682 |
import nest_asyncio
|
| 683 |
nest_asyncio.apply()
|
| 684 |
except ImportError:
|
| 685 |
-
pass
|
| 686 |
-
|
| 687 |
-
def run_async_function(coro):
|
| 688 |
-
"""λΉλκΈ° ν¨μλ₯Ό λκΈ°μ μΌλ‘ μ€ννλ ν¬νΌ"""
|
| 689 |
-
try:
|
| 690 |
-
loop = asyncio.get_event_loop()
|
| 691 |
-
if loop.is_running():
|
| 692 |
-
# μ΄λ―Έ μ€ν μ€μΈ 루νκ° μμΌλ©΄ μ μ€λ λμμ μ€ν
|
| 693 |
-
import concurrent.futures
|
| 694 |
-
with concurrent.futures.ThreadPoolExecutor() as executor:
|
| 695 |
-
future = executor.submit(asyncio.run, coro)
|
| 696 |
-
return future.result()
|
| 697 |
-
else:
|
| 698 |
-
return loop.run_until_complete(coro)
|
| 699 |
-
except RuntimeError:
|
| 700 |
-
# 루νκ° μμΌλ©΄ μλ‘ μμ±
|
| 701 |
-
return asyncio.run(coro)
|
| 702 |
|
| 703 |
try:
|
| 704 |
# κ²μ μν (λκΈ°ν)
|
|
@@ -714,12 +700,15 @@ def create_optimized_gradio_interface():
|
|
| 714 |
yield history_with_message, "", ""
|
| 715 |
|
| 716 |
# λΉλκΈ° κ²μμ λκΈ°μ μΌλ‘ μ€ν
|
| 717 |
-
|
| 718 |
-
system.search.search_async(message, count=search_count)
|
| 719 |
-
|
|
|
|
|
|
|
|
|
|
| 720 |
|
| 721 |
if search_results:
|
| 722 |
-
search_display = "
|
| 723 |
for i, result in enumerate(search_results[:3], 1):
|
| 724 |
search_display += f"**{i}. [{result['title'][:50]}]({result['url']})**\n"
|
| 725 |
search_display += f" {result['description'][:100]}...\n\n"
|
|
@@ -727,26 +716,37 @@ def create_optimized_gradio_interface():
|
|
| 727 |
# μ¬μ©μ λ©μμ§ μΆκ°
|
| 728 |
current_history = history + [{"role": "user", "content": message}]
|
| 729 |
|
| 730 |
-
#
|
| 731 |
-
async def
|
| 732 |
-
|
| 733 |
async for response, thoughts in system.parallel_process_agents(
|
| 734 |
query=message,
|
| 735 |
search_results=search_results,
|
| 736 |
show_progress=show_agent_thoughts
|
| 737 |
):
|
| 738 |
-
|
| 739 |
-
return responses
|
| 740 |
|
| 741 |
-
#
|
| 742 |
-
|
|
|
|
| 743 |
|
| 744 |
-
#
|
| 745 |
-
|
| 746 |
-
|
| 747 |
-
|
| 748 |
-
|
| 749 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 750 |
|
| 751 |
except Exception as e:
|
| 752 |
error_history = history + [
|
|
@@ -754,6 +754,12 @@ def create_optimized_gradio_interface():
|
|
| 754 |
{"role": "assistant", "content": f"β μ€λ₯: {str(e)}"}
|
| 755 |
]
|
| 756 |
yield error_history, "", ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 757 |
|
| 758 |
# Gradio μΈν°νμ΄μ€
|
| 759 |
with gr.Blocks(
|
|
@@ -768,7 +774,7 @@ def create_optimized_gradio_interface():
|
|
| 768 |
) as demo:
|
| 769 |
gr.Markdown("""
|
| 770 |
# β‘ κ³ μ Multi-Agent RAG System
|
| 771 |
-
|
| 772 |
|
| 773 |
**μ΅μ ν κΈ°μ :**
|
| 774 |
- π λ³λ ¬ μ²λ¦¬: μμ΄μ νΈ λμ μ€ν
|
|
@@ -802,7 +808,7 @@ def create_optimized_gradio_interface():
|
|
| 802 |
search_sources = gr.Markdown()
|
| 803 |
|
| 804 |
with gr.Column(scale=1):
|
| 805 |
-
gr.Markdown("
|
| 806 |
|
| 807 |
use_search = gr.Checkbox(
|
| 808 |
label="π μΉ κ²μ μ¬μ©",
|
|
@@ -823,7 +829,7 @@ def create_optimized_gradio_interface():
|
|
| 823 |
)
|
| 824 |
|
| 825 |
gr.Markdown("""
|
| 826 |
-
|
| 827 |
|
| 828 |
**νμ±νλ μ΅μ ν:**
|
| 829 |
- β
λ³λ ¬ μ²λ¦¬
|
|
|
|
| 351 |
class OptimizedStreaming:
|
| 352 |
"""μ€νΈλ¦¬λ° λ²νΌ μ΅μ ν"""
|
| 353 |
|
| 354 |
+
def __init__(self, chunk_size: int = 20, flush_interval: float = 0.05):
|
| 355 |
self.chunk_size = chunk_size
|
| 356 |
self.flush_interval = flush_interval
|
| 357 |
self.buffer = ""
|
|
|
|
| 421 |
AgentRole.FINALIZER: """[μ΅μ’
ν΅ν©]
|
| 422 |
λͺ¨λ μ견 μ’
ν©βμ΅μ λ΅λ³
|
| 423 |
λͺ
νꡬ쑰+μ€μ©μ 보+μ°½μκ· ν
|
| 424 |
+
λ°λ‘ ν΅μ¬ λ΄μ©λΆν° μμ. λΆνμν ν€λλ λ§ν¬μ
μμ΄. λ§ν¬λ€μ΄ ν€λ(#, ##, ###) μ¬μ© κΈμ§."""
|
| 425 |
}
|
| 426 |
|
| 427 |
async def parallel_process_agents(
|
|
|
|
| 449 |
try:
|
| 450 |
# === 1λ¨κ³: κ°λ
μ + κ²μ λ³λ ¬ μ€ν ===
|
| 451 |
if show_progress:
|
| 452 |
+
agent_thoughts = "π λ³λ ¬ μ²λ¦¬ μμ\n"
|
| 453 |
agent_thoughts += "π κ°λ
μ λΆμ + π μΆκ° κ²μ λμ μ§ν...\n\n"
|
| 454 |
yield accumulated_response, agent_thoughts
|
| 455 |
|
|
|
|
| 474 |
async for chunk in self.streaming.buffer_and_yield(supervisor_task):
|
| 475 |
supervisor_response += chunk
|
| 476 |
if show_progress and len(supervisor_response) < 300:
|
| 477 |
+
agent_thoughts = f"π κ°λ
μ λΆμ\n{supervisor_response[:300]}...\n\n"
|
| 478 |
yield accumulated_response, agent_thoughts
|
| 479 |
|
| 480 |
# === 2λ¨κ³: μ°½μμ± + λΉν μ€λΉ λ³λ ¬ ===
|
| 481 |
if show_progress:
|
| 482 |
+
agent_thoughts += "π¨ μ°½μμ± μμ±μ + π λΉνμ μ€λΉ...\n\n"
|
| 483 |
yield accumulated_response, agent_thoughts
|
| 484 |
|
| 485 |
# μ°½μμ± μμ± μμ
|
|
|
|
| 524 |
|
| 525 |
if show_progress:
|
| 526 |
display_creative = creative_response[:400] + "..." if len(creative_response) > 400 else creative_response
|
| 527 |
+
agent_thoughts = f"π¨ μ°½μμ± μμ±μ\n{display_creative}\n\n"
|
| 528 |
yield accumulated_response, agent_thoughts
|
| 529 |
|
| 530 |
# λΉνμ κ²°κ³Ό λκΈ°
|
|
|
|
| 532 |
critic_response = await critic_task
|
| 533 |
|
| 534 |
if show_progress:
|
| 535 |
+
agent_thoughts += f"π λΉνμ κ²ν \n{critic_response[:200]}...\n\n"
|
| 536 |
yield accumulated_response, agent_thoughts
|
| 537 |
|
| 538 |
# === 3λ¨κ³: νμ§ μ²΄ν¬ λ° μ‘°κΈ° μ’
λ£ ===
|
|
|
|
| 545 |
accumulated_response = creative_response
|
| 546 |
|
| 547 |
if show_progress:
|
| 548 |
+
agent_thoughts += f"β
νμ§ μΆ©μ‘± (μ μ: {quality_score:.2f})\nμ‘°κΈ° μλ£!\n"
|
| 549 |
|
| 550 |
# μΊμ μ μ₯
|
| 551 |
self.cache.set(query, {
|
|
|
|
| 558 |
|
| 559 |
# === 4λ¨κ³: μ΅μ’
ν΅ν© (μ€νΈλ¦¬λ°) ===
|
| 560 |
if show_progress:
|
| 561 |
+
agent_thoughts += "β
μ΅μ’
ν΅ν© μ€...\n\n"
|
| 562 |
yield accumulated_response, agent_thoughts
|
| 563 |
|
| 564 |
final_prompt = f"""
|
|
|
|
| 566 |
μ°½μμ±λ΅λ³: {creative_response}
|
| 567 |
λΉννΌλλ°±: {critic_response}
|
| 568 |
κ°λ
μꡬ쑰: {supervisor_response}
|
| 569 |
+
μ΅μ’
ν΅ν©βμλ²½λ΅λ³. λ§ν¬λ€μ΄ ν€λ(#, ##, ###) μ¬μ© κΈμ§."""
|
| 570 |
|
| 571 |
final_task = self.llm.chat_stream_async(
|
| 572 |
messages=[
|
|
|
|
| 577 |
max_tokens=2500
|
| 578 |
)
|
| 579 |
|
| 580 |
+
# μ΅μ’
λ΅λ³ μ€νΈλ¦¬λ° - κ°μ λ νν°λ§
|
| 581 |
accumulated_response = ""
|
| 582 |
+
unwanted_header_found = False
|
| 583 |
|
| 584 |
+
async for chunk in final_task: # buffer_and_yield μ κ±°νμ¬ μ¦μ μ€νΈλ¦¬λ°
|
| 585 |
+
# λΆνμν ν€λ 체ν¬
|
| 586 |
+
if not unwanted_header_found:
|
| 587 |
+
accumulated_response += chunk
|
| 588 |
+
|
| 589 |
+
# ν€λ ν¨ν΄ κ°μ§
|
| 590 |
+
if "| --- # π± **μ΅μ’
ν΅ν© λ΅λ³:" in accumulated_response:
|
| 591 |
+
unwanted_header_found = True
|
| 592 |
+
# ν€λ μ΄ν λ΄μ©λ§ μΆμΆ
|
| 593 |
+
parts = accumulated_response.split("| --- # π± **μ΅μ’
ν΅ν© λ΅λ³:")
|
| 594 |
+
if len(parts) > 1:
|
| 595 |
+
accumulated_response = parts[1].lstrip()
|
| 596 |
+
|
| 597 |
+
# μ€λ₯ νΈν° κ°μ§ λ° μ κ±°
|
| 598 |
+
if "**βμ€λ₯: ---" in accumulated_response:
|
| 599 |
+
accumulated_response = accumulated_response.split("**βμ€λ₯: ---")[0]
|
| 600 |
+
else:
|
| 601 |
+
# ν€λλ₯Ό μ°Ύμ νμλ λ°λ‘ μΆκ°
|
| 602 |
+
accumulated_response += chunk
|
| 603 |
+
|
| 604 |
+
# μ€λ₯ νΈν° μ€μκ° μ²΄ν¬
|
| 605 |
+
if "**βμ€λ₯: ---" in accumulated_response:
|
| 606 |
+
accumulated_response = accumulated_response.split("**βμ€λ₯: ---")[0]
|
| 607 |
|
| 608 |
+
# μ€μκ° μ€νΈλ¦¬λ° yield
|
|
|
|
| 609 |
yield accumulated_response, agent_thoughts
|
| 610 |
|
| 611 |
+
# μ΅μ’
μ 리
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 612 |
accumulated_response = accumulated_response.strip()
|
| 613 |
|
| 614 |
# μ²λ¦¬ μκ° μΆκ°
|
|
|
|
| 673 |
show_agent_thoughts: bool,
|
| 674 |
search_count: int
|
| 675 |
):
|
| 676 |
+
"""μ΅μ νλ 쿼리 μ²λ¦¬ - μ€μκ° μ€νΈλ¦¬λ° λ²μ """
|
| 677 |
|
| 678 |
if not message:
|
| 679 |
yield history, "", ""
|
|
|
|
| 684 |
import nest_asyncio
|
| 685 |
nest_asyncio.apply()
|
| 686 |
except ImportError:
|
| 687 |
+
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 688 |
|
| 689 |
try:
|
| 690 |
# κ²μ μν (λκΈ°ν)
|
|
|
|
| 700 |
yield history_with_message, "", ""
|
| 701 |
|
| 702 |
# λΉλκΈ° κ²μμ λκΈ°μ μΌλ‘ μ€ν
|
| 703 |
+
async def search_wrapper():
|
| 704 |
+
return await system.search.search_async(message, count=search_count)
|
| 705 |
+
|
| 706 |
+
loop = asyncio.new_event_loop()
|
| 707 |
+
asyncio.set_event_loop(loop)
|
| 708 |
+
search_results = loop.run_until_complete(search_wrapper())
|
| 709 |
|
| 710 |
if search_results:
|
| 711 |
+
search_display = "π μ°Έκ³ μλ£\n\n"
|
| 712 |
for i, result in enumerate(search_results[:3], 1):
|
| 713 |
search_display += f"**{i}. [{result['title'][:50]}]({result['url']})**\n"
|
| 714 |
search_display += f" {result['description'][:100]}...\n\n"
|
|
|
|
| 716 |
# μ¬μ©μ λ©μμ§ μΆκ°
|
| 717 |
current_history = history + [{"role": "user", "content": message}]
|
| 718 |
|
| 719 |
+
# μ€μκ° μ€νΈλ¦¬λ°μ μν λΉλκΈ° μ²λ¦¬
|
| 720 |
+
async def stream_responses():
|
| 721 |
+
"""μ€μκ° μ€νΈλ¦¬λ° μ λλ μ΄ν°"""
|
| 722 |
async for response, thoughts in system.parallel_process_agents(
|
| 723 |
query=message,
|
| 724 |
search_results=search_results,
|
| 725 |
show_progress=show_agent_thoughts
|
| 726 |
):
|
| 727 |
+
yield response, thoughts
|
|
|
|
| 728 |
|
| 729 |
+
# μ μ΄λ²€νΈ 루νμμ μ€μκ° μ€νΈλ¦¬λ°
|
| 730 |
+
loop = asyncio.new_event_loop()
|
| 731 |
+
asyncio.set_event_loop(loop)
|
| 732 |
|
| 733 |
+
# λΉλκΈ° μ λλ μ΄ν°λ₯Ό λκΈ°μ μΌλ‘ μν
|
| 734 |
+
gen = stream_responses()
|
| 735 |
+
|
| 736 |
+
while True:
|
| 737 |
+
try:
|
| 738 |
+
# λ€μ νλͺ© κ°μ Έμ€κΈ°
|
| 739 |
+
task = asyncio.ensure_future(gen.__anext__(), loop=loop)
|
| 740 |
+
response, thoughts = loop.run_until_complete(task)
|
| 741 |
+
|
| 742 |
+
# μ€μκ° μ
λ°μ΄νΈ
|
| 743 |
+
updated_history = current_history + [
|
| 744 |
+
{"role": "assistant", "content": response}
|
| 745 |
+
]
|
| 746 |
+
yield updated_history, thoughts, search_display
|
| 747 |
+
|
| 748 |
+
except StopAsyncIteration:
|
| 749 |
+
break
|
| 750 |
|
| 751 |
except Exception as e:
|
| 752 |
error_history = history + [
|
|
|
|
| 754 |
{"role": "assistant", "content": f"β μ€λ₯: {str(e)}"}
|
| 755 |
]
|
| 756 |
yield error_history, "", ""
|
| 757 |
+
finally:
|
| 758 |
+
# 루ν μ 리
|
| 759 |
+
try:
|
| 760 |
+
loop.close()
|
| 761 |
+
except:
|
| 762 |
+
pass
|
| 763 |
|
| 764 |
# Gradio μΈν°νμ΄μ€
|
| 765 |
with gr.Blocks(
|
|
|
|
| 774 |
) as demo:
|
| 775 |
gr.Markdown("""
|
| 776 |
# β‘ κ³ μ Multi-Agent RAG System
|
| 777 |
+
**볡μ‘ν μ§λ¬Έλ 5μ΄ μ΄λ΄ μ²λ¦¬ λͺ©ν**
|
| 778 |
|
| 779 |
**μ΅μ ν κΈ°μ :**
|
| 780 |
- π λ³λ ¬ μ²λ¦¬: μμ΄μ νΈ λμ μ€ν
|
|
|
|
| 808 |
search_sources = gr.Markdown()
|
| 809 |
|
| 810 |
with gr.Column(scale=1):
|
| 811 |
+
gr.Markdown("**βοΈ μ€μ **")
|
| 812 |
|
| 813 |
use_search = gr.Checkbox(
|
| 814 |
label="π μΉ κ²μ μ¬μ©",
|
|
|
|
| 829 |
)
|
| 830 |
|
| 831 |
gr.Markdown("""
|
| 832 |
+
**β‘ μ΅μ ν μν**
|
| 833 |
|
| 834 |
**νμ±νλ μ΅μ ν:**
|
| 835 |
- β
λ³λ ¬ μ²λ¦¬
|