Практычныя прытамулкі: Загублены слой у стаках AI-агентоў у працэсе выработкі
Практычныя прытамулкі: Загублены слой у стаках AI-агентоў у працэсе выработкі: контракты, перакананні та слоты для коду для команд, якія викорыстоўваюць гэты патэрн.
Існавайце гэта як перапрацоўаны варыянт ідэй з кнігі “The Missing Layer in Production AI Agent Stacks” для працавальнікаў: чыстыя этапы, арганізаваныя блакі коду і прыметкі з восстанавлення, якія застаюцца пасля перадачы задання. Этап “Аптаварыс” найэфектывнейша працюе, калі яго розглядаць як вимерны элемент. Запісайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі з вярнення да пачатковага стану прычаму расшырэння масштаба. Запісвайце часы виконання і косты токенав або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косты з самага пачатку запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмаверсіі ў спакульнаныя сераўысы.
Адкрыцце
У стадії адаптавання неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы з’ясаваць схованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Прызначыць людскія апраўданні для рэлейнаў, якія витрачаюць грошы або зменяюць даны у працэсе. Підключэння пад час компілявання не ўзначае повнасці бізнес-процэсу.
Тры шары
Для стадіі троха слоёў неабходна прадзефінавацыя вхідных дадзеных, адпаведнага адпаведальнага за крок і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не прабуючы спадарацца пра схованы стан. Неабходна аддзеіставіць дакументацыю як для стандартнага, так і для альтернатывнага падходу. Праказкі, перагледы з боку людзей і обработка некоректных паведамленняў ёсць часткай продукту, а не елементамі пазнейшага дапрацоўкі. Неабходна людская аправарэнне для тых крокоў, якія ведуць да выдаткаў грошаў або зменыння продакцыйных дадзеных. Кампіляцыйная наладка не ўзроўнавалася з повнасцю функцыоналу продукту.
HARNESS — што можа кантактаваць агент
Для системы HARNESS, узначаючы стадію агента, неабяжна практычна вказаць інпуты, адміністратара крока та крэтыяры завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымасць перзапуск крока з вядомай точкі контролю, не падозрюючы пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына нехарактэрства должна вказываць на адзіну адпаведальную сторону, а не на заплутаны ланцюг задач. Автентыфікуйцеся на входзе і практычна перавыдайце разрэшэння на роўні дадзеных. Толькі токэн-носіцель не ёстся межой адпаведальнасці. Для системы HARNESS, узначаючы стадію агента, неабяжна практычна вказаць інпуты, адміністратара крока та крэтыяры завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымасць перзапуск крока з вядомай точкі контролю, не падозрюючы пра схованы стан. Запісвайце час выконання та вартасць токэна або запытку разам з функцыйнымі рэзультатамі. Відразлівасць вартасцей з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмовай среды ў спяльнаныя сераўеры.
LOOP — калі агент зупыніцца
Калі працуеце з цыклам LOOP, на стадзіі агента спачатку запісайце умовы: неабяжлівыя даны, сигнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі список контроля дапамагае заліцвачыць змяны ў кодзе. Храніце настройкі параду ўнутры коду прыемленае. Файлы сераўіса, хранальнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць пераглядаць іх без неабяжлівага чытання всей структуры. Стварайце контрольныя пункты пасля дорогіх крокаў. Функцыя вярнення до роботы не должна занова ставіць плату за той самы вызов LLM, калі аператар праказвае роботу наступнага вузла.
GRAPH — куды можа пайсці агент
Калі працуеце з ГРАФам, дзе паказаны стадіі агента, спачатку запісайце умовы контракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцвачыць змяны ў кодзе.
Што выходзіць, калі плутаеце шары
Калі працуеце над раздзелам «Што адбываецца, калі вы стэйжуеце», спачатку запісайце умовы кантракта: неабяжлівыя данні, сигнал успеху і тое, што адбываецца у разе частковага нявыпання. Такі список перакладоў заходзіць пазнейшыя змены коду чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, прычына нявыпання павінна вказываць на адзін конкрэтны аспект, а не на заплутаны ланцюг задач. Зробіце перапактаванне пасля дорогіх крокаў. Система вярнення не павінна знову ставіць плату за той самы вызов LLM, калі аператар праказвае пазнейшы вузел. Калі працуеце над раздзелам «Што адбываецца, калі вы стэйжуеце», спачатку запісайце умовы кантракта: неабяжлівыя данні, сигнал успеху і тое, што адбываецца у разе частковага нявыпання. Такі список перакладоў заходзіць пазнейшыя змены коду чыстымі. Запісвайце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца рана, таму не будзе неспакою праз нечаканыя рахункі, калі процес перайдзе з дэма-серавероў у спяльныя среды.
Плутанне Harness з Loop
Працэваўніцтво з «харчовым ланцугам» і сцэной даходзіць до наяўнасці найкращых рэзультатаў, калі іх спрыяваць як до мерыемагучай паверхні. Зафіксаваць адна «золатая» транскрыпцыю, адин прыклад неудачы і запіс пра вярнэнне да поперадньага стану прычым перш чым расширваць масштабы. Хаваць конфігурацыю за межамі коду прыкладнага праграмы. Файлы сераўіса, сховішчы секрэтных даных і пазнакі функцый крануцца насуперак у адным месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх дадзеных. Адкрываць інструменты з вузкімі схемамі і чытальнымі пазначэннямі побачных эфектаў. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх.
# CONFUSED LAYER — Harness owns Loop logic
async def query_suppliers(item: str, budget: float, quantity: int, attempts: int) -> dict:
"""Tool decides when the loop stops. Capability + control flow in one function."""
results = query_mock_marketplace(item, budget, quantity)
# The tool decides when to stop — couples execution logic with capability
if len(results) > 5 or attempts >= 3:
return {"status": "STOP", "suppliers": results}
return {"status": "CONTINUE", "suppliers": results}
async def research_node(state: AgentState) -> dict:
# The node just calls the tool and forwards whatever the tool decided.
# It has no idea why the loop stopped — that logic is hidden inside the tool.
result = await query_suppliers(
state["brief"].item, state["brief"].budget, state["brief"].quantity,
state.get("attempts", 0) + 1,
)
return {"suppliers": result["suppliers"], "status": result["status"].lower()}
# ✅ CLEAN SEPARATION — Harness is pure capability, Loop lives in the Node
MAX_RESEARCH_ATTEMPTS = 3
async def query_suppliers_impl(item: str, budget: float, quantity: int) -> dict:
"""Pure Harness capability: schema validation, circuit breaker, marketplace call.
The tool has no idea a loop exists. It returns data. It does not decide
when to stop. Circuit breaker + fault injection live here because they are
capability concerns (is the downstream reachable?), not control-flow concerns.
"""
breaker = get_circuit_breaker("query_suppliers")
if not breaker.allow_call():
raise CircuitBreakerOpenError("query_suppliers", breaker.state)
maybe_inject("query_suppliers") # fault injection for chaos tests
try:
results = query_mock_marketplace(item, budget, quantity)
breaker.record_success()
return {"suppliers": results}
except Exception as e:
breaker.record_failure()
raise
async def research_node(state: AgentState) -> dict:
"""Graph Node / Loop: mechanical stop conditions and routing decisions.
The node reads state, calls the tool through the registry, and decides
whether to stop — based on counters in state, NOT on the LLM's judgment
and NOT on the tool's opinion.
"""
brief = state["brief"]
attempts = state.get("attempts", 0) + 1
# Harness call — schema validation, timeout, output cap all happen inside registry.call
query_result = await registry.call("query_suppliers", {
"item": brief.item,
"budget": brief.budget,
"quantity": brief.quantity,
})
suppliers = query_result.get("suppliers", [])
# Mechanical stop condition — enforced OUTSIDE the tool, in code, on state.
# Deterministic. Survives replay. Testable without the tool being live.
if not suppliers and attempts >= MAX_RESEARCH_ATTEMPTS:
logger.info(
"STOP_CONDITION_FIRED path=no_matches item=%s attempts=%d max=%d",
brief.item, attempts, MAX_RESEARCH_ATTEMPTS,
)
return {"suppliers": [], "attempts": attempts, "status": "no_matches"}
if not suppliers:
return {"suppliers": [], "attempts": attempts, "status": "running"}
# Enrich, then mark completed
enriched = []
for s in suppliers:
quote = await registry.call("get_price_quote", {
"supplier_name": s["name"], "item": brief.item, "quantity": brief.quantity,
})
rating = await registry.call("check_seller_rating", {"supplier_name": s["name"]})
enriched.append({**s, "quote": quote, "rating_info": rating})
return {"suppliers": enriched, "attempts": attempts, "status": "completed"}
# The Graph owns WHERE the agent can go — conditional edges, not the node body.
def _should_retry_or_end(state: AgentState) -> str:
"""After Research: loop back if still running, else Score or END."""
if state["status"] == "running":
return "research" # self-loop — the retry
if state["status"] == "no_matches":
return END # mechanical stop → graph terminates
return "score" # success → next node
# Wiring (in build_sourcing_graph):
# graph.add_conditional_edges("research", _should_retry_or_end,
# {"research": "research", "score": "score", END: END})
Плутанне ціклу з графам
Працэваўанне з цыклам і стадіям выкарыстоўваецца наякрасцей, калі яго спрыймаюць як вимерную паверхню. Зафіксавайце адна «золатая» транскрыпцыю, адин прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є частью продукту, а не наступным этапам дорабкі. Храніце стан графа ў простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў якое поле, і спакшуюць продовжэнне роботы пасля перерываў.
# ❌ CONFUSED LAYER — Implicit topology inside a monolithic ReAct loop
# The loop IS the graph. The LLM is the edge function. There is no "between."
while not agent.is_done():
action = llm.decide_next_step(history)
if action == "query":
data = query_suppliers()
elif action == "approve":
# Retrofitting human approval into an implicit loop requires messy pauses.
# You have to break the loop, externalize state, park the worker, and
# resume on a webhook — the loop fights you because it was designed to
# be self-driving.
pause_execution_and_wait_for_webhook()
elif action == "stop":
break
# ✅ CLEAN SEPARATION — Declarative graph with explicit nodes and human interrupt
from langgraph.graph import StateGraph, START, END
from langgraph.types import interrupt
def approve_node(state: AgentState) -> dict:
"""Human checkpoint via interrupt() — a STRUCTURAL pause, not a prompt.
The graph genuinely suspends here. interrupt() pauses execution and waits
for a human to call Command(resume=approval_data). The worker is freed.
If the worker crashes while waiting, Temporal replays the activity, the
graph re-runs from the last checkpoint, and interrupt() fires again —
the human re-approves. No data loss.
"""
selected = state.get("selected_supplier", {})
brief = state.get("brief", {})
approval_request = {
"item": brief.item,
"quantity": brief.quantity,
"supplier": selected.get("name", ""),
"price": selected.get("price", 0),
"total_cost": selected.get("price", 0) * brief.quantity,
}
# interrupt() pauses the graph HERE. The human must call /approve
# with a resume value to continue.
approval = interrupt(approval_request)
approved = approval.get("approved", False)
comment = approval.get("comment", "")
return {
"approval_status": "approved" if approved else "rejected",
"approval_comment": comment,
"rejection_count": state.get("rejection_count", 0) + (0 if approved else 1),
}
def _after_approve(state: AgentState) -> str:
"""After Approve: go to Confirm if approved, retry Research if rejected."""
if state.get("approval_status") == "approved":
return "confirm"
if state.get("rejection_count", 0) + 1 >= 3:
return END
return "research"
def build_sourcing_graph(checkpointer=None):
"""Topology is DECLARED DATA, not statement order in a loop body.
START → Research → (retry) → Score → Decide → Approve → Confirm → END
↓ (rejected, < 3)
Research
↓ (rejected, = 3)
END
"""
graph = StateGraph(AgentState)
graph.add_node("research", research_node)
graph.add_node("score", score_node)
graph.add_node("decide", decide_node)
graph.add_node("approve", approve_node) # explicit checkpoint node
graph.add_node("confirm", confirm_node)
graph.add_edge(START, "research")
graph.add_conditional_edges("research", _should_retry_or_end,
{"research": "research", "score": "score", END: END})
graph.add_edge("score", "decide")
graph.add_edge("decide", "approve")
graph.add_conditional_edges("approve", _after_approve,
{"confirm": "confirm", "research": "research", END: END})
graph.add_edge("confirm", END)
return graph.compile(checkpointer=checkpointer)
Плутанне графа з інструментамі
«Зблыканне графа з стадзіямі» працуе найкраща, калі яе спрыяваць як меравальную паверхню. Зберагчыце адны ідеальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцюг дзеяння. Адкройце інструменты з вузкімі схемамі та чысткімі пазначэннямі побачных наследкаў. Адпаведальныя за эксплуатацыю павінны знать, якія вызовы мутуюць стан, перш чым автаматычна схваліць іх. «Зблыканне графа з стадзіямі» працуе найкраща, калі яе спрыяваць як меравальную паверхню. Зберагчыце адны ідеальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Запісвайце часы выканання та косты токеноў або запытак праза функцыйнае рэзультат. Відкрытыя даны пра косты з самага пачатку запобегаюць неспакоўным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя сераўысы.
# ❌ CONFUSED LAYER — Graph node owns the tool call (Harness concern)
import httpx
def supplier_node(state: AgentState) -> dict:
"""The graph node reaches directly into HTTP, auth, retries, and parsing.
Why that's wrong: the graph is topology. It should not know about HTTP,
authentication, retries, circuit breakers, or schema validation. Those are
harness concerns. When the graph owns the tool call:
- You can't add a circuit breaker without modifying the graph.
- You can't swap the tool implementation without modifying the graph.
- You can't test the graph without the tool being live.
- You can't enforce an egress allowlist — the URL is hardcoded here.
"""
resp = httpx.get(
f"https://supplier-api.example.com/suppliers",
params={"item": state["brief"].item},
headers={"Authorization": f"Bearer {SUPPLIER_API_KEY}"},
timeout=10.0,
)
resp.raise_for_status()
suppliers = resp.json()["suppliers"] # no schema validation, no output cap
return {"suppliers": suppliers}
# ✅ CLEAN SEPARATION — Graph node calls through the harness; harness owns the call
async def supplier_node(state: AgentState) -> dict:
"""The graph node says 'call this tool with these args' and gets back a
validated, typed result. The graph doesn't know there's HTTP involved.
The harness doesn't know there's a graph involved.
"""
query_result = await registry.call("query_suppliers", {
"item": state["brief"].item,
"budget": state["brief"].budget,
"quantity": state["brief"].quantity,
})
suppliers = query_result.get("suppliers", [])
# Mechanical stop condition — the node's job, not the tool's
if state.get("attempts", 0) + 1 >= MAX_RESEARCH_ATTEMPTS and not suppliers:
return {"suppliers": [], "attempts": state.get("attempts", 0) + 1, "status": "no_matches"}
return {"suppliers": suppliers, "attempts": state.get("attempts", 0) + 1, "status": "completed"}
# What the harness does — the graph never sees this:
#
# registry.call("query_suppliers", {...})
# │
# ├─ 1. validate_input(QuerySuppliersInput, args) # Pydantic v2
# ├─ 2. EgressFilter(spec.allowed_egress) # URL allowlist
# ├─ 3. SandboxedHTTPClient(egress_filter) # blocked domains = structural
# ├─ 4. run_with_timeout(fn, kwargs, spec.timeout_seconds)
# ├─ 5. enforce_output_cap(result, spec.max_output_bytes) # 64KB cap
# └─ 6. validate_output(QuerySuppliersOutput, result) # garbage caught here
#
# The graph node gets back a validated dict. It never sees the HTTP call,
# the auth header, the retry, the circuit breaker, or the egress filter.
# Swap httpx for aiohttp, swap the supplier API for a new one, add a circuit
# breaker — the graph doesn't change. The harness doesn't know a graph exists.
Хто ёсць адпаведальны за кожны шар у стаке
Ёнколі трэба вялічы, хто ўладае кожным этапам, неабходна з’явіць параметры, власніка кожнага крока і крэтырыя завершэння пры зміне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба захаваць паза кодам прыемлікі. Файлы серавэра, хранілішча секретных дадзеных і флагі функцый належаць у аднам месца, якое працавнікі можу аудытаваць, не чытаючы весь лянцуг задач. Для рэшэнняе пытанняў, якія касаюцца витрачання грошэй чы змены дадзеных у працоўным режыме, неабходна людская апраўда. Падключэнняе элементаў у час компіляцыі не є гарантыяю полнай адпаведнасці з бізнес-трэбованнямі.
Temporal ўладае апаратам захоплення ад збоёў у цыкле
Календарны выконавач, які керуець стадіяй LOOP, должен з’явіць вказанні ўсіх вхідных параметраў, абавесцяў выканання кожнага крока і крэтарыяў завершэння працы перад будзь-якімі змянамі ў коде. Аператары павінны магчымаць перзапуск крока з вядомай точкі контролю, не прабуючы спадарожваць схованы стан системы. Неабходна аддзеўнаваць дакументацыю як паслявыпадковых, так і варыянтных сцэнарыёў працы. Практыка перапрыбуткі, людзкія пераказы і обробка некоректных паведамленняў є частью самага продукту, а не елементамі, якія дадаюцца пазней. Неабходна людзкая апраўда для тых крокаў, якія ведуць да выдаткаў грошаў або змян у продакцыйных данных. Працэс складання коду не є гарантіяй полнай адпаведнасці продукту рэальным вярткаўам бізнесу.
LangGraph керуе топалогіяй ГРАФА
Паколькі LangGraph адмініструець ЭТАП ГРАФА, пярэд зменым коду неабходна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыёныя працавнікі должны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына нехваткі должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Пры выконанні дзеянь, якія коштуюць грошы або зменяюць даны для працы, неабходна людская апраўда. Компіляцыйны падключэння не є гарантыяю цэліснасці бізнес-процэсаў. Паколькі LangGraph адмініструець ЭТАП ГРАФА, пярэд зменым коду неабходна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыёныя працавнікі должны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання, а таксама кост токеноў чы запытаў, разам з функцыйнальнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную.
Це ўсё.
Інструментальны комплект MCP на 100% мой
Калі працуеце над стадзіяй інструментальнага комплекта MCP, спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху та тое, што выходзіць у разе частковага абякання. Такі список дапамагае заліцварыць пазнейшыя змены ў кодзе. Зберагаюце настройкі паза кодам прыемліка. Файлы сераўнавання, хранальнікі секрэтных данных та флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць пераглядаць іх без неабяжлівага чытання всей структуры. Запісуйце назву інструмента, хэш аргументаў, час адпаведзі і рынак кожнага вызову. Без такога лёгкага следу час на дэбагаванне губіцца за гадзіны.
Перакананне — тое, што адзначае разлік межу «агент сказаў, што все працавала» і «все дзейналася»
Калі працуеце над стадзіяй пераканання, спачатку запісайце умовы контракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўвае, каб пазнейшыя змены коду былі чыстымі. Документавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Зробіце перакананне пасля дорогіх крокаў. Система вярнення не павінна зноў ставіць плату за той самы вызов LLM, калі аператар перапрыбуе пазнейшы вузел.
Прынцып раздзелення
Калі працуеце над стадзіяй «Прынцып раздзелення», спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выканаецца у разе частковага абярэння. Такі список пераканальвае ў тым, каб пазнейшыя змены коду былі чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок абярэнняе, абярэнне павінна вказваць на адну адпаведальнасць, а не на заплутаны ланцюг задач. Зробіце пераканальванне пасля дорогіх крокаў. Система не павінна зноў вырахоўваць кост той самай вызову LLM, калі аператар праканае пазнейшы вузел. Калі працуеце над стадзіяй «Прынцып раздзелення», спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выканаецца у разе частковага абярэння. Такі список пераканальвае ў тым, каб пазнейшыя змены коду былі чыстымі. Запісвайце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відкрытыя даны пра косцы з’являюцца раніше, таму не будзе неспакою, калі процес пераходзіць з дэмавайнага режыма ў спяльныя среды.
Ментальная модэль
Этап стварэння ментальной моделі працюе наяўней, калі яго спрыяваць як мерыемую структуру. Запісаўце адна ідеальная версія, адзін прыклад неудачы і прыметкі па поверненню да пярвоначальнага стану пры расшырэнні масштаба. Зберагаўце настройкі праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць контроль без неабяжнага чытання всей структуры. Задаўце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.
Што будзе ў наступным эпізодзе
Процес, які выконваецца на практычным етапе, найэфективней работае, калі яго расследжваць як меравальную паверхню. Запісацеце адна ідеальная версія, адзін прыклад неудачы і прыметку па вярнэнні да пачатковага стану пры расшырэнні масштаба. Дакументавайце як успешны, так і вярнучыся шляхі развіцця. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є частью продукту, а не дадатковым элементам для пасляднейшай доработкі. Храніце стан графаў у простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў.
Справакі
Этап «Апавяранні» працюе найэфектывней, калі яго спрыяваць як до меры можна. Зберагчыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг дзеяння. Рэжым графа павінен быць простым і з адначытаемымі дадзеннямі. Вярнутыя структуры дадзеных маскуюць інфармацыю пра тое, канферны ўзлокі якія полья, і спаказваюць роботу пасля перерываў. Этап «Апавяранні» працюе найэфектывней, калі яго спрыяваць як до меры можна. Зберагчыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Запісвайце часы выканання і косты токеноў або запытак праза функцыйнальныя рэзултаты. Відразувая візуабельнасць костаў запобегае неспакойным рашчыткам, калі процес пераходзіць з дэмавайнага режыму ў спяльныя сераўеры.
Чэк-ліст для эксплуатацыі
Калі працюеце над стадзіяй Кантрольнага списку, спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Шыры той кантрольны список дапамагае заліцвачваць будучыя змены коду.
Спрыятліваце гэтую стадзію як контракт межа данымі і перакананымі выходамі. Дайце назвы артыфактам, задаце правілы пераканання успеху і адмовіцеся ад тыхоўскага частковага завершэння.
Зробіце кантрольную пазнаку пасля дорогіх крокаў. Система адновлення не павінна зноў вырахоўваць кашты за той жа вызов LLM, калі аператар прабуе зноў запрацаваць пазнейшы вузел.
Фіксуйце версіі залежнасцяў і запісвайце хэш адобраза, які выканаў дамэ. Возможнасць павторнага стварэння результатаў лепшая за традыцыйныя знання.
Запісвайце час выконання і кашт токенав або запытаў разам з функцыйнаімі рэзультатамі. Відкрытыя даны пра кашты заранее запобегаюць неспакойным рахункам, калі процес пераходзіць з дамэ ў спяльныя среды.
Пауза пасля дорогіх крокаў. Система абработкі заявок не должна знову браць плата за той самы вызов LLM, калі аператар прабуе зноў выконаць пазнейшы крок.
Перад апранаваньем стака неабходна заморазіць версіі, зафіксаваць «золаты» транскрыпты для критичнага шляху і паверыцца ў крокі вярнення да пачатковага стану. У спадзеленых средах трэба наявнасць лімітавання частоты вызоў, пераказаў прыналежнасці тэрміналаў і чысткага власніка для змены секрэтных даных. Лепш аддаць прыоритет надзеям на надзейную надзею, чым крэатіўным, але разовым дэманстрацыйным рашэнням.
Прымітка для пакета e9b9da736831: не трэба клацать ключы прадастальніка ў репазітары, задаць ліміт токена на кожную сесію і зберагчыць транскрыпты разам з фіксатрамі для ацэнкі, каб пазнейшыя замены моделей заставаліся порупачнымі.
Калі працуеце над першым этапам зміцнення, спачатку запісайте умовы: неабяцковыя даны, сигнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае залишацца чыстым пад будучыя зміны коду. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, неудача должна вказваць на адну конкрэтную прычыну, а не на заплутаную сітку задач.
Дзеянне зміцнення 0/826: звярніце увагу на час выканання, класы памылак і витрату токенав для гэтага пункту, а потым выявіце, чы рашыцца застаўляць зміны на адной фіксаванай сэтке пытанняў, а не на індывідуальных спостарожэннях.
Першы этап зміцнення працюе лепей, калі яго спрыяглядаць як меравальную плошчу. Запісайце адны ідеальны прыклад роботы, адзін кейс неудачы і прыказку па абратанні змян перад расшырэнням масштаба. Запісвайце часы выканання і вартасць токенав або запытак пад функцыйнальнымі рэзултатамі. Відразувыя даны пра вартасці запобегаюць неспакоўным рашчыткам, калі працэс пераходзіць з дэмавай версіі ў спяльныя сераўеры.
Дзеянне паўжчання 1/826: звярніце увагу на час выканання, клас памылакі і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змену.
Для 2-й стадзіі паўжчання неабходна перад змянай коду чытко апісаць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчымае перадзвануць гэты крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Таксама неабходна апісаць як шлях успеху, так і шлях вярнення да нормальнага стану. Праказы, перадпрыемства ад людзей і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Дзеянне паўжчання 2/826: звярніце увагу на час выканання, клас памылакі і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змену.
Калі працуеце над трэцім этапам практыкы забезпечэння безпекі, спачатку запісайце контракт: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць на частым нявыпанні. Такі список контроля дапамагае залічваць пазнейшыя змены ў кодзе чыста і прозрачна. Спрэцьвуйце да гэтага этапу як да контракту межаў вхідных даных і перакананых выходных рэзультатаў. Дайце назвы артыфактам, задацьте критэрыя успеху і адмовіцеся ад мовчанкавага частаг завершэння задачы.
Дзеянне па забезпечэнню безпекі 3/826: вымерыце час выканання, класію каштоўкаў і витраты токенав для гэтай практыкі, а потым выявіце, чы хацеце застаўіць змену на адной пазначанай базе пытанняў, а не на адной лічбе прыкладаў.
Этап практыкы забезпечэння безпекі 4 працюе лепей, калі яго спрэцьвуюце як мерыемую паверхню. Зафіксуйце адны ідеальны прыклад роботы, адзін кейс нявыпанні і прыказку па адкату перш чым расширваце сферу дзейства. Зберагаўце настройкі праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных данных і флагі функций должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжлівага чытання всей структуры.
Дзеянне паўжчання 4/826: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.
Для 5-го этапу запіса паўжчання неабходна перад змянай коду чытка апісаць вхідныя даны, адпаведальнага за крок і критэрыяы завершэння. Аперацыйныя працавнікі должны магчымае перадзвануць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына нехарактэрыстыкі должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.
Дзеянне паўжчання 5/826: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.
Калі працуеце над 6-й стадзіяю прыемкі з павышэння безпекі, спачатку запісайце умовы кантракту: неабяжлівыя данні, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцвачыць пазнейшыя змены ў кодзе. Запісвайце часы выканання і вартась токенаў або запытак пад функцыйнальнымі рэзултатамі. Відразы вартасей з самага пачатку запобегае неспакою, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.
Дзеянне прыемкі з павышэння безпекі 6/826: замерьце час выканання, класію паканаў і вартась токенаў для гэтай прыемкі, а пасля выберыце, чы робіць змены на адной пазначанай базе пытанняў, а не на адной толькі прыватнай інформацыі.
7-я стадзія прыемкі з павышэння безпекі работае лепей, калі яе спрыямаць як меравальную плошчу. Запісвайце адну ідеальную транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Дакументавайце як успішны, так і вярнэнчы паты. Перапрыбуткі, людзкія контралі і обработка неканальных паканаў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
Дзеянне паўжасткі 7/826: звярніце увагу на час выканання, класы паказчыкаў і колькасць токенаў, якія былі выкарыстаны для гэтага зазначэння, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацься застаўляць змяну.
Для 8-го этапа паўжасткі неабходна перад змянай коду чытко апісаць вхідныя даны, адпаведальнага за выкананне крока і критэрыяы завершэння. Аперацыйныя працавнікі должны магчыма было перазапускаць крок з вядомай точкі контролю, не прабуючы спадарацца прыватны стан системы. Штодзе гэты этап трэба спрыяць як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі: дайце назвы всім элементам, апісаць критэрыяы успеху і не прабывайце прыймаць часткова завершаныя рэзультаты без падтверджэння.
Дзеянне паўжасткі 8/826: звярніце увагу на час выканання, класы паказчыкаў і колькасць токенаў, якія былі выкарыстаны для гэтага зазначэння, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацься застаўляць змяну.
Калі працуеце над 9-м пунктам правіл забезпечэння безпекі, спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць на частым неудачам. Такі список дапамагае залічваць будучыя змены коду чыста і адкрыта. Зберагайце настройкі пазначыней ад коду прыемліка. Файлы сераўнавання, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжлівага чытання всей структуры.
Дакладнасць пункта 9/826 забезпечэння безпекі: вымерайце час выканання, класы каштоўкаў і витрату токенав для гэтага пункта, а потым выбірайце, чы робіць змену на адной пазначанай базе пытанняў, а не на адной толькі прыватнай інформацыі.
9-й пункт правіл забезпечэння безпекі працуе лепей, калі яго спрыяваць як меравальную плошчу. Зберагайце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіску пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптав. Калі якісь крок не выйшае, неудача должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.
Дзеянне паўжчання 10/826: звярніце увагу на час выканання, клас памылак і колькасць токенаў, выкорыстаных для гэтай змяны, а пасля, на аднойчынай базе фіксаваных пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацца застаўляць гэту змяну.
Для 11-й стадзіі паўжчання неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за выкананне крока і критэрыяы завершэння. Аперацыйныя працавнікі должны магчыма было перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выканання і колькасць токенаў або вартасць запыткі паляглыя да функцыйнаых рэзультатаў. Відкрытая інформацыя пра вартасці запобегае неспакойным рашчыткам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды.
Дзеянне паўжчання 11/826: звярніце увагу на час выканання, клас памылак і колькасць токенаў, выкорыстаных для гэтай змяны, а пасля, на аднойчынай базе фіксаваных пытанняў, а не на індывідуальных прыкладах, выявіце, чы рэшацца застаўляць гэту змяну.
Калі працуеце над 12-й стадзіяю практыкы забезпечэння надзеі, спачатку запісайце угоду: неабяжлівыя данні, сігнал успеху і тое, што выходзіць пад частковы нявыплэн. Такі список контролю дапамагае заставіць пазнейшыя змены коду быць чыстымі.
Документавайце як «шчаслівы» шлях, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пазнейшым дапрацоўкам.
Дакладнасць практыкы забезпечэння надзеі 12/826: звярніце увагу на час выканання, класы каштоўкаў і витрату токенав для гэтай практыкі, а потым вырашыце, чы робіць змены на адной пазначанай базе пытанняў, а не на адной толькі прыватнай інформацыі.
13-я стадзія практыкы забезпечэння надзеі працуе лепей, калі яе спрыяваць як меравальную плошчу. Запісайце адну «золатую» транскрыпцыю, адны прыклад нявыплэну і запіску пра адвёртанне змян, перш чым расширваць масштаб.
Спрыяйце гэтай стадзіі як угоды межа даннімі і перакананымі выходамі. Дайце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхнай частковай, неканфірмаванай роботы.
Дзеянне паўжырання 13/826: звярніце увагу на час выканання, класыя ошибак і колькасць викорыстоўваных токенаў для гэтага зьязначэння, а пасля, на аднойчынай базе запытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змены.
Для 14-й стадзіі паўжырання неабходна перад змянай коду чытача апісацыю вхідных дадзенняў, адпаведальнага за крок і крэатарыяў завершэння. Аперацыйныя працавнікі павінны магчымае перадзьвіжваць крок з вядомага пункта контролю, не прымусваныя здагадвацца пра схованы стан. Канфігурацыю трэба зберагчы за межамі коду прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функций павінны знаходзіцца ў адном месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф.
Дзеянне паўжырання 14/826: звярніце увагу на час выканання, класыя ошибак і колькасць викорыстоўваных токенаў для гэтага зьязначэння, а пасля, на аднойчынай базе запытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змены.
Калі працуеце над стадзіяй 15 з адаптавання, спачатку запісайце умовы кантракта: неабяжлівыя даны, сігнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список дапамагае заліцварваць будучыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача павінна вказваць на адзін конкрэтны аспект, а не на заплутаны ланцюг задач.
Дакладнасць адаптавання 15/826: змерыце час выконання, класію памылак і колькасць токенаў, якія былі выкарыстоўваны для гэтай стадзіі, а пасля вырашыце, чы робіць змены на адной основе фіксаванага набору пытанняў, а не на адной толькі прыватнай інформацыі.
Стадзія 16 з адаптавання працюе лепей, калі яе спрыямаць як меравальную плошчу. Запісайце адзін ідеальны прыклад роботы, адзін кейс неудачы і прыказку па абратанні змян, перш чым расширваць сферу дзеяння. Запісвайце часы выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразувыя даны пра косты запобегаюць неспакойным рашчыткам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўы.
Дзеянне паўжчання 16/826: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы робіць змены.
Для стадіі паўжчання 17 неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыйныя працавнікі должны магчымае перадзвануць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна адначасна задокументаваць шлях успеху і шлях вярнення. Перапрыбуткі, людзкі контроль і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Дзеянне паўжчання 17/826: звярніце увагу на час выканання, клас памылакі і колькасць выкорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазыраннях, выявіце, чы робіць змены.
Калі працуеце над стадзіяй 18 з адаптавання, спачатку запісайце контракт: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага неяксаменства. Такій чарт дапамагае залічваць будучыя змены коду адкрыта. Спрыятлівае ставленне да гэтай стадзіі значыць спрыятлівае ставленне да контракта межа данымі і перакананымі рэзультатамі. Дайце назвы элементам, задаце критэрыі успеху і не прымайце часткова завершэння без паведамлення.
Дзеянні адаптавання 18/826: звярніце увагу на час выканання, класы каштоўкаў і витрату токенав для гэтай стадзіі, а пасля вырашыце, чы робіць змены на адной пазначанай базе пытанняў, а не на адной толькі прыватнай інформацыі.
Стадзія 19 з адаптавання будзе эфектывней, калі яе спрыятаць як меравальную плошчу. Запісайце адны ідеалны прыклад работы, адны прыклад неяксаменства і запіску пра анулювання змены, перш чым расширваце сферу дзейства. Канфігурацыю трэба залічваць пазначкай, якая знаходзіцца за межамі коду прыемлівача. Файлы сяродавішча, хранільнікі секрэтных данных і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт, не чытаючы весь код.
Дзеянне паўжчання 19/826: звярніце увагу на час выканання, клас памылак і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набора пытанняў, а не на асобістых спазыраннях, выявіце, чы рэшацца застаўляць змяну.
Для стадіі паўжчання 20 неабходна перад змянай коду чытко визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыяныя працавнікі должны магчымае перадзвануць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.
Дзеянне паўжчання 20/826: звярніце увагу на час выканання, клас памылак і колькасць викорыстоўваных токенаў для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набора пытанняў, а не на асобістых спазыраннях, выявіце, чы рэшацца застаўляць змяну.
Этап 0 практыкы зміцнення працюе наяўна, калі яго розглядаць як вимерную паверхню. Зафіксавайце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярненне да поперадньего стану перш чым расширваць сферу дзеяння. Зберагаюце настройкі пазырочна ад коду прыемліка. Файлы сераўнавання, хранільнікі секрэтных данных і пазнакі функцый крануцца на адным месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх элементаў.
Дакладнасць практыкы зміцнення 0/845: вы мераваеце час выканання, класію адказоў і колькасць выкарыстоўваных токеноў для гэтай практыкі, а потым выявляеце, чы хацеце застаўіць змяну, спыраючыся на апранаваны набор пытанняў, а не на індывідуальныя спостарожэння.
Для першага пасэгу з ударожанняя абярання неабходна ўзначэнне вхідных дадзеных, адпаведальнага за шаг і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перадзеўсці шаг з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі шаг не выйшаў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.
Дзеянні з ударожанняя 1/845: вымерыце час выконання, класію памылак і колькасць выкорыстоўваных токенав для гэтага пасэгу, а потым вырашыце, чы робіць змену на адной пазначанай базе пытанняў, а не на адной лічбе прыкладаў.