AI_Menu_Search / scripts /05_agent_search.py
Juhaha
HF Spaces 데모 배포 (Streamlit + Qdrant 임베디드, 색인 빌드타임 생성)
fbd1091
Raw
History Blame Contribute Delete
4.31 kB
"""
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()