Phase 05: NLP: Foundations to Advanced

Diyalog Durum Takip

"Şimalde ucuz bir restoran istiyorum... aslında onu moderat yapıp İtalyanca ekle". Üç dönüş, üç devlet güncelleme.

Type: Build

Languages: Python

Prerequisites: Phase 5 · 17 (Chatbots), Phase 5 · 20 (Structured Outputs)

Time: ~75 minutes

Sorun

Görev odaklı bir diyalog sisteminde, kullanıcı hedefi bir slot değer çiftleri kümesi olarak kodlanır: {cuisine: italian, area: north, price: moderate}Her kullanıcı bir yuva ekleyebilir, değiştirebilir veya kaldırabilir. Sistem tüm konuşmayı okumalı ve mevcut durumu doğru şekilde çıkartmalıdır.

Bir slot yanlış olursa sistem yanlış restoranı kaydeder, yanlış uçuşu programlar veya yanlış kartı ücretlendirir.

2026 yılında LLM'lere rağmen neden hâlâ önemli:

  • Uyumluğa duyarlı alanlar (bankacılık, sağlık, hava yolculuğu rezervasyonu) serbest biçim üretimi değil, belirleyici slot değerlerini gerektirir.
  • Araç kullanımı ajanları hala API'leri aramak için boşluk çözünürlüğüne ihtiyaç duyarlar.
  • Çok dönüşlü düzeltme görünüşünden daha zor: "Gerçekten hayır, Perşembe yapın".

Modern boru hattı: klasik DST kavramları + LLM ekstraktörleri + yapılandırılmış çıkış koruyucu rayları.

Anlaşım

!DST: dialog history → slot-value state

Task structure.Bir şema alanları (restaurant, otel, taksi) ve yuvalarını (mutfak, alan, fiyat, insanlar) tanımlar. Her yuva boş olabilir, kapalı bir setten bir değerle doldurulabilir ( fiyat: { ucuz, ortalama, pahalı}), veya serbest bir değerle (adı: "Bakır Kettle ").

Two DST formulations.

  • Classification.Her (slot, candidate_value) çift için evet/hayır tahmin edin. Kapalı kelime slots için çalışır. 2020'ye kadar standart.
  • Generation.Diyaloglar verildiğinde, boş metin olarak slot değerleri oluşturun. Açık kelime slots için çalışır. Modern varsayılan.

Metric.Ortak Hedef Düzgünliği (JGA) her slotun doğru olduğu virajların bölümü.

Architectures.

  1. Rule-based (slot regex + keyword).Sıkı alanlar için güçlü bir başlangıç çizgisi.
  2. TripPy / BERT-DST.BERT kodlaması ile kopyalı üretim.
  3. LDST (LLaMA + LoRA).Eğitim ayarlı ve domen yuvası uyarı ile LLM. MultiWOZ 2.4 üzerinde ChatGPT seviyesine ulaşır.
  4. Ontology-free (2024–26).Şema atlayın; doğrudan slot isimleri ve değerleri oluşturun. Açık alanları ele alır.
  5. Prompt + structured output (2024–26).LLM Pydantic şema + kısıtlı çözme. 5 satır kod, üretim hazır.

Klasik başarısızlık modları

  • Co-reference across turns."İlk seçeneği seçelim". Hangi seçeneği çözmek gerekiyor.
  • Over-write vs append.Kullanıcı "İtalyanca ekle" diyor.
  • Implicit confirmations."OK güzel" Bu teklif edilen rezervasyonu kabul etti mi?
  • Correction."Aslında saat 7'de olsun". Başka yerleri açmadan saatleri güncellemeli.
  • Coreference to previous system utterance."Evet, o. " Hangi "o"?

Yapın

Adım 1: Kurallara dayalı yuva çıkarıcı

Bakın .code/main.py. Regex + eşya sözlükleri , sıkı alanlarda bulunan kanonik ifadelerin % 70'ini kapsar:

pythonCUISINE_SYNONYMS = {
    "italian": ["italian", "pasta", "pizza", "italy"],
    "chinese": ["chinese", "chow mein", "noodles"],
}


def extract_cuisine(utterance):
    for canonical, synonyms in CUISINE_SYNONYMS.items():
        if any(syn in utterance.lower() for syn in synonyms):
            return canonical
    return None

Kanonik kelimeforum dışında kırık, belirleyici boşluk onayları için çalışır.

Adım 2: Durum güncelleme döngüsü

pythondef update_state(state, utterance):
    new_state = dict(state)
    for slot, extractor in SLOT_EXTRACTORS.items():
        value = extractor(utterance)
        if value is not None:
            new_state[slot] = value
    for slot in NEGATION_CLEARS:
        if is_negated(utterance, slot):
            new_state[slot] = None
    return new_state

Üç değişken:

  • Kullanıcının dokunmadığı bir yuva asla yeniden ayarlamayın.
  • Açık bir inkar ("mutfakla ilgilenmeyin") netleşmelidir.
  • Kullanıcı düzeltmesi ("gerçekten...") eklemek yerine yazılmalıdır.

Adım 3: Struktürlü çıkış ile LLM yönlendirilmiş DST

