שוק הקריפטו הוא קרקע פורייה למידע כוזב. התנודתיות גבוהה: ציוץ מזויף אחד על רישום בבינאנס או פריצה לפרוטוקול יכול להזיז את המחיר בעשרות אחוזים. תוכניות פאמפ אנד דאמפ מתחילות במניפולציית מידע. אנו בונים מודלים מותאמים אישית לסיווג חדשות מזויפות בקריפטו — מאיסוף מערך נתונים ועד פריסה. אנו משתמשים בטכניקות NLP המותאמות לקריפטו: כוונון עדין של FinBERT על קורפוס קריפטו ואימות טענות חדשות על-רשת. זיהוי דיסאינפורמציה בקריפטו הוא המומחיות שלנו. אנו יכולים להעריך את הפרויקט שלך ולהציע פתרון.
פיתוח מסווג כזה הוא משימת NLP עם מספר אתגרים ייחודיים: טרמינולוגיה ספציפית לתחום, מהירות הפצת מידע (ידיעה חדשותית מתיישנת תוך שעות), תוכן רב-לשוני והסתרה מכוונת על ידי מחברי חדשות מזויפות. אנו משתמשים בטכנולוגיות מודרניות: PyTorch, HuggingFace Transformers, כוונון עדין של FinBERT על קורפוס קריפטו. התוצאה היא מערכת שמסמנת אוטומטית דיסאינפורמציה עם recall > 0.85 ו-precision > 0.90.
אילו סוגי זיופים אנו מבחינים?
לפני בניית מודל, עלינו להגדיר מה בדיוק אנו מסווגים. "חדשות מזויפות" הוא מונח רחב מדי. אנו מסווגים כך:
| קטגוריה | דוגמה | אימות |
|---|---|---|
| רישום מזויף | "טוקן X יירשם בבינאנס מחר" | בדיקת בריכת Uniswap, חשבון רשמי של הבורסה |
| שותפות מזויפת | "פרוטוקול A משתלב עם B" | אינטראקציה בין חוזים על-רשת |
| ניצול מומצא | "פרוטוקול C נפרץ, הפסיד 10 מיליון דולר" | שינוי ב-TVL ב-DeFiLlama |
| תוכן שילינג | "100x מובטח, הביטקוין הבא" | ניתוח דפוסי טקסט, גילוי אינטרס פיננסי |
| התחזות | חשבון Vitalik_Buterin_ עם שגיאת כתיב | בדיקת אימות, שגיאות דקדוקיות |
לכל קטגוריה יש דפוסי טקסט, מקורות ושיטות אימות משלה. המודל מסווג לפי קטגוריה, לא רק בינארי מזויף/אמיתי.
כיצד אנו אוספים נתוני אימון?
האתגר המרכזי הוא היעדר מערך נתונים מוכן. מערכי נתונים קיימים (LIAR, FakeNewsNet) אינם מכסים את הפרטים של קריפטו.
מקורות נתונים:
- Twitter/X API: Academic Research API מספק גישה לנתונים היסטוריים. אנו מסננים חשבונות עם יותר מ-1,000 עוקבים בתחום הקריפטו, האשטאגים #bitcoin, #defi, מילות מפתח של פרוטוקולים.
- Telegram: Telethon לניתוח ערוצים ציבוריים. מקור חשוב הוא ערוצי פאמפ אנד דאמפ.
- Reddit: r/CryptoCurrency, r/Bitcoin, r/CryptoMoonShots דרך Pushshift API.
- אגרגטורי חדשות: CoinDesk, Cointelegraph, Decrypt — חדשות מאומתות (מחלקה חיובית).
אימות צולב אוטומטי: אם ידיעה חדשותית מופיעה בטוויטר אך אינה מאושרת על ידי ערוצים רשמיים תוך 24 שעות — ככל הנראה מזויפת; אם היא סותרת נתונים על-רשת — ככל הנראה מזויפת מאוד. תיוג אנושי באמצעות מיקור המונים עם מומחי תחום. כל דוגמה מתויגת על ידי לפחות שלושה מתייגים, הסכמה בין מתייגים > 0.7.
from datasets import Dataset
import pandas as pd
# Структура датасета
example_schema = {
'id': str,
'text': str,
'source': str,
'author': str,
'timestamp': str,
'label': int,
'category': str,
'confidence': float,
'verification_sources': list,
'mentioned_tokens': list,
'mentioned_exchanges': list,
}
def balance_dataset(df: pd.DataFrame, target_ratio: float = 0.4) -> pd.DataFrame:
fake = df[df['label'] == 1]
real = df[df['label'] == 0]
n_fake = len(fake)
n_real_target = int(n_fake / target_ratio * (1 - target_ratio))
real_sampled = real.sample(n=min(n_real_target, len(real)), random_state=42)
return pd.concat([fake, real_sampled]).sample(frac=1, random_state=42) ארכיטקטורת המודל
הנדסת תכונות: מה חשוב לזיופי קריפטו
אותות טקסט של זיופים:
- הייפ מוגזם ללא פרטים ("100x מובטח", "הביטקוין הבא")
- דחיפות ("קנה עכשיו", "הזדמנות אחרונה")
- שמות של פרויקטים/אישים ידועים ללא הקשר
- שגיאות דקדוקיות (חשבונות מתחזים לרוב מרושלים)
תכונות מטא-דאטה:
- גיל החשבון והיסטוריית פרסומים
- יחס עוקבים/מעקבים (0.01 חשוד)
- מהירות הפצה (ויראליות בשעה הראשונה)
- דפוס זמני (פרסום בשעה 3:00 UTC)
קו בסיס: TF-IDF + Logistic Regression / XGBoost. מודל ראשי: FinBERT (BERT פיננסי), מכוונן על קורפוס קריפטו. אנסמבל סופי: gradient boosting על שרשור של CLS embeddings ותכונות מטא. שילוב זה מדויק משמעותית: האנסמבל מדויק פי 1.15 מ-FinBERT לבדו.
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
class CryptoFakeNewsClassifier:
def __init__(self, model_name: str = 'ProsusAI/finbert'):
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.text_model = AutoModelForSequenceClassification.from_pretrained(
model_name,
num_labels=6
)
self.meta_classifier = GradientBoostingClassifier(
n_estimators=300,
max_depth=6,
learning_rate=0.05
)
def extract_text_features(self, texts: list[str]) -> np.ndarray:
self.text_model.eval()
all_embeddings = []
batch_size = 32
for i in range(0, len(texts), batch_size):
batch = texts[i:i+batch_size]
inputs = self.tokenizer(
batch,
max_length=512,
truncation=True,
padding=True,
return_tensors='pt'
)
with torch.no_grad():
outputs = self.text_model(**inputs, output_hidden_states=True)
cls_embeddings = outputs.hidden_states[-1][:, 0, :]
all_embeddings.append(cls_embeddings.numpy())
return np.vstack(all_embeddings)
def extract_meta_features(self, posts: list[dict]) -> np.ndarray:
features = []
for post in posts:
account_age_days = (
pd.Timestamp.now() - pd.Timestamp(post['account_created'])
).days
feature_vector = [
account_age_days,
post.get('followers_count', 0),
post.get('following_count', 1),
post.get('followers_count', 0) / max(post.get('following_count', 1), 1),
post.get('tweet_count', 0),
post.get('retweet_count', 0),
post.get('like_count', 0),
int(post.get('verified', False)),
len(post.get('text', '')),
post.get('text', '').count('!'),
post.get('text', '').count('$'),
np.sin(2 * np.pi * pd.Timestamp(post['created_at']).hour / 24),
np.cos(2 * np.pi * pd.Timestamp(post['created_at']).hour / 24),
int('http' in post.get('text', '')),
sum(1 for token in KNOWN_TOKENS if token.lower() in post.get('text', '').lower()),
]
features.append(feature_vector)
return np.array(features)
def predict(self, posts: list[dict]) -> dict:
texts = [p['text'] for p in posts]
text_features = self.extract_text_features(texts)
meta_features = self.extract_meta_features(posts)
combined = np.hstack([text_features, meta_features])
probabilities = self.meta_classifier.predict_proba(combined)
predictions = self.meta_classifier.predict(combined)
return {
'predictions': predictions,
'probabilities': probabilities,
'labels': ['real', 'fake_listing', 'fake_partnership', 'fake_exploit', 'shill', 'impersonation']
} כוונון עדין על תחום הקריפטו
FinBERT אומן על חדשות פיננסיות אך אינו מתמחה בקריפטו. כוונון עדין על קורפוס קריפטו משפר משמעותית את האיכות: recall לזיופים עולה ב-5–7%. אנו משתמשים במשקלי מחלקות מותאמים לאיזון: מחלקות זיוף מקבלות עונש גבוה יותר על החמצות.
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
output_dir='./crypto-fake-news-model',
num_train_epochs=5,
per_device_train_batch_size=16,
per_device_eval_batch_size=32,
warmup_steps=500,
weight_decay=0.01,
evaluation_strategy='epoch',
save_strategy='epoch',
load_best_model_at_end=True,
metric_for_best_model='f1_macro',
) מקרה אמיתי: זיהוי אותות פאמפ אנד דאמפ
פרסנו מודל זה עבור חברת מסחר המנטרת מדיה חברתית לתוכניות פאמפ אנד דאמפ. האתגר: קבוצת הפאמפ מפרסמת הודעת רישום מזויפת, המודל חייב לסמן אותה תוך דקות כדי למנוע הפסדים. האנסמבל שלנו השיג זמן זיהוי של פחות מ-5 דקות עם שיעור חיובי שגוי מתחת ל-5%. במקרה אחד, ציוץ מזויף על "רישום בבינאנס" לטוקן לא ידוע סומן תוך 2 דקות, ומנע הפסדים מוערכים של 200,000 דולר מפאמפ מתואם. היכולת של המודל לשלב אימות על-רשת (לא הייתה בריכה אמיתית) עם אותות טקסט (דחיפות, גיל חשבון) עשתה את ההבדל.
מדוע אימות על-רשת חשוב?
יתרון ייחודי של תחום הקריפטו: טענות רבות ניתנות לאימות על-רשת. טענת רישום ב-Uniswap V3 — בדוק דרך Uniswap Subgraph אם קיימת בריכה. טענת ניצול — בדוק שינוי ב-TVL ב-DeFiLlama בתקופה הנטענת. טענת שותפות — חפש אינטראקציה בין חוזים על-רשת. זו בדיקה דטרמיניסטית המשפרת מאוד את הדיוק לקטגוריות עם טביעת רגל על-רשת.
import aiohttp
async def verify_listing_claim(token_address: str, dex: str = 'uniswap_v3') -> dict:
if dex == 'uniswap_v3':
query = """
query PoolsForToken($token: String!) {
pools(where: { or: [ { token0: $token }, { token1: $token } ] }, first: 5) {
id
token0 { symbol }
token1 { symbol }
liquidity
totalValueLockedUSD
createdAtTimestamp
}
}
"""
async with aiohttp.ClientSession() as session:
async with session.post(
'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3',
json={'query': query, 'variables': {'token': token_address.lower()}}
) as response:
data = await response.json()
pools = data.get('data', {}).get('pools', [])
return {
'listing_exists': len(pools) > 0,
'pools': pools,
'total_tvl': sum(float(p['totalValueLockedUSD']) for p in pools)
}
async def verify_exploit_claim(protocol: str, claimed_amount_usd: float, claim_timestamp: int) -> dict:
async with aiohttp.ClientSession() as session:
async with session.get(
f'https://api.llama.fi/protocol/{protocol}'
) as response:
data = await response.json()
tvl_history = data.get('tvl', [])
before_tvl = get_tvl_at_timestamp(tvl_history, claim_timestamp - 3600)
after_tvl = get_tvl_at_timestamp(tvl_history, claim_timestamp + 3600)
tvl_drop = before_tvl - after_tvl if before_tvl > after_tvl else 0
return {
'tvl_drop_detected': tvl_drop > 0,
'detected_amount': tvl_drop,
'claimed_amount': claimed_amount_usd,
'plausible': abs(tvl_drop - claimed_amount_usd) / claimed_amount_usd < 0.3
}
כיצד להעריך את איכות המודל?
לזיהוי זיופים, דיוק הוא מדד מטעה. אם 90% מהדוגמאות אמיתיות, מודל שתמיד חוזה "אמיתי" מקבל 90% דיוק. מדדים מרכזיים: precision, recall, F1 לכל מחלקה. תשומת לב מיוחדת ל-recall למחלקות זיוף: החמצת זיוף גרועה מאזעקת שווא.
מדדי ייצור יעד: recall לזיהוי זיופים > 0.85, precision לאמיתיים > 0.90, F1 מקרו > 0.82. אנו מנטרים יציבות זמנית: המודל חייב לשמור על איכות על נתונים חדשים, לכן אנו מאמנים מחדש מדי חודש.
השוואת גישות:
| מודל | דיוק (F1 מקרו) | מהירות עיבוד | מורכבות יישום |
|---|---|---|---|
| TF-IDF + XGBoost | 0.72 | 1000 בקשות/שנייה | נמוכה |
| FinBERT (ללא כוונון עדין) | 0.78 | 100 בקשות/שנייה | בינונית |
| FinBERT + אנסמבל (שלנו) | 0.85 | 80 בקשות/שנייה | גבוהה |
הארכיטקטורה שלנו מספקת F1 גבוה ב-18% מ-TF-IDF + XGBoost. הנזק האופייני מציוץ מזויף מוצלח אחד מוערך ב-10,000–500,000 דולר.
from sklearn.metrics import classification_report, roc_auc_score
import pandas as pd
def evaluate_model(y_true, y_pred, y_proba, class_names):
report = classification_report(
y_true,
y_pred,
target_names=class_names,
output_dict=True
)
df_report = pd.DataFrame(report).T
fake_classes = [c for c in class_names if c != 'real']
fake_f1_avg = df_report.loc[fake_classes, 'f1-score'].mean()
print(f"Fake detection F1 (macro avg): {fake_f1_avg:.3f}")
print(f"Real precision: {df_report.loc['real', 'precision']:.3f}")
binary_labels = (y_true > 0).astype(int)
binary_proba = 1 - y_proba[:, 0]
auc = roc_auc_score(binary_labels, binary_proba)
print(f"AUC-ROC (fake vs real): {auc:.3f}")
return df_report
מה כלול בעבודה
- איסוף ותיוג מערך נתונים (50,000+ דוגמאות) עם אימות אוטומטי וידני
- כוונון עדין של FinBERT על הקורפוס שלך (או על הקורפוס הציבורי שלנו)
- פיתוח צינור עיבוד עם אימות על-רשת דרך The Graph, DeFiLlama
- פריסה במיכל Docker עם FastAPI, Kafka לסטרימינג, ניטור concept drift
- התראות על זיהוי זיופים עם ספים ניתנים להגדרה
- תיעוד API ומדריך משתמש
תהליך העבודה
- ניתוח: אנו לומדים את מקורות הנתונים שלך, מגדירים קטגוריות זיוף יעד
- עיצוב: בחירת הטכנולוגיות, עיצוב מערך הנתונים וצינור האימות
- יישום: איסוף נתונים, אימון מודל בסיס ומודל טרנספורמר, איטרציות
- בדיקות: הערכה על נתונים היסטוריים וחדשים, בדיקות A/B
- פריסה: הטמעה בתשתית שלך, אינטגרציה עם שירותים קיימים
לוח זמנים משוער
מ-3 עד 4 חודשים למערכת מוכנה לייצור. איסוף ותיוג מערך נתונים — 6–8 שבועות, אימון מודל — 4–6 שבועות, פריסה וניטור — 3–4 שבועות. עלות מחושבת באופן אישי.
לצוות שלנו יש ניסיון של 8+ שנים ב-NLP וב-blockchain, עם 30+ פרויקטים שהושלמו בסיווג תוכן. חיסכון ממניעת הפסדים עקב חדשות מזויפות יכול להגיע למאות אלפי דולרים. צור קשר להערכת פרויקט — נבחר את הפתרון האופטימלי. בקש פיתוח מודל היום.







