dimesum

Etusivu / Blogi / Tekniikka

Tekniikka

Poistimme luonnollisen kielen kulujäsentäjän

· 6 min lukuaika ·

Sääntöpohjainen jäsentäjämme kesti viikon, neljä tavallista lausetta ohjasi rahat väärälle henkilölle, ja yksi kieltäytymissääntö korvasi koko suojauspinon.

Poistimme jäsentäjän, jonka olimme juuri saaneet valmiiksi. Dimesumin ensimmäinen yritys luonnollisen kielen kulujen jäsentämiseen oli sääntömoottori, ja neljä tavallista lausetta jäähdytti sen: dinner 12-08 400 luettiin €12:na, ravioli 600 lisäsi jakoon Ravindra-nimisen jäsenen, kirana 500 veloitti Kiran-nimistä jäsentä, ja refund -483.50 muuttui €483.50:n veloitukseksi.

Lauseen ymmärtäminen on mallin tehtävä eikä minkään muun. Sääntömoottorin korvasi yksi taso nimeltä amount_only: yksittäinen numero, joka palautetaan vain kun teksti sisältää täsmälleen yhden yksiselitteisen rahaehdokkaan, eikä koskaan väitettä ihmisistä. Kaksi ehdokasta tarkoittaa, ettei summaa anneta. Yksi sääntö korvasi kasvavan kasan suojauksia.

Neljä lausetta lopetti sääntöjäsentäjän

Poistettu jäsentäjä kattoi koko entiteettijoukon, jonka tekoälysuunnitteludokumenttimme määrittää: jäsen- ja lempinimivastaavuudet, poissulkusanaston, maksajan päättelyn, kategoriasanaston ja kenttäkohtaisesti viritetyt luottamusarvot. Jokaisella alla olevalla neljällä virheellä oli ilmeinen korjaus. Jokainen korjaus oli uusi suojaus omine sokeine pisteineen.

Neljä virhettä, jotka jäähdyttivät Dimesumin sääntöjäsentäjän, kirjattu 2026-08-20 tiedostoon docs/tech/10-ai-design.md.
Mitä käyttäjä kirjoittiMitä jäsentäjä tekiMiksi näin kävi
dinner 12-08 400Luki summaksi €12Lukija näkee päivämäärän ja loppusumman. Säännöllinen lauseke näkee kolme numeroa ja ottaa ensimmäisen.
ravioli 600Lisäsi jakoon Ravindra-nimisen jäsenenSumea lempinimivastaavuus pisteytti ruokalajin ihmistä vasten.
kirana 500Veloitti Kiran-nimistä jäsentäSama vastaaja, tällä kertaa kaupan nimellä.
refund -483.50Kirjasi €483.50:n veloituksenNumerot säilyivät mutta etumerkki ei, joten raha osoitti vastakkaiseen suuntaan.

Kaksi neljästä on yksi ja sama vika eri vaatteissa. Sumea vastaavuus ei osaa erottaa ruokalajia ihmisestä eikä kauppaa ihmisestä, koska merkkitasolla ravioli ja Ravindra todella näyttävät samanlaisilta. Vaadi pidempää etuliitevastaavuutta ja rikot tapauksen ravi, joka on juuri se tapaus, jota varten vastaaja on olemassa.

Jokainen lisäämäsi suojaus paljastaa kaksi uutta muotoilua

Sääntöjäsentäjä epäonnistuu yhdessä tietyssä muodossa: se vastaa itsevarmasti ja väärin. Tyhjä kenttä maksaa käyttäjälle yhden napautuksen. Väärä jako maksaa luottamuksen tilikirjaan, ja rahanjaon seurantasovelluksessa tilikirja on tuote. Yllä olevat neljä riviä eivät ole vähällä vältettyjä virheitä, ne ovat rahavirheitä.

