Desenler
Modele uydurtmayın, seçtirin
· 6 dakika okuma
Sohbet hattımızda hak edilmesi zaman almış bir yorum satırı var: model kendisine verilen metni seçer, asla bir sorgu uydurmaz. Bu, modele müşterinin bütçesinin ne olduğunu sormakla, cümledeki bütün sayıları ona verip hangisinin bütçe olduğunu sormak arasındaki fark. İkinci soru uydurulmuş bir sayıyla cevaplanamaz, çünkü uydurulmuş sayı seçeneklerden biri değildir.
Kaldırmaya çalıştığınız hata
Serbest metin çıkarımı belirli ve sinir bozucu bir biçimde başarısız olur. Bir modelden "oğlum 8 yaşında, 1500 lira civarı bir şey arıyorum, varsa 4032 model" cümlesinden bütçeyi çekmesini isteyin, genellikle 1500 döner. Genellikle. Bir kısmında 8 döner, ya da 4032, ya da geçen seferkinden farklı biçimlenmiş 1500.00, ya da daha iyi bir fiyat noktası gibi hissettirdiği için yardımsever bir 1450.
Çıktıyı doğrulayabilirsiniz, doğrulamalısınız da, ama doğrulama yalnızca bariz biçimde bozuk değerleri yakalar. Makul ama yanlış bir sayıyı yakalayamaz. Yaş da model numarası da makul birer bütçedir.
Çıkarımı seçime dönüştürün
Çözüm, çıkarımı kendiniz ve kötü biçimde yapıp modele iyi olduğu kısmı bırakmak. Mesajdaki her sayısal parçayı düzenli ifadeyle çekiyor, altı ile sınırlıyor ve bu parçaları bir Choice sorusunun seçenekleri olarak Jev'e veriyoruz.
numeric = re.findall(r'\d[\d.,]*', query)
budgets = {str(i): v for i, v in enumerate(numeric[:6])}
budgets['KEEP'] = str(prior.get('budget') or 'No budget')
budgets['NONE'] = 'No maximum budget or remove earlier budget.'Düzenli ifade bilerek aptal. Hangi sayının bütçe olduğunu bilmiyor ve bilmesi de gerekmiyor; yalnızca hiçbirini kaçırmaması gerekiyor. Kesinlik modelin işi, anma düzenli ifadenin işi, ki bu da insanların bu işi genelde bölüştürme biçiminin tam tersi.
İki seçenek mesajdan gelen parçalar değil. KEEP, önceki bütçenin hâlâ geçerli olduğu anlamına geliyor; bu önemli çünkü takip mesajı çoğu zaman hiç sayı içermez ve sessizlik, kaldırmakla aynı şey değildir. NONE ise üst sınır olmadığı ya da önceki bütçenin az önce geri alındığı anlamına geliyor. İkisi de konuşmanın gerçekten içinde bulunabileceği durumlar ve hiçbiri bir sayı seçerek ifade edilemez.
Aynı numara sorgunun kendisinde
Zor olan, müşterinin şu an gerçekte ne aradığına karar vermek. Konuşmalar savrulur. Biri yeğenine doğum günü hediyesiyle başlar, yaşı düzeltir, bir öneriyi reddeder, sonra eşinden söz eder. Bir modelden buna bir arama sorgusu yazmasını isteyin, dört turu hiçbir belirgin ağırlıkla harmanlamayan bir cümle alırsınız.
Bu yüzden ondan bir şey yazmasını istemiyoruz. Mesajı cümleciklere bölüp her cümleciği, önceki sorgu ve mevcut mesajın tamamıyla birlikte aday olarak sunuyoruz.
focus = {
'PREVIOUS': prior.get('query', 'No previous query'),
'LATEST': query,
}
# every clause of the message becomes its own candidate
for i, part in enumerate(re.split(r'[;.!?]|\b(?:ama|fakat|ancak)\b', query)):
if len(part.strip()) > 4:
focus['PART_' + str(i)] = part.strip()Bölme noktaları cümle noktalaması ve Türkçe karşıtlık bağlaçları: ama, fakat, ancak. Bu kelimeler müşterinin cümlenin ortasında fikrini değiştirdiği yerlerdir ve onlardan sonraki cümlecik genellikle şu an önemli olandır. Model bir cümlecik seçer. Ne seçerse seçsin müşterinin yazdığı metindir, yani arama adımı hiç kimsenin söylemediği bir şeyi aramaz.
PREVIOUS, KEEP ile aynı nedenle yerini hak ediyor. Son mesaj yalnızca bir dışlama, bir bütçe değişikliği ya da alternatif isteğiyse doğru sorgu hâlâ öncekidir, ve talimat bunu açıkça söylüyor.
Olumsuzlama sorgudan çıkmalı, durumda kalmalı
İşin ilginçleştiği yer dışlamalar, çünkü bir yerden çıkarılıp başka bir yerde saklanmaları gerekiyor. Peluş istemediğini söyleyen bir müşteri size iki şey vermiştir: hatırlanacak bir kısıt, ve sorgu metninde kalırsa gömme aramasını zehirleyecek bir ifade.
Dışlama cümleciklerini Türkçe işaretleyicilerinden buluyoruz: olmasın, istemiyorum, hariç, dışında. Ayakta kalan her terim, mevcut aramada hâlâ geçerli olup olmadığını soran kendi Choice sorusuna dönüşüyor. Sonra o cümlecikleri aramaya giden metinden çıkarıyoruz. Kısıt yapılandırılmış durumda yaşıyor; ifade sorguda yaşamıyor.
Eski dışlamalar kendi koşullarıyla sona eriyor. Yeni ve bağımsız bir arama, tekrarlanmadıkça onları düşürüyor; sonraki bir mesaj birini geri alabiliyor ve model bunu o terimin sorusunda NO olarak bildiriyor. Dışlamaları serbest metin olarak tutup sorgu gömmesinin onları halletmesini umarsanız bunların hiçbiri güvenilir değildir, çünkü gömmelerin DEĞİL diye bir kavramı yoktur.
Ayrıştırma yine de sizin üstünüzde
Seçim, uydurma problemini ortadan kaldırır. Ayrıştırma problemini kaldırmaz ve bunu açıkça söylemekte fayda var. Model "1.299" parçasını seçtikten sonra, bunun Türkçe binlik ayracıyla bin iki yüz doksan dokuz mu yoksa bir virgül iki dokuz dokuz mu olduğuna hâlâ bir şeyin karar vermesi gerekiyor. Bunu, ondalık virgül dönüşümüne düşmeden önce gruplanmış rakam örüntüsü için açık bir kontrolle hallediyoruz.
O kod gösterişsiz ve tam olması gereken yerde. Bir sayıyı yanlış ayrıştıran düzenli ifade, bulabileceğiniz, tekrar üretebileceğiniz ve düzeltebileceğiniz bir hatadır. Ara sıra sayı uyduran bir model ise yalnızca örnekleyebileceğiniz bir davranıştır.
Genel biçim
Tipli bir karar modelinden bir değer isteyecekken, bunun yerine ondan bir işaretçi isteyip isteyemeyeceğinizi kontrol edin. Adayları zaten elinizdeki veriden sayın, aday olmayan durumları ekleyin ve seçimi modele bırakın. Girdide hiç geçmeyen değerleri ele alma yeteneğinizi kaybedersiniz ki bu genellikle bir özelliktir, ve yalnızca olası olmayan değil imkânsız hale gelen bir hata sınıfı kazanırsınız.
Navlu, e-ticaret mağazaları için konuşma tabanlı bir ürün keşif asistanıdır. Bir turdaki bütçe, odak, para birimi ve her dışlama, müşterinin kendi mesajından çıkarılan adaylar üzerinde birer Choice sorusudur.