dimesum

Ana sayfa / Blog / Mühendislik

Mühendislik

Doğal dil harcama ayrıştırıcımızı sildik

· 7 dakika okuma ·

Kurallar ayrıştırıcımız bir hafta dayandı, dört sıradan cümle parayı yanlış kişiye yükledi ve tek bir redde kuralı tüm koruma yığınının yerini aldı.

Yeni bitirdiğimiz bir ayrıştırıcıyı sildik. Dimesum'un doğal dilde harcama ayrıştırma denemesi ilk olarak bir kurallar motoruydu ve dört sıradan cümle onu emekliye ayırdı: dinner 12-08 400 ₺12 olarak okundu, ravioli 600 bölüşmeye Ravindra adlı bir üyeyi ekledi, kirana 500 Kiran adlı bir üyeye borç yazdı ve refund -483.50 ₺483.50 tutarında bir harcamaya dönüştü.

Bir cümleyi anlamak modelin işidir, başka hiçbir şeyin değil. Kurallar motorunun yerini amount_only adlı tek bir basamak aldı: metinde tam olarak tek bir belirsizlik taşımayan para adayı bulunduğunda döndürülen tek bir sayı, kişilere dair hiçbir iddia içermez. İki aday olması, hiç tutar olmaması demektir. Tek bir kural, birikip duran bir korumalar yığınının yerini aldı.

Dört cümle kurallar ayrıştırıcısını bitirdi

Silinen ayrıştırıcı, yapay zeka tasarım belgemizin tanımladığı tüm varlık kümesini kapsıyordu: üye ve takma ad eşleştirme, bir dışlama sözlüğü, ödeyen çıkarımı, bir kategori sözlüğü ve alan bazında ayarlanmış güven değerleri. Aşağıdaki dört hatanın her birinin apaçık bir çözümü vardı. Her çözüm, kendi kör noktası olan yeni bir korumaydı.

Dimesum'un kurallar ayrıştırıcısını emekliye ayıran dört hata, 2026-08-20 tarihinde docs/tech/10-ai-design.md içine kaydedildi.
Kullanıcının yazdığıAyrıştırıcının yaptığıNeden oldu
dinner 12-08 400Tutarı ₺12 olarak okuduBir okur bir tarih ve bir toplam görür. Bir regex üç sayı görür ve ilkini alır.
ravioli 600Bölüşmeye Ravindra adlı bir üyeyi eklediBulanık takma ad eşleştirme, bir yemeği bir kişiyle eşleştirip puanladı.
kirana 500Kiran adlı bir üyeye borç yazdıAynı eşleştirici, bu kez bir dükkan adıyla.
refund -483.50₺483.50 tutarında bir harcama işlediRakamlar korundu ama işaret korunmadı, böylece para ters yöne işaret etti.

Dördün ikisi, farklı kılıklara girmiş tek bir hatadır. Bulanık eşleştirme, bir yemeği bir kişiden ya da bir dükkanı bir kişiden ayırt edemez, çünkü karakter düzeyinde ravioli ve Ravindra gerçekten birbirine benziyor. Daha uzun bir ön ek eşleşmesi istersen ravi durumunu bozarsın ki eşleştiricinin var olma nedeni de zaten odur.

Eklediğiniz her koruma iki yeni ifade biçimini açığa çıkarır

Bir kurallar ayrıştırıcısı belirli bir biçimde başarısız olur: kendinden emin ve yanlış yanıt verir. Boş bir alan kullanıcıya bir dokunuşa mal olur. Yanlış bir bölüşme, deftere olan güvene mal olur ve para paylaşımı takip eden bir uygulamada defter, ürünün ta kendisidir. Yukarıdaki dört satır az farkla kaçırılmış durumlar değil, para hatalarıdır.