Oikea argumentti on juoksumatto, ei mikään yksittäinen vika. Lisää päivämääräsuojaus ja tilausnumerotapaus saapuu. Lisää tilausnumerosuojaus ja paljaat numerot saapuvat, sitten määrät, sitten pöytänumerot. Suojauslista kasvaa eikä koskaan suppene, koska luonnollisella kielellä ei ole äärellistä joukkoa lueteltavia muotoiluja.

Ennen ja jälkeen: kasvava pino suojauksia, korvattu yhdellä kieltäytymissäännöllä ENNEN: SÄÄNTÖJÄSENTÄJÄ (POISTETTU) dinner 12-08 400 summan säännöllinen lauseke päivämääräsuojaus tilausnumerosuojaus lempinimivastaaja poissulkusanasto lukee €12 ja kirjaa sen Jokainen korjaus paljasti kaksi uutta muotoilua. JÄLKEEN: amount_only dinner 12-08 400 täsmälleen yksi yksiselitteinen rahaehdokas? ei, kolme numeroa summa jää tyhjäksi kyllä, yksi luku palautetaan sentteinä Taso ei sano mitään ihmisistä, joten se ei voi ohjata rahaa väärälle henkilölle.
Poistettu jäsentäjä vastasi jokaiseen lauseeseen. Sen korvannut taso vastaa numerolla tai ei mitenkään.
Päätös, päivätty

Luonnollisen kielen syöttö on tekoälyominaisuus, eikä mikään Dimesumin koodivarastossa hahmontunnista sitä. Päätös tehtiin 2026-08-20, kirjattiin ylös neljän virheen kanssa, jottei kukaan rakenna suojauksia uudelleen vahingossa.

Mitä toimitettiin on yksi numero ja kieltäytyminen

amount_only on tekoälysuunnitteludokumenttimme heikennetty taso kirjaimellisesti toteutettuna. Tuo taso kuuluu "tavallinen lomake asiakaspään summan säännöllisen lausekkeen esitäytöllä", joten taso palauttaa summan eikä mitään muuta: ei kuvausta, ei kategoriaa, ei maksajia, ei osallistujia, ei poissulkuja. Se ei maksa mitään eikä kutsu ketään, minkä vuoksi testit ja CI ajetaan sillä.

Monitulkintaisuus on kieltäytyminen, ei tasapelin ratkaisu

Koko sääntö sijaitsee yhdessä funktiossa, extract_amount_minor. Luku palautuu vain kun teksti sisältää täsmälleen yhden ehdokkaan sille, joten order 90210 dinner 400 ja flat 402 rent 15000 palauttavat tyhjän sen sijaan että valitsisivat voittajan. Valuuttamerkitty luku lasketaan yksiselitteiseksi jopa paljaiden numeroiden vieressä, minkä vuoksi split 3 ways €1,200 lukee yhä €1,200.

Negatiivinen luku ei ole lainkaan summa, ei sen itseisarvo. -500, minus 200 ja kirjanpitäjän (500) palautuvat kaikki tyhjinä, koska kenttä on veloitus ja numeroiden säilyttäminen etumerkin pudottaen ohjaa rahan tekstille vastakkaiseen suuntaan. Sulkeet lasketaan vain kun ne sulkeutuvat itse luvun ympärille, joten (500 each) pysyy sulkulauseena.

Miten amount_only valitsee yhden luvun ja ei vastausta välillä kerää jokainen luku, joka voisi olla rahaa ei löytynyt, tai jokin niistä etumerkiltään negatiivinen? ei täsmälleen yksi valuuttamerkitty luku, kuten €1,200 tai 500/-? ei ei merkkejä lainkaan, ja täsmälleen yksi paljas numero? kyllä amount_minor: kokonaisluku pienimmissä yksiköissä, ISO 4217 -eksponentin kautta kyllä ei ei summaa kenttä näkyy tyhjänä kyllä
Kolme kysymystä, joista kaksi päättyy tyhjään. Kahden uskottavan summan välillä valitseminen tuotti €12:n illallisen.

Valuutta ratkaisee laskutoimituksen

