Практычныя прытамулкі: Стварэнне агентаў AI на Rust — частка 2
Практычныя прыказкі: стварэнне агентаў AI на Rust — частка 2: кантракты, перакрыцчы і слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
Наступныя прытамлівкі паказваюць практычны шлях для вывучэння «Стварэння агентаў AI на Rust — частка 2». Акцэнт ставіцца на кантракты, пераконтроўваннія і месца для коду, які можна легка адразу вставіць, а не на мотывацыйныя аспекты. Калі працуеце над стадзіяй агляду, спачатку запісайце кантракт: неабходныя вхідныя даны, сігнал успеху і тое, што выканаецца у разе частковай нявыполненасці. Такі список контролю дапамагае залишыцца чыстаснам у пазнейшых змяненах коду. Спрыятлівае ставленне да гэтай стадзіі значыць спрыятлівае ставленне да кантракту межа вхіднымі данымі і пераконтроўванымі выходнымі рэзультатамі. Дайце назвы элементам, задаць критэрыя успеху і не падтрымайце тыхню частковую завершэннасць.
Чаму тут важны структура
Структура «Чаму» мае важна значэнне тут — ей лепша прымкнуць як да памерной паверхні. Запісаце адна «золатая» транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненні змян перш чым расширваць масштаб. Запісвайце часы выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца рана, таму не будзе неспакою з рахункамі, калі праця перайдзе з дэмаверсіі ў спакульнаныя сераўысы. Храніце стан графа простым і з адзінаковым типам дадзеных. Вкладаныя блокі маскуюць, калькі вузел запісаў калькі поль, і спакойнае продаважанне працы зупіняецца пасля перарываў.
Чатыры шары
Чатырошаровая структура працюе найкраща, калі яе розглядаць як вимерную паверхню. Запісаўце адна «золатая» версія, адзін прыклад неудачы і запіс пра вярнэнне да поперадньага стану пры розшырэнні масштаба. Зберагачце настройкі пазырочна ад коду прыемліка. Файлы сераўіснага сэрвісу, хранілішчы секретных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Зберагачце стан графа ў простам і типаваным формате. Вкладныя блокі маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перерываў.
Тыпаваны кампілятор
Этап будування з типамі A працюе найкраща, калі яго спрыяваць як мерыемую паверхню. Зберагчыце адны ідеальны прыклад роботы, адну справу з бягамі і прыметку па абратанню роботы, перш чым расширваць сферу дзеяння. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў ёсцю часткая продукту, а не элементы пазнейшай дапрацоўкі. Храніце стан графа ў простам і типаваным формате. Вярнутыя структуры маскуюць інфармацыю пра тое, канферны вузел запісаў канкрэтнае поле, і спакшваюць продовжэнне роботы пасля перарываў. Этап будування з типамі A працюе найкраща, калі яго спрыяваць як мерыемую паверхню. Зберагчыце адны ідеальны прыклад роботы, адну справу з бягамі і прыметку па абратанню роботы, перш чым расширваць сферу дзеяння. Спрыявайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўайце назвы артыфактам, задаюце критэрыя успеху і адмовляйцеся ад мовчанкавага частковага завершэння роботы.
let prompt = SystemPromptBuilder::new()
.identity("You are Eugene, a careful research assistant who answers \
questions about a Rust project. You prefer reading the source \
over guessing.")
.instruction("Use `list_files` to discover what is in the project before reading.")
.instruction("Use `read_file` to inspect a specific file. Do not call it on \
paths you have not seen listed.")
.instruction("If a tool returns an error, do not retry the same call.")
.output_constraints("Answer in plain prose. Cite the file you read in parentheses, \
for example: (src/main.rs).")
.example("What edition does Cargo.toml use?",
"I'll check Cargo.toml directly. (Cargo.toml) The project uses Rust edition 2024.")
.context(format!("<env>\ntoday: {today}\nproject_root: {sandbox}\n</env>"))
.build();
## Identity
You are Eugene, a careful research assistant ...
## Instructions
- Use `list_files` to discover what is in the project before reading.
- Use `read_file` to inspect a specific file. Do not call it on paths ...
- If a tool returns an error, do not retry the same call.
## Output
Answer in plain prose. Cite the file you read in parentheses ...
## Examples
Example 1:
User: What edition does Cargo.toml use?
Assistant: I'll check Cargo.toml directly. (Cargo.toml) ...
## Context
<env>
today: 2026-05-22
project_root: /Users/me/code/eugene
</env>
Аідэнтычнасць — це голас, а не правда
Пакалькі голас, а не сцэна; таму перад змянайом код трэба чытка адзначыць вхідныя данні, власніка крока і критэрыя завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Запісваць трэба час выконання і вартасць токена або запытку разам з функцыйнальнымі рэзултатамі. Відразувыя данні пра вартасці запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную. Неабходна людская апрацоўка тых крокаў, якія выкорыстоўваюць грошы або зміняюць данні ў працоўный сервіс. Працэс складання коду не є гарантіяй полнай адпаведнасці бізнес-трэбаў.
Інструкцыі — это спіс, а не эсэ
Калі інструкцыі ў формате спісу, пярэд тым, як зменіць код, неабходна апрацаваць параметры вхідных дадзеных, адпаведальнага за шаг і крэтарыя выходу. Аператары должны магчымае перайсці на гэты шаг з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба захаваць паза кодам прыкладнення. Файлы сераўнавання сяродовішча, храненні секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Пры выконанні дзеянь, якія коштуюць грошы або зменяюць данні ў працэсе, неабходна атрымваць затверджэнне чалавека. Підключэння пад час компіляцыі не є гарантіяй полнай адпаведнасці прыкладненняя бізнес-трэбаванням.
Абмежэнні выходу аддзеляюць формат ад прыемнасці
Для саработкі з абсалютнымі выходнымі паказаннямі трэба адсоедыніць этап форматавання, чытачы, власніка крока і крэтарыя выходу прычым змене коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабясненняя схованага стану. Неабходна дакументацыя як успішнага, так і патэнтнага шляху. Перапрыбуткі, людзкія перакрыцці і обработка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Неабходна людзкая затверджэнняе для тых крокаў, якія выкарыстоўваюць грошы або зменяюць данні ў працэсе вырабніцтва. Кампайляванне коду не ўзроўнаважваецца з абсалютной завершанасцю бізнес-процэсу. Для саработкі з абсалютнымі выходнымі паказаннямі трэба адсоедыніць этап форматавання, чытачы, власніка крока і крэтарыя выходу прычым змене коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабясненняя схованага стану. Спрыятліваць гэты этап як даговор межа чытачамі і перакананымі выходнымі паказаннямі. Назваць всі элементы, чытачы успеху і адмовіцца ад беззвучнага частковага завершэння.
Прыклады з малай колькасцю прыкладоў паказваюць, а не адгукваюць
Калі працуеце з этапам, дзе прыклады з малай колькасцю прыкладоў паказваюць, спачатку запісайте умовы: неабходныя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контролю дапамагае заставаць пазнейшыя змены коду чыстымі. Запісвайце час выконання і кост токеноў або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца рана, таму не будзе неспакою, калі праця перайдзе з дэмаверсіі ў спакульнаныя сераўры. Зробіце контрольную пазнаку пасля дорогіх крокаў. Система вярнення не павинна зноў нараховваць косты за той самы вызыв LLM, калі аператар праканае пазнейшы вузел.
.example(
"What edition does Cargo.toml use?",
"I'll check Cargo.toml directly. (Cargo.toml) The project uses Rust edition 2024.",
)
Контэкст ў кожнай запытці є свежы
Калі вы працуеце з контекстам, які ўсё ещы наявны, спачатку запішыце угоду: неабяжлівыя даны, сигнал успеху і тое, што выканаецца у разы частковага невяскання. Такі список пераконтроўваець, каб пазнейшыя змены коду былі чыстымі. Зберагаеце настройкі паза кодам прыемліка. Файлы сераўнавання, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжлівага чытання всей структуры. Зробіце пераконтроўку пасля дорогіх крокаў. Функцыя вярнення роботы не должна знову ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да пазнейшага вузла.
let today = OffsetDateTime::now_utc()
.date()
.format(&Iso8601::DATE)
.unwrap_or_else(|_| "unknown".into());
let sandbox = sandbox_root()?.display().to_string();
let prompt = system_prompt(&today, &sandbox);
Межы кэша
Калі працуеце над стадзіяй «Межа кэша», спачатку запісайце угоду: неабяжлівыя данні, сигнал працэздання і тое, што выходзіць у разе частковага невыпання. Такі список перакладоў заходзіць пазнейшыя змены коду ў правільным направленні. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам. Стварайце контрольныя пункты пасля дорогіх крокаў. Система вярнення не павинна знову ставіць плату за той самы вызов LLM, калі аператар перапрыбуе пазнейшы вузел. Калі працуеце над стадзіяй «Межа кэша», спачатку запісайце угоду: неабяжлівыя данні, сигнал працэздання і тое, што выходзіць у разе частковага невыпання. Такі список перакладоў заходзіць пазнейшыя змены коду ў правільным направленні. Спрыяйце цій стадзіі як угоды межаў між вхіднымі данніма і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задайце критэрыяі успеху і адмовіцеся ад тыхнага частковага завершэння без паведамлення.
let blocks = prompt.into_system_blocks();
// blocks[0] = { type: "text", text: <static prefix>, cache_control: {type: "ephemeral"} }
// blocks[1] = { type: "text", text: <dynamic suffix> } // no cache_control
[turn 0] in=4 cache_read=0 cache_create=1247 out=89
[turn 1] in=3 cache_read=1247 cache_create=0 out=42
Секцыя мемаізацыі: вырахаваць раз, викорыстоўваць знову
Мемаізацыя секцый падчас вычыслаў у адзін раз працуе найкраща, калі яе спрыявае можласць яе аналізу. Перш чым расширваць масштаб, зафіксавайце адну ідеальную версію, адзін прыклад неудачы і запіс пра можлівасць анулювання змян.
Версійаванне і тэсты на регрэсію
Этап версіявання і тэставання на регрэсцыю працуе найкраща, калі яго спрыявае можлівасць вимеры. Зберагачыце адну «золатую» транскрыпцію, адзін прыклад неудачы і запіс пра вярнэнне да поперадней версіі, прычым расшырюючы сферу дзеяння. Храніце настройкі параду ад коду прыемліка. Файлы сяродавішчыны, хранальнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць аудыт без неабяжнага чытання всіх дадзеных. Храніце стан графа ў простам і типаваным формате. Вярнутыя блокі дадзеных маскуюць інфармацыю пра тое, калькі вузел запісаў калькі поле, і спакойваюць працэс пасля перарываў.
const EXPECTED_PROMPT_FINGERPRINT: u64 = 0; // set after first successful run
if EXPECTED_PROMPT_FINGERPRINT != 0
&& prompt.fingerprint() != EXPECTED_PROMPT_FINGERPRINT
{
eprintln!(
"warning: system prompt fingerprint drifted (was {EXPECTED_PROMPT_FINGERPRINT}, \
is {}). Update the constant if the change was intentional.",
prompt.fingerprint()
);
}
Eugene v0.2 у практыцы
Eugene v0 2 у стадії розработкі працюе найэфективней, калі яго спрыяваць як до меры можна паверхню. Зберагчыце адны ідеальны прыклад роботы, адны прыклад неудачі і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў ёсцю часткая продукту, а не элементы пазнейшай дапрацоўкі. Храніце стан графа ў простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, кальки вузелі запісвалі калькі поль і спакоююць продовжэнне роботы пасля перарываў. Eugene v0 2 у стадії розработкі працюе найэфективней, калі яго спрыяваць як до меры можна паверхню. Зберагчыце адны ідеальны прыклад роботы, адны прыклад неудачі і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Спрыявайце гэтай стадіі як кантракту межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўайце назвы артыфактам, задаюце критэрыя успеху і не прабывайце прыймаць часткова завершаныя рэзультаты без паведамлення.
let prompt = system_prompt(&today, &sandbox);
let system_blocks = prompt.into_system_blocks();
let response = send(&http, &api_key, &system_blocks, &tools, &messages).await?;
Што гэта адкрывае
У стадії «Што гэта адкрывае» неабяжна практычная вакуменцыя: перад зменым коду трэба адзначыць вхідныя данні, адпаведальнага за крок і критэрыі завершэння. Аперацыямы должны магчымаць перапрыгнуць на вядомы пункт контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае паказанне костаў запобегае неспадзяваным расчыткам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя среды. Неабяжна людская апрацоўка тых крокаў, якія выкорыстоўваюць грошы або зміняюць данні ў працэсе. Компіляцыйныя налашчэння не ўзначаюць павнае адпрацоўкі задачы з точка зору бізнеса.
Што будзе далей
У стадії «Што будзе далей» неабяжна практычна ваказваць параметры вхідных дадзеных, адпавядаючага адпаведальнага і крэтынія завершэння працы перад зменым коду. Аперацыйныя працавнікі павінны магчымае перадзягаць выпаленне ціх крокаў з вядомага пункту контролю, не прымушаныя здагадвацца пра схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемленае. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў павінны быць у адном месца, якое працавнікі можуць пераглядаць, не чытаючы весь ланцуг задач. Для рэшэнняяе, якія выконваюць витраты грошэй або змінююць даныя у працуючай сістэме, неабяжна ўвесці людскую апраўду. Падключэнняяе ў час компілявання не адпавядае пачатковым ваказвам бізнесу.
Рабочая зона
Для стадіі рабочага прастору неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў є часткай продукту, а не яго пазнейшай дапрацоўкі. Неабяжна апавярдзіць людзкім адгукам тые крокі, які ведуць да витрачання грошаў або змяны дадзэнняў у працэсе виробніцтва. Працэсы, якія выкананы ў часе компіляцыі, не є падставай для стверджэння абоўсюднага завершэння бізнес-процэсу. Для стадіі рабочага прастору неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяць гэтай стадіі як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Назваць всі неабяжныя элементы, узначыць крэтыры успеху і не прабаваць прыймаць часткова завершаныя рэзультаты без падтверджэння.
Связаныя тэмы
Калі працюеце на стадыі «Сяродзейныя тэмы», спачатку запісайце угоду: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список перакладзець пазнейшыя змены коду ў правільныя русла. Запісвайце час выканання і кост токена або запыту праза функцыйнальныя рэзултаты. Відразлівасць коста з самага пачатку запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды. Зробіце перапаконтаванне пасля дорогіх крокаў. Система адновлення не должна зноў нарахоўваць кост той самай вызову LLM, калі аператар прабуюць зноў запрацаваць з пазнейшым вузлом.
Код
Калі працуеце над стадзіяй кода, спачатку запісайце умовы викорыстоўвання: неабходныя даны, сігнал успеху і тое, што выходзіць па частковай нявыполненасці. Такі список дапамагае залічваць змяны коду чыста. Зберагайце настройкі паза кодам прыемліка. Файлы сераўнавання, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць пераглядаць іх без неабходнасці чытання всей структуры. Стварайце контрольныя пункты пасля дорогіх крокаў. Система вярнення роботы не должна занова ставіць плату за той самы вызыв LLM, калі аператар перапрыяўляе роботу да наступнага элемента.
Хочаце ўсё такое ж?
Калі працуеце на стадыю «Хочу большэй такога», спачатку запісайце умовы контракту: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список пераконтролю дапамагае заліцвачыць пазнейшыя змены коду. Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе етапы контролю і обработка некоректных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Зробіце пераконтроль пасля дорогіх крокаў. Система вярнення не павінна знову ставіць плату за той самы вызов LLM, калі аператар перапрыбуе пазнейшы вузел.
Чек-ліст для эксплуатацыі
На стадыю чек-ліста для эксплуатацыі неабяжлівае задаць даннэ, адпаведальную особу за крок і критэрыя завершэння пры зміне коду. Аператары павінны магчымаць перапрацоўка крока з вядомага пераконтролю, не спрабоўваючы здагадвацца пра схованы стан.
Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.
Неабяжна людская апраўка для тых элементаў, які выкорыстоўваюць грошы чыстаіця зменяюць данні праработы. Падключэнне ў час кампілявання не адпавядае пачытальнай цэласнасці бізнесу.
Напісце кароткі путаводзіцель: як роцыяваць кантроллеры, як спрачысці чергу, як анулюваць пярэдню імпортацыю.
Спрацавваце гэты этап як кантракт межа вхіднымі дадзеннямі і апраўнанымі выходнымі. Даце назвы артыфактам, зададзіце крэтыры успеху і адмовіцеся ад моўчаннага частковага завершэння.
Неабяжна людская апраўка для тых элементаў, які выкорыстоўваюць грошы чыстаіця зменяюць данні праработы. Падключэнне ў час кампілявання не адпавядае пачытальнай цэласнасці бізнесу.
Перад паўышэнням стаку заморозьце версіі, зафіксуйце ідеальны транскрыпт для критычнага маршруту і падтвердзіце крокі анулювання. Спадзяльныя сераўысы патрабуюць лімітаў частоты, пераканання ў арендаванні і чыстага власніка для роцыявання секрэтных дадзенняў. Валіце надтачнае надзеянне над хітрымі експерыментамі, якія выкалічваюцца разова.
Запіска параграфу bfb02d0288c5: не трэба кантрацяваць ключы прадастоўцаў у репазітарые, задаць максімальную кантэйнернасць токена на кожную сесію, а таксама зберагчы транскрыпціі праза фіксатуры адлічэння, каб пазнейшыя замены моделей заставаліся порównанымі.
Для запіскі параграфу 0 пра зміцнэнне: перад зменай коду неабходна адзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыёныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабходна аддокументаваць як штатны, так і патэнціяльны ход задачы. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Дзялейныя деталі зміцнэння 0/858: памерыце час выканання, класію адказоў і выкарыстаны токан для гэтай запіскі, а пасля – вырашыце, чы робіць змяну на адной падставе фіксаванага набора запытанняў, а не на падставе індывідуальных спостарожэнняў.
Калі працюеце над першым этапам зміцнення, спачатку запісайце контракт: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрыймайце гэты этап як контракт межа данымі і перакананымі выходамі. Дайце назву элементам, задаце критэрыя успеху і не падзволяйце частковаму завершэнню без паведамлення.
Дзеянні зміцнення 1/858: вымерыце час выканання, класію памылак і колькасць выкорыстоўваных токенав для гэтага пункту, а потым выберыце, чы робіць змену на аднойчы заданых критэрыях, а не на падставе індывідуальных спостерэнняў.