Головна / Статті / Практичні зауваження: Розробка, зорієнтована на оцінку: підхід інженерії програмного забезпечення до

Практичні зауваження: Розробка, зорієнтована на оцінку: підхід інженерії програмного забезпечення до

Покроковий посібник з практичних нотаток: Розробка, орієнтована на оцінку: підхід інженерії програмного забезпечення до контрактів, перевірок та слотів для вставки коду для команд, які використовують цю модель.

3101 слів

Цей посібник описує процес створення системи від сировини до готового продукту для: Eval-Driven Development: A Software Engineering Approach to Production-Grade AI Agents. Основна увага приділяється конкретним крокам виконання, чітким перевіркам та коду, який можна просто додати до репозиторію без необхідності здогадуватися щодо його призначення. На етапі огляду необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не здогадуючись про прихований стан системи. Необхідно фіксувати час виконання та витрати на токени чи запити разом із функціональними результатами. Чітке бачення витрат заздалегідь запобігає несподіваним рахункам під час переходу від демо-версії до спільних середовищ.

Підсумок

Під час роботи на етапі підсумку спочатку запишіть умови контракту: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність подальших змін у коді. Тримайте конфігурацію окремо від коду додатку. Файли середовища, сховища секретних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Робіть контрольні точки після дорогих операцій. Функція відновлення не повинна знову стягувати плату за один і той самий виклик LLM, коли оператор перезапускає пізнішу ланку.

Вступ

Під час роботи над етапом введення спочатку запишіть умови контракту: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Одночасно задокументуйте шлях успішного виконання та шлях відновлення. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої доробки. Робіть контрольні пункти після дорогих кроків. Система відновлення не повинна знову стягувати плату за той самий виклик LLM, коли оператор намагається знову виконати пізнішу операцію.

Продуктовий конвеєр: загальний алгоритм роботи

Під час роботи над етапом «The Production Pipeline» спочатку запишіть контракт: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Віддавайте перевагу невеликим, тестованим одиницям коду перед об’ємними скриптами. Коли якась крок виявляється невдалою, причина має вказувати на конкретну відповідальність, а не на заплутану структуру процесу. Робіть перевірки після дорогих кроків. Система відновлення не повинна знову оплачувати один і той самий виклик LLM, коли оператор намагається знову виконати пізнішу операцію.

1. Контракт: розділення та версіонування запиту

Під час виконання етапу 1 «Декуплювання за допомогою контракту» спочатку запишіть контракт: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність у подальших змінах коду. Розглядайте цей етап як контракт між вхідними даними та перевіреними вихідними результатами. Назвіть створювані елементи, визначте критерії успіху та не допускайте беззвучного часткового виконання. Зберігайте у кеші стабільні інструкції системи та схеми інструментів. Повторна передача ідентичних даних є поширеною причиною витрат ресурсів.

[
  {
    "agent_id": "financial_market_headlines",
    "version": 1,
    "agent_model": "openai:gpt-4",
    "prompt": "What are today's major financial market headlines?",
    "eval": {
      "contains": ["market"],
      "max_model_requests": 3,
      "min_tool_calls": 1,
      "max_tool_calls": 5,
      "judge_rubric": "The answer should be a useful response to the user's financial markets question. It should summarize market-relevant information, avoid obviously unrelated content, avoid investment advice, and avoid claiming certainty beyond what the retrieved information supports."
    }
  }
]

2. Час виконання: двигун виконання

Під час роботи над етапом „2. Час виконання“ спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Запишіть час виконання та витрати на токени або запити поруч із результатами функціоналу. Відображення витрат заздалегідь запобігає несподіваним рахункам, коли процес переходить від демо-середовища до спільних. Робіть контрольні позначки після дорогих кроків. Функція відновлення не повинна знову стягувати плату за один і той самий виклик LLM, коли оператор перезапускає пізніший етап.

3. Шар спостережуваності: без сліпих зон

Під час виконання третього етапу «Шар спостережливості» спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успішне виконання та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність подальших змін у коді. Зберігайте конфігурацію окремо від коду додатку. Файли середовища, храни секретів та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Робіть контрольні пункти після дорогих операцій. Система відновлення не повинна знову стягувати плату за один і той самий виклик ШІ, коли оператор перезапускає пізнішу ланку.

