AI로 420개의 예측 소스를 추적합니다. 여기 오픈소스 프레임워크가 있습니다.

발행: (2026년 2월 8일 오후 01:51 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

(번역할 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.)

문제

예측 추적을 위한 표준 인프라가 없습니다.

기존 생태계무엇을 하는가
LangChain에이전트
HuggingFace모델
Supabase백엔드

하지만 다음 질문에 답하는 것은 없습니다:

“누가 무엇을 언제 예측했으며, 그 예측이 맞았는가?”

Signal Tracker가 이를 해결합니다.

설치

pip install signal-tracker

Zero dependencies – stdlib only.
Python 3.10+.

5‑분 워크스루

출처와 주장 추적

from signal_tracker import SignalTracker
from datetime import date

tracker = SignalTracker()

# Add sources
elon   = tracker.add_source("Elon Musk", source_type="person", category="tech")
cramer = tracker.add_source("Jim Cramer", source_type="person", category="finance")
imf    = tracker.add_source("IMF", source_type="institution", category="economics")

# Add predictions
tracker.add_claim(
    source=elon,
    text="Tesla will achieve full self‑driving by end of 2025",
    target_date=date(2025, 12, 31),
)

tracker.add_claim(
    source=cramer,
    text="Netflix will hit $800 by Q2 2025",
    target_date=date(2025, 6, 30),
)

tracker.add_claim(
    source=imf,
    text="Global GDP growth will reach 3.2 % in 2025",
    target_date=date(2025, 12, 31),
)

결과 검증

tracker.verify(claim1, outcome="wrong",   reasoning="FSD not achieved by deadline")
tracker.verify(claim2, outcome="correct", reasoning="Netflix reached $820 in May")
tracker.verify(claim3, outcome="partial", reasoning="GDP grew 2.9 %, close but below target")

리더보드 구축

board = tracker.leaderboard(min_claims=3)

for entry in board.top_accurate:
    print(f"{entry.rank}. {entry.source.name}: {entry.score.accuracy_score}%")

다른 유용한 보기:

  • board.worst_accurate – 하위 성과자
  • board.biggest_risers – 급상승 중인 사람
  • board.biggest_fallers – 성과가 악화된 사람
  • board.notable_wrongs – 고프로필 실수

점수 체계

정확도 점수

  • 단순 백분율 기반 정확도, 뉘앙스 포함:
    • 부분 정확도 가중치 – 설정 가능 (기본값 0.5, 즉 부분 정답은 절반으로 계산)
    • 최소 주장 임계값 – 의미 있는 점수를 위해 소스는 최소 3개의 해결된 주장이 필요
    • 시간 창 점수 – 30 d, 90 d, 12 mo, 그리고 전체 기간에 대한 정확도를 별도로 계산
windows = tracker.accuracy_scorer.score_windowed(claims, source_id=source.id)

for period, snapshot in windows.items():
    print(f"  {period}: {snapshot.accuracy_score}%")

최신성 가중 점수

최근 예측일수록 더 큰 영향을 미칩니다. 설정 가능한 반감기를 갖는 지수 감쇠를 사용합니다:

from signal_tracker.scoring import AccuracyConfig

config = AccuracyConfig(recency_half_life_days=90)
tracker = SignalTracker(accuracy_config=config)

지난 주의 예측은 1년 전 예측보다 약 8× 더 큰 영향을 미칩니다. 이는 과거에 좋았지만 최근에 성과가 떨어진 소스를 부각시킵니다.

주장 품질 점수

모든 예측이 동등하게 만들어지는 것은 아닙니다. “언젠가 상황이 나아질 것이다”는 “비트코인이 2025년 4분기에 $150k에 이를 것이다”와 동일하지 않습니다.

품질 스코어러는 아래 표를 기준으로 각 주장을 0‑100 점수로 평가합니다.

요소가중치확인 항목
시간‑제한30 %특정 기한이 있나요?
측정 가능30 %수치 목표가 있나요?
반증 가능20 %성공/실패 기준이 명확한가요?
최신성20 %주장이 얼마나 최신인가요?
from signal_tracker import QualityScorer

scorer = QualityScorer()
score = scorer.score(claim)          # e.g., 87.5 — highly trackable
high_quality = [c for c in claims if scorer.is_high_quality(c)]

스코어러는 정규식 패턴을 사용해 예측 문구, 금액, 백분율, 날짜 언급 및 회피 어휘를 감지합니다. 모호한 표현(“might”, “could”, “eventually”)은 벌점이 부과됩니다.

텍스트에서 예측 추출

규칙 기반 (빠름, API 호출 없음)

text = """
In his latest interview, the CEO predicted that revenue would 
exceed $10 billion by Q2 2025. He also forecast that the company 
would reach 100 million users within 18 months.
"""

claims = tracker.extract_claims(text, source=ceo)

for claim in claims:
    print(f"  {claim.text}")
    print(f"  Target: {claim.target_date}")
    print(f"  Category: {claim.category}")
    print(f"  Quality: {claim.quality_score}")

LLM‑기반 (보다 정확함)

자신만의 LLM 함수를 제공하세요 (str → str 형태의 호출 가능한 객체라면 모두 사용 가능).

import anthropic

client = anthropic.Anthropic()

def my_llm(prompt: str) -> str:
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1000,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text

tracker = SignalTracker(llm_fn=my_llm)

claims = tracker.extract_claims(transcript, source=analyst, use_llm=True)

이 통합은 모델에 구애받지 않음 – OpenAI, Anthropic, Gemini, 로컬 모델 등 어떤 모델도 사용할 수 있습니다.

다중 모델 합의 검증

In production at Crene we don’t trust a single model. We run several and take a weighted vote.

tracker.verify_with_consensus(
    claim,
    [
        {"outcome": "correct", "verifier": "ai:claude",  "confidence": 0.90},
        {"outcome": "correct", "verifier": "ai:gpt-4",  "confidence": 0.85},
        {"outcome": "wrong",   "verifier": "ai:gemini","confidence": 0.60},
    ],
)

결과: "correct" – 가중 합의가 승리합니다.
결과는 신뢰도 점수에 따라 가중치가 부여됩니다; 높은 신뢰도의 동의가 다수일 경우 낮은 신뢰도의 반대를 무시합니다.

변조 감지

모든 청구는 생성 시 SHA‑256 해시를 부여받습니다:

claim = tracker.add_claim(source, "Bitcoin to $200k by 2025")
print(claim.content_hash)  # a1b2c3d4...

이후, 변경되지 않았는지 확인합니다:

claim.verify_integrity()  # True

누군가 텍스트를 수정하면…

claim.text = "I never said that"
claim.verify_integrity()  # False — hash mismatch

지속성

JSON (간단)

tracker.save("my_tracker.json")
tracker = SignalTracker.load("my_tracker.json")

SQLite (대규모 데이터셋용)

from signal_tracker.storage import SQLiteBackend

backend = SQLiteBackend("tracker.db")
backend.save_source(source)
backend.save_claim(claim)

쿼리

all_claims = backend.list_claims(source_id="elon-musk")

아키텍처

signal-tracker/
├── tracker.py        # SignalTracker — main interface
├── models.py         # Source, Claim, Verification, ScoreSnapshot
├── scoring.py        # AccuracyScorer, QualityScorer
├── extractors.py     # ClaimExtractor (rules + LLM)
├── leaderboard.py   # Leaderboard engine
└── storage.py        # SQLiteBackend

디자인 원칙

  • Zero required dependencies – stdlib only for core
  • Bring your own LLM – any provider works
  • Pluggable storage – JSON, SQLite, or build your own
  • Plain dataclasses – no ORM dependency anywhere

다음 단계

로드맵은 커뮤니티가 원하는 것에 따라 달라집니다:

버전기능
v0.2REST API 서버 (FastAPI)
v0.3RSS, Twitter, YouTube 전사본 자동 수집
v0.4대시보드 UI (React)
v0.5예측 시장 통합 (Polymarket, Kalshi)
v0.6변조 방지 기록을 위한 블록체인 앵커링

시도해 보기

pip install signal-tracker

40개의 테스트가 통과되었습니다. MIT 라이선스. 기여를 환영합니다.

이 프레임워크는 무료입니다. 데이터가 방어벽입니다.

0 조회
Back to Blog

관련 글

더 보기 »

sunpeak은 MCP 앱에 전념한다

개요: MCP Apps는 이제 ChatGPT, Claude, Goose 및 VS Code에서 실행됩니다. Claude는 1월 26일에 MCP App 지원을 발표했으며, ChatGPT는 2월 4일에 이를 따랐습니다. 2월 현재…