Галоўная / Артыкулы

Агентны AIOps з графам кантэксту: Neocarta, Neo4j, LangGraph і Gemini

Замкнёная схема рэагавання на інцыдэнты: загрузка ServiceNow, Dynatrace і GitHub у Neo4j, разважанні на LangGraph і Gemini за фільтрам бяспекі і запіс кожнага дзеяння назад.

Выдавец: REACTAPP.TOP10 хв чытання2402 слоў

Крыніцы: 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.

Чатыры слоі, якія замыкаюць цыкл

Чатыры шаруны кожны несу по аднай адпавядальнасці, і цыкл замыкаецца, таму што сабе дзеянні агента запісваюцца знову ў граф. Такім чынам, наступны інцыдэнт, які ён обрабоцвае, ведае, што ужо было спробавана.

  1. Автаматызаваная збірка за дапомогою Neocarta ingestion CLI. У працоўніку замест таго, каб пісаць прыемнік webhook для кожнага інструмента, канектары Neocarta выцягваюць метаданные і логі з ServiceNow, Dynatrace і GitHub і завантажваюць іх у граф. Не трэба падтрымваць спецыяльныя службы збіркі дадзеных для кожнага крыніцы.
  • Сістэмны кантэкст у Neo4j, які адказвае сервер Neocarta MCP. Гэта ўсё сутнасць кантролю працы сістэмы. Рэпазітары, службы, запускі, інцыдэнты, каманды і заходы з усунення проблем являюцца вузламі, а кожныя зв’язкі — гэта тыпаваныя, направленыя рэбры. Neocarta размешчае сервер MCP пры графе, таму будзь-які інструмент, які падтрымлеў MCP, укладаючы LangGraph агента, можа выконваць запіты без неабяжнага коду базы дадзеных.
  • Расчункі з LangGraph і Gemini. Машына станоў LangGraph выконвае цыкл «спазірванне, орыентаванне, прыняцце рашэння, дзеянне». Ён запрашвае кантэкставы падграф праз MCP, перакладае яго ў запіт і дае Gemini абмежаны выбар: выправіць проблему чы розглядаць яе з людзьмом.
  • Усуненне проблем і павертаўшчыя дзеянні. Калі агент прымечае рашэнне дзейсцаваць заходы, ён запускае процедуру выправлення, напрыклад абратыя дзеяння GitHub Actions, а пасля фіксуе рэзультат у графе як новы вузел. Большасць дэманстрацый AIOps праходзяць поважна праз гэты крок, і самэ гэта дазволяе замкнуць цыкл і не робіць дзеяння адночасовым.
  • 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},
    )
    

    Тое, што прыменяе гэты сістэму з замкнутым цыклам, а не проста скрыпта для автаматызацыі, — гэта простая дэталю: рэсультат сабе дзеяння агента стае кантэкстам для наступнага інцыдэнту, які ён аналізуе, таму платформа з часам становіцца болей усведамленай пра сітуацыю, а не менш.

    Інцыдэнт з пачатку да канца

    У праекце ёсць сімуляцыя без рэальных дзеянь, якая паказвае, як разны элементы взаімаўпрацоўваюць, і ее аналіз можа быць павучальным.

    1. 14:00:00. Сервіс платэжнага шлюза завершыў розгортанне, чыяму палягае вузол Deployment, які з’ѐеднаны з гэтым сервісам.
    2. 14:05:00. Dynatrace выявіў крытычную анамалію на том жа сервісе.
    3. 14:06:00. У ServiceNow з’яўіўся інцыдэнт класу P1, які стае вузлом Incident і з’ѐеднаны з сервісам за дапамогою рэгламента ALERTS_ON.
  • Агент LangGraph працяе на новым вузле інцыдэту. Функцыя FetchGraphContext пераходзіць ад інцыдэту да службы, да розгортання, да хранілні і да каманды і выявляе, што розгортання адбылася за пяць хвілін да появы аномаліі.
  • Функцыя VerifySafetyGate не знаходзіць жадных поперадніх заходаў з усунення проблемы за апошню гадзіну, таму шлях для дальнейшых дзеянь вільны.
  • Gemini прымеяе кантэкставую сумарызацію, выявляе, што розгортання стала прычыной інцыдэту, і вяртае значэнне TRIGGER_ROLLBACK.
  • Екзекутар адпрацоўвальнага інструмента запускае працэс анулювання ў GitHub Actions, пасля чаго зберагае новы вузел RemediationAction у Neo4j.
  • З моменту появы аномаліі да ўсунення проблемы пройшлі калькі хвілін, а не патрэбны былі тэлефонныя кансультацыі. Кожны крок логічных выводаў застаецца працэсуемым у графе, таму можна выясніць, чым агент кераваўся, выканаўшы тое чы іншэ.

    Пасля стварэння карты інцыдэнт утвараее адну суцэльную структуру, якая абарачае каманду, код, развяроцьбу, сервіс, сам інцыдэнт і дзеянні агента па ўсуненню проблемы. Гэта самае тая падграфа, якую выкарыстоўвае 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 на копіі кожнага крыніцы ў сэндбоксе, створыце абмежэнні графа і пераканайцеся, што вузлы правільна супараднуюцца і з’яўляюцца ў зв’язку, пры чым яшчэ не включаюцца даны з працоўнай асяроддзя.
  • 2-я недзеля: апрабоўкі на стэйджынгаваных базах дадзенняў. Створыце оркестрактар LangGraph на базе толькі для чытання стэйджынгаванай базы дадзенняў і старайцеся зрозумець, калі Gemini прыме рашэння, калі выкананне не ўвёшчаецца. Хутчэй выяўляюцься проблемы з запітамі або кантэкстам.
  • 3-я недзеля: аўтаматызацыя з замкнутым цыклам. Праўяце Layer 4 да рэальных канцаўкаў API стэйджынгаваных сістэм і пераканаецеся, што транзакцыі з запісам завершаюць цыкл, чым даўаецца сістэме безпекі рэальная інфармацыя для аналізу.
  • Толькі пасля таго, калі всі тры фазы будуць працаваць належна, інструменты для выправлення проблем можаць быць настроеныя на канцаўкі прыменення.

    Чаму такія рашэнні ўзьяздны

    Некалькі рашэнняяў разлучаюць дэманстрацыйную версію з чым-то надзеяным у рэальных умовах прыменення.

    • Машыны станоў працуюць лепшая за ціклы агентаў без частакоў. LangGraph робіць кожны шлях прымення рашэння явным і можна адзірваць, і не існуе жадных схованых логічных ланцаў, якія не можна було бы воспроіцаваць.
    • Перад кожным вызовам LLM, які можу спрычыніць дзеянне, выконваецца перакрыцча безпекі. Калі неякшыя заходы былі выкананы недавна, агент не можа дася да вузла разумовых вычынэнняў. Гэтыя перакрыцча рэалізуюцца ў дэтэрміністычным кодзе, а не ў запросе.
    • Контракт выходных даных ёсць обмежаным. Ад Gemini не выкарыстоўваецца прозаічны тэкст. Обмежэнне яго до адного з двух токенаў робіць рэзультат настолькі ж надзеяным, як і значэнне, якое вяртае функцыя.
    • Граф служыць памяцю, а не толькі месца для зберагчэння. Дзеянні, направленыя на усуненне проблем, запішываюцца ў той самы граф, які чытае агент, таму яго усведомленне пра сітуацыю накапліваецца і не скасоўваецца з кожным інцыдэнтам.
    • MCP — гэта з’ўязок між агентам і графам. Калі сервер MCP ад Neocarta знаходзіцца між LangGraph і Neo4j, агент ніколі не выкарбавае драйвер базы дадзеных і не керуе пуламі з’ўязкаў. Ён проста вызывае інструменты. Гэты з’ўязок таксама дазволяе заменіць Gemini на іншую мадэль або LangGraph на іншага оркестранта, не прабачаючыся з працэсам запоўнення дадзеных і шаром графа.

    Кантэкст, які ўтвараецца натычна ў графе, цыкл разумовых дзейсць з фіксаванымі крокамі і механізм захісту, напісанный у кодзе, разам робяць автонамнае відновлення чымс, што можна запусціць на практыце, а не толькі чымс, што выглядае гарна на слайдзе. Розумныя наступныя крокі — гэта запуск усіх компонентаў за дапамогою Docker Compose і адправка паведамленняў у Slack з роутэра 4-го шару, ёжы дозволяе всім быць у кантакце пра кожную автонамную дзеянне, нават калі ніхто не мусіў втручацца.