4. Шар оцінки: CI/CD для ШІ

Під час роботи над 4-м етапом «Шар оцінки» спочатку запишіть контракт: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Цей перелік допомагає зберігати чесність подальших змін у коді. Одночасно задокументуйте шлях успішного виконання та шлях відновлення. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої доробки. Робіть контрольні пункти після дорогих кроків. Система відновлення не повинна знову стягувати плату за той самий виклик LLM, коли оператор повторює спробу з пізнішого етапу.

Оцінка: примус до детермінізму в недетермінованій системі

Під час роботи над модулем Evals Forcing Determinism на етапі розробки спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність подальших змін у коді. Віддавайте перевагу невеликим, тестованим одиницям коду перед об’ємними скриптами. Якщо якийсь крок зазнає невдачі, причина має вказувати на конкретну функцію, а не на складну послідовність операцій. Робіть контрольні пункти після дорогих кроків. Механізм відновлення роботи не повинен знову стягувати плату за один і той самий виклик LLM, коли оператор намагається виконати наступний етап. Під час роботи над модулем Evals Forcing Determinism на етапі розробки спочатку запишіть умови використання: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність подальших змін у коді. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Чітке бачення витрат заздалегідь запобігає несподіваним оплатам, коли процес переходить від демо-версії до спільних середовищ.

Шар 1: Живі детерміністичні тести

Етап Шару 1 „Живі детерміністичні тести“ працює найкраще, якщо його розглядати як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу тестування. Тримайте конфігурацію окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь граф. Тримайте стан графа простим та типованим. Вкладені блоки приховують інформацію про те, який вузол записав яке поле, і ускладнюють продовження роботи після перерв.

uv run python tests/unittest_eval_agent.py
evaluators=[
    *[Contains(value, case_sensitive=False) for value in case.eval.contains],
    MaxModelRequests(case.eval.max_model_requests),
    MinToolCalls(case.eval.min_tool_calls),
    MaxToolCalls(case.eval.max_tool_calls),
]
(financial-agent2) alex@pop-os:/ssd/ai_works/financial_agent2$ uv run python tests/unittest_eval_agent.py
Running each eval case 3 time(s)
Evaluating task ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
                               Evaluation Summary: task
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Case ID                             ┃ Metrics               ┃ Assertions ┃ Duration ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ financial_market_headlines_v1 [1/3] │ tool_calls: 1         │ ✔✔✔✔       │    18.8s │
│                                     │ requests: 2           │            │          │
│                                     │ input_tokens: 1,325   │            │          │
│                                     │ output_tokens: 278    │            │          │
│                                     │ cost: 0.0564          │            │          │
├─────────────────────────────────────┼───────────────────────┼────────────┼──────────┤
│ financial_market_headlines_v1 [2/3] │ tool_calls: 1         │ ✔✔✔✔       │     8.8s │
│                                     │ requests: 2           │            │          │
│                                     │ input_tokens: 1,195   │            │          │
│                                     │ output_tokens: 82     │            │          │
│                                     │ cost: 0.0408          │            │          │
├─────────────────────────────────────┼───────────────────────┼────────────┼──────────┤
│ financial_market_headlines_v1 [3/3] │ tool_calls: 1         │ ✔✔✔✔       │    13.5s │
│                                     │ requests: 2           │            │          │
│                                     │ input_tokens: 1,292   │            │          │
│                                     │ output_tokens: 388    │            │          │
│                                     │ cost: 0.0620          │            │          │
├─────────────────────────────────────┼───────────────────────┼────────────┼──────────┤
│ Averages                            │ requests: 2.00        │ 100.0% ✔   │    13.7s │
│                                     │ output_tokens: 249.3  │            │          │
│                                     │ tool_calls: 1.00      │            │          │
│                                     │ cost: 0.0531          │            │          │
│                                     │ input_tokens: 1,270.7 │            │          │
└─────────────────────────────────────┴───────────────────────┴────────────┴──────────┘

Шар 2: Детерміністична регресія на основі слідів

Етап детерміністичної регресії 2-го рівня працює найкраще, коли його розглядають як вимірювану поверхню. Зафіксуйте один ідеальний варіант виконання, один випадок збою та примітки щодо скасування дій перед розширенням обсягу. Документуйте як успішний, так і відновлювальний сценарії роботи разом. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. Зберігайте стан графа у простому та типованому вигляді. Вкладені структури приховують інформацію про те, який вузол заповнив яке поле, і ускладнюють продовження роботи після перерв.

