Агентны AIOps з графам кантэксту: Neocarta, Neo4j, LangGraph і Gemini
Замкнёная схема рэагавання на інцыдэнты: загрузка ServiceNow, Dynatrace і GitHub у Neo4j, разважанні на LangGraph і Gemini за фільтрам бяспекі і запіс кожнага дзеяння назад.
Крыніцы: Building Agentic AIOps: A Closed-Loop Platform with LangGraph, Gemini, and a Native Graph Database
Калі ўстаёць праця платформы чыму-небудзь у командзе SRE, патэрн павтараецца. Адны інжынеры сочыць за трэсамі з Dynatrace, іншыя пераглядаюць історыю выкладчыкаў у GitHub, каб з’ясавіць, што зменілася, а трэціе рэдагуюць карточку у ServiceNow, ўпынкам кераванне перастае запытваць пра апошнія змены. Ніхто не мае цэлага картынкі, таму што яна не знаходзіцца нідзе конкрэтна. Яна распадзялена між трыма чыму-небудзь дзесяцью інструментамі.
Гэта фрагментацыя, больш чым сама памылка чы сапраўдны выкладчык, зазвычай стае прычыной вярнення усяго у нормальны стан. Задзейсткі вынікаюць таму, што людзі зноў ствараюць кантэкст, які ўжо існаваў гдзе-то ў ціх сістэмах, проста не ў аднам месцы.
План выправлення ціеі проблемы заключаецца у поўнай інтэграцыі трохцо выбраных тэхналогій у платформу AIOps на адмініструемых агентах. Neocarta автаматызуе ввод дадзэў у граф Neo4j і надае доступ да гэтага графа для інструментаў AI праз MCP. LangGraph абавярае дэтэрміністычную оркестрацыю агента, а SDK Google Gen AI з Gemini забезпечвае логічныя працэсы. Не існуе ні lakehouse, ні пакетнаг ETL, ні ручна створаных вебхуков, ні панелей з застарэлымі показнікамі. Усё, што застаецца, — цэ хуткае, можна запытваць графічнае прэдставленне рэальнасці эксплуатацыі, да якога агент можа безпосерэдньа дастычыць і дзеяць.
Граф кантэксту заместо панелей
Большая частка інструментаў AIOps дадае «інтэлект» на базе аналітычных сховішчаў дадзей, створаных для бізнес-аналітыкі, а не для рэальнага часу, што ўсё ж такі неправы падход. У такой концэпцыі стан аперацый выкладваецца як проблема графа: кожны сервіс, розгортанне, інцыдэнт, каманда і заход з усунення проблемы стаюць вузламі, а зв’язкі межы ямі — такія як DEPLOYED_TO, ALERTS_ON, TRIGGERED_BY і OWNER_OF — ёсць краямі першага класу.
Калі запусковыя прыбуткі інфраструктуры ствараюць скалькованы граф, а не ізольаваныя логі, аналіз первапрычыны змінюе свой характэр. Гэта перэстаёць быць ручной археалогіяй і стаёць праходжэнням па графе, багатоэтапным запітам, які LLM можа безпасова аналізаваць пры помочы Graph RAG.
Чатыры слоі, якія замыкаюць цыкл
Чатыры шаруны кожны несу по аднай адпавядальнасці, і цыкл замыкаецца, таму што сабе дзеянні агента запісваюцца знову ў граф. Такім чынам, наступны інцыдэнт, які ён обрабоцвае, ведае, што ужо было спробавана.
- Автаматызаваная збірка за дапомогою Neocarta ingestion CLI. У працоўніку замест таго, каб пісаць прыемнік webhook для кожнага інструмента, канектары Neocarta выцягваюць метаданные і логі з ServiceNow, Dynatrace і GitHub і завантажваюць іх у граф. Не трэба падтрымваць спецыяльныя службы збіркі дадзеных для кожнага крыніцы.
Neocarta выступае замест нявыконанага сервісу для прыемкі дадзеных і безпосерэдніх вызоў драйвера базы дадзеных. Яго CLI автаматызуе збір дадзеных у Neo4j, а яго сервер MCP — гэта тое, з чым фактычна вяршыцца абмен дадзеннямі межа агентам для отрымання кантэксту графа.
Слой 1 і 2: прыемка дадзеных праз Neocarta
Схема ўступае першай, адтолькі яна ёсць онталогія, на якой стоіць весь платформа. Атрыбуты вузлаў і тыпы звязкаў — гэта тое, што кожны канектар і кожны запыт Cypher ў паўнай меры чытае і запісвае. Кожная аб’ектаў являе сабою вузел з пазначаным тыпам, а кожная залежнасць, звязак прыналежнасці і апавешчэнне — спрамоўваны рэбера з пазначаным тыпам. Самэ гэтая структура ператварае аналіз у розных інструментах на праходжэнне па графе.
Раней для прыемкі дадзеных трэба было запускаць прыемнік webhook для кожнага крыніцы і ручна пісаць код Cypher для кожнага фармата пакета. Neocarta скарацывае гэта да простай настройкі. Дастатнька толькі нацэслаць яго CLI да ServiceNow, Dynatrace і GitHub, ўжо тады ён сам займаецца адкрыцьцем схемы, пашаговай загрузкай дадзеных і ўзначэнням яных у вузлах і тыпах звязкаў графа.
# Register each source once — Neocarta handles auth, schema inference, and scheduling
neocarta connect servicenow --instance your-org.service-now.com --scope incident
neocarta connect dynatrace --tenant your-tenant-id --scope metrics,problems
neocarta connect github --org your-org --scope deployments,repos
# Point the loader at your graph and let it run
neocarta load --target neo4j://your-instance:7687 --database aiops-graph
Пад тым выкарыстоўваюцься тыя ж шаблоны MERGE і CREATE, якія людзі пішалі бы вручную. Пастойныя ентытэты, такія як рэпазітарыі, сервісы і каманды, з’еднаюцца, тады дублікаты вузлаў ніколі не з’являюцца. Падзеі, прыязначаныя для певнага момента, такія як запуск чы ўскладнення, кожны раз дадаюцца як новыя вузлы, што прабачае часовую лінію ад перакручэння і захоўвае пачатковую історыю недарабленай. Разлік у тым, што ніхто не павінен адтульваць код карэтківання межы троха API, якія самастойна зменяюць фармат пакетаў дадзенаў.
Паштучна да прыемкі дадзенаў, Neocarta даўае свой сервер MCP. Калі граф падпілены, ён стае доступны як канцэнтры MCP, і кліент, які падтрымляе MCP, у тым ліку LangGraph, можа выканаць запіты да графа з калькуляціямі як звычныя вызовы інструментаў. Код агента не патрабуе шара драйвераў базы дадзенаў для запісу чы адтульвання.
# LangGraph's context-fetching node talks to Neocarta over MCP,
# not to a Neo4j driver directly
from langchain_mcp_adapters.client import MCPClient
neocarta_client = MCPClient(server_url="http://neocarta-mcp:8080")
tools = await neocarta_client.get_tools() # graph_query, graph_traverse, etc.
Контроль схемы застаецца ў руках інжынераў. Абмежэнняі і індэксы візначаюцца як завжды, безпосерэдна ў Neo4j.
CREATE CONSTRAINT unique_service_id IF NOT EXISTS
FOR (s:Service) REQUIRE s.id IS UNIQUE;
CREATE INDEX incident_state_index IF NOT EXISTS
FOR (i:Incident) ON (i.state);
Слой 3: цыкл LangGraph
Гэты слой называецца „агентным“. У замест на адзін вызов LLM, прыняттыя рашэнні выконваюцца як машына станоў з чысткіма вузламі і рэшткамі, тады кожны шлях прыняцьбы рашэння можа быць пераглянут, працаваны і аналізаваны, на вядомаць ад нечысткага цыклу багатох агентаў.
Стан — гэта тыпаваны слоўнік, які пераходзіць праз граф.
class AIOpsAgentState(TypedDict):
incident_id: str
failing_service_id: str
graph_context_summary: Optional[str] = None
safety_gate_passed: Optional[bool] = None
chosen_action: Optional[str] = None
target_repository: Optional[str] = None
execution_result: Optional[str] = None
Чатыры вузла керуюць цыклам:
FetchGraphContextвызывае інструмент graph_traverse у серверы MCP Neocarta, каб праследаваць інцыдэт да яго службы, а потым да рэалізацыі, якая зменіла тую службу, асоцыяванага рэпазітарыя і команды, якая яго керуе. Код агента ніколі не мае прымусовага з’ўязку з базай дадзеных.VerifySafetyGateпраз той самы інтэрфейс запытання MCP пераказвае, чы не была ўжо застосавана мера падтрымкі да гэтай службы за апошню гадзіну. Штрафны механізм запобегае безканцоваму цыклу агента на нестабільной службе.GeminiReasoningзапускаецца толькі, калі пераказ пройшоў. Gemini 2.5 Pro атрымлея сумарны выказ тэксту графа разам з вузькімі інструкцыямі сістэмы, а ўсё прыемнае адпаведзенне — аднам з двух фіксованых токенаў.
ExecuteRemediationTool запускае процедую віправлення і запісваеў у Neo4j абаковыя дадзылія праз Neocarta, чыяму закрываецца цыкл.Якшчы якісь чакае найбольшая увага, то гэта безпековыя механізмы. Хоць тут пісаецца як MCP інструмент, а не простоя сесія драйвера.
async def evaluate_remediation_safety_gate(state: AIOpsAgentState) -> Dict:
result = await neocarta_client.call_tool(
"graph_query",
cypher="""
MATCH (s:Service {id: $service_id})<-[:EXECUTED_AGAINST]-(a:RemediationAction)
WHERE a.timestamp >= datetime() - duration('PT1H')
RETURN count(a) as active_actions
""",
params={"service_id": state["failing_service_id"]},
)
return {"safety_gate_passed": (result["active_actions"] == 0)}
Аўтонамны цыкл дзеяння без заходнага клапана ніколі не павінен выходзіць у прыемленьне. Саме клапан не дазволяе агенту зноў запускаць процедуру вярнення да пачатковага стану кожныя трыдцаць секунда, калі асновная анамалія яшчэ не знікла.
Узел Gemini спецыяльна ўрадзіва проста, і гэта яго перавага.
system_instruction = (
"You are an automated Agentic AIOps architect. "
"Analyze the provided graph context summary. "
"If a deployment recently modified the service state, "
"output EXACTLY the word TRIGGER_ROLLBACK. "
"If the context is clear but safe guidelines are violated, "
"output HALT_ESCALATE. Do not append any other characters."
)
Адзінакавленне выходу модэлі да двум точным токенам прыводзіць да таго, што вызов ведаецца больш як функцыя, запісаная рукой, чым як адказ у чаце, што ўзгодна, калі рэзультат спрычыняе адвёрсію працы сістэмы.
Слой 4: закрыць цікл
Пасляпянны вузол альбо запускае процэс адвёрсіі праз API GitHub Actions, альбо нічога не робіць, факт зупінкі проста фіксуецца. У будзь-ям случае граф актуалізуецца праз той самы шлях запісі MCP, як і весь іншы матэрыял, таму для запісі назад не трэба окалечных паролёў да базы даных.
await neocarta_client.call_tool(
"graph_write",
cypher="""
MATCH (s:Service {id: $service_id}), (i:Incident {id: $incident_id})
CREATE (a:RemediationAction {id: $action_id, timestamp: datetime(), status: 'SUCCESS_ROLLBACK'})
CREATE (a)-[:EXECUTED_AGAINST]->(s)
CREATE (a)-[:ATTEMPTED_TO_FIX]->(i)
""",
params={"service_id": service_id, "incident_id": incident_id, "action_id": action_id},
)
Тое, што прыменяе гэты сістэму з замкнутым цыклам, а не проста скрыпта для автаматызацыі, — гэта простая дэталю: рэсультат сабе дзеяння агента стае кантэкстам для наступнага інцыдэнту, які ён аналізуе, таму платформа з часам становіцца болей усведамленай пра сітуацыю, а не менш.
Інцыдэнт з пачатку да канца
У праекце ёсць сімуляцыя без рэальных дзеянь, якая паказвае, як разны элементы взаімаўпрацоўваюць, і ее аналіз можа быць павучальным.
- 14:00:00. Сервіс платэжнага шлюза завершыў розгортанне, чыяму палягае вузол Deployment, які з’ѐеднаны з гэтым сервісам.
- 14:05:00. Dynatrace выявіў крытычную анамалію на том жа сервісе.
- 14:06:00. У ServiceNow з’яўіўся інцыдэнт класу P1, які стае вузлом Incident і з’ѐеднаны з сервісам за дапамогою рэгламента ALERTS_ON.
З моменту появы аномаліі да ўсунення проблемы пройшлі калькі хвілін, а не патрэбны былі тэлефонныя кансультацыі. Кожны крок логічных выводаў застаецца працэсуемым у графе, таму можна выясніць, чым агент кераваўся, выканаўшы тое чы іншэ.
Пасля стварэння карты інцыдэнт утвараее адну суцэльную структуру, якая абарачае каманду, код, развяроцьбу, сервіс, сам інцыдэнт і дзеянні агента па ўсуненню проблемы. Гэта самае тая падграфа, якую выкарыстоўвае Gemini, і саме адна суцэльная структура замест трох прызначых панелей дазволяе агенту праследаваць інцыдэнт класу P1 аж да самага каміту, які яго спрычыніў.
Тую ж історыю можна разбіць на тры моменты, якія стварылі граф: развяроцьбу, збой і усуненне проблемы. Кожны з гэтых моментаў ўражае базу дадзеных окрэма, але разам яны утвараюць адну неперывную часовую лінію, якая праходзіць ад злічынення коду ў Git праз апавешчэнне ў працоўнай асяроддзі да усунення проблемы, за семь хвілін.
Надача інжынерам можлівасці адразу бачыць граф
Автонамная сістэма, яю інжынеры не можаць пераглядаць, ёсць абавесцю. Таму план таксама включае панель дашборду Streamlit, створаную на базе pyvis, якая адображае актуальную топалогію графа і хроніку дзеянняў.
net = Network(height="600px", width="100%", bgcolor="#1a1c1e", directed=True)
color_map = {
"Team": "#5f3dc4", "Repository": "#24292e", "Deployment": "#007acc",
"Service": "#11a685", "Incident": "#c41c1c", "RemediationAction": "#cc0088"
}
Інжынеры маюць можлівасць бачыць всю ланцоўку з працэсу злічынгу ў Git, пачынаючы ад інцыдэта ў працоўнай асяроддзя, па заканчыць автаматызаванага выкарыстання парадкава, пры чым ў бокавай панелі паказваецца спіс усіх дзеянняў, якія выканаў агент, у правільнай прыродзе. Такая прозрачнасць робіць автонамную сістэму достатна надзеямай, каб яе можна было запускаць у працоўнай асяроддзі, адтак нічага з таго, што яна робіць, не застаецца незрозумелым.
Аплікацыя, якая не парадуе працоўную срэду
Рэкамендаваны падход ёсць абераглівы, ён складаецца з трохоў фаз, а не з аднаго моменту запуску.
- 1-я недзеля: прабіранне і перакананне. Настоўце канектары Neocarta на копіі кожнага крыніцы ў сэндбоксе, створыце абмежэнні графа і пераканайцеся, што вузлы правільна супараднуюцца і з’яўляюцца ў зв’язку, пры чым яшчэ не включаюцца даны з працоўнай асяроддзя.
Толькі пасля таго, калі всі тры фазы будуць працаваць належна, інструменты для выправлення проблем можаць быць настроеныя на канцаўкі прыменення.
Чаму такія рашэнні ўзьяздны
Некалькі рашэнняяў разлучаюць дэманстрацыйную версію з чым-то надзеяным у рэальных умовах прыменення.
- Машыны станоў працуюць лепшая за ціклы агентаў без частакоў. LangGraph робіць кожны шлях прымення рашэння явным і можна адзірваць, і не існуе жадных схованых логічных ланцаў, якія не можна було бы воспроіцаваць.
- Перад кожным вызовам LLM, які можу спрычыніць дзеянне, выконваецца перакрыцча безпекі. Калі неякшыя заходы былі выкананы недавна, агент не можа дася да вузла разумовых вычынэнняў. Гэтыя перакрыцча рэалізуюцца ў дэтэрміністычным кодзе, а не ў запросе.
- Контракт выходных даных ёсць обмежаным. Ад Gemini не выкарыстоўваецца прозаічны тэкст. Обмежэнне яго до адного з двух токенаў робіць рэзультат настолькі ж надзеяным, як і значэнне, якое вяртае функцыя.
- Граф служыць памяцю, а не толькі месца для зберагчэння. Дзеянні, направленыя на усуненне проблем, запішываюцца ў той самы граф, які чытае агент, таму яго усведомленне пра сітуацыю накапліваецца і не скасоўваецца з кожным інцыдэнтам.
- MCP — гэта з’ўязок між агентам і графам. Калі сервер MCP ад Neocarta знаходзіцца між LangGraph і Neo4j, агент ніколі не выкарбавае драйвер базы дадзеных і не керуе пуламі з’ўязкаў. Ён проста вызывае інструменты. Гэты з’ўязок таксама дазволяе заменіць Gemini на іншую мадэль або LangGraph на іншага оркестранта, не прабачаючыся з працэсам запоўнення дадзеных і шаром графа.
Кантэкст, які ўтвараецца натычна ў графе, цыкл разумовых дзейсць з фіксаванымі крокамі і механізм захісту, напісанный у кодзе, разам робяць автонамнае відновлення чымс, што можна запусціць на практыце, а не толькі чымс, што выглядае гарна на слайдзе. Розумныя наступныя крокі — гэта запуск усіх компонентаў за дапамогою Docker Compose і адправка паведамленняў у Slack з роутэра 4-го шару, ёжы дозволяе всім быць у кантакце пра кожную автонамную дзеянне, нават калі ніхто не мусіў втручацца.