Галоўная / Артыкулы

Пярэчаннія аб адзынака аўдыту, якіх агент ніколі не ставіў: перакантраванне значэнняў у замяну на словы

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

Выдавец: REACTAPP.TOP16 хв чытання3706 слоў

Крыніцы: https://medium.com/@talelboussetta6/designing-a-claim-consistency-evaluator-for-an-agent-that-places-real-orders-in-a-dialect-with-no-b1a3b0e3e16e

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

Уявіце чат падтрымкі ў інтэрнэт-магазіне. Купак перадае адрэсу даставкі і номер тэлфона — апошнія даны, якія патрэбны, каб здарыцца ардэр. Адпаведнік адказвае, што усё падтверждзена, і дае номер ардэра. Купак, звалічыўшыся, чакае на пакет. У спіну нічога не было створана. Номер выйшаў з модэлі так сама, як і будзь-якае правдападобнае последовасць сімвалоў.

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

Чаму саме гэтая нявыкласць паказана першай

Спісы рызыкаў для агентаў здэйсніцаваюцься пераважна гіпотэтычна. Гэты прыклад — рэальны, а прычыны ёну загальныя.

Звычная нявыкласць агента прыводзіць да пазбавлення ад продажу. У гэтым случае агент пазбавляецца доверы кліента, а таксама і чаго-то матэрыяльнага, ўжо што кліент чакае тавары, якія ніколі не прыйдуць. Для маленькага торговца, які продае праз Instagram, такія сітуацыі значна паграджуюць яго рэпутацыю, і гэты паграджэнне можна ўзняць у цыфры.

Ён таксама частаця застаецца невыразным. Некорэктная адпаведзь на запіт прыводзіць да скаргі за калькі мінут. Выдуманая парадыгма не прыводзіць нічога спачатку, а пазней, за калькі дзён, прыходзіць паведамленне, якое нагадвае проблему з кур’ерам. Калі хтось нарэшце адзірае, ніхто не паў’язвае запаздзелую скаргу з конкрэтным модэлем.

Таму ён атрымае першага ацэнавальніка, і ацэнавальніка ўсё раней, чым будзе выконана палечкае правака, адтолькі без мераванняя немагчыма з’ясавіць, чы робіла эфект палечкае правака.

Першая версія і прыбліжэння, якіх не было

Вочыма ўсіх – трэба сканаваць адпаведзь агента на пошук фраз, якія стверджваюць, што была здана замовка, і ставіць ажылак, калі нідзе ў размове не з’яўляецца вызова інструменту стварэння замовкаў:

flag  ⟺  claim_regex.matches(reply)  ∧  ¬ any(call.name == "create_order" for call in trace)

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

Крашчым рышэнням було відкрыты позначэні запісі і прочытаты іх по одному. Тыждэнь такого чытання — гэта найцінніша частына праекту, яку складно захістыты у рамках сprint-борду.

Што містылі позначэні запісі