uv run python tests/regression_eval_traces.py
Trace: ff5a53e3392dc26cd0a2890782be70ec
Eval case: financial_market_headlines v1
Status: PASS
Model requests: 2
Tool calls: 1
contains('market'): PASS
MaxModelRequests: PASS
MaxToolCalls: PASS

Рівень 3: Недетерміністичні тести — LLM як суддя

Етап Layer 3 Non Deterministic працює найкраще, коли його розглядають як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу роботи. Віддавайте перевагу невеликим, тестованим одиницям перед складними скриптами. Коли якийсь крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на заплутану послідовність дій. Встановіть ліміти на кількість токенів за хід та за сеанс. Інструменти типу агентів активно розширюють контекст; жорсткі обмеження запобігають тому, що демонстрації перетворюються на несподівані рахунки. Етап Layer 3 Non Deterministic працює найкраще, коли його розглядають як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу роботи. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Відомі заздалегідь витрати запобігають несподіваним рахункам, коли процес переходить від демонстрації до спільних середовищ.

[
  {
    "agent_id": "financial_market_headlines",
    "version": 1,
    "agent_model": "openai:gpt-4",
    "prompt": "What are today's major financial market headlines?",
    "eval": {
      "contains": ["market"],
      "max_model_requests": 3,
      "min_tool_calls": 1,
      "max_tool_calls": 5,
      "judge_rubric": "The answer should be a useful response to the user's financial markets question. It should summarize market-relevant information, avoid obviously unrelated content, avoid investment advice, and avoid claiming certainty beyond what the retrieved information supports."
    }
  }
]
LLMJudge(
    rubric=case.eval_case.eval.judge_rubric,
    model=args.judge_model,
    include_input=True,
    score={"evaluation_name": "judge_score", "include_reason": True},
    assertion={"evaluation_name": "judge_pass", "include_reason": True},
)
uv run python tests/regression_llm_judge_traces.py   --sample-percent 50
Trace selection: fetched=1 sampled=1 judging=1 lookback_minutes=1440 sample_percent=50 max_traces=5
Trace case: trace_id=3891f0b8432c9bbcb00e5e8adce1600b agent_id=financial_market_headlines prompt_version=1 answer_chars=207
Judging 1 trace(s) with openai:gpt-5.4
Evaluating task ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
                                                   Evaluation Summary: task
┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Case ID              ┃ Inputs               ┃ Outputs              ┃ Scores               ┃ Assertions          ┃ Duration ┃
┡━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ financial_market_he… │ {'trace_id':         │ Today's major        │ judge_score: 0.000   │ judge_pass: ✗       │    469µs │
│                      │ '3891f0b8432c9bbcb00 │ financial market     │   Reason: The        │   Reason: The       │          │
│                      │ e5e8adce1600b',      │ headlines can be     │ response does not    │ response does not   │          │
│                      │ 'agent_id':          │ found on major       │ summarize any actual │ summarize any       │          │
│                      │ 'financial_market_he │ business and finance │ market headlines or  │ actual market       │          │
│                      │ adlines',            │ news outlets         │ provide              │ headlines or        │          │
│                      │ 'prompt_version': 1, │ including CNBC,      │ market-relevant      │ provide             │          │
│                      │ 'agent_model':       │ Yahoo Finance,       │ information; it only │ market-relevant     │          │
│                      │ 'openai:gpt-4',      │ Reuters, and         │ redirects the user   │ information; it     │          │
│                      │ 'judge_model':       │ Bloomberg. For more  │ to news websites. It │ only redirects the  │          │
│                      │ 'openai:gpt-5.4',    │ specific stories,    │ avoids investment    │ user to news        │          │
│                      │ 'prompt': "What are  │ please visit their   │ advice, but it is    │ websites. It avoids │          │
│                      │ today's major        │ websites.            │ not a useful answer  │ investment advice,  │          │
│                      │ financial market     │                      │ to the user's        │ but it is not a     │          │
│                      │ headlines?"}         │                      │ question.            │ useful answer to    │          │
│                      │                      │                      │                      │ the user's          │          │
│                      │                      │                      │                      │ question.           │          │
│                      │                      │                      │                      │                     │          │
│                      │                      │                      │                      │                     │          │
├──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┼─────────────────────┼──────────┤
│ Averages             │                      │                      │ judge_score: 0.000   │ 0.0% ✔              │    469µs │
└──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┴─────────────────────┴──────────┘
uv run python tests/regression_llm_judge_traces.py  --sample-percent 10 --lookback-minutes 30
Trace selection: fetched=1 sampled=1 judging=1 lookback_minutes=30 sample_percent=10 max_traces=5
Trace case: trace_id=38fa3a54134d8818c7d7a5afbf50967e agent_id=financial_market_headlines prompt_version=1 answer_chars=654
Judging 1 trace(s) with openai:gpt-5.4
Evaluating task ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
                                             Evaluation Summary: task
┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ Case ID            ┃ Inputs             ┃ Outputs           ┃ Scores             ┃ Assertions        ┃ Duration ┃
┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━┩
│ financial_market_… │ {'trace_id':       │ Here are today's  │ judge_score: 0.450 │ judge_pass: ✗     │    441µs │
│                    │ '38fa3a54134d8818c │ major financial   │   Reason: The      │   Reason: The     │          │
│                    │ 7d7a5afbf50967e',  │ market headlines: │ response is        │ response is       │          │
│                    │ 'agent_id':        │                   │ market-related and │ market-related    │          │
│                    │ 'financial_market_ │ 1. Wall Street's  │ avoids investment  │ and avoids        │          │
│                    │ headlines',        │ riskiest trades   │ advice, but it     │ investment        │          │
│                    │ 'prompt_version':  │ are suddenly back │ mostly lists       │ advice, but it    │          │
│                    │ 1, 'agent_model':  │ on top: Chart of  │ article headlines  │ mostly lists      │          │
│                    │ 'openai:gpt-4',    │ the Day - Yahoo   │ and links rather   │ article headlines │          │
│                    │ 'judge_model':     │ Finance           │ than providing a   │ and links rather  │          │
│                    │ 'openai:gpt-5.4',  │ [Link](https://fi │ useful summary of  │ than providing a  │          │
│                    │ 'prompt': "What    │ nance.yahoo.com/) │ the key financial  │ useful summary of │          │
│                    │ are today's major  │ 2. S&P 500        │ market             │ the key financial │          │
│                    │ financial market   │ notches           │ developments.      │ market            │          │
│                    │ headlines?"}       │ record-high close │                    │ developments.     │          │
│                    │                    │ as rate-hike      │                    │                   │          │
│                    │                    │ worries ease -    │                    │                   │          │
│                    │                    │ Reuters           │                    │                   │          │
│                    │                    │ [Link](https://ww │                    │                   │          │
│                    │                    │ w.reuters.com/mar │                    │                   │          │
│                    │                    │ kets/us/)         │                    │                   │          │
│                    │                    │ 3. Treasury       │                    │                   │          │
│                    │                    │ yields rise as    │                    │                   │          │
│                    │                    │ U.S. threatens    │                    │                   │          │
│                    │                    │ Iran with more    │                    │                   │          │
│                    │                    │ economic          │                    │                   │          │
│                    │                    │ sanctions - CNBC  │                    │                   │          │
│                    │                    │ [Link](https://ww │                    │                   │          │
│                    │                    │ w.cnbc.com/)      │                    │                   │          │
│                    │                    │ 4. Latest stock   │                    │                   │          │
│                    │                    │ market, financial │                    │                   │          │
│                    │                    │ and business news │                    │                   │          │
│                    │                    │ - MarketWatch     │                    │                   │          │
│                    │                    │ [Link](https://ww │                    │                   │          │
│                    │                    │ w.marketwatch.com │                    │                   │          │
│                    │                    │ /)                │                    │                   │          │
│                    │                    │ 5. Latest finance │                    │                   │          │
│                    │                    │ and stock market  │                    │                   │          │
│                    │                    │ news covering the │                    │                   │          │
│                    │                    │ Dow, S&P 500,     │                    │                   │          │
│                    │                    │ banking,          │                    │                   │          │
│                    │                    │ investing and     │                    │                   │          │
│                    │                    │ regulation - WSJ  │                    │                   │          │
│                    │                    │ [Link](https://ww │                    │                   │          │
│                    │                    │ w.wsj.com/finance │                    │                   │          │
│                    │                    │ )                 │                    │                   │          │
├────────────────────┼────────────────────┼───────────────────┼────────────────────┼───────────────────┼──────────┤
│ Averages           │                    │                   │ judge_score: 0.450 │ 0.0% ✔            │    441µs │
└────────────────────┴────────────────────┴───────────────────┴────────────────────┴───────────────────┴──────────┘mar
  {
    "id": "financial_market_headlines",
    "version": 2,
    "agent": "websearch",
    "prompt": "Use the web-search tool to find and verify today's major financial-market headlines. Report the 3 to 5 most consequential developments across equities, rates, currencies, commodities, or macroeconomic policy. For each item, state what happened, identify the affected market or region, explain briefly why it matters, and name the source with a link when available. Include the relevant date and units for numerical claims. Cross-check any surprising index level, percentage move, policy decision, or economic release against a second reliable source; if it cannot be verified, omit it or clearly label it as unconfirmed. State when the information was current, distinguish facts from developing reports or interpretation, and say when reliable current information is insufficient. Do not invent facts, present stale information as today's news, or give personalized investment advice.",
    "contains": ["market"],
    "max_model_requests": 4,
    "min_tool_calls": 1,
    "max_tool_calls": 7,
    "judge_rubric": "The response should provide 3 to 5 current, consequential financial-market developments based on web research. Each item should identify what happened, the affected market or region, why it matters, and its source, preferably with a link. Numerical claims should include meaningful dates and units; surprising figures should be corroborated by a second reliable source or explicitly marked unconfirmed. The answer should state when the information was current, distinguish verified facts from developing reports or interpretation, and acknowledge insufficient evidence rather than inventing details. It must stay relevant, avoid stale news presented as current, avoid unsupported certainty, and avoid personalized investment advice. A polished but uncited answer containing an implausible or unverifiable market figure should fail."
  },

Перетворення шаблону на CI/CD

Щоб перетворити шаблон на етап процесу, необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись здогадатися про прихований стан. Конфігурацію слід тримати окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функціоналу мають знаходитися в одному місці, яке оператори можуть перевіряти, не читаючи весь процес. Необхідно передбачити людське схвалення для кроків, які призводять до витрат грошей чи змінюють дані у продакшені. Підключення на етапі компіляції не є гарантією повноти бізнес-процесу.

Посилання

На етапі „Посилання“ необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись вгадати прихований стан. Необхідно документувати як успішний, так і аварійний сценарії роботи. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. Встановлюйте людське схвалення для операцій, які призводять до витрат грошей чи змінюють дані у продакшені. Підключення на етапі компіляції не є гарантією повності функціоналу продукту.

Чек-лист операцій

Етап чек-листу операцій працює найкраще, коли його розглядають як вимірювану поверхню. Збережіть один ідеальний запис роботи, один випадок збою та примітки щодо скасування змін перед розширенням обсягу роботи.

Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Позначте всі елементи, визначте критерії успіху та не допускайте мовчазного часткового завершення роботи.

Зберігайте стан графа у вигляді простих, типованих структур. Вкладені блоки приховують інформацію про те, який вузол заповнив яке поле, і ускладнюють відновлення після перерв.

Оцінюйте відповіді, надані за один крок, та послідовності дій, що включають кілька кроків, окремо. Агрегація оцінок чату приховує проблеми, пов’язані з циклами використання інструментів.

Напишіть короткий посібник: як змінювати ключі, як спорожнювати чергу, як скасовувати останнє введення даних.

Одночасно задокументуйте оптимальний та резервний сценарії роботи. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації.

Перш ніж підвищувати версію стека, заморозьте існуючі версії, зафіксуйте ідеальний запис для критичного сценарію та підтвердьте кроки скасування змін. У спільних середовищах необхідні обмеження швидкості, перевірки прав на використання ресурсів та чіткий власник для зміни секретних ключів. Віддавайте перевагу надійності перед креативними одноразовими демонстраціями.

Примітка до пакету 4a86f3fd2d9a: не включайте ключі постачальників у репозиторій, встановіть ліміт токенів на сеанс та зберігайте транскрипції поруч із фіксами для оцінки, щоб подальша заміна моделей залишалася порівнянною.