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

Чатырошаровая архітэктура для агента выконавчых брыфінгаў у Azure

Як агент для прагматычнай обработкі дзеянаў дзеліць працу между Fabric, процедурамі зберагання дадзэнняў SQL, FastAPI ў Azure Functions і Copilot Studio, каб стварыць адповідныя керуючыя дакументы.

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

Крыніцы: **Chief of Staff Executive Briefing Agent: Enterprise-scale layered architecture for automated intelligence generation**

Кожны, хто готавіць керуючага да зустрэчы з кліентам, ведае, насколькі розрасцяныя ў нас первынныя даны. Даны CRM знаходзяцца ў адной сістэме, показнікі доходу — у іншай, інформацыя пра вікорыстоўванне продуктов — у трэцій, а стратэгічную справаку прабывае склadaць вручну з усіх эўх джэрэл. Сервіс для падготовкі краткага апаведамлення „начальніка штабу“ спрамованы самэ працоўна на гэтую задачу: адны чалавек прасіць пра краткае апаведамлення простым языком, а платформа вяртае дакумент, гатовы для керуючага, створаны з фрагментаваных аперацыйных, фінансовых і даных пра вікорыстоўванне AI.

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

Этан дыяжнэк выйшаў з внутранняга праекта з розвіцці ШЫ ў экасыстэме Microsoft, а тверджэння пра яго канцэртнасць і рынкавыя рычагі ёсць творчасцю самых разрабоў, а не рэзультатам незалежных тэстаў. Ён наіболей корыстны для архітэктараў падпрыемстваў, інжынераў ШЫ і кіраўнікаў платформ, якім трэбуюцься дэтэрміністычныя сістэмы ШЫ, якіе аддзеляюць кансалідацыю дадзэнняў, аграгацыю за дапамогою SQL, оркестрацыю без стану і рабочыя працэсы на адносах з корантамі.

Чатырошаровы дыяжнэк

