""" Step 5: LangGraph Agent 기반 메뉴 검색 CLI 실행: python scripts/05_agent_search.py --query "내 주식 얼마야?" python scripts/05_agent_search.py --query "주문 취소하고 싶어" --verbose python scripts/05_agent_search.py --batch python scripts/05_agent_search.py (대화형 모드) """ import sys import io import argparse from pathlib import Path # Windows 터미널 한글 깨짐 방지 if sys.platform == "win32": sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace") sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace") sys.path.insert(0, str(Path(__file__).parent.parent)) from core.agent import run_agent # --------------------------------------------------------------------------- # 배치 테스트 쿼리 # --------------------------------------------------------------------------- BATCH_QUERIES = [ "내 주식 얼마나 올랐어?", "주문 취소하고 싶어", "미국 주식 사고 싶어", "차트 보여줘", "조건 만족하는 종목 찾아줘", "계좌 잔액 확인", "삼성전자 현재 가격", "선물 주문", "공시 검색", "알림 끄기", ] def print_agent_result(query: str, result: dict, verbose: bool = False): """에이전트 결과 출력""" print(f"\n{'='*60}") print(f"[질문] {query}") print(f"{'='*60}") print(result["final_response"]) if verbose: print() print("[에이전트 내부 정보]") print(f" 감지 카테고리 : {result.get('detected_category') or '미감지'}") print(f" 감지 의도 : {result.get('intent', '기타')}") print(f" 최종 쿼리 : {result.get('refined_query', query)}") print(f" 품질 점수 : {result.get('quality_score', 0.0):.4f}") print(f" 결과 만족 여부 : {'만족' if result.get('is_satisfactory') else '불만족'}") print(f" 재시도 횟수 : {result.get('retry_count', 0)}회") history = result.get("rewrite_history", []) if history: print(f" 재작성 이력 :") for i, h in enumerate(history, 1): print(f" {i}. {h}") if result.get("error_message"): print(f" 오류 메시지 : {result['error_message']}") def run_single(query: str, verbose: bool): """단일 쿼리 모드""" result = run_agent(query) print_agent_result(query, result, verbose) def run_batch(verbose: bool): """배치 모드 - 미리 정의된 쿼리 목록 실행""" print(f"\n배치 테스트 시작 ({len(BATCH_QUERIES)}개 쿼리)\n") for i, query in enumerate(BATCH_QUERIES, 1): print(f"\n[{i}/{len(BATCH_QUERIES)}]") result = run_agent(query) print_agent_result(query, result, verbose) print("\n\n배치 테스트 완료") def run_interactive(verbose: bool): """대화형 모드""" print("\nLangGraph Agent 메뉴 검색 (종료: q 또는 quit)") print("verbose 토글: v 입력\n") _verbose = verbose while True: try: user_input = input("검색어 > ").strip() except (EOFError, KeyboardInterrupt): print("\n종료합니다.") break if not user_input: continue if user_input.lower() in ("q", "quit", "exit"): print("종료합니다.") break if user_input.lower() == "v": _verbose = not _verbose print(f" verbose {'켜짐' if _verbose else '꺼짐'}") continue result = run_agent(user_input) print_agent_result(user_input, result, _verbose) def main(): parser = argparse.ArgumentParser(description="LangGraph Agent 메뉴 검색 CLI") parser.add_argument("--query", type=str, help="단일 쿼리") parser.add_argument("--batch", action="store_true", help="배치 테스트 모드") parser.add_argument("--verbose", action="store_true", help="에이전트 내부 정보 출력") args = parser.parse_args() if args.query: run_single(args.query, args.verbose) elif args.batch: run_batch(args.verbose) else: run_interactive(args.verbose) if __name__ == "__main__": main()