Практычныя прытамулкі: Я створыў автономнага агента SRE, які рашае проблемы ў працэсе виробніцтва.
Практычныя прытамулкі: Я створыў автономнага агента SRE, які рашае проблемы ў працэсе виробніцтва: контракты, пераканання та готовыя фрагменты коду для команд, якія викорыстоўваюць гэты патэрн.
У гэтым керавану практычнае адгэтуванне пацёрку з сыр'ёчных матэрыялаў да рабочай системы для проекта «Я створыў автонамны агент SRE, які рашае проблемы ў вырабоцтве, калі я спя». Акцэнт ставіцца на практычныя крокі, чысткія перакананні та код, які можна проста дадаць у репазітарый без неабяснення меты. У стадзіі агульнага відгледу неабходна з'явіць вхідныя даны, адпаведальнага за крок та критэрыя завершэння прычыму перад зменай коду. Аператары должны магчымае перадзваніць крок з вядомай точкі контролю, не падозрюючы пра схованы стан. Валіць кращэ маленькія, тэставаныя елементы над велікімі скрыптамі. Калі крок не выйшоў, прычына неха вказывае на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач.
Репазітарый на GitHub
Калі працуеце з стадзіяй GitHub Repo, спачатку запісайце кантракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўкаў дапамагае заліцвачыць пазнейшыя змены ў кодзе. Спрыймайце гэтую стадзію як кантракт межа даннэмі і перакананымі выходамі. Дайце назву артыфактам, задаце перакананні на успех і адмовіцеся ад тыхоўскага частковага завершэння. Зробіце пераконтроўку пасля дорогіх крокаў. Система адновлення не павінна зноў стягваць плата за той самы вызов LLM, калі аператар прабуе зноў запрацаваць з пазнейшым вузлам.
Чаму ReAct, і чаму LangGraph
Калі працуеце над стадіямі «Чаму ReAct» і «Чаму», спачатку запісайце умовы працы: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контролю дапамагае заліцварваць будучыя змены коду. Запісуйце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды. Зробіце перапаконтрацю пасля дорогіх крокаў. Система вярнення не павінна знову нарахоўваць косты за той самы вызов LLM, калі аператар прабуе зноў выконаць пазнейшы вузел.
Чатыры слоі памяці
Калі працуеце над стадзіяй «Чатыры слою памяці», спачатку запісайце угоду: неабяжлівыя даннэ, сигнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список контроля дапамагае заліцвачыць пазнейшыя змены коду. Зберагаеце настройкі паза кодам прыемлена. Файлы сераўіса, храненні секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Стварайце контрольныя пункты пасля дорогіх крокаў. Функцыя вярнення до роботы не должна занова ставіць плату за той самы вызов LLM, калі аператар перазапускае пазнейшы вузел. Калі працуеце над стадзіяй «Чатыры слою памяці», спачатку запісайце угоду: неабяжлівыя даннэ, сигнал успеху і тое, што выходзіць пад частковыя неудачы. Такі список контроля дапамагае заліцвачыць пазнейшыя змены коду. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неудачы должна вказываць на адну адпаведальнасць, а не на заплутаную лінію обробкі.
Як насправді працюе эпізодычная памяць
Этап «Як насправді працюе эпізодычная памяць» работае найкраща, калі яго розглядаць як вимерную паверхню. Запісаце адна ідеальная версія, адзин прыклад неудачы і прыметкі па поверненню да пачатку перш чым расширваць масштаб. Разглядзіце этап як кантракт межа вхіднымі даннымі і паверыжанымі выходнымі рэзультатамі. Даце назвы артыфактам, задаце критэрыі успеху і адмовіцеся ад тыхоў, частковага завершэння. Зберагачыце стан графа ў простам і типаванам формате. Вкладзеныя блокі маскуюць, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў.
Сістэма автонаміі: L0 да L3
Система автонаміі на стадії L0 працюе найэфективней, калі яе розглядаць як вимерную паверхню. Запісаце адна «золатая» транскрыпцыя, адны прыклад неудачы і прыметкі па поверненню да пачатковага стану пры розшырэнні масштаба. Запісвайце часы выканання і косты токеноў або запытак праза функцыйнае рэзультаты. Відкрытыя данні пра косты з’являюцца рана, таму не будзе неспакою з расчыткамі, калі працэўнае сераўеры зменяюцца з дамовай версіі на спадзеленыя.
Полны набор інструментаў
Этап «The Full Tool Arsenal» працюе найкраща, калі яго розглядаць як вимерную паверхню. Зберагчыце адны ідеальны прыклад роботы, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Храніце настройкі параду ад коду прыемліка. Файлы сераўнавання, хранальнікі секрэтных данных і пазнакі функцый крануцца ў адным месцы, якое аператары можаць пераглядаць без неабяжнага чытання всіх элементаў системы. Актуалізавайце інструменты з вузкімі схемамі та чытальнымі пазначэннямі побачных эфектаў. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць ўпрыем дадзенняў. Этап «The Full Tool Arsenal» працюе найкраща, калі яго розглядаць як вимерную паверхню. Зберагчыце адны ідеальны прыклад роботы, адны прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць сферу дзеяння. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшаў, прычына неудачы должна вказываць на адну конкрэтную абавязак, а не на заплутаны ланцужок дзеяння.
Цікл ReAct у практыцы
Для цілей цыклу The ReAct на данай стадзіі неабяжна ўскладніць вхідныя даны, адпаведальную особу за кожны крок і критэрыі завершэння перш чым змяніць код. Аператары должны магчымае запускіць крок з вядомай точкі перапытку без неабяжнага вычыслення схованых станоў. Спрыяйце цій стадзіі як даговору межа вхіднымі данымі і падтверджанымі выходнымі рэзультатамі. Даўце назвы артыфактам, ускладніць перагляд успеху і адмовіцеся ад беззвучнага частковага завершэння. Забезпечыце людзкія парады на тых кроках, дзе витрачаюцца грошы або зміняюцыся даны для працы. Компіляцыйныя налашчэння не ўзроўнаваны з абсолютным завершэнням бізнес-процэсаў.
[MEMORY] Loading episodic context for payment-service...
[MEMORY] Found 2 similar past incidents (similarity: 0.89, 0.76)
[MEMORY] Loaded 3 procedural policies for payment-service/critical
[THOUGHT] Incident: payment-service OOMKill, 3 pods CrashLooping.
Past incident INC-2801 had identical symptoms — root cause was
a memory leak in the gRPC connection pool after a deploy.
Starting with get_logs to confirm before acting.
[ACTION] Calling tool: get_logs with {'service_name': 'payment-service', 'log_level': 'error'}
→ top_errors: [{"pattern": "out of memory: kill process", "count": 47},
{"pattern": "grpc connection pool exhausted", "count": 23}]
[THOUGHT] OOM confirmed. gRPC pool exhaustion matches INC-2801 pattern.
Retrieve runbook before acting — want the fix procedure.
[ACTION] Calling tool: retrieve_runbook with {'query': 'payment service grpc oom memory leak fix'}
→ [runbooks / payment-service-oom.md] Recommended action: rolling restart
resets connection pool. If recurs within 1h, rollback to previous image.
[THOUGHT] Runbook confirms rolling restart. Checking policy for autonomy L2...
[ACTION] Calling tool: restart_deployment with {'service': 'payment-service',
'deployment': 'payment-worker', 'namespace': 'production',
'severity': 'critical', 'autonomy_level': 'L2'}
→ policy: ALLOWED (L2 ≥ min_level L2 for restart_deployment)
→ draining pods... restarting... polling rollout...
→ health_check: healthy=True, pods_ready=3/3, error_rate=0.008
[THOUGHT] Restart succeeded. Error rate 0.8% — below 5% threshold.
Verifying with check_service_health before closing.
[ACTION] Calling tool: check_service_health with {'service': 'payment-service',
'deployment': 'payment-worker', 'namespace': 'production'}
→ healthy=True, pods_total=3, pods_ready=3, error_rate=0.007
[THOUGHT] Service fully recovered. Writing audit log and resolving.
[ACTION] Calling tool: write_audit_log ...
→ audit_log written: restart_deployment for incident INC-2847
RESOLVED: payment-service recovered after rolling restart. Root cause: gRPC
connection pool OOM — matched pattern from INC-2801. All 3 pods healthy,
error rate 0.7%. MTTR: 187 seconds.
[MEMORY] Saving incident INC-2847 to episodic memory...
[NOTIFY] Sending resolution to Slack channel: #all-aegisops ✅
Invoke-RestMethod -Uri "http://localhost:8000/webhook/incident" `
-Method Post `
-ContentType "application/json" `
-Body '{
"source": "webhook",
"severity": "critical",
"service": "payment-service",
"symptoms": ["High 500 errors", "DB connection timeouts"],
"autonomy_level": "L2"
}'
Як выглядае канал Slack
Для ўрагу «What the Slack Channel» неабходна пазначыць даннэ, якія будуць вводзіцца, адпаведальнага за кожны крок і критэрыя завершэння працы перад зменым коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не прабуючы спадарожваць скрыты стан. Запісвайце час выконання і вартасць токена або запыту разам з функцыйнальнымі рэзултатамі. Відразы вартасці з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмавайнтараў у спяльныя среды. Заставьце людзкія апраўданні для тых крокаў, якія витрачаюць грошы або зменяюць даннэ ў працоўным сераверы. Праця ў часе компілявання не абавязкова значыць повную готовасць да роботы.
Інфраструктурны стак
Для стадіі The Infrastructure Stack неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае перайскаць крок з вядомага пункта контролю без адгадвання захаванага стану. Конфігурацыю трэба знаходзіць за межамі коду прыкладнення. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцый належыць у аднам месца, якое працавнікі можуць пераглядаць, не чытаючы весь ланцуг. Прызначайце людскія апраўленні для рэлей, якія выкарыстоўваюць грошы або зміняюць даны у працоўным режыме. Підключэння ў час складання не є адпаведным для пачатку бізнес-процэсаў. Для стадіі The Infrastructure Stack неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае перайскаць крок з вядомага пункта контролю без адгадвання захаванага стану. Валіце маленькія, тэставальныя елементы працоўнікаў над вялікімі скрыптамі. Калі крок не выйшаў, прычына нехтарактару должна вказываць на адну адпаведальнасць, а не на заплутаны комплекс прычын.
Прынцыпы роботы.
version: "3.9"
services:
postgres:
image: ankane/pgvector:latest
ports:
- "5445:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin123
POSTGRES_DB: aegisops
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:alpine
ports:
- "6380:6379"
app:
build: .
ports:
- "8000:8000"
env_file: .env
depends_on:
- postgres
- redis
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./infra/prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
postgres_data:
Хадзяба аудыту
Калі працюеце на стадзіі хадзябы аудыту, спачатку запісайце умовы контракта: неабяжлівыя даннэ, сігнал успеху і тое, што выканаецца у разы ў частковай нявыполненасці. Такі список контролю дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрыятлівае ставленне да гэтай стадзіі як да контракта межа даннемі і перакананымі выходамі. Дайце назвы элементам, задаце критэрыя успеху і не падзельвайцеся на частковую роботу без адказу. Зробіце пераконтроль пасля дорогіх крокаў. Програма не должна занова выклікаць той самы календар LLM, калі аператар праказвае пазнейшы вузел.
Што далей
Калі працюеце над стадзіяй «Што далей», спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Запісвайце час выканання і кост токена або запыту праза функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмаверыяна ў спакульнаныя сераўысы. Зробіце перапаконтакт пасля дорогіх крокаў. Продовжэнне працы не должна зноў нарахоўваць кост той самай вызову LLM, калі аператар прабуюць зноў запрацаваць пазнейшы вузел.
Заключныя меркі
Калі працюеце над стадзіяй «Заключныя мыслі», спачатку запісайце контракт: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Зберагаеце настройкі паза кодам прыемлі. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцый крануцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжлівага чытання всей структуры. Ставяйце контрольныя пункты пасля дорогіх крокаў. Система вярнення праблемы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да наступнага элемента. Калі працюеце над стадзіяй «Заключныя мыслі», спачатку запісайце контракт: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Валіце маленькія, тэставаныя елементы працы над вялікімі скрыптамі. Калі крок не выйшаў, прычына нявыпання должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаную структуру працы.
Пра гэты проект
Этап «Апавя пра гэты проект» работае наўзям лепш, калі яго спрыятаць як мерымае паверхне. Запісайце адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштабы. Спрыяйце гэтым этапам як кантракту межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Зберагачыце стан графа ў простам і типаванам формате. Вярнутыя структуры дадзення маскуюць, який вузел запісаў кожны поле, і спакшуюць продовжэнне роботы пасля перарываў.
Чэк-ліст для эксплуатацыі
Этап чэк-ліста для эксплуатацыі работае наўзям лепш, калі яго спрыятаць як мерымае паверхне. Запісайце адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па адвярненню змян перш чым расширваць масштабы.
Дакументавайце як шлях успеху, так і шлях вяснавання проблем. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Зберагаюце стан графа у простам і типаваным формате. Вярнутыя структуры маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакоююць працэзвяршэнне пасля перарываў.
Калі бюджет дазволяе, дадзіце тэст на перакананне, які працюе над критычным шляхам у CI з викорыстаннем фіксатываў, а не рэальных платных API.
Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, адказгавальнасць за гэта павінна быць прызначаная для адной задачы, а не для заплутанага ланцюга крокаў.
Зберагаюце стан графа у простам і типаваным формате. Вярнутыя структуры маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакоююць працэзвяршэнне пасля перарываў.
Перад апраноўкай стэка заморозьце версіі, зафіксуйце ідеальны транскрыпт для критычнага шляху і паказваце крокі для адворачэння. У спадзеленых средах патрэбны ліміты частоты запытоў, перакананні пра адпаведнасць власніка і чысткі распад секрэтных даных. Валіце простую надзяйнасць замест крэатыўных, адзінразовых дэманстрацый.
Запіска параграфу 102175b0ac7c: не трэба кантрацеўваць ключы прадастоўніка ў репазітарыі, задаць максімальную кантэйнгу токена на кожную сесію, а таксама зберагчы транскрыпціі праза фіксатуры адлічэння, каб пазнейшыя замены моделей заставалі пораўняннымі.
Запіска па прыемнасці 0 стадзіі работае лепш, калі яе спрыяваць як вимерную плошчу. Зафіксавайце адну ідеальную транскрыпцію, адзін кейс абякання і запіску пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Канфігурацыю трэба кантрацеўваць за межамі коду прыемніка. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функций должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць без неабходнасці чытання всей структуры.
Дзялінкі прыемнасці 0/800: вимеравайце час выканання, класію абякання і выкарыстоўванне токена для гэтай запіскі, а пасля вырашыце, чы робіць змяну на адной пазначанай сэткі пытанняў, а не на адной толькі анекдотычнай інформацыі.
Для першага пасэгу з ударожанняя абярання неабходна ўзначэнне вхідных дадзеных, адпаведальнага за шаг і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перадзеўсці шаг з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі шаг не выйшаў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.
Дзеянне ударожанняя 1/800: зважыце час выконання, класію памылак і колькасць выкорыстоўваных токенав для гэтага пасэгу, а потым вырашыце, чы робіць змену на адной пазначанай базе пытанняў, а не на адной лічбе прыкладаў.