Агент выкарыстоўвае чатырошаровую модэль оркестрацыі, пры чым кожны шар мае адзінаковую функцыю і охопляе кальколькі служб Azure і меж бяспекі:

  • Фундамент: Microsoft Fabric Lakehouse, які кансалідуе дадзэннія пад кераваннем.
  • Дадзэннія: Fabric SQL (хранілішча або тэрмінал SQL), які зберагае процедуры для аперацыйных запытоў і аграгацыі.
  • Сэрвіс: дваржыба для оркестрацыі FastAPI, якая размешчаная ў Azure Functions.
  • Касцовыя можлівасці: робочы працэс на базе Copilot Studio, які выкаанаўляе дыялог і разумее намеры корыстувальніка.
  • Ўсе гэта разам стварае однакітны канал обработкі інформацыі. Даныя адбіраюцца і кармануцца на самай базе, дэтэрміністычна аграгуюцца ў SQL, об’едначуюцца за дапамогою логікі домэна на роўні сэрвіса і ў канцы канцоў адображаюцца праз взаімадзею на праўай мове. Кожны слой практыкуе чыстае супакоўванне з суседнімі слоямі, таму элементы ШЫ дапамагаюць у прынятцы рашэнняў, але не плутаюць іх.

    Слой фундаменту: кармануванне дадзеных па правілах

    Microsoft Fabric выступае як адзінайчы платформа для аналізу даных і ўніверсальны істочнік правды для дакументацыі абліков, фінансавых даных, паказначыкаў выкорыстоўвання і історычных тэндэнцый. Кансэпт прост: хаваць даныя адно раз і вікорыстоўваць іх паўтараючы, тады нічога не будзе дуплікавана между сістэмамі.

    Пайплайн апцэнзуецца ўсё дзень, збіраючы і адналягаючы корпаратывныя даны з Dynamics 365, фінансавых сістэм і зовнішняях API. Графік запуску забезпечвае прыгадныя перыяды апрацоўкі і гарантуе, што кожная выхадная сістэма завершыць свою ўседзённую працу перад пачаткам кансалідацыі. Lakehouse зберагае даныя ў іх первісным фармаце разам з інформацыяй пра ўзрошэнне і стандартамі карыстоўвання, а пасля перабраныя наборы даных пераходзяць у Fabric SQL — швайны слой для оператыўных запытоў, структуры якога налаштаваны для стварэння аповешчэнняў для керавання.

    Слой даных: оператыўны механізм, створаны для доступу праз API

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

    Архітэктура. Fabric SQL Warehouse — гэта рэляцыйны інтэрфейс, які помешчае кожную операцыю з дадзеннямі, relacionаванымі з інформацыяй, унутры процэдураў зберагання. Служба ніколі не выкарыстоўвае табліцы безпасэродзь. Складныя з’ўязкі межаў табліц, значэнне кожной агрэгацыі і бізнес-логіка выконваюцца ў самай базе дадзеных, а не у кодзе прыемлівача, што дапамагае падтрымваць прыемлівы час адпаведзення нават праз вялікі об’ём дадзеных. SQL налаштаваны для операцыйных запітоў, а не для аналітычнага аналізу; дызайн спрамованы на стварэнне дэтэрміністычных з’ўязкаў, якія даюць аднаковыя рэзультаты, на вікорыстанне планаў запітоў, якія можна перызначаць для стабільнай працы, на параметрызаваное выконанне для безпекі і на агрэгацыю, якая лёгкая для тыпавання.

    Філасофія схемы: запіты на першай пазухе. Схема адпраўляецца за шаблонамі запытаў, а не за правіламі нормалізацыі з учбовых падручнікаў. Энтытэт Account ёсць галоўной структурой кластэрування, а дапаможныя таблы аранжаваны так, каб з’еднанні выконваліся эфектыва на адповіднай бізнес-ідэнтыфікаторы, TPID.

         --Accounts Table - Primary Business Entity
    
    CREATE TABLE [aieo].[Accounts] (
    
        [Id] INT IDENTITY(1,1) PRIMARY KEY,
    
        [TPID] BIGINT NOT NULL,
    
        [AccountName] NVARCHAR(255) NOT NULL,
    
        [AccountNumber] NVARCHAR(50),
    
        [SearchTokens] NVARCHAR(500),
    
        [Segment] NVARCHAR(100),
    
        [Industry] NVARCHAR(100),
    
        [ACR_FY25] DECIMAL(15,2),
    
        [RevenueRank] INT,
    
        [CreatedDate] DATETIME2 DEFAULT GETUTCDATE(),
    
        [LastSync] DATETIME2,
    
        [IsActive] BIT DEFAULT 1
    
    );
    
    
    
    CREATE CLUSTERED INDEX IX_Accounts_TPID ON [aieo].[Accounts]([TPID]);
    
    CREATE NONCLUSTERED INDEX IX_Accounts_Name ON [aieo].[Accounts](
    

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

    Дапаможныя табліцы. Некалькі з дапаможных табліцаў паказваюць, як обрабляюцца фінансавыя показнікі, даны пра вжыванне AI і дадзеныя, атрымленае з разных сістэм.

    -- Revenue Table - Historical and Forecast Data
    
    CREATE TABLE [aieo].[Revenue] (
    
        [TPID] BIGINT,
    
        [FiscalYear] NVARCHAR(10),
    
        [RevenueType] NVARCHAR(20),
    
        [Amount] DECIMAL(15,2),
    
        [LastUpdated] DATETIME2
    
    );
    
    CREATE INDEX IX_Revenue_TPID_FY ON [aieo].[Revenue]([TPID], [FiscalYear]);
    

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

    -- AI Usage Table - Product Adoption Metrics
    
    CREATE TABLE [aieo].[AIUsage] (
    
        [TPID] BIGINT,
    
        [ProductCategory] NVARCHAR(50),
    
        [UsageLevel] NVARCHAR(20),
    
        [SeatCount] INT,
    
        [AdoptionRate] DECIMAL(5,2),
    
        [LastUpdated] DATETIME2
    
    );
    
    CREATE INDEX IX_AIUsage_TPID_Product ON [aieo].[AIUsage]([TPID], [ProductCategory]);
    

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

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

    --Account Search Procedure - Revenue-Prioritized Discovery
    
    CREATE OR ALTER PROCEDURE [aieo].[SearchAccounts]
    
        @searchTerm NVARCHAR(255),
    
        @top INT = 5
    
    AS
    
    BEGIN
    
        SET NOCOUNT ON;
    
    
    
        DECLARE @likeTerm NVARCHAR(257) = '%' + REPLACE(REPLACE(@searchTerm, '[', '[[]'), '%', '[%]') + '%'
    
    
    
        SELECT TOP (@top)
    
            a.TPID,
    
            a.AccountName,
    
            a.AccountNumber,
    
            ISNULL(acr.ACR_YTD, 0) as ACR_YTD
    
        FROM [aieo].[Accounts] a
    
        LEFT JOIN [aieo].[ACR] acr ON a.TPID = acr.TPID
    
        WHERE
    
            a.AccountName LIKE @likeTerm
    
            OR CAST(a.TPID AS NVARCHAR) = @searchTerm
    
            OR a.AccountNumber LIKE @likeTerm
    
        ORDER BY
    
            ISNULL(acr.ACR_YTD, 0) DESC,
    
            a.AccountName ASC
    
        FOR JSON PATH;
    
    END;
    
    --Account Details Retrieval Procedure - Comprehensive Intelligence Aggregation
    
    CREATE PROCEDURE [aieo].[GetAccountDetails]
    
    (@TPID int)
    
    AS
    
    BEGIN
    
        SET NOCOUNT ON;
    
        SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    
    
    
        SELECT TOP 1
    
            JSON_QUERY(ap.[AccountProfile]) AS [Account],
    
            JSON_QUERY(ai.[AIUsage]) AS [AI],
    
            JSON_QUERY(acr.[Data]) AS [ACR],
    
            deal.[Deals.AgreementValue],
    
            deal.[Deals.DealType],
    
            deal.[Deals.Term],
    
            deal.[Deals.Remaining],
    
            deal.[Deals.EndDate],
    
            ecif.[ECIF.Committed],
    
            aco.[ACO.IncrementalRevenue],
    
            aco.[ACO.Discount],
    
            aco.[ACO.ACO],
    
            JSON_QUERY(bot.[Data]) AS [BoT],
    
            JSON_QUERY(inv.[Data]) AS [Investments],
    
            JSON_QUERY(rev.[Data]) AS [Revenue]
    
        FROM [dbo].[vw_Customer] P
    
        OUTER APPLY (
    
            SELECT TOP 1
    
                a.[TPID],
    
                a.[CRMAccountName] AS [AccountName],
    
                a.[Segment],
    
                a.[Industry],
    
                a.[EOU],
    
                a.[OU],
    
                LOWER(TRIM(c.[Value])) AS [ATU_Manager.Alias],
    
                aau.[Mail] AS [ATU_Manager.Email],
    
                [dbo].[RemoveJobTitle](aau.[DisplayName]) AS [ATU_Manager.DisplayName],
    
                NULLIF(TRIM(aau.[BusinessPhone]), '') AS [ATU_Manager.PhoneNumber],
    
                JSON_QUERY([am].[Data]) AS [AM],
    
                JSON_QUERY([atum].[Data]) AS [ATUM]
    
            FROM [dbo].[vw_Customer] A
    
            OUTER APPLY STRING_SPLIT(a.[AM], ',', 1) C
    
            LEFT JOIN [cm].[vw_AAD_User] AAU ON LOWER(TRIM(C.[Value])) = LOWER(AAU.[UserPrincipalName])
    
            WHERE A.TPID = P.TPID
    
        ) ap
    
        WHERE P.TPID = @TPID;
    
    END;
    
    --Template Management Procedure - Role-Based Access Control
    
    CREATE OR ALTER PROCEDURE [aieo].[GetBriefingTemplate]
    
    (
    
        @UserAlias NVARCHAR(200),
    
        @BriefingType NVARCHAR(200)
    
    )
    
    AS
    
    BEGIN
    
        SET @UserAlias = IIF(CHARINDEX('@', @UserAlias) > 0,
    
                            LEFT(@UserAlias, CHARINDEX('@', @UserAlias) - 1),
    
                            @UserAlias)
    
    
    
        SELECT DISTINCT
    
            [BriefingTemplateId],[TemplateDescription],[BriefingType],
    
            [UserAlias],FullName,[Filename],[FileType],[PreviewFilename]
    
        FROM [hr].[DimPerson] p
    
        INNER JOIN [aieo].[ExecutiveOfficeMember] eom ON eom.[PersonnelNumber] = p.[PersonnelNumber]
    
        INNER JOIN [aieo].[ExecutiveOffice] o ON o.[ExecutiveOfficeId] = eom.[ExecutiveOfficeId]
    
        INNER JOIN [aieo].[BriefingTemplate] bt ON bt.[ExecutiveOfficeId] = o.[ExecutiveOfficeId]
    
    
    
        UNION
    
    
    
        SELECT DISTINCT
    
            [BriefingTemplateId],[TemplateDescription],[BriefingType],
    
            p.EmailName As UserAlias,p.FullName,[Filename],[FileType],[PreviewFilename]
    
        FROM [aieo].[BriefingTemplate] bt
    
        CROSS JOIN [hr].[DimPerson] p
    
        WHERE bt.[UserAlias] = 'ALL' AND p.EmailName = @UserAlias
    
            AND bt.BriefingType = @BriefingType;
    
    END;
    

    Эфектывнасць і безпека. Для падышча эфектывнасці транзакцыі выкарыстоўваюць SET NOCOUNT ON, а для операцый чытання — SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, ўбачліва, каб яны не блакавалі іншыя операцыі. Работа з JSON адбываецца за дапамою вбудованых функцый SQL Server — JSON_QUERY і FOR JSON PATH, які эфектыва обрабоцваюць даны і серыязуюць іх безпосерэдна з базы дадзеных. Дазволена толькі параметрызаваная експансія, а ідэнтычнасць службы прыкладнага програма павінна мець права на выкарыстоўванне запісанных процедураў, без прымальнага доступу да табелей.

    GRANT EXECUTE ON SCHEMA::[aieo] TO [service_identity];
     - No direct table access permitted
    

    Слой служб: оркестрацыя без стану і межы выканання

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

    API і перакананне дадзеных. Аплікацыя FastAPI адкрывае чытрымы REST-канцэнты з строго тыпаванымі контрактамі, заданымі як мадэлі Pydantic:

    • POST /api/briefing/generate — галоўны канцэнт для стварэння інформацыі, з повным перакананнем вхідных дадзеных.
    • GET /api/health — аддае інформацыю пра статус сістэмы.
    • GET /api/templates — паказвае шаблоны, доступныя для вікорыстання корыстнікам.
    from pydantic import BaseModel
    from typing import Optional
    class BriefingRequest(BaseModel):
    account_name_or_tpid: str
    meeting_datetime: Optional[str] = None
    meeting_objective: Optional[str] = None
    ms_attendees: Optional[str] = None
    template_type: Optional[str] = None
    

    Модэль аплікуюць строгую пераканальванне і безпеку тыпаў, автаматычна стварае дакументацыю OpenAPI і выправляе фармат кожнага запіту. Жадныя неструктураваныя даны не можаць працягнуцца за межы гэтага рубіка.

    Модэль выканання. Сервіс адрабатвае пяцькрокавую последовальнасць з дэтэрміністычным падходам:

    1. Пераканальванне запіту. Модэлі Pydantic пераканаюцца, што тыпы і даны ўсунутыя.
    2. Расшукаванне аблікавання. Фармат уводных дадзеных вялікае рашынку, чы хаця б працаваць безпосерэдна з TPID, чы выклікаць SearchAccounts для расшукавання па імені.
    3. Адночасны запрашэнне. Функцыі GetAccountDetails і GetBriefingTemplate выкананыя адночасна за дапамою asyncio.gather().
    4. Складанне кантэксту. Раследы процедур безпосерэдна перакладваюцца у об’екты, гатовыя для вікорыстання ў шаблонах, без жаднай проміжной апрацоўкі.
  • Адрабатаванне шаблона. Jinja2 ствараяе выконавальны документ з дэтэрміністычным фарматаваннем.
  • Асінхронная выкананне і кэшаванне з’яўленняў праз абстракцыю DatabaseService значае, што ідэнтычныя вхідныя даны даюць ідэнтычныя выходныя рэзультаты.

    Няваныя прынцыпы. Слой абслюйнацый керуецца пяцьма правіламі. У ям немае логікі бізнесу, адколькі інтэлігэнцыя ствараецца толькі ўнутрь збераганых процедурах, што захоўвае слой абслюйнацый ад правіл, якія ускладнююць тэставанне і адтрымкі. Ён займаецца чыстаю оркестрацыяй дадзеных, коордынуючы ўтрымканне і адображэнне без якіх-леба трансфармацый чы расчыткаў. Картаванне кантэксту адбываецца безпосерэдзя, таму рэзультаты процедураў прабіваюць у структуры шаблонаў без зворотнага пуці, чым зменшаеца рызык сутнасовага адхілення межу дадзенымі і ўпрадасткаваннем. Працэс выкарыстоўваецца дэтэрміністычна, даўаючы той самы выхад для таго ж уводу, незалежна ад часу чы стану інфраструктуры. А задачы застаюцца чыста аддзеленыя: логіка дадзеных знаходзіцца ў SQL-процедурах, оркестрацыя — у службах Python FastAPI, а ўпрадасткаванне — у шаблонах Jinja2.

    Слой досвіду: Copilot Studio як дварг для размов

    У верхней часты фрэймворк AdaptiveDialog у Microsoft Copilot Studio ператварае запіт на натуральнай мове на дэтэрміністычны рабочы працэс. Ён караце за рашыраннем аднакоўкі, автарызацыяй шаблонаў, інтэграцыяй зовнішніх дадзеных, стварэннем дакументаў і ўсуненнем іх праз разныя каналы. Працэс выконваецца па спадчыннай схеме: ад першага запіту праз рашыраннем аднакоўкі, автарызацыю шаблонаў, збіранне зовнішніх дадзеных і ўсуненне іх у SharePoint, пры чым на кожным этапе размовы ёсць рашынкі і крокі па верыфікацыі.

    Асновная размова. Размова автаматычна збірае ідэнтыфікатор аднакоўкі, вызначае фразы-трыгеры, якія пачынаюць інформаванне, і задае главную точку входу ў размову:

    kind: AdaptiveDialog
    
    inputs:
    
      - kind: AutomaticTaskInput
    
        propertyName: Account_Name_or_TPID
    
        name: Account Name or TPID
    
        description: The account/customer TPID (unique identifier) or name
    
        shouldPromptUser: true
    
    
    
    modelDescription: Create briefing document to prepare for meeting with customer
    
    beginDialog:
    
      kind: OnRecognizedIntent
    
      intent:
    
        displayName: Topic for creating briefing document to prepare for meeting with customer
    
        triggerQueries:
    
          - Generate a briefing document for account Accenture
    
          - I need a briefing for Amazon
    
          - Create briefing for Apple
    
          - I have a meeting with JPMorgan Chase at 4PM
    

    Рашыранне праблемы з рахункам. Апэл IsNumeric() класіфікуе вхідны дадзеныя як або безпосерэдній TPID, або назву рахунку, якая трэба шукань. Калі толькі можна, адхоўканне пошуку зменшае колькасць вызоў API і прыя়шчае час адпаведзі:

    - kind: SetVariable
    
      id: setVariable_IsNumeric
    
      variable: Topic.IsNumeric
    
      value: =IsNumeric(Topic.UserInput)
    
    
    
    - kind: ConditionGroup
    
      id: conditionGroup_InputType
    
      conditions:
    
        - id: condition_IsTPID
    
          condition: =Topic.IsNumeric
    
          actions:
    
            - kind: SetVariable
    
              variable: Topic.Account_TPID
    
              value: =Topic.UserInput
    

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

    - kind: HttpRequestAction
    
      id: httpRequest_SearchAccounts
    
      displayName: Search Accounts by Name
    
      url: =Global.ApiBaseUrl & "/api/mssales/search/" & EncodeUrl(Topic.UserInput)
    
      headers:
    
        Ocp-Apim-Subscription-Key: =Global.ApiKey
    
      response: Topic.SearchResults
    
      responseSchema:
    
        kind: Record
    
        properties:
    
          accounts:
    
            type:
    
              kind: Table
    
              properties:
    
                account_name: String
    
                tpid: String
    
          total_count: Number
    

    Карточка дэсканібігуацыі. Калі пад час пошуку знаходзіцца кальколька абанаў, Адаптываная карточка паказвае дынамічны набор выбора, створаны за дапамою ForAll() з рэзультатаў, пры чым кожны элемент паказвае свой TPID. Таму неясны вхідны даныя не спакоюе размову:

    - kind: AdaptiveCardPrompt
    
      id: adaptiveCard_SelectAccount
    
      card: "=Concatenate('{
    
        \"$schema\":\"https://adaptivecards.io/schemas/adaptive-card.json\",
    
        \"type\":\"AdaptiveCard\",\"version\":\"1.5\",
    
        \"body\":[
    
          {\"type\":\"TextBlock\",\"text\":\"Multiple accounts found\",\"weight\":\"Bolder\"},
    
          {\"type\":\"Input.ChoiceSet\",\"id\":\"selectedAccount\",\"isRequired\":true,
    
           \"choices\":',
    
           JSON(ForAll(Topic.SearchResults.accounts,
    
             {title: Concatenate(account_name, \" (TPID: \", tpid, \")\"), value: tpid})),
    
           '}],
    
        \"actions\":[{\"type\":\"Action.Submit\",\"title\":\"Continue\"}]
    
      }')"
    

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

    - kind: HttpRequestAction
    
      id: httpRequest_GetUserTemplates
    
      url: =Global.ApiBaseUrl & "/api/briefings/templates?user_alias=" &
    
           EncodeUrl(System.User.PrincipalName) & "&briefing_type=Customer"
    
      headers:
    
        Ocp-Apim-Subscription-Key: =Global.ApiKey
    
      response: Topic.UserTemplates
    

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

    - kind: AdaptiveCardPrompt
    
      id: adaptiveCard_MeetingDetails
    
      card: "=Concatenate('{
    
        \"$schema\":\"https://adaptivecards.io/schemas/adaptive-card.json\",
    
        \"type\":\"AdaptiveCard\",\"version\":\"1.5\",
    
        \"body\":[
    
          {\"type\":\"TextBlock\",\"text\":\"Create Executive Briefing Document\",
    
           \"weight\":\"Bolder\",\"size\":\"Large\",\"color\":\"Accent\"},
    
          {\"type\":\"Input.Date\",\"id\":\"meetingDate\",\"isRequired\":true,
    
           \"label\":\"Meeting Date\"},
    
          {\"type\":\"Input.Time\",\"id\":\"meetingTime\",\"value\":\"09:00\"},
    
          {\"type\":\"Input.Text\",\"id\":\"msAttendees\",\"isVisible\":false,
    
           \"label\":\"Microsoft Attendees\"}
    
        ],
    
        \"actions\":[
    
          {\"type\":\"Action.ToggleVisibility\",\"title\":\"Additional Options ▼\",
    
           \"targetElements\":[\"msAttendees\"]},
    
          {\"type\":\"Action.Submit\",\"title\":\"Generate Briefing\"}
    
        ]
    
      }')"
    

    Адміністрацыя паралельных запускаў збору дадзейнасці і стварэння дакументаў. Слой з адпаведным досвідам адразу вызывае API Account Details і Azure AI Foundry, пры чым кожны з яных мае таймаут у 60 секунд. Пасля таго, як оба даюць адказ, ён стварае адны структураваны JSON-пакет з усіх джэрэл і перадае яго API для стварэння дакументаў, пры чым праверкі і складанне застаюцца самостойнымі, таму ўтварэнне інформацыйныя дакументаў вадзіцца па практычна незменным алгорытму.

    Azure AI Foundry: організацыйная інтэлігенція

    Інтэграцыя з Foundry расшырвае можлівасці агента за межы зовнішняй рыночной дадзейнасці, уключаючы кантэкст з внутраніх частак арганізацыі, за дапамогою компонента "M365 Researcher". Ён выкарыстоўвае дэлегаваны доступ да Microsoft Graph для пошуку пісьмаў у Outlook і кантактаў у Teams, пры чым застаецца ў межах абаронных прыемоў падпрыёмства і прынцыпаў нулявага дазволу.

    Даступ даўжынай у Graph без збераганых секрэтных дадзенняў. Дзеярнік выкарыстоўвае механізм аутэнтыфікацыі даўжынай, які цэлым чынам адмаўляе збераганне секрэтных дадзенняў кліента. Для гэтага выкарыстоўваюцца канектары, якімі керуе Azure Logic Apps — аплікацыі Microsoft, якія маюць узгоджаныя дапускі даўжынай. Чыгунам гэта пазбавляе ад неабходнасці керування рэгістрацыямі аплікацый, калі Azure сама керуе жыццёвым цыклам токенаў і ўпрацоўкай іх автаматычнага аднаавлення.

    Кроме таго, Logic Apps з короткім тымчасовым перыодам выкарыстоўваюць HTTP-трыгеры, захішчаныя сэртыфікатамі SAS, для забезпечэння даступу да дадзенняў карыстальніка. Кожны пошук стварае новы экземпляр Logic App, паралельна запрашвае дадзеныя з Microsoft Graph і негайна ўдалае гэты экземпляр, таму URL з SAS не можа быць выкарыстоўваны па-нова, а жадных стойкіх токенаў не застаецца.

    // Ephemeral Logic App Security Pattern
    const createSearchLogicApp = async (userAlias, searchQuery) => {
    const logicAppName = `Researcher-${userAlias}`;
    // Create Logic App with SAS trigger
    const logicApp = await armClient.logicApps.createOrUpdate({
    resourceGroupName: 'Azure_OpenAI',
    workflowName: logicAppName,
    definition: buildResearchWorkflow(userAlias)
    });
    // Execute search via SAS URL
    const searchResults = await triggerLogicApp(logicApp.triggerUrl, searchQuery);
    // Immediate cleanup for security
    await armClient.logicApps.delete(logicAppName);
    return searchResults;
    };
    

    Паралельныя запыткі і налагоджэнне Graph. Даныя з электроннай пошты і Teams саўтэруюцца адразу, пры чым існуюць ліміты паралельнай працы, каб сесіі большага чысла выкарыстоўначаў не спрычынілі змены швайнасці. Для пошты канектар Office 365 адбірае па 250 найсвежэйшых паведамленняў на выкарыстоўніка, а фільтрацыя выканана на кліянцы, ў тым ліку, каб адчыніць можлівасць пошуку ў тэле паведамленняў, не перакрываючы ліміты Graph. Для Teams выкарыстоўваецца дваэтапны падход: спачатку за дапамогою сторанічных запыткаў выканана аднаходжэнне чатоў, а пасля — адбіранне паведамленняў з адзінаковых чатоў з можлівасцю налаштавання ліміту паралельнай працы.

    # Logic App Parallel Execute Pattern
    
    HTTP_Trigger_SAS_Secured:
    
      Email_Branch:
    
        - Get_Emails: Office365_Connector.Mail (top=250)
    
    
    
      Teams_Branch_Parallel:
    
        - Get_Teams_Chats_Page1: Teams_Connector.Chats (top=50)
    
        - Get_Teams_Chats_Page2: Teams_Connector.Chats (skip=50, top=50)
    
        - For_Each_Chat:
    
            concurrency: 10
    
            actions:
    
              - Get_Chat_Messages: Teams_Connector.Messages (top=50)
    
              - Append_Chat_Data: Variable_Accumulation
    
    
    
      Response_Assembly:
    
        - Combine: Email_Results + Teams_Results + Metadata
    
        - Return: JSON_Structured_Response
    

    Тыповая парадокс выконвае або 101 вызов Graph API: адзін для перадачы пашт, два для перэліку чатоў у Teams і ў сярэднем 98 вызоў для запрашання паведамленняў у чатах. Гэта дазволяе атрымаць вельмі большы об’ём дадзэнняў, застаючыся ў межах лімітаванняў одночасных запрашанняў Graph, а таксама, згідна з прыметам дызайну, падтрымаць час адпаведзі ў межах 60 секунд.

    Поеднані корыстувацькі з’язкі і токені. Кожэн корыстувач потрэбуе два керовані з’язкі, які зберыгаюць дэлеговані токені OAuth на працягу усяго часу пошуковіх сеантыв: office365-{alias} для пошты з скопом Mail.ReadWrite і teams-{alias} для чату з скопом Chat.Read. Інфраструктура Azure автоматычно оновлюе токені і підтрымуе відповівкісць правілам. Налаштування відбуваецца за допомогою API Azure Resource Manager праз керовану ідэнтыфікацію, тому жодні кліентські даныя не зберэгаюцца у роевому шары додатку.

    // Per-User Connection Provisioning
    
    const provisionUserConnections = async (userAlias) => {
    
        const connections = [
    
            {
    
                name: `office365-${userAlias}`,
    
                api: '/providers/Microsoft.PowerApps/apis/shared_office365',
    
                scopes: ['Mail.ReadWrite']
    
            },
    
            {
    
                name: `teams-${userAlias}`,
    
                api: '/providers/Microsoft.PowerApps/apis/shared_teams',
    
                scopes: ['Chat.Read']
    
            }
    
        ];
    
    
    
        for (const conn of connections) {
    
            await armClient.connections.createOrUpdate({
    
                resourceGroupName: 'Azure_OpenAI',
    
                connectionName: conn.name,
    
                properties: {
    
                    displayName: conn.name,
    
                    api: { id: conn.api },
    
                    parameterValues: {}
    
                }
    
            });
    
        }
    
    
    
        return generateConsentUrls(connections);
    
    };
    

    Сінтэз за дапамою мадэлі GPT. Необработаныя кантэксты ператвараюцца ў інформацыю, готовую да вікорытання для аналізу, за дапамою мадэлі з Azure OpenAI Service (якая апісваецца як GPT-4.1, хоча у прыкладным кодзе згадваецца версія GPT-4 preview). Гэты працэс ператварае фільтраваныя пісьмы і контэнт Teams у структураваныя даны, якія включаюць аналіз заўсёдніх, шаблоны кантактаў і дзеянні, значныя для зустрэчы. Запіты спрамованы на задачы керуючага персоналу, такія як аналіз стосункоў, статус праекта і стратэгічныя тэмы, а мадэль вяртае структураваны JSON-файл, які можа быць вставлены ў існуючыя шаблоны Jinja2 з аднаковым фарматаванням у всіх дасягах.

    # Organizational Intelligence Synthesis
    
    async def synthesize_organizational_context(filtered_data, account_context):
    
        synthesis_prompt = """
    
        Analyze the following organizational communications for executive briefing preparation:
    
    
    
        Account Context: {account_name}
    
        Email Communications: {email_count} relevant messages
    
        Teams Discussions: {chat_count} relevant conversations
    
        Generate executive intelligence focusing on:
        Financial performance, earnings trends, and capital allocation signals.
        Corporate strategy, market positioning, and competitive landscape.
        AI strategy, digital transformation initiatives, and cloud ecosystem alignment.
        Recent material developments (≤ 90 days) with actionable insights for executive engagement.
    
        Format as structured JSON with executive_summary, stakeholder_analysis, recent_activities, and recommended_actions.
    
        """
    
    
    
        response = await azure_openai_client.chat.completions.create(
    
            model="gpt-4-1106-preview",
    
            messages=[{
    
                "role": "system",
    
                "content": "You are an executive intelligence analyst."
    
            }, {
    
                "role": "user",
    
                "content": synthesis_prompt.format(**filtered_data, **account_context)
    
            }],
    
            temperature=0.1,
    
            max_tokens=2000
    
        )
    
    
    
        return parse_structured_intelligence(response.choices[0].message.content)
    

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

    # Enhanced Copilot Studio Parallel Execution
    
    - kind: ParallelExecution
    
      id: parallelExecution_ComprehensiveIntelligence
    
      branches:
    
        - account_data:
    
            kind: HttpRequestAction
    
            url: =Global.ApiBaseUrl & "/api/accounts/" & Topic.Account_TPID
    
        - organizational_intelligence:
    
            kind: HttpRequestAction
    
            url: =Global.ApiBaseUrl & "/api/search?q=" & EncodeUrl(Topic.Account_Name) & "&alias=" & System.User.PrincipalName
    
            requestTimeoutInMilliseconds: 60000
    
            continueOnError: true
    
        - market_intelligence:
    
            kind: HttpRequestAction
    
            url: =Global.FoundryBaseUrl & "/bingnews/api/AgentFunction"
    
    
    
    - kind: SetVariable
    
      id: setVariable_CombinedIntelligence
    
      variable: Topic.BriefingContext
    
      value: ={
    
        account_details: Topic.AccountData,
    
        organizational_context: Topic.OrganizationalIntelligence,
    
        market_insights: Topic.MarketIntelligence
    
      }
    

    Управлець і супакоўка. За дапамогою дэлегаваных правыяўдзеў корыстувачы можа шукаць толькі свой сабэй і паведамленні ў Teams, што запобегае доступу з боку іншых корыстувачаў і падтрымляе строгі контроль над данымі. Кожны вызов Graph API фіксуецца з інформацыяй пра корыстувача, параметрамі пошуку і метаданамі рэзультатаў. Час зберагчання даных можна налаштаваць, а з’ўязкі, якія не выкарыстоўваюцца прыблізна 80 дней, автаматычна адчысляюцца. Апрацоўка даных вядзецца ў межах тэнанта Azure, а механізмы контролю прыбывашча даных падтрымляюць правілы управлець організацыі.

    // Enterprise Governance and Cleanup
    
    const implementGovernanceControls = async () => {
    
        // Automated stale connection cleanup
    
        const staleThreshold = 80; // days
    
        const allConnections = await listManagedConnections();
    
    
    
        const staleConnections = allConnections.filter(connection => {
    
            const lastUsed = parseISO(connection.properties.lastConnection);
    
            const daysSinceUse = differenceInDays(new Date(), lastUsed);
    
            return daysSinceUse > staleThreshold;
    
        });
    
    
    
        // Compliance audit logging
    
        for (const connection of staleConnections) {
    
            await auditLogger.log({
    
                action: 'CONNECTION_CLEANUP',
    
                userAlias: connection.userAlias,
    
                reason: 'AUTOMATED_GOVERNANCE',
    
                retentionPolicy: `${staleThreshold}_DAYS_INACTIVE`,
    
                timestamp: new Date().toISOString()
    
            });
    
    
    
            await deleteUserResources(connection.userAlias);
    
        }
    
    };
    

    Эфектывнасць і стойкасць да адказоў. Сістэма кешуе статус з’яўлення корыстніка і пераканальваецца ў стане з’яўлення пры выконванні дорогіх операцый Graph. Калі доступ да Graph обмежаны або на час недоступны, сістэма гракцязна пераходзіць на альтэрнатыўны спосаб выканання, вікорыстоўваючы экспанэнцыйны метод паўтарных спроб для тымчасовых адказоў і строгія ліміты часу, каб генераванне аналіза не затрымвалася. Калі пошук у арганізацыі не вдалося або выйшла за час, аналіз все рава падае разам з данымі аблікова і зовнішняю інформацыяй пра рынак, тады керавальнікі магуць атрымваць адносова стабільны досвід незалежна ад таго, чым доступны Microsoft 365.

    // Fault-Tolerant Execution Pattern
    
    const executeOrganizationalIntelligence = async (searchQuery, userAlias) => {
    
        const executionTimeout = 60000; // 60 second maximum
    
        const fallbackResponse = { summary: "Organizational context unavailable", status: "fallback" };
    
    
    
        try {
    
            // Health check before expensive operations
    
            const connectionsHealthy = await verifyConnectionHealth(userAlias);
    
            if (!connectionsHealthy) {
    
                return fallbackResponse;
    
            }
    
    
    
            // Execute with timeout boundary
    
            const intelligencePromise = gatherOrganizationalIntelligence(searchQuery, userAlias);
    
            const timeoutPromise = new Promise((_, reject) =>
    
                setTimeout(() => reject(new Error('TIMEOUT')), executionTimeout)
    
            );
    
    
    
            return await Promise.race([intelligencePromise, timeoutPromise]);
    
    
    
        } catch (error) {
    
            // Graceful degradation logging
    
            await logger.warn(`M365 Researcher fallback: ${error.message}`, {
    
                userAlias,
    
                searchQuery,
    
                fallbackMode: true
    
            });
    
    
    
            return fallbackResponse;
    
        }
    
    };
    

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

    Выклік для стварэння дакумента. У гэтым кроку ствараецца заканчоўны аналіз, які з’едыняе ўсё, што было скарыстана пад час размовы, у адну пакетную інформацыю для слоя сервіса. У ёй знаходзіцца кантэкст карыстальніка, дэталі зустрэчы і неабяжныя даныя вантарожнейх ШЫ, пры чым для завершэння всіго працэса стварэння дакумента встановлена 60-секундная таймаут-вымога:

    - kind: HttpRequestAction
    
      id: p4tceX
    
      method: Post
    
      url: =Global.ApiBaseUrl & "/api/briefings/" & Topic.templateId & "/accounts/" & Topic.Account_TPID
    
      body:
    
        kind: JsonRequestContent
    
        content: "={
    
          user_alias: Topic.SenderEmail,
    
          MeetingDateTime: Topic.MeetingDateTime,
    
          msAttendees: Topic.msAttendees,
    
          FoundryResponse: Topic.FoundryResponse
    
        }"
    
      requestTimeoutInMilliseconds: 60000
    
      response: Topic.BriefingDocument
    

    Дастынак у SharePoint. Усе створаныя дасведчыкі прабраўляюцца ў цэнтральны хранілыш праз канектар SharePoint Power Platform з кераваным аўтэнтыфікацыяй, таму кожны дасведчык застаецца і ёсць доступны незалежна ад таго, які вядомы дастынак будзе выкарыстоўвацца, што задовольняе трэбаванні ў сферы керування. Цэльны сайт і папка ў прыкладзе ніжэй являюцца месца для замены.

    - kind: InvokeConnectorAction
    
      id: invokeConnectorAction_YKkMK4
    
      input:
    
        binding:
    
          dataset: https://microsoft.sharepoint.com/teams/MCAPSAIIncubationHub
    
          folderPath: /Shared Documents/General/AI Prototypes & Solutions/AI Executive Office Use Cases/Published Cust Template/
    
          name: =Topic.CustomFilename
    
          file: =Global.File
    

    Назвы файлаў ствараюцца так, каб былі чытальныя, спалучаючы назву абліку, ідэнтыфікатор керавання і дату зустрэчы. Функцыя Substitute() робіць іх безпечнымі для файловай сістэмы і падтрымлеўчы ўніверсальнасць назв у всіх працэсах керавання:

    - kind: SetVariable
    
      id: setVariable_CustomFilename
    
      variable: Topic.CustomFilename
    
      value: =Concatenate(
    
        Substitute(Topic.Account_Name, " ", "_"), "_",
    
        Topic.ExecutiveName, "_Brief_",
    
        Text(Topic.meetingDate, "yyyy-MM-dd"), ".docx"
    
      )
    

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

    - kind: ConditionGroup
    
      id: conditionGroup_CheckBriefingError
    
      conditions:
    
        - condition: =!IsBlank(Topic.BriefingDocument.error) && Topic.BriefingDocument.error.error_code = "TEMPLATE_ACCESS_DENIED"
    
          actions:
    
            - kind: AdaptiveCardPrompt
    
              card: ={
    
                "$schema":"https://adaptivecards.io/schemas/adaptive-card.json",
    
                "type":"AdaptiveCard","version":"1.5",
    
                "body":[{
    
                  "type":"Container","style":"warning",
    
                  "items":[{
    
                    "type":"TextBlock","text":"Template Access Required",
    
                    "weight":"Bolder","color":"Attention"
    
                  },{
    
                    "type":"TextBlock","wrap":true,
    
                    "text": Topic.BriefingDocument.error.user_message
    
                  }]
    
                }]
    
              }
    

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

    - kind: ConditionGroup
    
      id: conditionGroup_ValidateInputs
    
      conditions:
    
        - condition: =Topic.meetingDate < Today()
    
          actions:
    
            - kind: SendActivity
    
              activity: The meeting date cannot be in the past. Please start over and enter a future date.
    
            - kind: EndConversation
    

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

    - kind: SetVariable
    
      id: setVariable_ClearUserInput
    
      variable: Topic.UserInput
    
      value: =Blank()
    
    
    
    - kind: SetVariable
    
      id: setVariable_ClearAccountDetails
    
      variable: Topic.AccountDetails
    
      value: =Blank()
    
    
    
    - kind: SetVariable
    
      id: setVariable_ClearFoundryResponse
    
      variable: Topic.FoundryResponse
    
      value: =Blank()
    
    
    
    - kind: SetVariable
    
      id: setVariable_ClearBriefingDocument
    
      variable: Topic.BriefingDocument
    
      value: =Blank()
    

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

    Безпека і дэталі рэалізацыі

    Федэраваная ідэнтычнасць і аўтэнтыфікацыя

    Сістэма выкорыстоўвае крэдытнасці федэраванай ідэнтычнасці Azure, таму ніякіх секрэтных дадзеных не зберагаецца, і ўсюды адбываецца еднаковая рэгістрацыя. Выбірач крэдытнасцей выканаўляе перакананне, дзе запускаецца код, і выбірае адпаведны механізм:

    # Environment-aware authentication pattern
    
    def get_credential():
    
        if is_azure_environment():
    
            return ManagedIdentityCredential(client_id=os.getenv('AZURE_CLIENT_ID'))
    
        else:
    
            return AzureCliCredential()
    

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

    Структура службы і кераванне залежнасцямі

    Слой службы спакоюецца на методзе впрыску залежнасцяў, які дазволяе таму ж коду працаваць з макетамі пад час тэстаў і цалком настроенымі экземплярамі ў працэсе вырабніцтва. Багатасферныя прыбліжэння, такія як кераванне адказамі на падазры і кераванне конфігурацыяй, дзеліцца між усімі компанентамі службы, пры чым кожны з іх (SharePoint, база дадзенаў, Power BI) прыймае неабавязковыя залежнасці праз свой канстрактар, заставаючыся адночасна слабка сувязаным з зовнішнімі API і рэсурсамі Azure. Гэта дапамагае адбываць рэшытныя тэсты з вікорыстаннем макетных рэалізацый, а таксама забезпечвае надзеяныю працэсу вырабніцтва за дапамогою належной абстракцыі.

    Архітэктура працюе асынхронна, ўбачліва для максымальнага выкарыстання паралельнага збору дадзэйна. Калі ствараецца інформацыйны апдэт, калькулююцься даны з колькіх джэроў за дапамойкай асынхронных методаў async/await і рэтэльнага карыстоўвання механізмаў апрацоўкі абэктаў, тады сістэма спакойна працюе нават калі адны з джэроў не функцыонуе.

    З’язкі з базай маўлявіння і ўрабочыя характэрыстыкі

    У роўні базай маўлявіння выкарыстоўваецца пулінг з’язкоў праз механізм карыстоўвання двыжка SQLAlchemy, пры чым дапускаецца выкарыстоўвання патэрна singleton для эфектываў выкарыстоўвання рэсурсаў. Запыты агрупаваны ў запісваныя працэдуры, якія зберагаюць бізнес-логіку ў самай базе маўлявіння, што зменшае трафік у сетцы і спроствае код прыемленае. Большыя наборы рэзультатаў обрабляюцца праз розумнае перзначэнне фармата JSON, чым усунуліся абмежэння бібліятэкі pyodbc па велікіх рэспонсах, тады працэс застаецца надзейны незалежна ад розмеру рэзультатаў, а выкарыстоўванне памяці застаецца разумным.

    Інтэграцыя з зовнішнімі сервісамі

    Інтэграція з SharePoint і Microsoft Graph ефектывно кешуе властывосты, шчоб зменшыты колькасць вікліків API і підтрымуваты актуальнісць даных. ID сайтыв і папок кешуюцца з належною логікою скасування і дынамічнім вібором бібліятэк, што забезпечуе надыйні завантажэння. Інтэграція з Dynamics 365 апрацоўвае адказы Search v2.0 і перэтворуе первінні рэзультаты на структуры, зрозумілі для бізнесу, вікорыстовуючы логіку повторніх спроб для подолання обмежэнь швідкосты і рэтэльне керування помілкамі.

    Створэння дакументаў

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

    Бягу прыбуткаў і асаблівасці

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

    Structured exception hierarchy
    
    class AIExecutiveOfficeError(Exception):
    
        def __init__(self, message: str, error_code: str = None, details: dict = None):
    
            self.message = message
    
            self.error_code = error_code or self.__class__.__name__
    
            self.details = details or {}
    
            self.timestamp = datetime.utcnow()
    

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

    Ацэнка і перакананне якосці

    Сістэма ацэнюецца за дапамогою структураванага карэткі тэставання, які пераканваецца ў тэхнічной выдатнасці і якосці інформацыі ў разных падпрыемственых акаунтах. Квантыўныя і калітатывныя методы сумешчаюцца ў працэсе ацэнкі, які тэстуе кожны архітэктурны компанент пакетам.

    У кантыятыўнай частцы акцэнт ставіцца на тачнасць дадзеных. Паказнікі ў готавыях шаблонах абшуранняў паўнаважна перапылваныя з адпаведнымі дадзеннямі з базовага шару, і сістэма вычыляе балы тачнасці і сярэжны абсалютны пацэнтажны блакан (MAPE). Яны паказваюць, насколькі аддаўна слой сервіса перадае дадзеныя праз увесь працэс, ад рэзультатаў запісаных працэсаў да фінальнага дакумента. Адзінаврэменныя запускі абрабатваюць многа рачункаў і ствараюць агрэгаваныя справаздачы пра выконанне, якія ўжо статыстычна падтверджваюць, што дызайн на адной основе параджыць сохраняе тачнасць дадзеных, не ствараючы памылак у вычысленнях чы семантычных адхылэнняў між базовым і корыстніцкім шарамі.

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

    Наступныя крокі: пераход на Microsoft Agent Framework

    Команда вважае чатырхаслоўную архітэктуру гарным аднойчынкам для пераходу на Microsoft Agent Framework (MAF), які павышыць эфектывасць керування AI, заўсёды дазваляючы прыменяць прынцыпы дэтэрмінізма. MAF будзе вікорыстоўваны пераважна на роўні служб, заменяючы логіку керування FastAPI агентамі MAF, якія следуюць тым самым шаблонам чыстага керування дадзеннямі. Роўень апыту корыстніка будзе цэлкам зменены: Copilot Studio будзе заменены на натыўнае інтэграцыя з Microsoft 365, якае размешчае рабочыя працэсы керавання ў Outlook, Teams і SharePoint, вікорыстоўваючы здатнасці MAF да розумення мовы для болей тонкага распазнавання намероў і багатасэрыйных дыялогаў, пры чым для аналізу бізнес-даных будуць вікорыстоўваны тыя ж збераганыя процедуры.

    Вбудованыя механізмы стварэння аднароднасці, керавання спрытамі і інструменты для ціклу жыцця агентаў MAF дазволяюць паслабіць запатрэбнае самастраўленне інфраструктуры, а таксама дадаюць магчымасці нагляду і развяртання на рэвюснам рывень. Пацёг міграцыі прабачае існуючыя інвэстыцыі ў процедуры зберагання дадзеных, шаблоны Jinja2 і інтэграцію з SharePoint, адночаса дадаючы можлівасці для складнейшых сцэнарыяў, такіх як стварэння інформацыйных аповешчэнняў для кальколькая акаунтаў, сінтэз аналізу конкурэнцыі, а таксама шаблонав, якія генеруюцца дынамічна на адной з усходзячых з метаю зустрэчы і ўчаснікаў. Завдзяк інтэграцыі з Microsoft 365 стварэнне інформацыйных аповешчэнняў стане часткай існуючых рабочых процэсаў продуктывасці, а не окрэмым інтэрфейсам чата, пры чым слоі дадзеных і сервісаў застаюцца незменнымі.

    Што паказвае дызайн

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

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