dimhold.by
← Артыкулы

Flan-T5 правільна прачытала 1393 радкі рахункаў з 1413 і правільна падлічыла вынік 1 рахунку з 400

Пасля выхаду ChatGPT 2 тыдні таму ў фінтэху я часцей за ўсё чую адну ідэю: хай моўная мадэль правярае дакументы. Бярэм рахунак і глядзім, ці сыходзяцца радкі з вынікам. У мяне было сваё меркаванне пра гэта. Я яго ніколі не правяраў. Я думаў, што цяжкая частка гэта чытанне. Мадэлі трэба знайсці патрэбны лік побач з патрэбнай назвай. Скласці пасля гэтага 4 лікі здавалася простым крокам.

У ChatGPT няма API, таму адправіць яму некалькі тысяч рахункаў я не магу. Замест гэтага я запусціў мадэль на сваёй машыне і вымераў, дзе яна перастае адказваць правільна.

Стэнд

Мадэль гэта Flan-T5 ад Google, base (250M параметраў) і large (780M), выйшла ў кастрычніку. Працуе на 4 ядрах віртуальнай машыны AMD EPYC: Python 3.9, torch 1.13, transformers 4.25.1, прагнае дэкадаванне. Адно пытанне займае каля 0,4 с на base і 1,5 с на large.

Скрыпт згенераваў 400 рахункаў з seed 2022, так што правільны адказ вядомы для кожнага. Радкоў у кожным ад 2 да 5. У палове рахункаў сумы цэлыя, да 99, напрыклад PLN 45. У другой палове сумы з грошамі, да 999,99, напрыклад PLN 412.35. Рахунак выглядае так:

Invoice No. 55049
Seller: Marek Nowak Consulting
cable ties: PLN 9
paper reams: PLN 68
drill bits: PLN 90
desk lamps: PLN 92

Пра адны і тыя ж рахункі я задаў пытанні 6 відаў. Для 2 з іх дастаткова прачытаць: сума аднаго радка і вынік, калі ў рахунку ёсць радок Total:. Для 4 трэба палічыць. 2 з іх працуюць з 2 радкамі, гэта сума і розніца. 3-і гэта вынік, калі радка выніку няма. 4-ы гэта колькасць на цану для радка, запісанага як 6 x PLN 73.82. Кожны промпт складаецца з дакумента і пытання, а за імі ідзе Answer with the amount only. Адказ правільны, толькі калі ў ім роўна 1 лік і гэты лік правільны.

Чытанне

Large правільна прачытала 1393 сумы радкоў з 1413 і 388 надрукаваных вынікаў з 400. Base справілася горш, 1154 радкі і 360 вынікаў. Яна часта не спынялася пасля сумы і выдавала яшчэ і наступныя радкі.

правільных адказаў з усіх пытанняў кожнага віду base large адказ надрукаваны сума радка 1154/1413 1393/1413 надрукаваны вынік 360/400 388/400 адказ трэба палічыць сума 2 радкоў 0/400 2/400 розніца 2 радкоў 0/400 3/400 колькасць x цана 0/400 0/400 вынік без радка выніку 0/400 1/400
Адны і тыя ж 400 рахункаў. Large правільна адказала на 6 з 1600 пытанняў з вылічэннем, base на 0.

Памылкі ў large не выпадковыя. З 20 яе няправільных адказаў пра суму радка ў 19 стаіць адна няправільная сума. У 18 з гэтых 19 гэта сума радка вышэй. 14 з гэтых 19 прыпадаюць на рахункі з 5 радкамі і цэлымі сумамі. Усе 12 няправільных вынікаў ад 1000 і вышэй. Толькі ў такіх вынікаў і ёсць раздзяляльнік тысяч. Замест 2188,24 large вярнула PLN 1,218.24, а замест 3005,03 вярнула PLN 30005.03. Усе 228 вынікаў да 1000 яна прачытала правільна.

Вылічэнні

Large правільна адказала на 6 з 1600 пытанняў з вылічэннем. Base ні на адно. Усе 6 прыпалі на рахункі з цэлымі сумамі, так што нават там гэта 6 з 800. У 2 з 6 правільная сума была надрукаваная ў рахунку яшчэ і як іншы радок, 79 і 91. Large вярнула гэты лік. Склала яна ці спісала, я сказаць не магу.

Больш мяне турбавалі няправільныя адказы. На пытанне пра вынік, калі радка выніку няма, large у 201 выпадку з 400 вярнула суму аднаго з радкоў. Яшчэ ў 16 яна вярнула нумар рахунку. У астатніх 182 яна вярнула лік, якога ў рахунку няма. Усе яны выглядаюць дакладна як вынік. Адказ гэта 1 лік з PLN наперадзе. Парсер прымае яго без памылкі. З колькасцю на цану было інакш. Large ва ўсіх 400 выпадках паўтарыла радок, 6 x PLN 73.82. У large гэта адзіны від пытанняў, дзе збой гучны, бо ў адказе 2 лікі.

Просьба паказаць крокі

