0Pricing
AI Agents · Ders

Belirsiz Veritabanı Sorularını Ele Alma

Açıklayıcı sorular, şema belirsizliğini giderme ve çok tablolu birleştirme akıl yürütmesi.

Belirsiz Veritabanı Sorularını Ele Alma, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.

NL-to-SQL'de Belirsizlik Sorunu

Doğal dil doğası gereği belirsizdir. Birisi "Bana son siparişleri göster" dediğinde insan şu soruları sorar: kim için son? hangi zaman aralığında? nasıl sıralansın?

Varsayılanları sessizce kabul eden bir aracı, kullanıcının beklemediği sonuçlar üretir. İyi bir aracı belirsizliği algılar ve hedefe yönelik netleştirme soruları sorar.

Belirsizlik Türleri

Veritabanı bağlamlarında belirsiz soruların dört yaygın kategorisi vardır:

  • Zaman belirsizliği: 'son', 'en yeni', 'eski', 'bu yıl'
  • Kapsam belirsizliği: 'en iyi müşteriler' — hangi ölçüte göre en iyi?
  • Tablo belirsizliği: soruyu birden fazla tablo yanıtlayabilir
  • Filtre belirsizliği: 'etkin kullanıcılar' — etkin olmayı ne belirler?
# Examples of each type
ambiguous_examples = {
    'temporal': 'Show me recent orders',         # last 7 days? 30 days? 1 year?
    'scope':    'Who are the top customers?',     # by revenue, order count, or recency?
    'table':    'Show me user activity',          # from users, sessions, or audit_log?
    'filter':   'List all active products'        # active = in_stock? not discontinued?
}

if __name__ == '__main__':
    print('Types of ambiguous questions:')
    for kind, example in ambiguous_examples.items():
        print(f'  {kind}: "{example}"')

LLM ile Belirsizliği Algılama

Belirsizlik kurallarını koda sabitlemek yerine LLM'den belirsizliği algılamasını isteyin. Şemayı sağlayın ve şu soruyu sorun: kesin bir SQL sorgusu oluşturmak için bu soru yeterince açık mı?

import json

AMBIGUITY_CHECK_PROMPT = '''You are a SQL assistant. Given a database schema and a user question,
determine if the question is clear enough to write a single correct SQL query.

Schema:
{schema}

Question: {question}

Respond with JSON:
- If clear: {{"ambiguous": false, "sql": "SELECT ..."}}
- If ambiguous: {{"ambiguous": true, "clarification": "What time range counts as recent?",
  "options": ["Last 7 days", "Last 30 days", "Last 90 days"]}}

JSON:'''

def check_and_generate(question, schema):
    response = llm_call(AMBIGUITY_CHECK_PROMPT.format(
        schema=schema, question=question
    ))
    return json.loads(response)

Netleştirme Döngüsü

Belirsizlik algılandığında bir netleştirme döngüsüne girin: kullanıcıya hedefe yönelik bir soru sorun, yanıtını alın ve ardından zenginleştirilmiş bağlamla SQL oluşturmayı yeniden deneyin.

Döngüyü 2 netleştirme turuyla sınırlayın — çok fazla soru sormak kullanıcıları rahatsız eder.

def nl_to_sql_with_clarification(user_question, schema, conn, ask_user_fn):
    for attempt in range(2):  # max 2 clarification rounds
        result = check_and_generate(user_question, schema)

        if not result.get('ambiguous'):
            # Clear question — execute
            rows = execute_query(conn, result['sql'])
            return format_results(rows, user_question)

        # Ambiguous — ask user
        clarification = result['clarification']
        options = result.get('options', [])
        user_reply = ask_user_fn(clarification, options)

        # Enrich the question with the answer
        user_question = f'{user_question} ({clarification}: {user_reply})'
        print(f'Enriched question: {user_question}')

    # After 2 rounds, generate with best guess
    return check_and_generate(user_question, schema)

'Son' Zaman Belirsizliğini Giderme

'son', 'en yeni', 'bu hafta', 'yeni' gibi zaman ifadeleri son derece yaygındır. Belirsiz terimleri varsayılan zaman aralıklarına eşleyen özel bir zaman çözümleyicisi oluşturun; güven düşük olduğunda LLM'nin soru sormasına da izin verin.

from datetime import datetime, timedelta

TEMPORAL_DEFAULTS = {
    'recent':   7,    # days
    'latest':   1,    # days
    'new':      30,
    'old':      365,
    'this week': 7,
    'this month': 30,
    'this year': 365
}

def resolve_temporal(question):
    lower = question.lower()
    for term, days in TEMPORAL_DEFAULTS.items():
        if term in lower:
            since = (datetime.now() - timedelta(days=days)).strftime('%Y-%m-%d')
            return question + f" ('{term}' means since {since})"
    return question

