File size: 3,225 Bytes
fbd1091
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""
Step 3: CLI 검색 테스트
실행:
  python scripts/03_search_cli.py                       # 대화형 모드
  python scripts/03_search_cli.py --query "내 주식 얼마야?"  # 단일 쿼리
  python scripts/03_search_cli.py --batch               # 사전 정의 쿼리 배치 테스트
"""
import sys
import argparse
from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))

from rich.console import Console
from rich.table import Table
from rich import print as rprint
from core.search_engine import MenuSearchEngine

console = Console()

# 배치 테스트용 사전 정의 쿼리
BATCH_QUERIES = [
    "내일 장 시작하면 자동으로 사게 해줘",
    "주문 잘못 냈는데 취소하고 싶어",
    "여러 종목 한꺼번에 주문할 수 있어?",
    "내 주식 얼마나 올랐어?",
    "지금 내 계좌에 주식 얼마 있어?",
    "오늘 손익이 얼마야",
    "삼성전자 지금 얼마야?",
    "호가창 보고싶어",
    "차트 보여줘",
    "미국 주식 사고싶어",
    "애플 주식 가격 확인",
    "RSI 30 이하 종목 찾아줘",
    "조건식 실시간으로 보고싶어",
    "내 총 자산 얼마야",
    "다른 계좌로 돈 보내고 싶어",
    "삼성전자 공시 확인하고 싶어",
    "오늘 주요 뉴스 뭐야",
    "알림 소리 끄고싶어",
    "코스피 선물 주문",
    "예약했던 거 됐는지 확인",
]


def display_results(query: str, results: list):
    table = Table(title=f'검색: "{query}"', show_lines=True)
    table.add_column("순위", style="cyan", width=4)
    table.add_column("메뉴명", style="bold green")
    table.add_column("메뉴 경로", style="white")
    table.add_column("유사도", style="yellow")

    for i, r in enumerate(results, 1):
        table.add_row(str(i), r["menu_name"], r["menu_path"], r["similarity_pct"])

    console.print(table)
    if not results:
        rprint("[red]결과 없음: 유사도 임계값 이하[/red]")


def interactive_mode(engine: MenuSearchEngine):
    console.print("[bold blue]영웅문 S# AI 메뉴 검색 (종료: q)[/bold blue]")
    while True:
        query = input("\n검색어 입력: ").strip()
        if query.lower() in ("q", "quit", "exit"):
            break
        if not query:
            continue
        results = engine.search(query, top_n=5)
        display_results(query, results)


def batch_mode(engine: MenuSearchEngine):
    console.print(f"\n[bold]배치 테스트 시작: {len(BATCH_QUERIES)}개 쿼리[/bold]\n")
    for query in BATCH_QUERIES:
        results = engine.search(query, top_n=3)
        display_results(query, results)
        console.print()


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--batch", action="store_true", help="사전 정의 쿼리 배치 테스트")
    parser.add_argument("--query", "-q", type=str, help="단일 쿼리 테스트")
    args = parser.parse_args()

    engine = MenuSearchEngine.get_instance()

    if args.batch:
        batch_mode(engine)
    elif args.query:
        results = engine.search(args.query, top_n=5)
        display_results(args.query, results)
    else:
        interactive_mode(engine)