Flan-T5 вучылі на прыкладах з разважаннем па кроках, таму сумленная наступная спроба гэта дапісаць да пытанняў пра суму Let's think step by step. Тады large распісвае вылічэнне. На рахунку вышэй яна адказала:

The total amount of all items is PLN 9 + 68 + 90 + 92 = PLN 340. The answer: 340.

Правільны вынік 259. Тут кожны лік злева ад = правільны, а памылка толькі ў складанні.

рахунак cable ties: PLN 9 paper reams: PLN 68 drill bits: PLN 90 desk lamps: PLN 92 large піша 9 + 68 + 90 + 92 = 340 адказ large той жа выраз лічыць Python 9 + 68 + 90 + 92 = 259 правільна выраз запісаны 398/400 уласны адказ правільны 3/400 выраз правільны, калі яго палічыць Python 223/400
Па кроках на першых 200 рахунках, 400 пытанняў пра суму, толькі Flan-T5 large.

Я прагнаў гэта толькі на першых 200 рахунках, гэта 400 пытанняў пра суму, бо 1 адказ займае каля 8 секунд. Large запісала выраз у 398 з іх. Яе ўласны канчатковы адказ быў правільны ў 3. Потым я палічыў запісаны ёю выраз у Python. Правільнымі аказаліся 223 з 400. На хвіліну я падумаў, што гэта і ёсць рашэнне, але пытанні пра вынік рахунку ўсё сапсавалі. У пытаннях пра вынік без радка выніку выраз утрымліваў усе радкі рахунку толькі ў 89 выпадках з 198. Пры 2 радках гэта 51 з 55, пры 5 радках 8 з 43. У 99 з астатніх 109 мадэль выкінула частку радкоў з сумы. У апошніх 10 яна няправільна прачытала або паўтарыла суму.

Чытае мадэль, складае код

Таму я падзяліў працу па гэтай мяжы. Мадэль чытае суму кожнага радка, па адным пытанні на радок, а Python іх складае. Тады large дала 386 правільных вынікаў з 400 супраць 1 з 400, калі яе пыталі пра вынік наўпрост. У кожным з 13 няправільных вынікаў ёсць няправільна прачытаны радок. У 1 рахунку радок вярнуўся з 2 лікамі, таму код адмовіўся яго складаць.

вынік 400 рахункаў 2 спосабамі правільна няправільна, ціха гучна, код адмаўляецца спытаць у мадэлі вынік flan-t5-base 0/355/45 flan-t5-large 1/399/0 мадэль чытае радкі, код складае flan-t5-base 211/18/171 flan-t5-large 386/13/1
Гучна значыць, што ў адказе больш за 1 лік і код бачыць, што нешта не так. У другім спосабе для гэтага хапае 1 радка.

Пры такім падзеле base дала 211 правільных вынікаў і 18 няправільных. У астатніх 171 нейкі радок вярнуўся ў выглядзе PLN 9 paper reams 68. Код такі радок скласці не можа. Калі base пыталі пра вынік наўпрост, яна так гучна памылілася 45 разоў, а ў астатніх 355 ціха.

Ідэя не мая. Артыкул мінулага месяца, PAL ад Gao з суаўтарамі, робіць тое ж самае ў агульным выглядзе. Мадэль піша праграму, а інтэрпрэтатар яе выконвае. Мадэлі, пабудаваныя для FinQA і TAT-QA, 2 набораў 2021 года з такімі пытаннямі па фінансавых справаздачах, таксама аддаюць вылічэнне коду.

Дзе б я правёў мяжу

Для мяне мяжа цяпер ясней. Калі лік, які вярнула мадэль, надрукаваны ў дакуменце, я магу хаця б праверыць, што ён там ёсць. Памылку з радком вышэй такая праверка не зловіць, але гэта хоць нешта. Калі лік трэба палічыць, Flan-T5 на гэтых рахунках амаль ніколі не лічыць яго правільна. Яна вяртае нешта правільнай формы. Праверка, што адказу няма сярод лікаў дакумента, злавіла б 217 з 399 няправільных вынікаў large. Астатнія 182 прайшлі б.

Правіла для памылак чытання ў мяне дагэтуль няма: радок вышэй у доўгіх рахунках і вынікі ад 1000. Здараюцца яны рэдка, а парсер прымае іх як любы правільны адказ.

Чаго я не правяраў

  • Большыя мадэлі. text-davinci-003 ад OpenAI даступная праз API каля 2 тыдняў. Для гэтага прагону мне была патрэбная мадэль на сваёй машыне, таму davinci я не спрабаваў. Большыя мадэлі, магчыма, складуць 4 лікі правільна.
  • Сапраўдныя рахункі. Гэтыя сінтэтычныя, на англійскай, па адным радку на пазіцыю. У іх няма сканаў і памылак OCR.
  • Іншыя промпты. Я выкарыстаў 1 фармулёўку на пытанне і прагнае дэкадаванне. Прыклады ў промпце маглі б змяніць гэтыя лічбы, асабліва ў base.