print(resolve_temporal('Show me recent orders'))
# Show me recent orders ('recent' means since 2024-05-22)

Şema Belirsizliği: Birden Fazla Tablo

Bir soruyu birden fazla tablo yanıtlayabiliyorsa aracının hangisinin en uygun olduğunu değerlendirmesi gerekir. Örneğin, 'kullanıcı etkinliği' sessions, audit_log veya user_events tablolarında bulunabilir.

TABLE_SEMANTIC_MAP = {
    'user activity':    ['sessions', 'user_events', 'audit_log'],
    'purchases':        ['orders', 'transactions', 'invoices'],
    'product catalog':  ['products', 'items', 'listings'],
    'sign-ups':         ['users', 'registrations', 'accounts']
}

def disambiguate_tables(question, schema_dict, ask_user_fn):
    lower = question.lower()
    for concept, tables in TABLE_SEMANTIC_MAP.items():
        if concept in lower:
            available = [t for t in tables if t in schema_dict]
            if len(available) > 1:
                chosen = ask_user_fn(
                    f"Which table should I query for '{concept}'?",
                    available
                )
                return question + f" (use the {chosen} table)"
    return question

if __name__ == '__main__':
    def ask_user_fn(prompt, options):
        print(f'{prompt} -> choosing "{options[0]}" (demo default)')
        return options[0]

    demo_schema = {'sessions': [], 'transactions': [], 'orders': []}
    resolved = disambiguate_tables('Show me user activity', demo_schema, ask_user_fn)
    print('Resolved question:', resolved)

'En İyi N' Kapsam Belirsizliğini Ele Alma

'En iyi müşteriler', 'en iyi ürünler' ve 'en etkin kullanıcılar' ifadelerinin tümünde hangi ölçüte göre sorusunun yanıtlanması gerekir. Birini sessizce seçmek yerine ölçüt seçeneklerini kullanıcıya sunun.

RANKING_AMBIGUITY_PROMPT = '''The question asks for a ranking but the metric is unclear.

Question: {question}
Table columns available: {columns}

List 2-3 reasonable ranking metrics as a JSON array of objects:
[{{"label": "By total revenue", "sql_expr": "SUM(total) DESC"}},
 {{"label": "By order count", "sql_expr": "COUNT(*) DESC"}}]

JSON:'''

def resolve_ranking(question, columns, ask_user_fn):
    import json
    response = llm_call(RANKING_AMBIGUITY_PROMPT.format(
        question=question, columns=columns
    ))
    options = json.loads(response)
    labels = [o['label'] for o in options]
    chosen_label = ask_user_fn('How should I rank the results?', labels)
    chosen = next(o for o in options if o['label'] == chosen_label)
    return question + f" (rank by: {chosen['sql_expr']})", chosen['sql_expr']

Akıllı Varsayılanlar Sunma

Kullanıcıya her seferinde soru sormak rahatsız edici olabilir. Daha akıllı yaklaşım şudur: uygun bir varsayılan seçin, sorguyu çalıştırın ve neyi varsaydığınızı kullanıcıya söyleyin. Şuna benzer bir not ekleyin: "'Son' ifadesinin son 30 günü ifade ettiğini varsaydım. Farklı bir dönem mi kastettiniz?"

def nl_to_sql_with_assumptions(question, schema, conn):
    # Resolve common ambiguities with defaults
    enriched = resolve_temporal(question)
    result = check_and_generate(enriched, schema)

    if result.get('ambiguous'):
        # Still ambiguous — pick default option
        options = result.get('options', ['the most common interpretation'])
        default = options[0]
        enriched = enriched + f' ({result["clarification"]}: {default})'
        result = check_and_generate(enriched, schema)

    rows = execute_query(conn, result['sql'])
    answer = format_results(rows, question)

    # Append assumption note
    if enriched != question:
        assumption = enriched[len(question):].strip().strip('()')
        answer += f'\n\n[Note: I assumed {assumption}]'

    return answer

Sütun Düzeyinde Belirsizlik

Bazen belirsizlik sütun düzeyindedir. 'Siparişleri tarihe göre sıralanmış olarak göster' — hangi tarih? created_at, updated_at, shipped_at veya delivery_date?

LLM'ye yardımcı olmak ve sütun düzeyindeki belirsizliği azaltmak için şema eklemenize sütun açıklamalarını da dahil edin.

COLUMN_DESCRIPTIONS = {
    ('orders', 'created_at'):   'When the order was placed',
    ('orders', 'updated_at'):   'When the order was last modified',
    ('orders', 'shipped_at'):   'When the order was shipped to customer',
    ('orders', 'delivery_date'): 'Expected or actual delivery date'
}