pythonfrom pydantic import BaseModel
from typing import Literal, Optional
import instructor

class RestaurantState(BaseModel):
    cuisine: Optional[Literal["italian", "chinese", "indian", "thai", "any"]] = None
    area: Optional[Literal["north", "south", "east", "west", "center"]] = None
    price: Optional[Literal["cheap", "moderate", "expensive"]] = None
    people: Optional[int] = None
    day: Optional[str] = None


def llm_dst(history, llm):
    prompt = f"""You track the slot values of a restaurant booking across turns.
Dialogue so far:
{render(history)}

Update the state based on the latest user turn. Output only the JSON state."""
    return llm(prompt, response_model=RestaurantState)

Instructor + Pydantic geçerli bir durum nesnesini garanti eder.

4. Adım: JGA değerlendirme

pythondef joint_goal_accuracy(predicted_states, gold_states):
    correct = sum(1 for p, g in zip(predicted_states, gold_states) if p == g)
    return correct / len(predicted_states)

Kalibrasyon: sistem tüm slotları hangi bölümde doğru yapar? MultiWOZ 2.4 için, en iyi 2026 sistemleri: 80-83%.

Adım 5: Yönetim düzeltmesi

pythonCORRECTION_CUES = {"actually", "no wait", "on second thought", "change that to"}


def is_correction(utterance):
    return any(cue in utterance.lower() for cue in CORRECTION_CUES)

Bir tespit edilen düzeltme üzerine, eklemek yerine son güncellenmiş boşluğu yazın. LLM yardımı olmadan doğru olmak zordur. Modern örnektir: her zaman LLM'nin tarihten tüm durumu güncelleştirmesine izin verin.

Tuzaklar

  • Full-history regeneration cost.LLM'nin her turda yeniden çalışmasına izin vermek, toplam tokenlerin O ((n2) değerini artırır.
  • Schema drift.Post hoc yeni yuvalar eklemek eski eğitim verilerini kırır.
  • Case sensitivity."İtalyan" vs. "İtalyan" vs. "İtalyan" her yerde normalleşir.
  • Implicit inheritance.Kullanıcı daha önce "4 kişi için" belirlediyse, farklı bir zaman için yeni bir talebin insanları temizlemesi gerekmez.
  • Free-form vs closed-set.Adlar, saatler ve adresler serbest şekil slotları gerektirir; mutfaklar ve alanlar kapalıdır.

Kullan

2026'da:

SituationApproach
Narrow domain (one or two intents)Rule-based + regex
Broad domain, labeled data availableLDST (LLaMA + LoRA on MultiWOZ-style data)
Broad domain, no labels, prod-readyLLM + Instructor + Pydantic schema
Spoken / voiceASR + normalizer + LLM-DST
Multi-domain booking flowSchema-guided LLM with per-domain Pydantic models
Compliance-sensitiveRule-based primary, LLM fallback with confirmation flow

Gönder

  • Kaydet .outputs/skill-dst-designer.md- ...
markdown---
name: dst-designer
description: Design a dialogue state tracker — schema, extractor, update policy, evaluation.
version: 1.0.0
phase: 5
lesson: 29
tags: [nlp, dialogue, task-oriented]
---

Given a use case (domain, languages, vocab openness, compliance needs), output:

1. Schema. Domain list, slots per domain, open vs closed vocabulary per slot.
2. Extractor. Rule-based / seq2seq / LLM-with-Pydantic. Reason.
3. Update policy. Regenerate-whole-state / incremental; correction handling; negation handling.
4. Evaluation. Joint Goal Accuracy on a held-out dialogue set, slot-level precision/recall, confusion on the hardest slot.
5. Confirmation flow. When to explicitly ask the user to confirm (destructive actions, low-confidence extractions).

Refuse LLM-only DST for compliance-sensitive slots without a rule-based secondary check. Refuse any DST that cannot roll back a slot on user correction. Flag schemas without version tags.

Egzersizler

  1. Easy.Kurallara dayalı bir devlet izleme cihazı oluşturun code/main.py3 slot için (mutfak, alan, fiyat) 10 el yapımı diyalog üzerinde test. JGA ölçüm.
  2. Medium.Aynı veri kümesi, Enstrüctor + Pydantic + küçük bir LLM ile. JGA'yı karşılaştırın. En zor dönüşleri inceleyin.
  3. Hard.Her iki yönü de uygulayın: kural tabanlı ilk, kural tabanlı < 2 boşluk güvenle yayıldığında LLM geri dönüşü.

Anahtar Terimler

TermWhat people sayWhat it actually means
DSTDialogue state trackingMaintain the slot-value dict across dialogue turns.
SlotUnit of user intentNamed parameter the backend needs (cuisine, date).
DomainThe task areaRestaurant, hotel, taxi — sets of slots.
JGAJoint Goal AccuracyFraction of turns where every slot is correct. All-or-nothing.
MultiWOZThe benchmarkMulti-domain WOZ dataset; standard DST evaluation.
Ontology-free DSTNo schemaGenerate slot names and values directly, no fixed list.
Correction"Actually..."Turn that overwrites a previously-filled slot.

Daha Fazla Okumak

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.