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

OrgGraph AI: Граф знанняў без прымусовага кодавання для дадзеных у сферы кадраў.

Як LLM адаптуючыся пад любы файл Excel чыста CSV, выклікае схему графа, завантажвае яе ў Neo4j за дапамогою дынамічнага Cypher і адпавядае на запіты па кадрах за дапамогою чат-агента LangGraph.

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

Крыніцы: Building a Fully Agentic Employee Knowledge Graph: **OrgGraph AI — using LangGraph & Neo4j**

Велікі компаніі зберыгаюць більшэ даных про своіх співробітніків, ніж будзь-колі ранішэ, проце пры підборы персоналу все шчэ вікорыстовуюць прыпушчэння. Іерархіі віддылу кадрыв знаходзяцца у сістэмі Workday. Розподыл праектыв ведэцца у Jira. Навічкі, рывень компетэнтносты і сертыфікаты залішаюцца у старых порталах навчання. Потым з’являецца праект вісокоі прыорытэтносты з вікорыстанням ШЫ, і керывнік праекту запітуе, хто в офісі в Мумбаі чы Пуні мае досвід працы з Python, сертыфікат AWS, знання в галузі ШЫ/машынного навчання і вільну потужнісць.

Відповісты на гэта запітання можна лішэ за тыждэнь, калі гэта взагалі можліво. Факты існуюць, але яны залішэні у окрэміх сістэмах, які не можуць аналізуваты взаемозв’язкі між рэчамі.

OrgGraph AI — гэта сістэма, створаная для заполнення гэтаго прыему. Яна прыймае неапранутыя організацыйныя даны ў будзь-ям фармаце Excel або CSV, LLM сама вырахоўвае схему графа, заваносіць усё ў Neo4j і пасля адпавядае на запытанні простай мовай. Ніякая логіка домэны не ўводзіцца жорсткая нітку.

Связі маюць большое значэнне чым запісі

