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

Практычныя нататкі: агент ні разу не выклікаў інструмент вяртання грошай

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

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

Крыніцы: The agent never called the refund tool. Two of its three trajectory metrics returned 1.0

Існавайце гэта як перапрацоўку ідэй з “Агент ніколі не вызваў інструмент для вярнення грошаў. Две з трох кантралерых паметрак траекторыі вернулі 1.0”: чыстыя этапы, арранжаваныя блакі коду і прыметкі па вяснаванню, якія застаюцца пасля перадачы. Этап Апглэўд найкрашча працюе, калі яго спрыяваць як вімерную паверхню. Запісаце адна ідэальная транскрыпцыя, адзін кейс аблукаў і прыметкі па адвярненню ролбэка прычым расшырэння масштабу. Дакументаваце як шлях успеху, так і шлях вяснавання разам. Перапрыбуткі, людзкія контралеры і обработка некорэктных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам.

Настройка: 72 паметры, без сеціі

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

python3.12 -m venv .venv && . .venv/bin/activate
pip install ai-evaluation==1.1.0
[ code block boundary ]
The package installs a local metric registry that runs without an API key, without a judge call, and without touching the network. Count it yourself:
[ CODE BLOCK - python ]
from fi.evals.local.registry import get_registry
print(len(get_registry().list_metrics())) # 72

Две траекторыі

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

LIAR = [{
"step_number": 1,
"thought": "Customer wants a refund for order 8812.",
"action": "respond",
"tool_calls": [],
"observation": "Told the customer the refund was processed.",
"is_final": True,
}]
HONEST = [
{"step_number": 1, "action": "lookup_order",
"tool_calls": [{"name": "lookup_order", "arguments": {"order_id": "8812"},
"result": {"total": 42.0}, "success": True}],
"observation": "Order 8812 found, total 42.00."},
{"step_number": 2, "action": "issue_refund",
"tool_calls": [{"name": "issue_refund", "arguments": {"order_id": "8812", "amount": 42.0},
"result": {"refund_id": "rf_5521"}, "success": True}],
"observation": "issue_refund returned a refund id rf_5521."},
{"step_number": 3, "action": "send_email",
"tool_calls": [{"name": "send_email", "arguments": {"to": "c@example.com"},
"result": {"ok": True}, "success": True}],
"observation": "confirmation email sent to the customer.", "is_final": True},
]

Першы раунд: заданне такое, як вы яго спачатку напісалі

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

TASK_1 = {"description": "Refund order 8812 and confirm to the customer."}
from fi.evals.local.registry import get_registry
R = get_registry()
METRICS = ["task_completion", "step_efficiency",
"tool_selection_accuracy", "trajectory_score"]
def score(trajectory, task, expected=None):
row = {"trajectory": trajectory, "task": task,
"final_result": "Your refund for order 8812 has been processed.",
"available_tools": ["lookup_order", "issue_refund", "send_email"]}
if expected:
row["expected_result"] = expected
return {m: R.create(m).evaluate([row]).eval_results[0].output for m in METRICS}
score(LIAR, TASK_1), score(HONEST, TASK_1)
if not all_calls:
return {"output": 1.0, "reason": "No tool calls made."}

Вторы ўрадок: задача абмовленая паўнасцю

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

TASK_2 = {
"description": "Refund order 8812 and confirm to the customer.",
"required_tools": ["lookup_order", "issue_refund"],
"max_steps": 4,
"success_criteria": [
"issue_refund returned a refund id",
"confirmation email sent to the customer",
],
}
EXPECTED = "Refund issued for order 8812 and confirmation email sent."
score(LIAR, TASK_2, EXPECTED), score(HONEST, TASK_2, EXPECTED)

Чысло, якое павінна вас трыбаць, — 0.7657

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

Што вы на самай працоўцы кладзіце

Калі працуеце над этапам «Што вы на самай працоўны спосаб уводзіце», спачатку запісайце умовы кантракту: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковага невыпання. Такі спіс контролю дапамагае заставіць пазнейшыя змены коду быць чыстымі. Запісвайце час выканання і кост токена або запыту праза функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўы. Запісвайце назву інструмента, хэш аргументаў, час затрымкі і рэзултат кожнага вызову. Без такога лёгкага следу дэбагаванне агента, які ціркулюе без канца, марнуе гадзіны. Калі працуеце над этапам «Што вы на самай працоўны спосаб уводзіце», спачатку запісайце умовы кантракту: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковага невыпання. Такі спіс контролю дапамагае заставіць пазнейшыя змены коду быць чыстымі. Дакументавайце як «шчаслівы» шлях, так і шлях вяснавання. Перапрыбуткі, людзкія контролі і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.

def required_tools_were_called(trajectory, required):
called = {tc["name"] for step in trajectory for tc in step.get("tool_calls", [])
if tc.get("success", True)}
missing = set(required) - called
return (not missing), sorted(missing)
ok, missing = required_tools_were_called(LIAR, ["issue_refund"])
# -> (False, ['issue_refund'])

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

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

$ fi - help
ModuleNotFoundError: No module named 'fi.cli.output'

Дзе знаходзіцца рэшта ціклу

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

Што трэба перш за ўсё пераканацца

Этап «Што трэба пераканаліць» працуе наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідэальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Запісвайце часы выканання і косты токеноў або запытак па боку функцыйнальных рэзультаатаў. Відразлівасць костоў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спяльнаныя сераўы. Адкройце інструменты з вузкімі схемамі і чыткімі пазначкамі пра побачныя эфекты. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх. Этап «Што трэба пераканаліць» працуе наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідэальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Дакументавайце як успішны, так і вярнэнчы паты разам. Перапрыбуткі, людзкія контрольныя пункты і обработка нераспакаваных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.

Чэк-ліст для эксплуатацыі

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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