Asıl mesele tek bir kusur değil, bu bitmeyen döngüdür. Bir tarih koruması eklersiniz ve sipariş numarası durumu gelir. Bir sipariş numarası koruması eklersiniz ve düz sayılar gelir, ardından miktarlar, ardından masa numaraları. Koruma listesi büyür ve asla bir yere yakınsamaz, çünkü doğal dilin sayıp bitirebileceğiniz sonlu bir ifade biçimleri kümesi yoktur.

Önce ve sonra: büyüyen bir korumalar yığını, tek bir redde kuralıyla değiştirildi ÖNCE: KURALLAR AYRIŞTIRICISI (SİLİNDİ) dinner 12-08 400 tutar regex tarih koruması sipariş numarası koruması takma ad eşleştirici dışlama sözlüğü ₺12 okur ve işler Her çözüm iki yeni ifade biçimini açığa çıkardı. SONRA: amount_only dinner 12-08 400 belirsizlik taşımayan tek bir para adayı var mı? hayır, üç sayı tutar boş kalır evet, tek bir sayı kuruş cinsinden döndürülür Bu basamak kişiler hakkında hiçbir şey söylemez, bu yüzden parayı yanlış kişiye yükleyemez.
Silinen ayrıştırıcı her cümleyi yanıtlıyordu. Yerini alan basamak ya bir sayı ya da hiçbir şey yanıtlıyor.
Karar, tarihiyle

Doğal dilde giriş bir yapay zeka özelliğidir ve Dimesum deposunda hiçbir şey onu kalıp olarak karşılamaz. Karar 2026-08-20 tarihinde alındı, dört hatayla birlikte yazıya döküldü, böylece kimse korumaları yanlışlıkla yeniden kurmaz.

Yayına giren şey tek bir sayı ve bir reddir

amount_only, yapay zeka tasarım belgemizin düşürülmüş basamağının birebir uygulanmış halidir. O basamak "istemci tarafında tutar regex'i ön dolgusuyla düz form" der, bu yüzden bu katman bir tutar döndürür ve başka hiçbir şey döndürmez: açıklama yok, kategori yok, ödeyen yok, katılımcı yok, dışlama yok. Hiçbir maliyeti yoktur ve kimseyi çağırmaz, testler ve CI'nin onun üzerinde çalışmasının nedeni de budur.

Belirsizlik bir reddir, bir eşitlik bozma değil

Kuralın tamamı tek bir fonksiyonda yaşar, extract_amount_minor. Bir sayı yalnızca metinde onun için tam olarak tek bir aday bulunduğunda geri döner, bu yüzden order 90210 dinner 400 ve flat 402 rent 15000 bir kazanan seçmek yerine boş döner. Para birimiyle işaretlenmiş bir sayı, çıplak sayıların yanında bile belirsiz sayılmaz, split 3 ways ₺1,200 ifadesinin hâlâ ₺1,200 olarak okunmasının nedeni budur.

Negatiflenmiş bir sayı, mutlak değeri yerine hiç tutar değildir. -500, minus 200 ve muhasebecinin (500) yazımı, hepsi boş döner, çünkü alan bir harcamadır ve rakamları tutup işareti düşürmek parayı metnin tersine yöne işaret ettirir. Parantezler yalnızca sayının kendisinde kapandığında geçerlidir, bu yüzden (500 each) bir parantez içi ifade olarak kalır.

amount_only'ın tek bir sayı ile hiç yanıt arasında nasıl karar verdiği para olabilecek her sayıyı topla hiç bulunamadı mı ya da herhangi biri negatif işaretli mi? hayır para birimiyle işaretlenmiş tam olarak tek bir sayı mı, örneğin ₺1,200 ya da 500/-? hayır hiç işaret yok ve tam olarak tek bir çıplak sayı mı? evet amount_minor: tam sayı alt birimler, ISO 4217 üssü aracılığıyla evet hayır tutar yok alan boş görüntülenir evet
Üç soru, ikisi boşla sonlanıyor. İki makul tutar arasında seçim yapmak ₺12'lik akşam yemeğini üretti.

Para birimi aritmetiği belirler

