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 answerSü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 resultBilgi 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
- NL'den SQL'e Aracılar Nasıl Çalışır
- Şema Anlama ve Enjeksiyonu
- SQL Sorguları Oluşturma ve Doğrulama
- Belirsiz Veritabanı Sorularını Ele Alma