الوحدة 7 — Feast عمليًّا
كلّ ما سبق مبدأ. هذه الوحدة تُنفّذه بـFeast على مشروع الاحتيال، بأصغر تركيبة تعمل من طرف إلى طرف: Parquet محلّيًّا للمخزن غير المتّصل، Redis محلّيًّا للمخزن المتّصل، وسجلّ ملفّ. الأدوات نفسها تعمل بنفس الأوامر حين تنتقل إلى BigQuery وDynamoDB في الإنتاج.
بنية دفتر المتغيّرات
feast init fraud_repo يُنشئ الهيكل الآتي:
fraud_repo/
├── feature_store.yaml
├── data/
│ └── transactions.parquet
└── features/
└── transactions.py
feature_store.yaml يُصرّح الاستضافة:
project: fraud_scoring
registry: data/registry.db
provider: local
online_store:
type: redis
connection_string: "localhost:6379"
offline_store:
type: file
entity_key_serialization_version: 2
الانتقال إلى الإنتاج: يُغيَّر provider إلى aws أو gcp، ويُعدَّل online_store إلى DynamoDB، ويُغيَّر offline_store إلى BigQuery. بقيّة الشفرة تبقى كما هي.
تعريف الكيانات والوصفات
في features/transactions.py:
from datetime import timedelta
from feast import Entity, Field, FeatureView, FileSource
from feast.types import Int64, Float32
customer = Entity(name="customer", join_keys=["customer_id"])
transactions = FileSource(
name="transactions",
path="data/transactions.parquet",
timestamp_field="event_time",
created_timestamp_column="created_at",
)
customer_counters = FeatureView(
name="customer_counters",
entities=[customer],
ttl=timedelta(hours=2),
schema=[
Field(name="count_1h", dtype=Int64),
Field(name="count_24h", dtype=Int64),
Field(name="count_7d", dtype=Int64),
Field(name="avg_amount_7d", dtype=Float32),
],
source=transactions,
online=True,
tags={"owner": "fraud-team", "domain": "payments"},
)
created_timestamp_column مقصود: يميّز وقت الحدث (متى وقعت المعاملة) عن وقت الوصول (متى وصلت إلى النظام). Feast يستخدم هذا في الدمج الزمنيّ لتفادي تسرّب حين يتأخّر وصول حدث.