Стандартныя інструменты кадровага аддзелу базуюцца на плоскіх SQL-тэблы. Для яных лёгка запытацца пра всіх спрацаваных у Бангалоры або пра всіх, якіе вжываюць Python. Але яны сталкаюцца з запытаннямі, якія вырабляюцься па перасеканні, тымі, якія трэба рашыць, аналізаваючы кальколька відэйсоў связей адразу. Граф знанняяў відкрывае чатыры віда работ:

  1. Точны падбор кадраў. Знайсці аднаго чалавека, які падходзіць па навыку A, сертыфікату B, месцазнаходзке C і які мае вольны рэсурс, за адну перамерку, а не за чатыры окалічныя з’еднання.
  • Раннія дыягностыка прыемкі навыкаў. Пораўняйце чынныя навыкі з тым, калі ўсё болей прыходзяць праектам. Можаце выявіць, што аддзел дадзэнняў і штучнага інтэлекту не мае достатньго досвіду работы з Kubernetes для праекта ў трэцьму квартале, пакуль яшчэ ёсць час прыняць заходы.
  • Планаванне прыемкі і саавершанне. Спаўнюйце паўнага працавіка ў Сіднеі з старшым архітэкторам поблізу, які вікорыстоўвае той самы тэхнічны стак, альбо знаходзіце внутршніх экспертаў для шырокага кансалтантства замест таго, каб наймалі сторонніх практыкантав.
  • Аналіз організацыянага сеткі. Складзіце ланцюгі атрыбутаў адчытнасі, выявіце адзіныя пункты абявы пра бяду ў структурах керавання і пазнайсце, якія выдаюшчыяся працавікі маюць занадта вялікі навантажэнне, перш чым яны выгораюць.
  • Што значыць нулявы жорсткі кодаванне

    Большасць праектаў з графамі знанняяйшчаюць адной спецыяльнай таямніцы: схема ў яных задана жорсткая. Інжынер чытае таблічны файл, выявляе, што спавярнікі — гэта вузлы, навыкі таксама ёсць вузлы, а рэштка HAS_SKILL спаўявае іх між сабою, пішае спецыяльны код Cypher для кожнай ентытэты і выкладзе яго. Потым аддзел кадра дадае шартку Certifications або перайменавае PrimarySkill на TechStack, і весь працэс перастае працаваць.

    OrgGraph AI перакідае сітуацыю. Штучны інтэлект сам вяршыць выбор схемы. Для будзь-каго таблічнага файла сістэма:

    1. аналізуе даны, уключаючы тыпы столбцоў, кардынальнасць і можлівыя зовнішнія ключы
    2. выводзіць схему графа на адной структураванай выходнай масе ШЫ, якая пераканальвана за дапамою Pydantic
    3. дынамічна генеруе і запускае запіты Cypher MERGE
    4. аналізуе готовы граф, каб чат-агент могаў яго запытваць

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

    Чатыры фазы

    Сістэма працуе ў чатырох фазах, карыстуючыся Python, LangChain, LangGraph, Pydantic і Neo4j.

    Фаза 1: аналіз метададзеных

    Перш чым працюе які-небудзь LLM, MetadataProfiler аналізуе неапранутыя даныя локальна і стварае кампактны структурны «фінгерпрынт». Оажоўна, гэта ўхідная рашынка з прыватнасцю — справжнія даныя пра спаведамленнікі ніколі не прабываюць у модэле. Модэль отрымае назвы столбцоў, тыпы дадзеных, колькі разных значэнняў ёсць у кожным столбцы, а таксама калькі прыкладоў значэнняў.

    Найцэннейшы трук праблеймера — гэта аўтаматычная выявленне сторонніх ключоў. Ён пазначае столбец як магчымы сторонні ключ, калі яго значэнні пераважна знаходзяцца ў столбцы первачнага ключа ў іншым месца:

    # Simplified FK detection logic from profiler.py
    overlap = col_values & ref_values
    if len(overlap) / len(col_values) >= 0.8:
        fk_candidates.append({
            "source_table": tname,
            "source_column": col,
            "target_table": ref_table,
            "target_column": ref_col,
            "match_pct": round(len(overlap) / len(col_values) * 100, 1),
        })
    

    У набарыянку дадзеных па адміністрацыю кантролю гэта паказвае, што Manager_Employee_ID у таблыце Employees падходзіць да Employee_ID у рэгламенце больш чым 80%, што сведчыць пра самапасягальныя зв’язкі REPORTS_TO. Гэта даёмка надаецца LLM, які не мог узначыць іерархію на адной толькі падзеўцы столбцаў.

    Фаза 2: адкрыцье схемы

    Профіль надаёцца LLM, які можна настроіць між OpenAI GPT-4o, Google Gemini і Groq, пры чым праграма-запрос прызначае яго як галоўнага архітэктара баз дадзеных у фармаце графа.

    Ключовая інжынерная проблема закладзена ў тым, што LLM вырабляюць тэкст у вольнай форме, а базы дадзеных у фармаце графа выкалікаюць строгую структуру. Функцыя with_structured_output() з LangChain сувязвае гэтыя два падходы, прымусваючы мадэль вярнуць апрацаваны об’ект Pydantic:

    # The LLM is coerced to return this exact structure
    class GraphMappingModel(BaseModel):
        nodes: List[NodeMapping]           # What becomes a Node?
        relationships: List[RelationshipMapping]  # What becomes an Edge?
        notes: str                         # LLM's reasoning notes
    class NodeMapping(BaseModel):
        label: str                   # e.g., "Employee"
        source_table: str            # e.g., "Employees"
        primary_key_column: str      # e.g., "Employee_ID"
        properties: List[PropertyMapping]  # All columns to map
    class RelationshipMapping(BaseModel):
        type: str                    # e.g., "HAS_SKILL"
        from_node_label: str         # e.g., "Employee"
        to_node_label: str           # e.g., "Skill"
        from_key_column: str         # FK column in source table
        to_key_column: str           # PK column of target node
        properties: List[PropertyMapping]  # Edge properties
    

    Код GraphMappingModel выступае як контракт для всей сістэмы. Агент шымату вырабатоўвае яго, а механізм прыема дадзеных яго выкарыстоўвае. Калі паўтарна перакананне не ўспэўнае, запыт падаецца знову да LLM, таму ніякі некарэктны шымат не прабіваеся да Neo4j.

    Фаза 3: дынамічны прыем Cypher

    За наявнасці перакананага шымату механізм на месцы піша параметрызаваны код Cypher. Не існуе шаблонаў і выказваў switch для кожнага тыпу ентытаса. Ён чытае карточку супараднавання і стварае запыты MERGE асабліва SET для кожнага тыпу вузла і зв’язку:

    # Dynamically generated Cypher from the mapping — zero hardcoding
    UNWIND $rows AS row
    MERGE (n:Employee {employee_id: row.employee_id})
    SET n.full_name = row.full_name,
        n.designation = row.designation,
        n.date_of_joining = row.date_of_joining,
        n.annual_ctc_lpa = toFloat(row.annual_ctc_lpa)
    

    Паколькі імены схемы, якія вычленае, ўжо ўключаюць імены первічных ключоў, двойнік вікорыстоўвае MERGE, а не CREATE, што робіць працэс ідэмпатным. Выкананне яго тры разы на тых сабе даных дае той самы граф без дублікаў. Ён таксама перакладае тыпы (toInteger(), toFloat()), ператварае NaN на None і прыхоўчвае радкі, у якіх первічны ключ ёсць null.

    Датасэт для дамаў не ёсць простым прыкладам: 151 спавяльнік у 13 взаемна з’ѐеднаных табелях, укладаючы 935 картоць навыкаў, 285 заданняў да праектаў, 107 сертыфікацый, 313 атрыбутаў адгукнень і 453 запісы падготовкі, распакаваных між 10 аддзеламі і 10 глобальнымі філіямі.

    Фаза 4: чат на базе GraphRAG

    Слой чата — гэта не проста перакладач тэксту на Cypher. Гэта машына станоў LangGraph з чатырма вузламі, у якой ўбудована сістэма вярнення пасля адказоў на прычыны бядаў:

    User Question
        ↓
    ┌─────────────┐
    │   Planner   │ → Analyzes intent, extracts entities, maps to schema
    └──────┬──────┘
           ↓
    ┌─────────────┐
    │  CypherGen  │ → Generates Cypher query using schema + few-shot examples
    └──────┬──────┘
           ↓
    ┌─────────────┐     ┌─── Error? ───→ Retry CypherGen (up to 2x)
    │  Executor   │ ────┤
    └──────┬──────┘     └─── Success ──→
           ↓
    ┌──────────────┐
    │ Synthesizer  │ → Formats raw graph data into natural language
    └──────────────┘
    

    Тры якосты робяць яго адаптабельным.

    Інтроспекцыя схемы пад час выканання. Пад запуск агент заўжды берае актуальную схему з Neo4j, якая паказвае, якія тыпы вузлаў і звязкаў існуюць, якія ў яных атрыбуты і як яны з’еднаюцца. Гэтая схема включаецца ў кожны запіт, таму агент ніколі не вырашае сам, што містыць база дадзенаў.

    Самаствораныя прыклады на кансэрце. У багах сістэм GraphRAG прыклады на Cypher задаюцца жорсткаяму коду. У гэтым разе LLM пішае своія прыклады на кансэрце на адной актуальнай схеме і выбраных дадзенах, і яны автаматычна пераз’яўляюцца пасля таго, як новы аплод змяніў схему.

    Перапрыбуткі з урахоўваннем памылак. Калі створэны запіт не выйшаў, паведамленне пра памылку вяртаецца да вузла CypherGen, які паспрабоўвае пацягнуць запіт знову, але не больш чым два разы. Гэта робіць агента ўзнаком стойкім да спецыяльных сінтаксічных проблем.

    Проблемы для корпаратыўных кліентаў

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

    Гнекласнасць прадаўца. Шаблон LLM Factory дазволяе перыходзіць между OpenAI, Gemini і Groq, зменіўшы толькі адну змянную сераўіса:

    # .env: LLM_PROVIDER=gemini | openai | groq
    llm = get_llm()  # Returns the configured ChatModel
    

    Няма змян у кодзе і няма прыкрэплення да паверкара.

    Збірныя даны. Корпаратывныя табліцы ніколі не ў стане чыстоты. Механізм практычнага абрабаткі справляецца з непатрэбным прасвятам, разнымі фарматамі дат, нечаканымі значэннямі NaN і нулявымі первычнымі ключамі, пропускаючы або перакантраваючы проблемныя радкі замест таго, каб зламацца.

    Ад загрузкі да адпаведных рэшэнняў

    Фронт-энд — гэта панель керування Streamlit. Пользоватэль загружае файл Excel або CSV у бокавай панелі і спаглядае, як працюе весь працэс: аналіз, выявленне структуры, практычная абрабатка, а потым ініцыялізацыя агента. Пасля чаго ён проста ведае чат.

    Адзінаковая дэманстрацыя выкорыстоўвае Vis.js для атрыбутавання графа фізычнымі законамі і GSAP для анімацый, якія запускаюцца пад час прасування. Вузлы завантажаюцца пад дэйствам сіл гравітацыі і відштовхування, паэтапна апавярожваючыся. Адклікванне будзь-якага вузла ачынае панель з яго характэрыстыкамі і сувязямі. Сімуляцыйны чат паказвае як адпаведную на адповедзь на прашанне, так і запытку Cypher, створаную для ўзначэння ціяў.

    За межамі кадровага аддзелу

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

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