Архітектура для практычных корпоратыўскіх систем AI на аднойчынных агентах высокага рангу
Выучыце основныя элементы, стратэгіі запам’ятоввання, методы выкарыстоўвання інформаціі та правіла, неабходныя для пераходу агентных систем AI з пратэтапа ў надзеяныя корпоратыўскія системы працы.
Краткі выводы
Перахадка ад прыемных застосоўкаў на базе большых мовных модэляў без стану да агентных AI-сістэм высокага класу паказвае значныя змены ў спосабе, якім падпрыемства ствараюць програмнае забезпечэнне. Пачатковыя спробы падпрыемстваў у сфере AI значна апынуліся на базовых тэхніках Retrieval-Augmented Generation (RAG) — запоўненні дакументаў эмбеддінгамі і ўключэння іх у вікно контексту запита. Такой падход добра працюе для простых запытанняў, але не падходзіць для автонамнага прыняцця рашэнняў, багатапакетнага планавання з урахоўваннем стану, надзеянага вызывання інструментаў та можлівасці самакорэкцыі ў рамках робочага процесу.
Enterprise Agentic AI закрывае гэты прыем пацелкаваннем модэляў-фундаментаў: уместо таго, каб выступаць як прымытны інтерфейс для пользователя, модэль стае компанентам для рассудкавання, ўбудованым у дэтэрміністычны програмны каркас. Такія системы можаць спрыяваць аблікаванню свайго арэну, дзеліць вялікія цялі на меньшыя крокі, вызываць внутраніяя службы падпрыемства і пераносіць статус выконання праз багатакрокавыя транзакцыі. Аднак, каб перайсці ад рабочага пратотыпу да чаго-то, што можна запусціць у працэйнай средзе, неабходна рашыць проблэмы нестабільных недэтэрміністычных цягоў кантролю, заніжэння контексту па час дзейснення довгіх сэсій, рызыкі падвышэння прывілеяў і неконтрольаванага выкарыстання токенаў.
У данай частцы апісваецца цэласпрыводная архітектура для архітэктаў і керуючых інжынераў AI, якія адпаведна адпрацоўвают системы агентаў у корпаратыўных секторах. У яй рассматрываюцца базовыя слоі, неабходныя кожнаму агенту, прагледваюцься топалогіі калькольнікаў агентаў, деталізуюцься шаблоны інтэграцыі для выкарыстоўвання дадзеных на рэ벨е корпаратыўных систем — з асаблівай увагай да Amazon Kendra — і прыводзяцься прыклады коду на Python, якія падходзяць для працы ў рэальных умовах.
Раздзіл 1: Канонічная архітектура корпаратыўнага агента
Ключовыя слоі: спрыйманне, разумаванне, планаванне, памяць і выконання задач
Система агента, гатовая да працы ў рэальных умовах, выдзеляе верагатыснае базовае модэль на адзін узел ад детерміністычнага рантайма выконання, який яе абгружае. Цянуюючую частку такой архітектуры зазвычай складае пяць ключовых слоёў, усе з якіх працуюць унутры контейнера рантайма з кераванням:
- Слой спрыявання: Ператварае неапранутыя сігналы падпрыемства — тэлеметрыю, прыказы корыстувачаў, пакеты дадзеных для webhook-аў, адпаведзі API — у чыстыя, типаваныя даннэ, якія можа выкарыстоўваць рэшта системы. Це включае чыставанне даннэй, обмежэнне частоты запытоў і раннія пераконтрольвання структуры, якія выканываюцца ўсе прытаму, як толькі запускаецца LLM.
- Механізм разумавання: Канцэптуальны центр, які працуе за дапамою LLM (напрыклад, модэляs Anthropic Claude 3.5 Sonnet або AWS Bedrock). Уместа таго, каб сам выконваць дзеяння, гэты механізм адначасова аналізуе текущы контэкст, вазьмает пад увагу можлівыя шляхі дальнейшых дзеянь і выдае структураваныя заявы пра намеры.
Шаблоны оркестраціі: ціклы з аднам агентам проты топалогій з калькамі агентам
Выбор правильнага шаблону оркестраціі значнаю мерой залежыць ад таго, насколькі складны є цэльвы сфера:
- Ціклы ReAct з аднам агентам: Адны цікл разумавання, які пераходзіць праз фазы Мысль, Дзеянне і Абзір. Гэта падходзіць для вузкіх, лінейных рабочых практык, якія выкарыстоўваюць менш чым 5-8 разных інструментоў. Перад гэтым лімітам адны агент часта сталквецца з перадмернай велічынай вікна контексту, неканальнымі інструкцыямі та плутанням ў выборе інструменту.
Для выкарыстоўвання ў корпаратывацкай працэсаўной средзе Supervisor Multi-Agent Topology є рэкамендаваным стандартным выборам завяршваючы яго чыстыя межы стану, лёгкасць аудытавання і болей прагнозавальныя вартасці контэксту.
Раздзел 2: Карпоратывацкое кераванне памяцю і гігіена контэксту
Іерархія памяці: Рабочая память, краткатрывалы траекторыя і дзейнавая память
Спакульвайце кераванне памяцю агента як проблему бюджетавання рэсурсаў. Дазвол лепшым памяці прыводзіць да зростання вартасці інферэнсу, дадае затрымкі і вызывае пакінуць модэлю нить працы ў момент падупаду якосці контэксту. Якша спроектаваны корпаратывацкі агент патрабуе шаравай структуры памяці:
- Рабочая память (Scratchpad): Вікна жывога контэксту — інструкцыі системы, якія ў даны момент дзейнаюць, стан актыўнага задання і найсяродзейшыя выходы з адпаведных інструментаў.
Стратэгіі для складзення, адсечкі контексту і ізоляцыі стану
Ёжы кантэкст ад збіяння трэба, каб час выканання актыўна прыменяў правіла чыстоты:
- Адсечка спостарэння: Первісныя адпаведзі інструменту — напрыклад, JSON-дааны з 500 записамі — ніколі не должны прайсці безпосередна ў рабочую памэць. Час выканання трэба чыставаць, адсекаць або стасумаваць тое, што інструмент вяртае, прычым перш чым гэта дасягне механізма разумовых вычынкаў.
- Складчастая кампактнацыя: Калі запасны бафер перасягне заданы прагат выдаткаў (напрыклад, 20% ад загальнага ліміту контэксту моделі), наступны крок кампактнацыі спрацоўвае так, што ператварая ранейшыя часткі размовы на стислыя семантычныя падсумкі, а самыя первасныя тэксты выкасываецца.
- Ізоляцыя стану падзадач: Калі керуючы агент перадае задачу падагенту, той стварае для яго новы контэкст, ў якім знаходзяцца толькі конкрэтная мета і параметры, якія ўжо неабходны — жадна частка історыі разумовых процэсаў самога керуючага агента не прасачваецца.
Раздзіл 3: Дэтальны аналіз: Апрантка паданняў у предпрыемствах за дапамойкай Amazon Kendra
Amazon Kendra як слой апрантка паданняў у працэсе
Стварэнне практыкі адзыскання дакументаў у загальнай базе вектарных дадзеных зазвычай значыць самастоятельнае праектаванне логікі приймання дакументаў, ўдзелення іх на часткі, гэнеравання вектарных представленняў і шара злучэння гібрыдных спосабоў пошуку з нуля. Amazon Kendra замест тыго праставляе абслужваны на высокаму рэвэле інструмент для корпаратыўскага пошуку, який рашае гэтыя задачы без дадатковых налаштаванняў. Ён абягоўвае вбудованае багатаступеневае розумэнне нейтральной мовы, структураваную аналізу, якая вырахоўвае табелі, заголовкі і падзаголовкі, а таксама гібрыдную модэль ранжыравання, якая спалучае лексычныя і сэмантычныя паказнікі.
У корпаратыўскай структуре агентаў Kendra зазвычай выступае як ключовы Падсістэма фундаментавання знанняў — компонента, якая дазволяе агентам выцягваць пераканальваючы фактычны контэкст з розных внутршнях джерел дадзеных, без рызыку фрагментаціі, які ўстаёт унаследак простаг раздзелення дадзеных у вектарныя базы.
Развірнена налаштована адэкватнасць і дынамічная обробка метадаў
Ёжчы безпечна падтрымаць автонамныя рашэнні, системы пошуку высокага класу патрабуюць точнай кантролі прав і налаштовывальных параметраў адэкватнасці:
- Власныя спискі кантролю доступу (ACL): Kendra аўтоматычна запоўнюе і прыягоджае спискі ACL на рэвэле дакументаў, заданыя ў выканаўчых системах — будзь то SharePoint, Confluence чы S3. Калі агент выдае запит, ён перадае ідэнтыфікатор аутентызаванага пользователя як токен
UserContext, і Kendra прымае заходы безпекі на рэвэле індекса, так што жаданы фрагмент, да якого пользователя няма права, не дасягне агента.
_last_updated_at, за категорыяй бізнесу або за точным падабенствам у спецыяльных полях, такіх як Department чы ProjectCode.Retrieve заместо універсальнага API Query. API Retrieve абоўсюды ігнаруе метаданы пошуку, орієнтаваныя на UI, і замест таго вяртае дакладныя фрагменты тексту на рэвэлі, якія спецыяльна створаны для безпосередньага введэння ў вікно контексту LLM.Раздзіл 4: Дэтэрміністычныя правіла, паўтарэнне інструментоў і прыборкі для захавання стабільнасці
Контралы пры пярэднім выкананні (Feedforward) і паслявыканневыя контралы (Feedback)
Автонамныя агенты патрабуюць чыстае розмежаванне на рэвэрсе программнага забезпечэння, каб запобiec падышу прывілеяў, некоректным вызовам інструментаў чы ўзлічным цыклам выканання:
- Падтверджэнне ў напрамку (до выканання): Перш чым вызов інструмента досягне системы падпрыёмства, рэантайм пераказвае яго аргументы па строгіх схемах Pydantic — пераканваючыся, што існуюць неабяжныя поля, чы лічбовыя чы элементы enum знаходзяцца ў дазволеных дыапазонах, і чы токен автарызаціі вызывача дэйсна разрашае гэтую дзеянне.
Памылка: Тэблыца базы дадзейна ‘users_v2’ не знайдзена. Доступныя тэблыцы: ['users', 'orders'] — і такім чынам дае агенту конкрэтныя інструкцыі, якія ён можа выкарыстоўваць для корэктывы свайго наступнага крока.Сандбоксы, бюджэты крокаў і аўтаматызаваныя прыемнікі перашкод
- Ізольаваны сандбоксінг: Будзь-які дынамічна створаны код — напрыклад, Python, які генеруе агент для аналізу дадзейнаў — павінен выканацца ў тымчасовых, ізольаванных сандбоксах, такіх як контэйнеры Docker або мікро-ВМ gVisor, з строга контролюваным выходным доступам у сеть.
- Бюджэты крокаў і виткоў: Кожны заводзба агента павінен маты строгі ліміт па колькасці ітерацыяў вызываў інструментаў (на прыклад, не больш чым 10), а таксама максимальную суму витрачаных токенаў. Перасягнуце гэтыя ліміты павінна прымусіць систему зупініць выконанне і перадаць заводзбу чалавеку-оператару.
- Автаматычныя захопнікі для інструментаў: Якщо бэкенд-API або база дадзенаў продовжвае выканавляць помылкі праз адны за другім спробы перапрыяўлення, система павинна актывацыя захопнік, пазначыўшы гэты інструмент як
UNAVAILABLEу каталозе інструментаў агента, тады шар планавання будзе выбіраць альтернатывныя шляхі замест таго, каб паўтараць спробы выкарыстоўваць нефункцыональную залежнасць.
Раздзіл 5: План рэалізацыі ў працоўным серавере
Наведзены ў прыкладзе нижэй цэлая, працюючая Python-праявка, яка ілюструеўць архітектуру Supervisor Multi-Agent прыменныяга рангу. Яна аб’еднвае верыфікацыю інструментаў на аднойчыне з Pydantic, планаванне касоў на кожны крок, дэтерміністычную обработку памылак і інструмент-обгортка для запрашэнняў да Amazon Kendra.
import os
import json
import time
from typing import List, Dict, Any, Optional
from pydantic import BaseModel, Field, ValidationError
# =====================================================================
# 1. TOOL SCHEMAS & ENTERPRISE INTEGRATION CONTRACTS
# =====================================================================
class KendraRetrieveInput(BaseModel):
"""Input contract for the Amazon Kendra retrieval tool."""
query_text: str = Field(..., description="The natural language query string to search across corporate documentation.")
department_filter: Optional[str] = Field(None, description="Optional department metadata filter (e.g., 'Engineering', 'HR').")
user_id: str = Field(..., description="Authenticated user ID used for native Kendra ACL security trimming.")
class DatabaseQueryInput(BaseModel):
"""Input contract for enterprise relational database lookups."""
query_type: str = Field(..., description="Must be 'SELECT'. Data mutation operations are strictly prohibited.")
table_name: str = Field(..., description="Target database table name.")
limit: int = Field(default=5, ge=1, le=20, description="Number of records to return.")
# =====================================================================
# 2. MOCK ENTERPRISE SERVICES & KENDRA TOOL ENGINE
# =====================================================================
class MockAmazonKendraClient:
"""Simulates Amazon Kendra's high-density Retrieve API with ACL security trimming."""
def __init__(self):
self._mock_index = [
{
"doc_id": "KENDRA-DOC-001",
"content": "Production deployment requires dual sign-off from Engineering and Security leads.",
"department": "Engineering",
"acl_users": ["user_eng_101", "admin_007"]
},
{
"doc_id": "KENDRA-DOC-002",
"content": "Standard employee travel stipend is capped at $150/day for domestic lodging.",
"department": "HR",
"acl_users": ["user_hr_201", "user_eng_101", "admin_007"]
}
]
def retrieve(self, query_text: str, user_id: str, department_filter: Optional[str] = None) -> List[Dict[str, Any]]:
results = []
for doc in self._mock_index:
# Enforce Document-Level ACL Security Trimming
if user_id not in doc["acl_users"]:
continue
# Apply Optional Metadata Department Filtering
if department_filter and doc["department"].lower() != department_filter.lower():
continue
results.append({
"DocumentId": doc["doc_id"],
"ContentSnippet": doc["content"],
"Department": doc["department"]
})
return results
class MockEnterpriseDatabase:
"""Simulates a secure internal enterprise database."""
def __init__(self):
self._tables = {
"deployments": [
{"id": 1, "service": "auth-service", "status": "COMPLETED", "env": "prod"},
{"id": 2, "service": "payment-api", "status": "PENDING_APPROVAL", "env": "prod"}
]
}
def execute_select(self, query_type: str, table_name: str, limit: int) -> List[Dict[str, Any]]:
if query_type.upper() != "SELECT":
raise ValueError(f"Security Alert: Unauthorized operation '{query_type}'. Only 'SELECT' is permitted.")
if table_name not in self._tables:
raise KeyError(f"Database Error: Table '{table_name}' does not exist. Available tables: {list(self._tables.keys())}")
return self._tables[table_name][:limit]
# =====================================================================
# 3. PRODUCTION AGENT HARNESS & RUNTIME ENGINE
# =====================================================================
class ProductionAgentRuntime:
"""
Deterministic software harness surrounding probabilistic reasoning models.
Enforces budgets, schema validation, sandboxing, and error recovery loops.
"""
def __init__(self, user_id: str, max_step_budget: int = 4):
self.user_id = user_id
self.max_step_budget = max_step_budget
self.kendra_service = MockAmazonKendraClient()
self.db_service = MockEnterpriseDatabase()
def execute_task(self, task_goal: str) -> Dict[str, Any]:
print(f"=== [Harness Started] Initiating Task: '{task_goal}' for User: '{self.user_id}' ===")
step_count = 0
scratchpad_history: List[str] = []
# Simulated dynamic model trajectory outputs (demonstrating multi-step execution & self-correction)
simulated_llm_turns = [
# Turn 1: Attempt invalid database deletion (Caught by Feedforward Schema/Guardrail)
{
"thought": "I will clean up old deployment logs before checking security compliance.",
"action": "execute_db_query",
"args": {"query_type": "DELETE", "table_name": "deployments", "limit": 5}
},
# Turn 2: Corrected database lookup
{
"thought": "I will check active deployment statuses in the enterprise database.",
"action": "execute_db_query",
"args": {"query_type": "SELECT", "table_name": "deployments", "limit": 2}
},
# Turn 3: Ground task using Amazon Kendra Retrieve API
{
"thought": "Now I need to query enterprise policies regarding production deployment sign-off.",
"action": "kendra_retrieve",
"args": {"query_text": "production deployment sign-off rules", "department_filter": "Engineering"}
}
]
while step_count < self.max_step_budget:
step_count += 1
print(f"\n--- [Step {step_count}/{self.max_step_budget}] ---")
# Fetch current simulated model decision turn
turn_data = simulated_llm_turns[min(step_count - 1, len(simulated_llm_turns) - 1)]
print(f"Agent Thought: {turn_data['thought']}")
action = turn_data.get("action")
args = turn_data.get("args", {})
# --- TOOL EXECUTION BRANCH: DATABASE ---
if action == "execute_db_query":
try:
# 1. Pre-execution Feedforward Schema Validation
validated_args = DatabaseQueryInput(**args)
# 2. Tool Execution
db_results = self.db_service.execute_select(
query_type=validated_args.query_type,
table_name=validated_args.table_name,
limit=validated_args.limit
)
observation = f"Database Query Success: {json.dumps(db_results)}"
print(f"[Observation]: {observation}")
scratchpad_history.append(observation)
except ValidationError as ve:
error_msg = f"Schema Validation Blocked Action: {ve.errors()[0]['msg']}"
print(f"[Harness Feedforward Intercept]: {error_msg}")
scratchpad_history.append(error_msg)
except (ValueError, KeyError) as exec_err:
error_msg = f"Tool Execution Failure: {str(exec_err)}"
print(f"[Harness Feedback Sensor Catch]: {error_msg}")
scratchpad_history.append(error_msg)
# --- TOOL EXECUTION BRANCH: AMAZON KENDRA RETRIEVE ---
elif action == "kendra_retrieve":
try:
# Inject authenticated context
args["user_id"] = self.user_id
# 1. Pre-execution Schema Validation
validated_kendra_args = KendraRetrieveInput(**args)
# 2. Execute Kendra Retrieve Call
kendra_passages = self.kendra_service.retrieve(
query_text=validated_kendra_args.query_text,
user_id=validated_kendra_args.user_id,
department_filter=validated_kendra_args.department_filter
)
observation = f"Amazon Kendra Retrieved {len(kendra_passages)} Grounding Snippets: {json.dumps(kendra_passages)}"
print(f"[Observation]: {observation}")
scratchpad_history.append(observation)
# Successful multi-step completion condition reached
return {
"status": "SUCCESS",
"completed_in_steps": step_count,
"trajectory": scratchpad_history
}
except ValidationError as ve:
error_msg = f"Kendra Schema Error: {ve.errors()[0]['msg']}"
print(f"[Harness Intercept]: {error_msg}")
scratchpad_history.append(error_msg)
return {"status": "FAILED", "reason": "Step budget exhausted without completing task goals."}
# =====================================================================
# 4. EXECUTION DRIVER
# =====================================================================
if __name__ == "__main__":
# Instantiate runtime for an authorized engineering user
agent_runtime = ProductionAgentRuntime(user_id="user_eng_101", max_step_budget=4)
# Run Agentic Workflow
final_execution_summary = agent_runtime.execute_task(
task_goal="Verify pending production deployments and confirm authorization policies."
)
print("\n================ FINAL SYSTEM SUMMARY ================")
print(json.dumps(final_execution_summary, indent=2))
Раздзіл 6: Прыменныя операцыі, телеметрыя і караўненне
Візуабельнасць: відстэйкаванне траекторыяў за дапамогою OpenTelemetry
Работа з агентнымі системамі у прыменнай сферы выклекае патрэбу ў рангу відстэйкавання, якога не можу прысунуць звычайныя панелі APM. Паколькі агенты следуюць зменным, недэтерміністычным шляхам выканання, ваша стак-телеметрыі павінна восстанавіць усё дрэва траекторыяў, якімі прайшоў агент, а не толькі пару запрашэння-адказ:
- Раздробленасць спанаў: Кожны крок агента должен выдаваць набор вялізных OpenTelemetry спанаў, пры чым адны спаны павінны быть прызначаны для стварэння запиту да системы, вимеравання часу, які трэба моделі на адпаведзь, перакананняся, што параметры інструмента падходзяць да запланаванага шымату, відстэйвання часу фактычнага вызову інструмента, а таксама для выканання будзь-якай компактнацыі памяці, якая адбываецца пры гэтым кроку.
- Зявленне стану траекторыі: Спаны павінны фіксаваць колькасць токенайў увводу, колькасць токенайў выходу, шыматы, якія викорыстоўваюцца для параметраў інструмента, а таксама первісную дужыну повернутых рэзультатаў. Саме такі рагляд дозволяе правільна прызначаць вартасці і точна выявіць, які самэ крок у траекторыі стаў вузькай ўсходзбамом.
Операцыйныя правілы і ацэнка (Трыада агентаў)
Ўтриманне агента ў здаровым стане пад час роботы апяроўваецца стацыонарным аўтаматызаваным ацэнкаванням у трох ключовых вісках:
- Шточнасць выпанавання цэлі: частка запускаў агента, якія досягаюць успешнага канечнага стану без выкарыстання всіх доступных ресурсоў чы выклікання неконтрольваных асаблівасцей.
- Адпаведнасць да контексту, або індэкс галюцинацый: гэта пераканваецца, чы ўстаўленая агентам заканчоўная адпаведнасць дзе-нейтральвае на факты, атрыманыя з яго інструментаў пошуку (такіх як абдзяцкі, вярнутыя Amazon Kendra), а не створеныя з сабеўласнай параметрычнай памяці модэлю.
Вывык з практычнымі рэкамендаціямі
Стварэнне систем AI класу enterprise-рангу значыць тратаваць адпоўнайчы модэль як компанент працовання на адпаведнасці верыятносцям, які знаходзіцца ўнутры дэтэрміністычнага, строго кантролюемага програмнага каркаса. Арганізацыі, якія успешна пераводзяць агентаў з пратотыпа ў працэс вырабоцтва, — гэта тые, якія чыста практычна раздзеляюць архітектурныя элементы: спрыйманне, планаванне, память і експанзію інструменту, замест таго каб модэль свабодна кантролавала ўсе яны адразу.
Практычны план дзеяння для каманды з архітектуры
- Раздзеліцеўваеце логіку і выконанне: кожны вызов адзінка, запусканы LLM, должен праходзіць через дэтерміністычны механізм, які пераканае аргументы па схеме Pydantic пры выконанні і чыста фіксуе бяглы недагодзены.
- Іспользуйце Amazon Kendra для падтрымкі: вызывайце API
RetrieveKendra, каб заправіць агента моцным контекстам на рэвэле, аднойчы разважаючыся на його механізме адсорбавання дакументаў на рэвэле, каб абавесці автаматычнае выкананне заходаў забезпечэння. - Чытка абмежавайце выкарыстоўванне памяці: прыменяйце механізм поступовага складчавання контексту і ізолюйце контекст падзяловых задач, каб у дужа дугіх сесіях не выклікаліся проблемы з застарэўшым контекстам, схыламі інструкцый і неконтрольаваным выкарыстоўваннем токенаў.
Супакойлена літэратура
- Чаму вартасці агентных AI растуць: модэль вартасці, адмовленая архітектурай — Пасвячана таму, чаму вартасці агентных LLM трэба мерыць за кожны завершаны задачы, а не за кожны вызов, і паказвае архітектурныя методы, такія як маршрутызацыя модэляў, бюджеты контексту і кешаванне, для контролю выкарыстоўвання ресурсаў.
- Дзевяць канструктыўных элементаў для систем AI-агента высокай якосцы — Дзеяўскі план архітектуры, які включае прынцыпы сетей з нульовым дазволам, роўнів дадзэйнаў і прычынно-наследных звязкаў, для стварэння систем AI-агента падпрыемнай якосцы, якія можна пераглядаць.
- Проектаванне працовых прастораў AI-агента, якія падходзяць да рэальнай дзеяльнасі команд — Інструкцыя па дзесяці ключовых прынцыпах стварэння працовых прастораў AI-агента, якія аднаёнуюць контэкст, знанні, автонамію, доступ да інструментаў і автаматызацію рабочага прайсупутку ў адну цэлую систему.
- Выбір і налаштаванне модэляў embedding для систем RAG у працоўнай супэрвізіі — Дазнаецеся, як модэлі embedding ператвараюць тэкст у векторы, якія можна шукать, чаму слоўнік домэны нашкоджае семантычнаму пошуку, і як выбіраць, стыскаць та налаштавляць модэлі для викорыстання ў системах RAG у працоўнай супэрвізіі.