Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Important
Bu özellik Genel Önizleme aşamasındadır. Çalışma alanı yöneticileri Bu özelliğe erişimi Önizlemeler sayfasından denetleyebilir. Bkz. Azure Databricks önizlemelerini yönetme.
Özellik Görünümleri, veri kaynaklarından özellikleri tanımlamanızı ve hesaplamanızı sağlar. Özellikler çeşitli kaynaklar (Delta tablosu, Kafka Stream ve istek zamanı verileri) ve hesaplamalar (zaman pencereli toplamalar, basit sütun seçimleri ve daha fazlası) kullanılarak tanımlanabilir. Bu kılavuz aşağıdaki iş akışlarını kapsar:
-
Özellik geliştirme iş akışı
- Model eğitiminde ve iş akışlarını sunmada kullanılabilecek Unity Kataloğu özellik nesnelerini tanımlamak için kullanın
create_feature. - Alternatif olarak,
Featurenesnelerini yerel olarak oluşturun ve ardından onları Unity Kataloğu'na kaydetmek içinregister_featurekullanın. Yerel olarak yapılan özelliklercreate_training_setile kayıt öncesinde birlikte kullanılabilir.
- Model eğitiminde ve iş akışlarını sunmada kullanılabilecek Unity Kataloğu özellik nesnelerini tanımlamak için kullanın
-
Model eğitim iş akışı
- Makine öğrenmesi için zamana bağlı toplanmış özellikleri hesaplamak için
create_training_setkullanın. Özellik Görünümleri ile eğitim hakkında ayrıntılı belgeler için bkz. Özellik Görünümleri ile modelleri eğitma.
- Makine öğrenmesi için zamana bağlı toplanmış özellikleri hesaplamak için
-
Özellik maddileştirme ve sunma iş akışı
- Bir özelliği
create_featureile tanımladıktan veyaget_featurekullanarak aldıktan sonra, özelliği veya özellik kümesini verimli bir şekilde yeniden kullanmak üzere, çevrimdışı bir mağazada veya çevrimiçi sunum için çevrimiçi bir mağazada uygulatmak içinmaterialize_featureskullanabilirsiniz. - Malzemeleşmiş görünümle
create_training_setkullanarak çevrimdışı toplu eğitim veri kümesini hazırlayın.
- Bir özelliği
API ayrıntıları için bkz. Özellik Görünümleri API başvurusu.
Requirements
Sunucusuz işlem veya Databricks Runtime 17.0 ML veya üzerini çalıştıran klasik bir işlem kümesi.
Özel Python paketini yüklemeniz gerekir. Not defterini her çalıştırdığınızda aşağıdaki kod satırlarını çalıştırın:
%pip install databricks-feature-engineering>=0.16.0 dbutils.library.restartPython()
Hızlı başlangıç örneği
Çalıştırılabilir hızlı başlangıç not defteri için bkz. Örnek not defteri.
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
CronSchedule, DeltaTableSource, Feature, AggregationFunction,
Sum, Avg, ColumnSelection, TableTrigger,
TumblingWindow, SlidingWindow,
OfflineStoreConfig, OnlineStoreConfig,
)
from datetime import timedelta
CATALOG_NAME = "main"
SCHEMA_NAME = "feature_store"
TABLE_NAME = "transactions"
# 1. Create data source
source = DeltaTableSource(
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
table_name=TABLE_NAME,
)
# 2. Define features locally (no catalog/schema needed yet)
avg_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), TumblingWindow(window_duration=timedelta(days=30))),
name="avg_transaction_30d",
)
sum_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), SlidingWindow(window_duration=timedelta(days=7), slide_duration=timedelta(days=1))),
# name auto-generated: "amount_sum_sliding_7d_1d"
)
fe = FeatureEngineeringClient()
# 3. Explore features with compute_features
feature_df = fe.compute_features(features=[avg_feature, sum_feature])
feature_df.display()
# 4. Create training set using local features
# `labeled_df` should have columns "user_id", "transaction_time", and "target".
training_set = fe.create_training_set(
df=labeled_df,
features=[avg_feature, sum_feature],
label="target",
)
training_set.load_df().display()
# 5. Register features in Unity Catalog
avg_feature = fe.register_feature(
feature=avg_feature,
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
)
sum_feature = fe.register_feature(
feature=sum_feature,
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
)
# 6. Or use create_feature for a one-step define-and-register workflow
latest_amount = fe.create_feature(
source=source,
function=ColumnSelection("amount"),
entity=["user_id"],
timeseries_column="transaction_time",
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
name="latest_amount",
)
# 7. Train model
with mlflow.start_run():
training_df = training_set.load_df()
# training code
fe.log_model(
model=model,
artifact_path="recommendation_model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name=f"{CATALOG_NAME}.{SCHEMA_NAME}.recommendation_model",
)
# 8. (Optional) Materialize features for serving
# Features must be registered in UC before calling materialize_features
online_config = OnlineStoreConfig(
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
table_name_prefix="customer_features_serving",
online_store_name="customer_features_store",
)
# Aggregation features support CronSchedule or TableTrigger, and support both offline and online configs
fe.materialize_features(
features=[avg_feature, sum_feature],
offline_config=OfflineStoreConfig(
catalog_name=CATALOG_NAME,
schema_name=SCHEMA_NAME,
table_name_prefix="customer_features",
),
online_config=online_config,
trigger=CronSchedule(
quartz_cron_expression="0 0 * * * ?", # Hourly
timezone_id="UTC",
),
)
# ColumnSelection features use TableTrigger and only support online config
fe.materialize_features(
features=[latest_amount],
online_config=online_config,
trigger=TableTrigger(),
)
Örnek not defteri
Özellik Görünümleri hızlı başlangıç not defteri
Akış özellikleri
Özellik değerlerinin toplu zamanlama yerine sürekli olarak güncellenmesi gerektiğinde akış özelliklerini kullanın. Akış ve toplu özellikler aynı Feature yapıcıları, toplama fonksiyonlarını ve eğitim ve hizmet akışlarını kullanır.
Akış özellikleri çevrimdışı mağazada kullanılamaz. Eğitim ve toplu çıkarım için Databricks, kaynak özellikler değerlerini hesaplar.
Yayın özelliklerinin aşağıdaki gereksinimleri vardır:
- Bir
online_configsağlamalısınız. Akış özellikleri,offline_configöğesini desteklemez. - Akış ve toplu iş özelliklerini tek bir
materialize_featuresçağrısında birleştiremezsiniz. Her tetikleyici türü için ayrı bir çağrı yapın. -
StreamSourceöğesini yalnızcatransformation_sqlile kullanabilirsiniz,DeltaTableSourceile değil. - Akışlı materyalizasyon işlemleri yalnızca boru hattı başladıktan sonra gelen kayıtları işler ve geçmiş kayıtları geriye dönük olarak tamamlamaz. Kayan pencere toplamaları, yalnızca ilk tam veri penceresi oluştuğunda tam sonuçlar döndürür.
Bir yayın özelliği kaynağı seçmek
Tazelik gereksinimlerinize ve mevcut tüketim kurulumunuza göre bir kaynak seçin:
- Saniyenin altındaki güncellik öncelikliyse bir
StreamSourcekullanın.StreamSourceÖzellikler, P99'un uçtan uca 200 milisaniyelik gecikmesi sağlar. Önce bir Stream kur, sonra birStreamSource' ile referans ver. Akış kaynakları, girdi olarak Kafka’yı destekler ve eğitim için verilerin geçmişe dönük bir kopyası olarak bir alım Delta tablosunu otomatik olarak sürdürür. - Delta tablosuna zaten düşük gecikmeli bir veri alım hattınız varsa bir
DeltaTableSourcekullanın. Güncelliğin onlarca saniye düzeyinde olmasını bekleyin. - Halihazırda düşük gecikmeli bir veri alım hattına sahip değilseniz, bir
DeltaTableSourceveriyle doldurmak için Zerobus kullanın. Zerobus veri alımı yaklaşık onlarca saniye sürdüğünden, özelliklerin güncelliğinin bir dakikanın altında olmasını bekleyebilirsiniz.
StreamSource kullanarak bir akış özelliği tanımlayın
StreamSource, bir Stream'e üç parçalı adıyla (catalog.schema.stream_name) başvurur. Akış, Unity Catalog'da güvenli bir nesne değildir; ancak Unity Catalog şeması kapsamındadır ve erişim, akışın alma tablosu tarafından yönetilir. Kafka iletisinin hangi bölümünün okunacağını belirtmek için, varlık, zaman serisi ve işlev tanımlarındaki sütun başvurularının önüne value. veya key. getirilmelidir. İç içe alanlar nokta gösterimi kullanılarak desteklenir (örneğin, value.user.address.city).
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
StreamSource,
Feature,
AggregationFunction,
Sum,
RollingWindow,
)
from datetime import timedelta
client = FeatureEngineeringClient()
stream_source = StreamSource(
full_name="my_catalog.my_schema.my_stream",
)
feature = Feature(
name="user_purchase_sum",
source=stream_source,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=AggregationFunction(
operator=Sum(input="value.amount"),
time_window=RollingWindow(window_duration=timedelta(hours=1)),
),
)
DeltaTableSource kullanarak bir akış özelliği tanımlayın
Bir DeltaTableSource üzerinde tanımlanan bir özelliği akış özelliği olarak somutlaştırmak için, StreamingMode öğesini materialize_features için tetikleyici olarak geçirin. Özellik tanımı, bir DeltaTableSource tarafından desteklenen toplu özellikle aynı API'leri kullanır. Delta tablo kaynakları toplama ve sütun seçimi özelliklerini destekler.
Kaynak Delta tablosunda, delta.enableChangeDataFeed=true ayarı yapılarak değişiklik verileri akışı (CDF) etkinleştirilmiş olmalıdır.
Aşağıdaki örnek, bir Delta tablo kaynağına sahip bir toplama özelliğini tanımlar ve gerçekleştirir.
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
DeltaTableSource,
AggregationFunction,
OnlineStoreConfig,
Sum,
RollingWindow,
StreamingMode,
)
from datetime import timedelta
client = FeatureEngineeringClient()
source = DeltaTableSource(
catalog_name="my_catalog",
schema_name="my_schema",
table_name="transactions",
)
feature = client.create_feature(
catalog_name="my_catalog",
schema_name="my_schema",
name="user_purchase_sum",
source=source,
entity=["user_id"],
timeseries_column="event_time",
function=AggregationFunction(
operator=Sum(input="amount"),
time_window=RollingWindow(window_duration=timedelta(hours=1)),
),
)
online_config = OnlineStoreConfig(
catalog_name="my_catalog",
schema_name="my_schema",
table_name_prefix="streaming_features",
online_store_name="my_online_store",
)
client.materialize_features(
features=[feature],
online_config=online_config,
trigger=StreamingMode(),
)
Zerobus tarafından doldurulmuş bir Delta tablosu kullanın
Zerobus tarafından doldurulan bir Delta tablosu, bir akış özelliği kaynağı olarak hizmet verebilir. Zerobus, delta.enableChangeDataFeed=true öğesini otomatik olarak ayarlamaz. Bu özelliği akış özelliği kaynağı olarak kullanmadan önce hedef Delta tablosunda manuel olarak ayarlamanız gerekir.
Akış kaynaklarındaki filtreleme koşulları
StreamSource veya DeltaTableSource için toplama işleminden önce satırları filtrelemek üzere filter_condition kullanın.
stream_source = StreamSource(
full_name="my_catalog.my_schema.my_stream",
filter_condition="value.event_type = 'purchase'",
)
StreamSource'u Dönüştür
transformation_sql, toplama veya sütun seçiminden önce, value ve key struct'larına nokta önekli başvurular kullanarak bir Spark SQL projeksiyonu uygular. Sadece satırlı ifadeleri destekler. Desteklenen ve desteklenmeyen işlemlerin tam listesi için Desteklenen transformation_sql ifadeler sayfasına bakınız.
transformation_sql ayarladığınızda, şunu da belirtmelisiniz: öngörülen çıktının Spark dataframe_schema JSON'u olan StructType. Bu şemayı elle yazmak yerine, aynı projeksiyonu Stream’in alma tablosu üzerinde çalıştırarak da türetebilirsiniz; bu tablo value ve key yapılarını ortaya çıkarır. Belirtildiğinde LIMIT 0, SELECT cümle şemayı veri okumadan döndürür:
from databricks.feature_engineering.entities import StreamSource
transformation_sql = (
"value.amount * value.conversion_rate AS converted_amount, "
"struct(value.user_id AS user_id, value.event_time AS time) AS event"
)
ingestion_table = "my_catalog.my_schema.events_ingestion"
dataframe_schema = spark.sql(
f"SELECT {transformation_sql} FROM {ingestion_table} LIMIT 0"
).schema.json()
stream_source = StreamSource(
full_name="my_catalog.my_schema.my_stream",
transformation_sql=transformation_sql,
dataframe_schema=dataframe_schema,
)
Akış kaynaklarından sütun seçimi
ColumnSelection özellikler, her varlık anahtarı için en son değeri kaynaktan toplama olmadan geçer. Eğitim sırasında, özellik değerleri belirli bir andaki doğruluğu korur.
Sütun seçimi özellikleri TTL’ye sahip değildir. Seçilen bir değeri çevrimiçi mağazadan kaldırmak için, kaynak seçilen sütun için null bir değer yaymalıdır.
from databricks.feature_engineering.entities import ColumnSelection
passenger_count = Feature(
name="passenger_count",
source=stream_source,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=ColumnSelection(column="value.passenger_count"),
)
İç içe alanlara StreamSource'tan erişin
A StreamSourceiçin, iç içe JSON alanlarına nokta gösterimi kullanarak erişebilirsiniz (örneğin, ). value.nested_field.amount Sunum sırasında istek yükü ile yanıt, yaprak düğüm adlarını kullanır (örneğin, amount yerine value.amount). Yaprak düğüm adları, bir model veya Özellik Spesifikasyonu içindeki tüm varlık isimleri, zaman serileri ve özellik adları arasında benzersiz olmalıdır, çünkü hizmet veren uç nokta değerleri yönlendirmek için yaprak isimlerini kullanır.
Akış özellikleri için zaman pencereleri
Streaming özellikleri, toplulaştırmalar için SawtoothWindow ve RollingWindow öğelerini destekler.
TumblingWindow ve SlidingWindow sabit tarihsel aralıklar üzerinden toplu hesaplama için tasarlanmıştır ve akış kaynaklarıyla kullanılamaz.
- Kısa geri dönüş pencereleri için en güncel verileri sürekli yeniden hesaplayan bir
RollingWindowpencere kullanın. - Gerçek zamanlı olarak güncel kalması gereken uzun geriye dönük inceleme pencereleri için bir
SawtoothWindowkullanın.window_durationiki günden fazla olmalıdır (zorunlu minimum), ancak 7 günden uzun süreler için testere dişli pencere önerilir. Daha kısa pencereler için ise rulo pencere kullanın. Testere dişi pencere, pencerenin büyük kısmını Akış’ın içe alım tablosundan ve yalnızca en son iki günü canlı akıştan alır; bu sayede her olayda pencerenin tamamını yeniden hesaplamaktan kaçınır.Max,StddevPop,VarSamp,VarPop,First,Last,StddevSamp,Sum,Min,CountveAvgtoplama fonksiyonlarını destekler. Stream’in içeri alma tablosu, en az tam pencere süresini kapsayacak verileri zaten içermelidir ve özellik, materyalizasyon başladıktan yaklaşık iki gün sonra sunuma hazır hâle gelir.
Important
SawtoothWindow beta sürümündedir.
Aşağıdaki örnek, StreamSource üzerinde testere dişi penceresine sahip 30 günlük bir akış özelliğini tanımlar.
from databricks.feature_engineering.entities import (
StreamSource, Feature, AggregationFunction, Sum, SawtoothWindow,
)
from datetime import timedelta
stream_source = StreamSource(full_name="my_catalog.my_schema.my_stream")
user_spend_30d = Feature(
name="user_spend_30d",
source=stream_source,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=AggregationFunction(
operator=Sum(input="value.amount"),
time_window=SawtoothWindow(window_duration=timedelta(days=30)),
),
)
Akış özellikleri örnek not defteri
Akış Özellik Görünümleri Hızlı Başlangıç Not Defteri
Model eğitimi ve çıkarımı
Modelleri eğitmek ve log_model(), score_batch() ve create_training_set() dâhil olmak üzere Özellik Görünümleriyle toplu çıkarım gerçekleştirmek için Özellik Görünümleriyle modelleri eğitme bölümüne bakın.
Özellik somutlaştırma
Özellikleri tanımladıktan sonra, eğitim ve hizmet iş akışlarında verimli bir şekilde yeniden kullanmak için bunları çevrimdışı veya çevrimiçi mağazalarda gerçekleştirebilirsiniz. Özellikleri gerçekleştirdikten sonra, CPU modeli sunma özelliğini kullanarak modelleri servis edebilirsiniz. Ayrıntılar için bkz. Özellik Görünümlerini Somutlaştırma.
En iyi yöntemler
Özellik adlandırma
- İş açısından kritik özellikler için açıklayıcı adlar kullanın.
- Ekipler arasında tutarlı adlandırma kurallarını izleyin.
- Özellik geliştirmeye başlarken otomatik olarak oluşturulan adları kullanın.
Zaman aralıkları
- Pencere sınırlarını iş döngüleriyle (günlük, haftalık) hizalayın.
- Kısa pencereler son eğilimleri yakalar ancak gürültülü olabilir. Daha uzun pencereler daha kararlı özellik dağıtımları üretir, ancak son davranış değişikliklerini kaçırabilir. Kullanım örneğiniz için temel alınan sinyalin ne kadar hızlı değiştiğine göre seçin. Örneğin, 7 günlük bir pencere günlük dalgalanmaları düzeltir ve tutarlı model girişleri üretirken, 1 saatlik bir zaman aralığı davranış değişikliklerine hızlı tepki verir, ancak model performansını düşüren varyansa neden olabilir. Dağıtım kaydığında modelinizin doğruluğu azalırsa girişleri dengelemek için daha uzun bir pencere kullanın.
- Atlayan ve kayan pencereler, sıralı (sürekli) pencerelerden daha ölçeklenebilir. Çoğu kullanım örneği için kayan pencerelerle başlayın.
Performance
- Veri taramalarını en aza indirmek için aynı veri kaynağındaki özellikleri tek
materialize_featuresbir çağrıda gerçekleştirin. - Gerçekleştirme sırasında daha iyi gruplandırma sağlamak için aynı veri kaynağındaki özellikler için aynı ayrıntı düzeyini (örneğin, 1 saatlik veya 1 günlük slayt sürelerinin tümü) kullanın.
Varlık sütunları ve filtre koşulları karşılaştırması
Aynı kaynak tablodaki özelliklerle çalışırken bu karar kılavuzunu kullanın:
Farklı toplama düzeylerine ihtiyacınız olduğunda (üzerindeentity) kullanın create_feature :
-
Müşteri düzeyinde özellikler (müşteri başına bir satır):
entity=["customer_id"] -
Müşteri-satıcı özellikleri (müşteri başına birden çok satır):
entity=["customer_id", "merchant_id"] -
Farklı toplama düzeyleri aynı
DeltaTableSourcedeğeri paylaşabilir: Her özellik tanımında farklıentitydeğerler belirtin
Satırları aynı toplama düzeyinde filtrelemeniz gerektiğinde,filter_condition (üzerinde DeltaTableSource) kullanın:
-
Yalnızca yüksek değerli işlemler:
filter_condition="amount > 100"(yine de müşteri başına toplanır) -
Yalnızca tamamlanan siparişler:
filter_condition="status = 'completed'"(yine de müşteri başına toplanır)
Temel kural: Değişikliğiniz varlık değeri başına farklı sayıda satırla sonuçlanırsa özellik tanımlarınızda farklı entity değerler kullanın. Yalnızca aynı toplamaya katkıda bulunan satırları filtreliyorsanız kaynakta kullanın filter_condition .
Ortak desenler
Müşteri analizi
from databricks.feature_engineering.entities import AggregationFunction, Sum, Count, RollingWindow
fe = FeatureEngineeringClient()
features = [
# Recency: Number of transactions in the last day
fe.create_feature(catalog_name="main", schema_name="ecommerce", source=transactions,
entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Count(input="transaction_id"), RollingWindow(window_duration=timedelta(days=1)))),
# Frequency: transaction count over the last 90 days
fe.create_feature(catalog_name="main", schema_name="ecommerce", source=transactions,
entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Count(input="transaction_id"), RollingWindow(window_duration=timedelta(days=90)))),
# Monetary: total spend in the last month
fe.create_feature(catalog_name="main", schema_name="ecommerce", source=transactions,
entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=30)))),
]
Eğilim çözümlemesi
# Compare recent vs. historical behavior
fe = FeatureEngineeringClient()
recent_avg = fe.create_feature(
catalog_name="main", schema_name="ecommerce",
source=transactions, entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
historical_avg = fe.create_feature(
catalog_name="main", schema_name="ecommerce",
source=transactions, entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), RollingWindow(window_duration=timedelta(days=7), delay=timedelta(days=7))),
)
Mevsimsel desenler
# Same day of week, 4 weeks ago
fe = FeatureEngineeringClient()
weekly_pattern = fe.create_feature(
catalog_name="main", schema_name="ecommerce",
source=transactions, entity=["user_id"], timeseries_column="transaction_time",
function=AggregationFunction(Avg(input="amount"), RollingWindow(window_duration=timedelta(days=1), delay=timedelta(weeks=4))),
)
Sınırlamalar
- Api'de
create_training_setkullanıldığında varlık ve zaman aralığı sütunlarının adları eğitim (etiketli) veri kümesi ile özellik tanımları arasında eşleşmelidir. - Eğitim veri kümesinde sütun olarak
labelkullanılan sütun adı, s tanımlamakFeatureiçin kullanılan kaynak tablolarda bulunmamalıdır. - API'de
create_featuresınırlı bir işlev listesi (UDAFs) desteklenir. Bkz . Desteklenen işlevler. - Varlık sütunları
DATEveyaTIMESTAMPtüründe olamaz. -
RequestSource,ScalarDataTypeiçinde tanımlanan yalnızca skaler veri türlerini destekler:INTEGER,FLOAT,BOOLEAN,STRING,DOUBLE,LONG,TIMESTAMP,DATE,SHORT. Diziler, haritalar ve yapılar gibi karmaşık türler desteklenmez. -
RequestSourcetoplama işlevlerini veya zaman pencerelerini desteklemez. YalnızcaColumnSelectionişlevler kullanılabilir. - Varlık sütunu adları, zaman aralıkları sütun adları ve istek özelliği sütun adları kümesi, bir eğitim kümesindeki veya hizmet uç noktasındaki tüm kaynaklar arasında genel olarak benzersiz olmalıdır.
-
score_batchsunucusuz işlemde başarılı olmayabilir. Databricks Runtime 17.0 ML veya üzerini çalıştıran klasik bir işlem kümesi kullanarak bu sorunu geçici olarak düzeltin.
Gerçekleştirmeye özgü sınırlamalar için bkz. Sınırlamalar.