vela-demo / inference.py
Heewon Oh
feat: initial release of VELA Framework v1.0.0 - Korean financial market research agent
9cef3a3
raw
history blame
4.24 kB
#!/usr/bin/env python3
"""VELA Framework - ์ถ”๋ก  ๋ฐ๋ชจ
์‚ฌ์šฉ๋ฒ•:
# RunPod ๋ฐฑ์—”๋“œ (๊ธฐ๋ณธ)
python inference.py --query "SKํ•˜์ด๋‹‰์Šค HBM ์‹œ์žฅ ์ „๋ง"
# MLX ๋ฐฑ์—”๋“œ (Apple Silicon)
python inference.py --query "์‚ผ์„ฑ์ „์ž ๋ถ„์„" --backend mlx
# vLLM ๋ฐฑ์—”๋“œ
python inference.py --query "๋„ค์ด๋ฒ„ AI ์ „๋žต" --backend vllm
# Adversary ๊ฒ€์ฆ ํฌํ•จ
python inference.py --query "SKํ•˜์ด๋‹‰์Šค HBM" --verify
# JSON ํŒŒ์ผ๋กœ ์ €์žฅ
python inference.py --query "์‚ผ์„ฑ์ „์ž ๋ฐ˜๋„์ฒด" --output result.json
"""
import argparse
import json
import logging
import sys
from dotenv import load_dotenv
load_dotenv()
from vela import ResearchAgent
from vela.schemas import ResearchOptions
def main():
parser = argparse.ArgumentParser(
description="VELA Research Agent - Korean Financial Research",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
์˜ˆ์‹œ:
python inference.py -q "SKํ•˜์ด๋‹‰์Šค HBM ์‹œ์žฅ ์ „๋ง"
python inference.py -q "์‚ผ์„ฑ์ „์ž ๋ถ„์„" -b mlx
python inference.py -q "๋„ค์ด๋ฒ„ AI" -b vllm --verify
python inference.py -q "์นด์นด์˜ค ์‹ค์ " -o result.json --markdown
""",
)
parser.add_argument(
"--query", "-q", type=str, required=True, help="๋ฆฌ์„œ์น˜ ์ฟผ๋ฆฌ",
)
parser.add_argument(
"--backend", "-b", type=str, default="runpod",
choices=["runpod", "mlx", "vllm"],
help="LLM ๋ฐฑ์—”๋“œ (๊ธฐ๋ณธ: runpod)",
)
parser.add_argument(
"--max-iterations", "-i", type=int, default=5,
help="์ตœ๋Œ€ ์ถ”๋ก  ๋ฐ˜๋ณต ํšŸ์ˆ˜ (๊ธฐ๋ณธ: 5)",
)
parser.add_argument(
"--no-content", action="store_true",
help="์ฝ˜ํ…์ธ  ๋ณธ๋ฌธ ์ถ”์ถœ ๋น„ํ™œ์„ฑํ™” (์†๋„ ํ–ฅ์ƒ)",
)
parser.add_argument(
"--verify", action="store_true",
help="Adversary Agent ๊ฒ€์ฆ ํ™œ์„ฑํ™” (Perplexity API ํ•„์š”)",
)
parser.add_argument(
"--verify-model", type=str, default="sonar",
help="๊ฒ€์ฆ Perplexity ๋ชจ๋ธ (๊ธฐ๋ณธ: sonar)",
)
parser.add_argument(
"--output", "-o", type=str, help="๊ฒฐ๊ณผ ์ €์žฅ ๊ฒฝ๋กœ (JSON)",
)
parser.add_argument(
"--markdown", action="store_true", help="๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ",
)
parser.add_argument(
"--verbose", "-v", action="store_true", help="์ƒ์„ธ ๋กœ๊น…",
)
parser.add_argument(
"--stock-code", type=str, help="์ข…๋ชฉ์ฝ”๋“œ (์˜ˆ: 005930)",
)
args = parser.parse_args()
# ๋กœ๊น… ์„ค์ •
log_level = logging.DEBUG if args.verbose else logging.INFO
logging.basicConfig(
level=log_level,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
)
# ์—์ด์ „ํŠธ ์ดˆ๊ธฐํ™”
print(f"\n[VELA] ๋ฐฑ์—”๋“œ: {args.backend}")
print(f"[VELA] ๋ฆฌ์„œ์น˜ ์‹œ์ž‘: {args.query}\n")
agent = ResearchAgent(
llm_backend=args.backend,
extract_content=not args.no_content,
)
options = ResearchOptions(
max_iterations=args.max_iterations,
extract_content=not args.no_content,
enable_verification=args.verify,
verification_model=args.verify_model,
)
# ๋ฆฌ์„œ์น˜ ์‹คํ–‰
result = agent.research(
query=args.query,
options=options,
stock_code=args.stock_code,
)
# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
if args.markdown:
print(result.to_markdown())
else:
print(json.dumps(result.to_dict(), ensure_ascii=False, indent=2))
# ํŒŒ์ผ ์ €์žฅ
if args.output:
from pathlib import Path
saved = ResearchAgent.save_with_metadata(
result=result,
output_path=Path(args.output),
save_markdown=args.markdown,
)
print(f"\n[VELA] ๊ฒฐ๊ณผ ์ €์žฅ: {saved['result']}")
print(f"[VELA] ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ: {saved['metadata']}")
# ์š”์•ฝ
print(f"\n{'='*50}")
print(f"[VELA] ๋ฆฌ์„œ์น˜ ์™„๋ฃŒ")
print(f" ์‹ ๋ขฐ๋„: {result.confidence:.0%}")
print(f" ์†Œ์Šค: {len(result.sources)}๊ฐœ")
print(f" ๋ฐ˜๋ณต: {result.metadata.iterations}ํšŒ")
print(f" ์†Œ์š”: {result.metadata.elapsed_seconds:.1f}์ดˆ")
print(f"{'='*50}")
if __name__ == "__main__":
main()