Pienimmät yksiköt ovat ainoa muoto, jossa raha esiintyy Dimesumissa, joten taso muuntaa ISO 4217 -eksponenttitaulukolla eikä kovakoodatulla kertomisella sadalla. Japanin jenillä ei ole alayksikköä lainkaan, ja ×100 paisuttaa ¥1,200:n kuitin satakertaiseksi. Valuutan pienintä yksikköä hienompi luku hylätään eikä pyöristetä, koska jonkun kirjoittaman summan pyöristäminen on sellaisen keksimistä.

Intialaiset numerosanat ovat osa luvun kirjoittamista, eivät osa lauseen ymmärtämistä. 1.2k, 2 lakh ja 500/- ratkeavat kaikki, kuten 1,200. Kaikki tilikirjan enimmäissumman ylittävä palautuu tyhjänä, joten väärin kirjoitettu luku tyhjentää yhden kentän sen sijaan että ylivuotaisi kokonaisluvun myöhemmin ketjussa.

Mitä kukin jäsennystaso saa väittää, 29. elokuuta 2026.
KenttäSääntöjäsentäjä (poistettu)amount_only (käytössä)Mallitaso (kytketty, avaimeton)
SummaArvattu useasta numerostaYksi yksiselitteinen luku, muuten tyhjäLuettu kontekstissa
Kuvaus, kategoriaSanastovastaavuusAina nullPoimittu lauseesta
Osallistujat, poissulutSumea nimivastaavuusAina tyhjäRatkaistu todellisiksi jäsentunnisteiksi
MaksajaPäätelty muotoilustaAina tyhjäNimetty, null-arvon sallivalla summalla
KokonaisluottamusViritetty kentittäinKiinteä 0.3Jäsennyskohtainen
Ilmoitettu kehoteEi ollut olemassaNull, kehotetta ei luettuKehotteen tunniste ja versio

Käytössä oleva taso ei koskaan ylitä 0.6:n käyttökelpoisuusrajaa

Jäsennyssopimuksemme hylkää jäsennyksen, jonka kokonaisluottamus on alle 0.6, ja pudottaa käyttäjän tavalliseen lomakkeeseen. amount_only ilmoittaa 0.3 jokaisessa vastauksessa, ja vakio on rakenteellinen eikä viritetty. Yksittäinen summa ei ole jäsennys, joten taso asettuu puoleen rajasta löysipä se mitä tahansa. Yksi vakio jokaiselle vastaukselle pitää sen siellä: tapauskohtainen pistemäärä on pistemäärä, jota joku lopulta nostaa ylöspäin.

Taso ei myöskään ilmoita kehotetta lainkaan. Sekä prompt_id että prompt_version palautuvat null-arvoina, koska taso ei lukenut kehotetta. Sellaisen nimeäminen kohdistaisi jokaisen arviointituloksen kehoteversioon, jota taso ei koskaan nähnyt, ja arviointikehys on ainoa väline, joka saa nostaa tason yhden napautuksen ehdotukseksi, 95 %:n tarkkuudella summassa ja osallistujissa yhdessä.

Kaksi muuta tasoa on määritelty eikä kumpikaan ole käytössä. cheap-fast-tasolla on Groq-sovitin mallille openai/gpt-oss-120b eikä avainta; keskitasolla ei ole sovitinta. Kumman tahansa valitseminen epäonnistuu käynnistyksessä eikä käyttäjän ensimmäisessä pyynnössä, koska LLM laskuttaa kutsukohtaisesti ja laskutettavan riippuvuuden on epäonnistuttava suljettuna.

Mikään ei kirjaudu automaattisesti, joten tyhjä maksaa yhden napautuksen

Tyhjä kenttä maksaa niin vähän vain siksi, ettei mikään kirjaus Dimesumissa voi kirjoittaa rahaa. Kirjaus luo ehdotuksen, ihminen vahvistaa sen, ja vahvistus on se, mikä luo kulun. Brief-päätös D5 määrää säännön, ja .go-arch-lint.yml pakottaa sen: sisäänsyöttökontekstilta evätään kaikki riippuvuus kuluun tai tilikirjaan, joten kirjaus ei voi kirjata päiväkirjaa edes vahingossa. CI hylkää tuonnin, minkä varmistimme lisäämällä yhden.

