Spaces:
Running
Running
| """ | |
| 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() | |