Özellik Görünümleri

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, Feature nesnelerini yerel olarak oluşturun ve ardından onları Unity Kataloğu'na kaydetmek için register_feature kullanın. Yerel olarak yapılan özellikler create_training_set ile kayıt öncesinde birlikte kullanılabilir.
  • Model eğitim iş akışı
    • Makine öğrenmesi için zamana bağlı toplanmış özellikleri hesaplamak için create_training_set kullanı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.
  • Özellik maddileştirme ve sunma iş akışı
    • Bir özelliği create_feature ile tanımladıktan veya get_feature kullanarak 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çin materialize_features kullanabilirsiniz.
    • Malzemeleşmiş görünümle create_training_set kullanarak çevrimdışı toplu eğitim veri kümesini hazırlayın.

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

Dizüstü bilgisayar al

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_config sağ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ızca transformation_sql ile kullanabilirsiniz, DeltaTableSource ile 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 StreamSource kullanın. StreamSource Özellikler, P99'un uçtan uca 200 milisaniyelik gecikmesi sağlar. Önce bir Stream kur, sonra bir StreamSource' 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 DeltaTableSource kullanı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 DeltaTableSource veriyle 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 RollingWindow pencere kullanın.
  • Gerçek zamanlı olarak güncel kalması gereken uzun geriye dönük inceleme pencereleri için bir SawtoothWindow kullanın. window_duration iki 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, Count ve Avg toplama 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

Dizüstü bilgisayar al

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_features bir ç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ı entity değ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_set kullanı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 label kullanılan sütun adı, s tanımlamak Featureiçin kullanılan kaynak tablolarda bulunmamalıdır.
  • API'de create_feature sınırlı bir işlev listesi (UDAFs) desteklenir. Bkz . Desteklenen işlevler.
  • Varlık sütunları DATE veya TIMESTAMP türünde olamaz.
  • RequestSource, ScalarDataType iç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.
  • RequestSource toplama işlevlerini veya zaman pencerelerini desteklemez. Yalnızca ColumnSelection iş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_batch sunucusuz 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.