Alt birimler, Dimesum'da paranın aldığı tek gösterimdir, bu yüzden katman 100 ile sabit kodlanmış bir çarpma yerine bir ISO 4217 üs tablosuyla dönüştürür. Japon yeninin hiç alt birimi yoktur ve ×100, ¥1,200'lük bir fişi yüz katına şişirir. Para biriminin en küçük biriminden daha ince bir sayı, yuvarlanmak yerine reddedilir, çünkü birinin yazdığı bir tutarı yuvarlamak yeni bir tutar uydurmaktır.

Hint sayı sözcükleri, bir sayının yazılmasının parçasıdır, bir cümlenin anlaşılmasının değil. 1.2k, 2 lakh ve 500/-, tıpkı 1,200 gibi, hepsi çözümlenir. Defterin en büyük tutarını aşan her şey boş döner, böylece yanlış yazılmış bir sayı, ileride bir tam sayıyı taşırmak yerine bir alanı boş bırakır.

Her ayrıştırma basamağının neyi ileri sürmesine izin verildiği, 29 Ağustos 2026 itibarıyla.
AlanKurallar ayrıştırıcısı (silindi)amount_only (yayında)Model katmanı (bağlı, anahtarsız)
TutarBirkaç sayıdan tahmin edildiBelirsizlik taşımayan tek bir sayı, yoksa boşBağlam içinde okunur
Açıklama, kategoriSözlük eşleşmesiHer zaman nullCümleden çıkarılır
Katılımcılar, dışlamalarBulanık ad eşleştirmeHer zaman boşGerçek üye kimliklerine çözümlenir
Ödeyenİfadeden çıkarıldıHer zaman boşAdı verilir, null olabilen bir tutarla
Genel güvenAlan bazında ayarlandı0.3'e sabitlenmişAyrıştırma başına
Bildirilen promptHiçbiri yoktuNull, hiç prompt okunmadıPrompt kimliği ve sürümü

Yayındaki basamak 0.6'lık kullanılabilirlik eşiğini asla geçmez

Ayrıştırma sözleşmemiz, genel güveni 0.6'nın altındaki bir ayrıştırmadan vazgeçer ve kullanıcıyı düz forma indirir. amount_only her yanıtta 0.3 bildirir ve bu sabit, ayarlanmış değil yapısaldır. Tek başına bir tutar bir ayrıştırma değildir, bu yüzden basamak ne bulursa bulsun eşiğin yarısında durur. Her yanıt için tek bir sabit, onu orada tutan şeydir: duruma göre bir puan, birinin er ya da geç yukarı doğru ittireceği bir puandır.

Katman ayrıca hiç prompt bildirmez. Hem prompt_id hem de prompt_version null döner, çünkü basamak hiç prompt okumadı. Birini adlandırmak, her değerlendirme sonucunu katmanın hiç görmediği bir prompt sürümüne mal ederdi ve bir basamağı tek dokunuşluk öneriye yükseltmeye izin verilen tek araç, tutar ve katılımcılarda birlikte %95 kesinlikte çalışan değerlendirme düzeneğidir.

İki katman daha tanımlanmış ve hiçbiri yayında değil. cheap-fast katmanının openai/gpt-oss-120b için bir Groq adaptörü var ama anahtarı yok; orta katmanın ise adaptörü yok. İkisinden birini seçmek, kullanıcının ilk isteğinde değil başlangıçta başarısız olur, çünkü bir LLM çağrı başına ücret yazar ve ücretlendirilebilir bir bağımlılık kapalı konumda başarısız olmalıdır.

Hiçbir şey otomatik işlenmez, bu yüzden bir boşluk bir dokunuşa mal olur

Boş bir alan bu kadar az maliyetli oluyor çünkü Dimesum'daki hiçbir yakalama para yazamaz. Bir yakalama bir öneri oluşturur, bir kişi onu onaylar ve harcamayı oluşturan şey bu onaydır. Brief kararı D5 bu kuralı belirtir ve .go-arch-lint.yml onu zorunlu kılar: alım bağlamının harcama ya da defter üzerinde herhangi bir bağımlılığı reddedilir, böylece bir yakalama yanlışlıkla bile bir günlük işleyemez. CI içe aktarmayı başarısız kılar, bunu bir tane ekleyerek doğruladık.