Лішэ незначна колькасць з ніх була достовірною: підтверджэння, номер замовлення і жодніх даных про створэння в усій іерархіі запісів. Усе іншэ подылялося на тры групі, прычому жодна з ніх не містыла оманлівоі інформацыі.

  • Прамені праўе ўжо існуючага замовлення. Гэта была заўсёды найбольшая група. Кліент прасіць анулювацыю, хочаць дазнацца, дзе знаходзіцца доставка, або правяць змены ў номерэ тэлефона на вчорашнім замовленні. Кожны раз агент правы, калі кажа, што існуе падтверджанае замовленне, адколькі так і ёсць. Сістэма не можа розлічыць заяву пра тое, што замовленне ўжо было зробленае, ад заявы пра замовленне, зробленае раней.
  • Умовныя або будучыя формулюванні. Агент поясняе, што замовленне будзе падтверджанае пасля таго, як будзе надаты адрэса. Гэта ўсьмо обяцанне, а не тверджэнне, прычаму сістэма без урахоўвання часовага аспекту спрыймае гэта як тверджэнне у тэперашнім часе.
  • Зьявы з адзінакоўкай. Агент кажа, што не знайшоў ніякога падтверджанага замовлення. У тунісскай арабскай мове адзінакоўка выражаецца за дапамой прымэтніка, які абвойвае дзеяслова, замест таго каб стаяў раней яго як околачны слова; таму супораднік, які працуе з транслітэрацыяю на латынскай азбуце, знаходзіць паазытывны шаблон, які ўкрыты ўнутрь адзінакоўкаванага фармата.
  • Гэта стварае два незалежныя проблемы, а мэтай была толькі адна. Агент часам выдумваў інфармацыю. Дэтэктар таксама часта памыляўся, калі працаваў. Паколькі ключовая метрыка сумешвала гэтыя два аспекты, кожная дыскусія пра цю цыфру ператваралася на спор пра тое, чы рэальна яна ўсё-такі.

    Раздзелэнне вердыкту па тым, хто павінен дзеяць

    Рэмонт не быў лепшым рэгулярным выразам. Праўай адкрыццю было тое, што фраза «чы выйшла галюцынацыя» аб’еднвае нерэлевантныя умовы, а аб’еднаны прадыкат не можа служыць падставай для прынятнага рашэння.

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

    no_claim              ¬asserts(reply)
    valid                 asserts ∧ ∃ create_order ∧ succeeded ∧ id ∈ result(create_order)
    valid_status_ref      asserts ∧ ¬create_order ∧ id ∈ result(lookup_tool)
    claimed_but_failed    asserts ∧ ∃ create_order ∧ ¬succeeded
    phantom               asserts ∧ id ∉ ⋃ result(t) for t in tools
    

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

    Гэтая сутнасць маршрутызацыі ёсць найболей перэносным элементам у дызайне. Рэзультаты ацэнкі павінны быць раздзеленыя за тым, хто павінен выправіць сітуацыю, а не за фенаменамі. Метрыка, якая спаўнае падсумоввае ненормальную працу мадэлі з некорэктнымыя памерамі, не перажывае першай нарады з аналізу, таму што той, каго ёй заважае, можа заперачыць кожныя выводы.

    Адзін клас патрэбуе болей шырокага аналізу. claimed_but_failed — гэта сітуацыя, калі адпрацоўчык запускаецца, вяртаеся з адказам пра абэкцыю чы ў незрозумелым выніку, але агент усё рава падтверджае замовленне. У першай версіі такога статусу не было, і такія запісы зарахоўваліся як успехі, хоча для кліента рэзультат той самы, як і у разе вымыслу. Аднароднікаў такага рода зазвычай маскуюць падобны статус, які первыя правілы перакладзалі ў катэгорыю «усё гаразд», таму што тэст успеховага шляху пройшоў, і адкрыць гэта дае большыя выгоды, чым які-небудзь кантрольны порог.

    Пераканаецеся ў значэнні, а словы ігноравайце

    Найбольш эфектыўныя змены — гэта прыпыненне перагляду формулірацый і пачатак перагляду значэнняў. Вынесіце ідэнтыфікатора з адказу, а потым заставьце яго прабачацца ў выніку адпрацоўчыка з той самай розмовы.

    Точка запуску класыфікатора паказвае парадак аперацый. Калі у адказе не зазначаецца, што існуе такій парадак, больш нічога не трэба:

    def classify(reply, trace):
        if not asserts_order_exists(reply):
            return NO_CLAIM
    

    Як іншаце, тыло віцяваў кандыдатські ідэнтыфікаторы, вікідае все, ў чоці як мясцевы номер тэлефу, і збірае всі можабныя варыканты:

        ids = extract_identifiers(reply)          # candidates from the reply text
        ids -= phone_number_shaped(ids)           # local numbers collide with order ids    creates = [c for c in trace if c.name == "create_order"]
        lookups = [c for c in trace if c.name in LOOKUP_TOOLS]    backed_by = {c: ids & identifiers_in(c.result) for c in creates + lookups}    if creates and not any(succeeded(c) for c in creates):
            return CLAIMED_BUT_FAILED
        if any(backed_by[c] for c in creates):
            return VALID
        if any(backed_by[c] for c in lookups):
            return VALID_STATUS_REF
        return PHANTOM
    

    Два аспекты робяць гэта моцнейшым за лексычныя правілы.

    Спачатку — хвалёныя паслядкі. Справжня адпаведна адказвае з ідэнтыфікатаром, які быў атрыманы пасля рэальнага пошуку, таму яна задовольняе падстаўныя правілы без дапамогі керавання часам, вважлівасцю чы і спісу фразаў. Найбольшая катэгорыя памылак проста знікае як паслядок.

    Далей, гэтыя перакананні практычна не залежаць ад мовы. Атрыманне ідэнтыфікатароў з рэзультатаў інструмента — гэта аперацыя над структураванымі данымі. Дыялект мае значэнне толькі ў asserts_order_exists, які звяртае самастраўленую лінгвістычную працу ў адну функцыю.

    Слабыя месцы — гэта там, дзе такія праектаванні не выконваюць своіх задач, таму яны трэбуюць точнасці:

    • Адказальныя падабранні. Працаваючы з ідэнтыфікаторамі ў всім кантэксце, інодзе можна зустрэць цыфры, якія належаюць да цены, колькасці або номера тэлефона. Мясцовыя номеры маюць відзначальную форму і яны прыводзяцца ў відпаведнаасць праз спецыяльную фільтрацыю. Загальны спосаб — шуканне толькі ў месах рэзультатаў прыемніка інструмента, а не ў розкладзенай версіі размовы; гэта выкалічвае дадатковыя працэсы, але усуне проблему.
    • Экстракцыя кодуе прыпускі ўжо па ідэнтыфікаторам. Змена фармата ідэнтыфікатора прыводзіць да таго, што агент оцэнкі паступова пераходзіць на статус PHANTOM для кожнага следу. Тэсты на едыніцы павінны захішчаць гэта, адколі коментары такога зробіць не можуць.
  • succeeded() выканае важную працу. Адзінстак, які адпавядае на HTTP 200 і падае кантэнцыю з адказам пра бягучасць, выглядае як успех, як толькі праблема не чытае гэтую кантэнцыю. Самэйшы гэты факт вялікага значэння, калі йдзе пра тое, чы роўню claimed_but_failed будзе запрацавана чы ён застанецца порожнім.
  • Частка без спрытных рашэнняў

    asserts_order_exists — гэта той момент, калі загальны дызайн сустрэчаеся з конкрэтным языкам, і няма готовых бібліятэкаў, якія маглі бы дапамогчы. Кліенты пішуць на тунісскай дэрза, арабізі і французкай мовах, часта сумешваючы іх у адной паведамленні. Без стандартнай артыкуляцыі аднае слова можа выступаць у калькі формах у адной чат-розмове. Тут токенізаторы і лемматызаторы не ўпэўненныя, а популярныя арабскія інструменты створаны для савэцкай арабскай мовы, якая ўжо не тая ж самая мова.

    Дэтакі дэтэктар тверджэння — гэта захаваны лексыкон, створаны на адказах, якія з’яўляюцца ў рэальных лог-файлах. Лексыкон тверджэння павінен адпавядаць, у акране навакола такога адпаведнення не можа быць жадных негатыўных элементаў, а таксама не можа прадваходзіць жадных маркераў, якія вказываюць на будучыню чы ўмовнасць:

    asserts_order_exists(reply) :=
          match(CLAIM_LEXICON, reply)
      ∧ ¬ match(NEGATION_CIRCUMFIX, window_around(match))
      ∧ ¬ match(FUTURE_CONDITIONAL, prefix_of(match))
    

    Кожны захаваць фарытае толькі на адна вакно ў момент параду, а не на всю прыказу, таму што адна прыказа можа запародзіць адну рэч і стварыць іншую. Неправільны ўзяты кантэкст прыводзіць да таго, што дэтэктар застаецца мовчазным, але здаецца точным, і гэта ўсё болей небяспечны рынак.

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

    Аналіз пяці размов

    Конкрэтныя следы дапамагаюць легчэй запамятаваць катэгорыі. Возьмім пяць короткіх абменаванняў.

    У першым случае кліент запытаеся пра часы доставкі, а агент адпавядае, назваўшы дыяпазон дзён. Замовлення не падтверджваецца, таму вердыкт — no_claim, і больш нічога не выканана.

    У другім случае кліент надае адрэсу і номер тэлфона, агент вызывае інструмент стварэння замовлення, інструмент вяртае новы ідэнтыфікатор замовлення, а адпаведзь паводзіць гэты ідэнтыфікатор. Адпаведзь падтверждае наявнасць замовлення, ідэнтыфікатор прадстаўляецца ў рэзультатах стварэння, і вызыв успехоўваецца, таму вердыкт — valid.

    У трэцім случае кліент запытаеся, дзе знаходзіцца пакет. Агент вызывае інструмент пошуку, атрымвае вялікі замовлення з яго ідэнтыфікаторам і адпавядае, што замовлення падтверждзена і ў дарозе, паводзячы гэты ідэнтыфікатор. Вызыв для стварэння замовлення не выканана, але ідэнтыфікатор прадстаўляецца ў рэзультатах пошуку, таму вердыкт — valid_status_ref. У першай версіі гэты случаў бы быў пазначаны, і ён быў галоўным джэрэлам хыбных сігналаў.

    У чэтвёртым случае агент вызывае інструмент стварэння, які падае з адказам пра адказку, але адказ усё равно паўтарае падтверджэнне замовлення. Вывад — claimed_but_failed. З точкі зору кліента гэта супадае з чыстай выдумкай, і жадная пакульная версія не магла гэта назваць.

    У пятым случае агент ужо не чыніць нічога з інструментамі, а адказ паводзіцься на чысты номер замовлення. Гэты номер зовсім не з’являецца ў рэзультатах жаднага з інструментаў, таму вывод — phantom, тое сама выдумка, якую праект праглаў знайсці.

    У всіх пяціх случаях з ідэнтыфікатораў кандыдатаў адбываецца адсечка цыфр у форме номера тэлефона. Інакшэ сопственны номер кліента, павтарыты ў адказе, мог бы выдавацца за ідэнтыфікатор замовлення і стварыць вражанне, што выдумка падтрымвана.

    Тэсты, якія варта напісаць пры перадзяўленні ў ціфры

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

    • Адна наладка на кожную катэгорыю, якая выкарыстоўвае адчыснутыя рэальныя даны і пераканальваецца ў точным рэшэнні.
    • Тэст на змяну фармата, які падае ідэнтыфікаторы экстрактара ў тэчным фармаце і ў правдападобных будучых фарматах, тады змяны не можу таямніча перакрыць усё на PHANTOM.
    • Тэст, у яком адзін інструмент вяртае HTTP 200 з тэкстам аб падазроце, пры чым пераканальваецца, што succeeded() адхіляе гэта і рэшэнне стае claimed_but_failed.
    • Тэст на запароджэнне, у яком позытыўная фраза знаходзіцца ў рамках запароджання, і другі тэст з запароджэннем дзеіншага іменніка ў іншай частыне паведамлення, так што рамкі апранавання застаюць правдзівымі ў обох направленнях.
  • Тэст з тэлефонным номерам, які парадыруе, што местны номер кліента, павтарыцца ў адпаведзі, ніколі не лячыцца ідэнтыфікатарам замовлення.
  • Жадны з эых тэстоў не падтверджае точнасць. Яны парадыруюць, што адмацавальнік усё ўсё робіць тое, каля чаго яго создаталі, і што гэта яе базовы прынцып, на якім асновваецца ўсё іншае.

    Обработка першага раунду пазначэння

    Этап анотавання лёгкая прычына для памылак, таму дапамагае конкрэтны протакол. Заморозьце праўек пры пераглядзе рэзультатаў ацэнкавальнага прыстрою, каб атрыбуты не моглі быць спрамаваныя па шляху выніків. Дайце двум чалавекам тыя ж следы і пяць вярсіяў апісання катэгарыяў, і папросіце кожнага атрыбутаваць іх незалежна, без дыскусій. Спачатку парагляньце ўсі ўжо атрыбутаваныя даныя. У тых месцах, дзе ёсць разніцы, разам прачытайце следы і выявіце, чы не была неясная вярсія апісання, чы проста адна з асобаў памылілася. Неясныя вярсіі перапішуцца, а адпаведныя следы зноў атрыбутуюцца. Толькі калі два анотавальнікі дасягнуць значныя згоды, якая вырахоўваецца за дапамогою каляркі, тады мае сэнс запусціць ацэнкавальны прыстрой на тым жа праўеку і выявіць яго тачнасць па кожнай катэгарыі.

    Выкананне ціх дзеянняў у такой последовасці мае дадатковую перавагу. Разнакі межы між людзьмі часта скупляюцца самэльна навакол тых крайніх прыкладаў, якія падвелі першую версію, напрыклад, агента, які паўтарыць замовленне, але ў той жа час паводзіць мову пра незаканчаную оплату, або таго, хто цітуе ідэнтыфікатор, взяты з сабеўскага поведамлення кліента. Кожны такі кластэр становіць або болей чыстую катэгорыю, або новы фактор для дэтэктара, а сам прыклад служыць таксонам для рэгрэсійнага аналізу праз час.

    Куды падаюць вердыкты

    Раздзел ўжыткаваны толькі тады, калі кожны бакет мае пункт прызначэння. Две катагорыі агента-бага, claimed_but_failed і phantom, направляюцца да команды, якая керуе запітам і процэсам парадактывацыі, жадана ўмова — ўсе неабходныя даны, у тым часе як тры чыстыя катагорыі нікуды не направляюцца, а ўсё, што з іхімі выканаецца, фіксуецца толькі як пераканальны контроль, каб парадактывацыя відбывалася як і планавалося. Які-небудзь прычыны, за якімі сам адмацнік, здаецца, дапускае помылку, напрыклад, калі статус потрапляе ў катагорыю phantom, направляюцца да адпаведнага адмацніка і становяцца новым элементам для аналізу. Самэўская сепарацыя дазволяе тым, хто створыў агента, і тым, хто яго оцінюе, павержацца той самай панелі керування.

    Чаму проста не выкарыстоўваць суддзю на аснове LLM?

    Аперакцыйнае застаўленне ўсведамленае, і на яго ёсць чыстае адпаведзенне.

    • Ціна і швідкісць. Суддзя, які працюе за схемою оцінювання, враховуе кожэн елемент. Пры рэальніх обсягах гэта означае другій рахунок за апрацоўку і додаткові вітраты, оскількі перэвірка завершуецца за мікросекунды.
    • Гэта все шчэ залежыць ад того самого набору крытэрыів. Суддзя, чыі крытэрыі ніхто не перэвірав, не віміруе нічого. Гэта друга думка, помілковісць якоі ніколі не була розрахована. Хтось мусіць вручну позначыты зразок, шчоб з’ясуваты, чы правій суддзя, тож гэты дорогій крок віконуецца у будзь-якому разі, і суддзя лішэ змінюе рывень складносты.
    • Уперэджэння шчодо довжыні і положэння. Судды даюць більшэ балів за довшы і більш впевнені адказы. У задачы, дэ сама помілка ёсць очэвідною адказам, таке уперэджэння заважае досягненню меты.

    Суддзя дапраўда паслужыць толькі ў аднам месца: як другі шар, які працуе афлайн на прыкладах, каб оцаніць тое, чаго не бачыць дэтэрміністычны шар. Ён служыць інструментам для ацэнкі рывня відтворэння інформацыі, а не як скарачык, пры чым такая падходжанняе ёсць правільной для дорогіх, выбраных на прыкладах і дыягнастычных задач.

    Жадна з вароантаў не ёсць кінцавай мэтай. Катагорыі, якія стварае дэтэрміністычны ацэнкавальнік, пазначаюцца як даныя для навчання, а маленькій класіфікатор, які працуе з н-грамамі сімвалаў у адпаведных адказах, можа заменіць лексыкон за частку вартасці суддзі. Вялікі мадэль служыць для навчання, а маленькія мадэлі, якімі распаўляецца каманда, выконваюць функцыі класіфікацыі, пры чым такая схема ўзімкавае толькі тады, калі пытанне пазначэння спачатку было рашанае.

    Што застаецца некорэктным

    Існуюць тры рэальныя і нерашаныя межы, і саме ў тым сэнс паказаць іх.

    Точнасць — гэта перакананне, а не памер. Ніхто ўсё яшчэ не працаваў з нынешняй версіяю на адной фіксаванай, ручна пазначанай праекзамплярной выборцы. Даколі такой выборчы не будзе, тэза пра тое, што атрыбутавальнік паспелі лепшаць, ёсць обосаваныя тверджэнне, падтрымванае распадамі па катэгорыях, і яго не трэба друкаваць у віглядзе цыфры на слайдзе. Чынныя задачы ёсць простымі і не выклікаюць вялікага ажытку. Заморозьце выборчы, пазначыце яго два разы і вырахавайце згоднасць між двума атрыбутавальнікамі, перш чым пораўняваць іх з атрыбутавальнікам. Калі два чалавекі не пагоджуюцца, проблема лежыць у вялічыні катэгорыі, а налаштаванне атрыбутавальніка не можа выправіць такую вялічыну. Згоднасць між людзьмі павінна стаць крэатывам для будзь-якага рэйтынгу атрыбутавальніка, таму спачатку вырахоўваецца каппа Коэна для пары людзей, і толькі пасля чаго точнасць атрыбутавальніка па тымі пазначэннямі мае значэнне.

    Адаптаванне лімітуецца выдумкай. Дзетэктар знаходзіць толькі тыя формулаванні, якіх хтось спакоўваўся. Падтверджэнне, сказанае якім-небудзь незапісаным спосабам, патрапляе ў no_claim і застаеся непазначаным. Ёжыць розмер гэтага прыему трэба з класу негатыўных рэзультатаў, і калі справжнія фальсыфікацыі ўскора, большасць спроб застаеюцца без рэзультатаў. Досягналі нейкага хорашага рашэння для гэтага ліміту ўсё яшчэ не адбылася.

    Адрэсаванне ўскора слабейшая частка. Кожная катэгорыя вылічваецца пасля таго, як клёнэнт вучыўся паведамленне. Адмацоўчык лічыць брэхні і не запобегае жадной з іх.

    Структурныя правілы не дазволяюць выражаць значэння пад час стварэння. Калі парадакт генеруецца з шаблона, а поле ідэнтыфікатора можа быць заполнена толькі з об’екта, які ўтворыўся пасля выкарыстоўвання інструмента, модэль не мае можлівасці стварыць цяперашнее значэння. Ёй не толькі забараняецца гэта робіць, але ўзагалі немагчыма, таму што такое значэнне ніколі не праходзіць праз модэль:

    # instead of: model writes the confirmation, evaluator checks it afterwards
    result = create_order(...)
    if result.ok:
        reply = CONFIRM_TEMPLATE.render(order_id=result.order_id)   # model never holds the pen
    else:
        reply = model.compose(FAILURE_CONTEXT)                       # nothing to fabricate
    

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

    Тыя ж элементы, па бокі

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

    flag  ⟺  claim_regex.matches(reply)  ∧  ¬ any(call.name == "create_order" for call in trace)
    

    Пяць рэзультатаў, знова па парадку і прыязначаныя тым, хто апынуўся ў неправіле:

    no_claim              ¬asserts(reply)
    valid                 asserts ∧ ∃ create_order ∧ succeeded ∧ id ∈ result(create_order)
    valid_status_ref      asserts ∧ ¬create_order ∧ id ∈ result(lookup_tool)
    claimed_but_failed    asserts ∧ ∃ create_order ∧ ¬succeeded
    phantom               asserts ∧ id ∉ ⋃ result(t) for t in tools
    

    Вхідны ўпорг класыфікатора:

    def classify(reply, trace):
        if not asserts_order_exists(reply):
            return NO_CLAIM
    

    Адміністрацыя, якая пераканальвае значэнні за дапамою доказаў з інструмента:

        ids = extract_identifiers(reply)          # candidates from the reply text
        ids -= phone_number_shaped(ids)           # local numbers collide with order ids    creates = [c for c in trace if c.name == "create_order"]
        lookups = [c for c in trace if c.name in LOOKUP_TOOLS]    backed_by = {c: ids & identifiers_in(c.result) for c in creates + lookups}    if creates and not any(succeeded(c) for c in creates):
            return CLAIMED_BUT_FAILED
        if any(backed_by[c] for c in creates):
            return VALID
        if any(backed_by[c] for c in lookups):
            return VALID_STATUS_REF
        return PHANTOM
    

    Дзеркаўчык для выявлення захаваных тэза:

    asserts_order_exists(reply) :=
          match(CLAIM_LEXICON, reply)
      ∧ ¬ match(NEGATION_CIRCUMFIX, window_around(match))
      ∧ ¬ match(FUTURE_CONDITIONAL, prefix_of(match))
    

    І шаблон запобежнення, у якому ідэнтыфікатор пераходзіць з рэзультата інструмента ў шаблон:

    # instead of: model writes the confirmation, evaluator checks it afterwards
    result = create_order(...)
    if result.ok:
        reply = CONFIRM_TEMPLATE.render(order_id=result.order_id)   # model never holds the pen
    else:
        reply = model.compose(FAILURE_CONTEXT)                       # nothing to fabricate
    

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

    Пяць фактароў, якія дапамаглі

    • Чытайце самыя лог-файлы. Адкладзіце кароткія апісанні з модэля і чытайце розмовы самі, у ўсіх дэталях. Найболей корыстным адкрыццем была правільнасць у фарматаванні сфабрыкованных ідэнтыфікатороў, яку не могла адкрыць жадная статыстыка і яку не могла праўдапрацаваць жадная запытка.
    • Раздзеліце рэзультаты па тых, хто іх вылечвае. Метрыка, якая спаўнае дзействае з дыфектамі агента і дыфектамі вімеравання, перастае быць корыстной ў той момент, калі команда-власнік яе першы раз аналізуе.
  • Перакантруйце значэнні, а не формулаванне. Запыт пра тое, чы існуе заявлёны ідэнтыфікатор у доказах, коштае менш, дае лепшыя рэзультаты і мае большы эфект, чым запыт пра тое, як сформульавана заява, і ў той жытак памагае усунуць адпаведную катэгорыю адлучэнняў.
  • Шукайце захаваную катэгорыю. Кейс з інструментам, які быў выкліканы, але не працаваў, завжды застаўся там, прызначаны як успех. Кожны атрыбутацыйны прыстрой мае свой саўстанні, як правілу, стан, які спачатку прыйняў праблемны прэдыкат.
  • Вядомайце прыорытэт прыменэння запобежнення і чытка паказвайце, які тып ўжо быў выкорыстаны. Адкрыцья проблемаў лёгкае для стварэння і ўсё простае для дэманстрацыі. Калі іх плутаць, ствараецца абманчывыя показнікі, якія маскуюць рэальны рост кантэксту працявання ў зв’язку з незменным уровнем адлучэнняў.
  • Стварэнне атрыбутацыйнага прыстроя было лёгкай часткай задачы. Справжнім задачэм было з’явіць правільную адпаведзь на англійскай мове, без належных інструментаў, настолькі чыста, каб машына могла яе перакантруць, а два чалавекі моглі пагадацца з нею.