def format_columns_with_descriptions(table, columns):
    parts = []
    for col in columns:
        desc = COLUMN_DESCRIPTIONS.get((table, col['name']), '')
        label = f"{col['name']} ({col['type']})"
        if desc:
            label += f' [{desc}]'
        parts.append(label)
    return ', '.join(parts)

if __name__ == '__main__':
    demo_columns = [
        {'name': 'created_at', 'type': 'timestamp'},
        {'name': 'shipped_at', 'type': 'timestamp'},
        {'name': 'total', 'type': 'float'},
    ]
    print(format_columns_with_descriptions('orders', demo_columns))

Belirsizlik Çözümlerini Günlüğe Kaydetme

Her belirsizlik türünün ne sıklıkta ortaya çıktığını ve hangi varsayılanların ya da netleştirmelerin seçildiğini izleyin. Bu veriler, varsayılan değerleri iyileştirmenize ve zaman içinde sorulan soru sayısını azaltmanıza yardımcı olur.

import json
from datetime import datetime

ambiguity_log = []

def log_ambiguity(original_question, clarification, resolution, method):
    ambiguity_log.append({
        'timestamp': datetime.now().isoformat(),
        'question': original_question,
        'clarification': clarification,
        'resolution': resolution,
        'method': method  # 'asked_user' | 'default' | 'llm_inferred'
    })

# Periodically analyze to improve defaults
def analyze_ambiguity_log():
    from collections import Counter
    types = Counter(entry['clarification'] for entry in ambiguity_log)
    print('Most common ambiguities:')
    for q, count in types.most_common(5):
        print(f'  {count}x: {q}')

if __name__ == '__main__':
    log_ambiguity('Show recent orders', 'temporal', 'last 30 days', 'default')
    log_ambiguity('Show recent orders', 'temporal', 'last 7 days', 'asked_user')
    log_ambiguity('Top customers', 'scope', 'by revenue', 'llm_inferred')
    analyze_ambiguity_log()

Çok Turlu Konuşma Bağlamı

Bir sohbet arayüzünde önceki turlar bağlam sağlar. Kullanıcı daha önce "2024'ün 4. çeyreğine ait verilere bakıyorum" dediyse, daha sonraki 'son siparişler' soruları sabit kodlanmış 30 gün yerine bu zaman aralığını varsayılan olarak kullanmalıdır.

def nl_to_sql_with_context(question, schema, conn, conversation_history):
    context_prompt = ''
    if conversation_history:
        context_prompt = 'Previous conversation context:\n'
        for turn in conversation_history[-3:]:  # last 3 turns
            context_prompt += f"User: {turn['user']}\n"
            if 'assumption' in turn:
                context_prompt += f"Assumption made: {turn['assumption']}\n"

    full_prompt = context_prompt + f'Current question: {question}'
    result = check_and_generate(full_prompt, schema)

    conversation_history.append({
        'user': question,
        'sql': result.get('sql', ''),
        'assumption': result.get('assumption', '')
    })
    return result

Bilgi Kontrolü

Bir NL-to-SQL aracısı zaman belirsizliği (örneğin 'son siparişler') algıladığında önerilen strateji nedir?

Özet: Belirsiz Soruları Ele Alma

NL-to-SQL'deki belirsizlik dört biçimde görülür: zaman, kapsam, tablo ve filtre. En iyi stratejiler; akıllı varsayılanları ('son' = son 30 gün ifadesini otomatik olarak çözümleme), LLM tabanlı belirsizlik algılamayı ve soru gerçekten net değilse hedefe yönelik netleştirmeyi bir araya getirir.

Varsayımları her zaman kullanıcıya bildirin. Bağlam için konuşma geçmişini kullanın ve zaman içinde varsayılanları iyileştirmek üzere belirsizlik çözümlerini günlüğe kaydedin.

Sıkça Sorulan Sorular

“Belirsiz Veritabanı Sorularını Ele Alma” dersi ücretsiz mi?

Evet — “Belirsiz Veritabanı Sorularını Ele Alma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.

“Belirsiz Veritabanı Sorularını Ele Alma” dersinde ne öğreneceğim?

Açıklayıcı sorular, şema belirsizliğini giderme ve çok tablolu birleştirme akıl yürütmesi. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

AI Agents öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Belirsiz Veritabanı Sorularını Ele Alma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?

Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. NL'den SQL'e Aracılar Nasıl Çalışır
  2. Şema Anlama ve Enjeksiyonu
  3. SQL Sorguları Oluşturma ve Doğrulama
  4. Belirsiz Veritabanı Sorularını Ele Alma
← AI Agents Sayfasına Dön