Yakalama, ayrıştırıcı ne yaparsa yapsın ham metni saklar ve hangi alanların çözümlenmediğini adlandırır. İstemci, uydurulmuş bir taslak göstermek yerine bu boşlukları vurgular, hiçbir şey söylemeyen bir ayrıştırıcı ile tahmin yürüten bir ayrıştırıcı arasındaki fark budur. Onay, harcama kimliğini öneri kimliğinden türetir, böylece çift dokunuş iki kez borç yazmak yerine aynı işlemi yineler.

Çalmaya değer kural

Hatalarınızı değil korumalarınızı sayın. Her hafta büyüyen bir koruma listesi, işin anlama olduğunu söyler ve anlama bir modele aittir. Sonraki adımımız, contracts/parse_expense/eval/ içindeki altın kümesini gerçek bir model katmanına karşı çalıştırmak, çünkü o karar olmadan buradaki hiçbir şey tek dokunuşluk bir öneriye dönüşmez.

Sık sorulan sorular

Dimesum kural tabanlı harcama ayrıştırıcısını neden sildi?

Dimesum onu sildi çünkü dört sıradan cümle para hataları üretti ve eklenen her koruma iki yeni ifade biçimini açığa çıkardı. dinner 12-08 400 ₺12 olarak okundu, ravioli 600 Ravindra adlı bir üye ekledi, kirana 500 Kiran adlı bir üyeye borç yazdı ve refund -483.50 ₺483.50 tutarında bir harcamaya dönüştü. Bir cümleyi anlamak modelin işidir.

amount_only katmanı gerçekte ne döndürür?

amount_only katmanı tek bir sayı döndürür ve başka hiçbir şey döndürmez. Yalnızca metinde tam olarak tek bir belirsizlik taşımayan para adayı bulunduğunda bir tutarla yanıt verir ve hiçbir zaman bir katılımcı, bir ödeyen, bir açıklama ya da bir kategori adı vermez. İki aday olması, hiç tutar olmaması demektir. Ayrıştırma sözleşmesindeki diğer her şey bir model katmanını bekler.

amount_only neden gerçek bir puan yerine 0.3 güven bildiriyor?

0.3, ayarlanmış değil yapısaldır. Ayrıştırma sözleşmemiz 0.6'nın altındaki bir ayrıştırmadan vazgeçer ve kullanıcıyı düz forma indirir, tek başına bir tutar da bir ayrıştırma değildir, bu yüzden basamak ne bulursa bulsun o eşiğin yarısında durur. Her yanıt için tek bir sabit değer, duruma göre bir puanın sonradan yukarı ittirilmesini engeller.

Doğal dil yakalaması, bir insan olmadan deftere yazabilir mi?

Hayır. Bir yakalama bir öneri oluşturur ve bir kişi onu onaylar, Brief kararı D5 uyarınca. Kural .go-arch-lint.yml içinde zorunlu kılınır, bu da alım bağlamının harcama ya da defter üzerindeki her türlü bağımlılığını reddeder, böylece bir yakalama bir günlüğe uzanırsa CI içe aktarmayı başarısız kılar. Harcamayı oluşturan şey onaylamaktır.

Hiçbir model katmanı yokken doğal dil harcama ayrıştırma ne olur?

Dimesum amount_only seviyesine düşer ve boşluklar gösterir. cheap-fast katmanı Groq'un openai/gpt-oss-120b modeline bağlıdır ve anahtarsız gelir, orta katmanın ise adaptörü yoktur, bu yüzden ikisinden birini seçmek kullanıcının ilk isteğinde değil başlangıçta başarısız olur. Yakalama her iki durumda da ham metni saklar.