Kirjaus säilyttää raakatekstin teki jäsentäjä mitä tahansa, ja nimeää mitkä kentät ovat ratkaisematta. Asiakas korostaa nuo tyhjät kentät sen sijaan että näyttäisi keksityn luonnoksen, mikä on ero jäsentäjän, joka ei sano mitään, ja jäsentäjän, joka arvaa, välillä. Vahvistus johtaa kulutunnisteensa ehdotustunnisteesta, joten kaksoisnapautus toistaa sen sijaan että veloittaisi kahdesti.

Sääntö, jonka kannattaa varastaa

Laske suojauksesi, älä virheitäsi. Suojauslista, joka kasvaa joka viikko, kertoo sinulle että tehtävä on ymmärtäminen, ja ymmärtäminen kuuluu mallille. Seuraava vaiheemme on ajaa kultainen joukko tiedostossa contracts/parse_expense/eval/ todellista mallitasoa vasten, koska mistään tässä ei tule yhden napautuksen ehdotusta ilman tuota tuomiota.

Usein kysytyt kysymykset

Miksi Dimesum poisti sääntöpohjaisen kulujäsentäjänsä?

Dimesum poisti sen, koska neljä tavallista lausetta tuotti rahavirheitä ja jokainen lisätty suojaus paljasti kaksi uutta muotoilua. dinner 12-08 400 luettiin €12:na, ravioli 600 lisäsi Ravindra-nimisen jäsenen, kirana 500 veloitti Kiran-nimistä jäsentä, ja refund -483.50 muuttui €483.50:n veloitukseksi. Lauseen ymmärtäminen on mallin tehtävä.

Mitä amount_only-taso oikeasti palauttaa?

amount_only-taso palauttaa yhden numeron eikä mitään muuta. Se vastaa summalla vain, kun teksti sisältää täsmälleen yhden yksiselitteisen rahaehdokkaan, eikä se koskaan nimeä osallistujaa, maksajaa, kuvausta tai kategoriaa. Kaksi ehdokasta tarkoittaa, ettei summaa anneta lainkaan. Kaikki muu jäsennyssopimuksessa odottaa mallitasoa.

Miksi amount_only ilmoittaa 0.3 luottamuksen oikean pistemäärän sijaan?

0.3 on rakenteellinen, ei viritetty. Jäsennyssopimuksemme hylkää jäsennyksen alle 0.6:n ja pudottaa käyttäjän tavalliseen lomakkeeseen, ja yksittäinen summa ei ole jäsennys, joten taso asettuu puoleen tuosta rajasta löysipä se mitä tahansa. Yksi kiinteä vakio jokaiselle vastaukselle estää tapauskohtaisen pistemäärän myöhemmän nostamisen.

Voiko luonnollisen kielen kirjaus kirjoittaa tilikirjaan ilman ihmistä?

Ei. Kirjaus luo ehdotuksen ja ihminen vahvistaa sen, Brief-päätöksen D5 mukaisesti. Sääntö on pakotettu tiedostossa .go-arch-lint.yml, joka estää sisäänsyöttökontekstilta kaiken riippuvuuden kuluun tai tilikirjaan, joten CI hylkää tuonnin, jos kirjaus koskaan yrittää päiväkirjaan. Vahvistaminen on se, mikä luo kulun.

Mitä luonnollisen kielen kulujen jäsentämiselle tapahtuu, kun mallitasoa ei ole saatavilla?

Dimesum putoaa tasolle amount_only ja näyttää tyhjät kentät. cheap-fast-taso on kytketty Groqin openai/gpt-oss-120b-malliin ja toimitetaan ilman avainta, eikä keskitasolla ole sovitinta, joten kumman tahansa valitseminen epäonnistuu käynnistyksessä eikä käyttäjän ensimmäisessä pyynnössä. Kirjaus säilyttää raakatekstin joka tapauksessa.