Агенты парадзявання грошай: LangGraph выжыў там, дзе CrewAI і AutoGen зазналі невясці.
Тыя ж самыя інструменты і правілы ў трох парадактах — толькі чыстая становасць, ідэмпотентнасць і пункты контролю перазсталі пасля хаосу.
Рабочая навантажэння, якія разбиваюць агенты-дэманты
Фреймворкі з колька агентаў выглядаюць гладкія ў дэмантах для даследжэнняў і блогаў. Не ёсць нічага критычнага, якщо інструмент запускаецца два разы. Агент для обробкі вярнення грошаў менш тэрпячы. Прымуўшы паведамленне ад кліента, ён должен класіфікаваць мету, завантажыць замовленне, адмацаваць правілы (вакансія, катэгорыя, пакульшыя вярнення), вызваць платежны шлюз ў максымум аднае разы, калі цэлкам дапускаецца, у разы працягвання — з пісьмовым обґрунтаваннем, і залишыць след для аудыту.
Такі формат ўжываецца часта ў прымэнні: вырашыць, змяніць становыя системы, застацца адпаведальным. Ён выкалікае патрэбу ў стойкім стане на всіх этапах, дэтерміністычным розгалужэнні межаў між вярненням грошаў і працягванням, ідэмпотентным побачным эфектам, а таксама перыядамі паузы для чалавека, якія застаюцца пасля перачынення процэсу — а не проста снам.
Тры рэалізацыі выкорыстоўвалі тыя ж інструменты, модель і логіку правілаў. Толькі адна перажыла тэсты хаосу, якія зупінялі процэс у падчас роботы.
Спакушаныя інструменты
Зберагаеце чыстую боротьбу: ідэнтычныя функцыі засобаў, укладзеных у аднойчыныя шлюзы і канцэлеркі ідэмпотэнцыі, прычаленыя да ID замовлення.
# tools.py — identical across all three implementations
import time
import uuid
from dataclasses import dataclass
from typing import Literal
class PaymentGatewayError(Exception):
pass
@dataclass
class Order:
order_id: str
customer_id: str
item_category: str
amount_cents: int
purchased_at: float
refund_count: int
# Fake DB — in prod this is Postgres behind a repository class
_ORDERS = {
"ORD-4471": Order("ORD-4471", "CUST-991", "electronics", 8999, time.time() - 86400 * 5, 0),
"ORD-2210": Order("ORD-2210", "CUST-102", "electronics", 4200, time.time() - 86400 * 45, 1),
}
_PROCESSED_REFUNDS: set[str] = set() # idempotency ledger
def get_order(order_id: str) -> Order | None:
return _ORDERS.get(order_id)
def check_refund_policy(order: Order) -> tuple[bool, str]:
days_since_purchase = (time.time() - order.purchased_at) / 86400
if days_since_purchase > 30:
return False, f"Purchase was {days_since_purchase:.0f} days ago, outside the 30-day window."
if order.refund_count >= 1:
return False, "Customer has already received a refund on this order."
return True, "Eligible: within window, no prior refund."
def issue_refund(order_id: str, idempotency_key: str) -> dict:
"""Calls the payment gateway. MUST be idempotent — retries are expected."""
if idempotency_key in _PROCESSED_REFUNDS:
return {"status": "already_processed", "idempotency_key": idempotency_key}
order = _ORDERS[order_id]
# simulate a flaky gateway — this matters later
if uuid.uuid4().int % 5 == 0:
raise PaymentGatewayError("gateway timeout, retry with same idempotency_key")
_PROCESSED_REFUNDS.add(idempotency_key)
return {"status": "refunded", "amount_cents": order.amount_cents, "idempotency_key": idempotency_key}
Ідэмпотэнцыя — гэта не проста дэкоратыванне; гэта разліка межу фрэймворкам для агентаў і простымі інструментамі для ўпрабоўкі.
CrewAI: моцныя дэманстрацыі, слабакі кантроль
CrewAI адграджвае ролі і задачы ў межах Crew. У прэzentациях продуктав пасляплодна падабяецца на організацыйную схему.
Наўівы шаблон
from crewai import Agent, Task, Crew, Process
from crewai.tools import tool
@tool("Get Order")
def get_order_tool(order_id: str) -> str:
"""Fetch order details by ID."""
order = get_order(order_id)
return str(order) if order else "NOT_FOUND"
@tool("Check Policy")
def check_policy_tool(order_id: str) -> str:
"""Check refund eligibility for an order."""
order = get_order(order_id)
if not order:
return "NOT_FOUND"
eligible, reason = check_refund_policy(order)
return f"eligible={eligible}, reason={reason}"
@tool("Issue Refund")
def issue_refund_tool(order_id: str) -> str:
"""Issue a refund for an order."""
result = issue_refund(order_id, idempotency_key=f"refund-{order_id}")
return str(result)
triage_agent = Agent(
role="Refund Triage Specialist",
goal="Decide whether a customer refund request should be approved or escalated",
backstory="You are an experienced support agent who follows policy strictly.",
tools=[get_order_tool, check_policy_tool, issue_refund_tool],
verbose=True,
)
triage_task = Task(
description="A customer says: '{customer_message}'. Order ID: {order_id}. "
"Decide if this qualifies for a refund and act accordingly.",
expected_output="A short summary of the action taken.",
agent=triage_agent,
)
crew = Crew(agents=[triage_agent], tasks=[triage_task], process=Process.sequential)
result = crew.kickoff(inputs={"customer_message": "I want a refund, item broke", "order_id": "ORD-4471"})
Шляхі здаваліся нормальнымі. Але як служба вона зазнала трохці невдач. Порядак выканання інструментаў быў недэтэрміністычны — інодзе issue_refund выкананы быў раней за check_policy, таму што модель стварае вольныя зв’язкі между інструментамі. Перапрыбуткі пасля PaymentGatewayError моглі стварыць новыя викликі інструментаў та новыя ключы, якщо толькі інструмент не меў жорстко заданай ідэмпотентнасці. Функцыя kickoff() выканана да канца без жадных перерываў з боку чалавека; фальшывая продовжэння выканання значыла перзбудаваць стан па заходам, не выкарыстоўваючы фрэймворк.
Захіщаны іерархічны падход
manager_agent = Agent(
role="Refund Process Manager",
goal="Enforce strict order: lookup, then policy check, then refund or escalate. Never skip steps.",
backstory="You strictly enforce process compliance and never let steps be skipped.",
allow_delegation=True,
)
crew = Crew(
agents=[triage_agent],
tasks=[triage_task],
process=Process.hierarchical,
manager_agent=manager_agent,
)
Агент-менеджар та болей выразныя паведамленні зменшылі канцэнтрацію пропускаемых крокаў, але не створылі жорсткіх незменных. Прыродны язык не можа гарантаваць сэрыйяванне на рэгламентны адлік. CrewAI падходзіць для гнучкай ролевай гры — спачатку досліджэнне, потым крітыка — а не для сэквенсаў, зв’язаных з платежамі.
AutoGen: гнучкі чат, нечыткая кантролл
Групавы чат з аўтаматычным выборам спікера дадае кожны раз вызов LLM, каб выбраць, хто будзе гаварыць.
import autogen
config_list = [{"model": "gpt-4o", "api_key": "..."}]
llm_config = {"config_list": config_list, "temperature": 0}
triage_agent = autogen.AssistantAgent(
name="TriageAgent",
system_message=(
"You triage refund requests. Look up the order, check policy, "
"then either call issue_refund or hand off to EscalationAgent."
),
llm_config=llm_config,
)
escalation_agent = autogen.AssistantAgent(
name="EscalationAgent",
system_message="You write a human-readable escalation note explaining why a refund needs manual review.",
llm_config=llm_config,
)
user_proxy = autogen.UserProxyAgent(
name="ToolExecutor",
human_input_mode="NEVER",
code_execution_config=False,
function_map={
"get_order": lambda order_id: str(get_order(order_id)),
"check_refund_policy_tool": lambda order_id: str(check_refund_policy(get_order(order_id))),
"issue_refund": lambda order_id: str(issue_refund(order_id, f"refund-{order_id}")),
},
)
groupchat = autogen.GroupChat(
agents=[user_proxy, triage_agent, escalation_agent],
messages=[],
max_round=10,
speaker_selection_method="auto", # an LLM call decides who speaks next
)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
user_proxy.initiate_chat(manager, message="Customer wants a refund on ORD-2210, item broke on arrival.")
Проблемы: ціклы кантакту межу тріажам і падняцьем прыгождоў без структураванага статусу «вже вынікла рашыць» — толькі транскрыпціі — што вымушвае вялікія обмежэння max_round. Пытанне «Чы гэты час вернулі грошы?» рашалася за дапамой пошуку ў вольным тексте. Недэтэрмінізм паўнастаў увесь граф выканання, таму інцыдэты реконструюваліся з логаў чату, а не з запісаў клавіравання.
LangGraph: той, хто перажыў
Стан, запісанный у вигляде тексту, явныя рэшткі, контролеры стану і пракаты падходзілі да рашэння проблемы.
from typing import TypedDict, Literal, Optional
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.sqlite import SqliteSaver
from langgraph.types import interrupt, Command
import uuid
class RefundState(TypedDict):
order_id: str
customer_message: str
order: Optional[dict]
eligible: Optional[bool]
policy_reason: Optional[str]
decision: Optional[Literal["refund", "escalate", "denied"]]
refund_result: Optional[dict]
audit_log: list[str]
def lookup_order_node(state: RefundState) -> RefundState:
order = get_order(state["order_id"])
log = state["audit_log"] + [f"Looked up {state['order_id']}: {'found' if order else 'not found'}"]
if not order:
return {**state, "decision": "escalate", "audit_log": log}
return {**state, "order": order.__dict__, "audit_log": log}
def policy_check_node(state: RefundState) -> RefundState:
order = Order(**state["order"])
eligible, reason = check_refund_policy(order)
log = state["audit_log"] + [f"Policy check: eligible={eligible}, reason={reason}"]
return {**state, "eligible": eligible, "policy_reason": reason, "audit_log": log}
def route_after_policy(state: RefundState) -> str:
# Plain Python. No LLM call decides this branch. This is the whole point.
if state.get("decision") == "escalate":
return "escalate"
return "refund" if state["eligible"] else "escalate"
def human_approval_node(state: RefundState) -> RefundState:
# Durable pause: this literally suspends the graph run and persists state
# via the checkpointer. It can resume hours or days later, across restarts.
decision = interrupt({
"reason": "Ambiguous or ineligible refund needs human sign-off",
"order": state["order"],
"policy_reason": state["policy_reason"],
})
return {**state, "decision": decision, "audit_log": state["audit_log"] + [f"Human decision: {decision}"]}
def issue_refund_node(state: RefundState) -> RefundState:
idempotency_key = f"refund-{state['order_id']}" # stable across retries — this is the whole trick
try:
result = issue_refund(state["order_id"], idempotency_key)
except PaymentGatewayError as e:
# LangGraph re-raises into the node; retry policy (below) handles this,
# and because the key is stable, a retried call is safe.
raise
log = state["audit_log"] + [f"Refund issued: {result}"]
return {**state, "decision": "refund", "refund_result": result, "audit_log": log}
def escalate_node(state: RefundState) -> RefundState:
log = state["audit_log"] + ["Escalated to human queue"]
return {**state, "audit_log": log}
from langgraph.pregel.retry import RetryPolicy
graph = StateGraph(RefundState)
graph.add_node("lookup_order", lookup_order_node)
graph.add_node("policy_check", policy_check_node)
graph.add_node(
"issue_refund",
issue_refund_node,
retry=RetryPolicy(max_attempts=3, retry_on=PaymentGatewayError),
)
graph.add_node("human_approval", human_approval_node)
graph.add_node("escalate", escalate_node)
graph.set_entry_point("lookup_order")
graph.add_edge("lookup_order", "policy_check")
graph.add_conditional_edges("policy_check", route_after_policy, {
"refund": "issue_refund",
"escalate": "human_approval",
})
graph.add_edge("human_approval", "issue_refund") # human can still approve
graph.add_edge("issue_refund", END)
graph.add_edge("escalate", END)
checkpointer = SqliteSaver.from_conn_string("refunds.db")
app = graph.compile(checkpointer=checkpointer)
Канфігурацыі тэадаў восстанавляюцца пасля збоев:
config = {"configurable": {"thread_id": "order-2210-refund-req"}}
# Kick off the run — it will pause at human_approval_node
result = app.invoke(
{"order_id": "ORD-2210", "customer_message": "second refund please", "audit_log": []},
config=config,
)
# result contains an interrupt payload; the process can now exit entirely.
# ... hours later, possibly a different process, different machine ...
final_result = app.invoke(Command(resume="escalate"), config=config)
Дэтэрміністычныя тесты пераканваюцься, што непарадныя замовленні павінны падняцца прыгождоў:
def test_ineligible_order_escalates():
state = {"eligible": False, "decision": None}
assert route_after_policy(state) == "escalate"
def test_eligible_order_refunds():
state = {"eligible": True, "decision": None}
assert route_after_policy(state) == "refund"
Процес зупіняўся падчас вернення грошаў, але пачынаўся знову з таго ж стану з той самай ключовай вялікасцю ідэмпотентнасці. Гэты тест вяліў за сабой рашэнне ў конкурсе.
Калі CrewAI чыра AutoGen яшчэ выграюць
CrewAI падходзіць для саўместнага стварэння з гнучкым порядкам задач. AutoGen — для дакладных даследжэнняў з участю калькі агентаў, дзе сам размова ёсць рэзультатам. Ні адна з іх не можа заменіць машыну станоў, калі ў гэты процес уключаюцца фінансы.
Урок
Падбірайце абстракцыю па спосабу можлівых абяканняў. Якщо неправы порядак выкарыстоўвання інструментаў чы двойныя побачныя эфекты є непрыемнымі, волейце ясныя графы з стабільным станом, чым команды, складзеные з прамптамаў. Фрэймворкі — гэта не проста заменныя “шкуры” для агентаў; яны закодаваныя разныя падходы да кантролю, запамятовування і вяснавання.
Чакліст для працы пасля завершэння
Перад тым, як адоптаваць будзь-яга прыстрой, сэрвіруючы гранты, неабяжна патрабаваць: стан, запісанный у формате з флагам already_refunded (או адэкватным); ключы ідемпотентнасці, створаныя на адміністрацыйскіх ідэнтыфікаторах; перакрыцця правіл у вазе кодовых вузлаў, а не як прапанаванні для корыстніка; перарывы HITL пасля запуску checkpointer; тэсты на хаос, якія зупіняюць працу процэсаў пад час выканання побачных эфектаў; логі аудыту, якія не выкарыстоўваюць шуканне у тексте. Якщо фрэймворк не можа выражыць гэтыя характэрыстыкі без дапамогі додатковага двойніка-механізма, то саме гэты двойнік яўляецца рэальным керуючым элементам, а фрэймворк — толькі дарогі з’ёднальны элемент.
Звярзайце увагу на разныя показнікі неудач у тэставанні: прычыны, за якіх правіла не былі выкарыстаны, падзеі двойных спроб грантавання, втраты перарываў пасля перзапуску і неразбірлівыя логі аудыту. Протатыпы Crew і AutoGen, якія не можаць перамогчы LangGraph па гэтым показнікам, должны застацца ў лабараторыі. Аплодуйце ў выпадку ўсунення іх з эксплуатацыі; неконтрольавана експансія мае свою цену.
Запісуйце рашынку для будучых каманд, ўбачліва, каб наступны конкурс не быў неабходны. Прыкяюце інструкцыі па выкарыстоўванні цього інструменту ў файле README. Валіце нудныя графікі, якія застаюцца актуальнымі пасля розных змян, працоўгледзейчы крэатывныя дыскусіі, якія застаюцца толькі пасля дэманстрацый. Гэты стандарт прыменяецца не толькі да варыянтавання грошовых адшкодаванняў, але і да будзь-яга агента, які мутуе званычныя системы пад тым тыслам, калі ведуцца аудыты; гэта самае тое, чаго насправды хочуць падпрыемства ад «АІ-агентаў», калі тэмпарарыяны прылады перестаюць работаць, а бухгалтарскія кнігі зноў становяцца важлівымі ў кожны квартал.
Спаўненне неудач з прынятымі падазрамі фрэймворку
CrewAI прыяжджае да гнекліваму разбіўцы задач. AutoGen прыяжджае да таго, што размова ўсё, што трэба для кантролю. LangGraph прыяжджае да таго, што вы самі ствараце систему кантролю. Автоматызацыя вярнення грошаў наражае на рызык першыя два прыяжджання: абавесці ўчасті нельга пераговарваць, а выбор спакланяючаго не ёсць механізамам разрэшэння платежа. Калі прыяжджання ступіцца з законамі галузі, фрэймворк з меньшым колам прыяжджання выграе — нават якщо ў першы тыдзень ён здаецца менш эфектывным.
Інжынеры інодзе прабуюць «вылечыць» CrewAI чысто AutoGen за дапамой ўсё дужэй і дужэй працоўных запрасаў для системы. Гэта як выкарыстоўваць захід проты цыклону як дзвері сховішча. Перакладзіце аспекты супакоўкі ў типаваныя вузлы і трывайце мовныя моделі ў вузлах, якія класыфікуюць чысто прадаюць, а не ў вузлах, якія вырашаюць, чы роўнасці будзе пераводзіцца.
Абавесці спяльнай адразлівасці
Што бы вы не выбралі, неабяжна выдаваць даны для кожнага вызову інструмента з ідэнтыфікатаром параду, ключам ідэмпотэнцыі та рэзультатам палітыкі. Без гэтаго дыскусіі ў фрэймворках стаюць супернатыянальнымі, а працэўнае сераўеры застаюць без інформаціі. LangGraph зробіў гэтыя элементы відчутнымі, таму што вузлы ёсць функціямі; вы можете застосаваць тую ж дисципліну і ў іншых месцах, але тэсты паказалі, што гэта є стандартны, наіменш суперечлівы падход для такай навантажэнняй.
Заключанне
Стварыце агента, які будзе падходзіць да ситуацый, калі ваша система выконваеся некоректна. Для вярнення грошаў такі агент мусіць быць графам з памяцю, а не командай людзей. Заставіце іншыя інструменты для проблем, да якіх яны насправдэўна падходзяць, і перастаньце прытварацца, што адна абстракцыя можа падхопіць кожны заявкі ў формате агента, якія застаюцься у черзі.
Прагляд структуры LangGraph, якая працавала
Успешныя графы зберагалі класыфікацыю, запрошэнне дадзеных, правілы, вярненне грошаў, падняць проблему на вышэйшы ранг і аудыт як окремыя вузлы. Краі графа кодавалі ўсе дазволеныя законам пераходы. Модель ніколі не выбірала, чы робіць прыступ да правілаў; яна толькі запоўняла структураваныя поля, якія інтэрпретаваў код правілаў. Перапрыбуткі на вузле шлюза выкарыстоўвалі той самы ключ ідэмпотентнасці, які быў зберагнуты ў стане. Для падняць проблемы на вышэйшы ранг выкарыстоўваліся функцыі interrupt() з контрольным паказчыкам, каб менеджер мог адмаўліць прыказку за калькі гадзін на іншай копіі.
Такія прыемы выглядаюць занадта деталізаванымі паўступлень да вярсіі з трох агентаў. Саме деталізаванасць і є мэтай: кожны незворачны крок можа быць пазначаны пад час перагляду коду. Новыя інжынеры можаць прачытаць граф і спрогназаваць поведзенне, не прабуючы занова дзесяткі статыстычных чатаў.
Порэванне способаў реагавання на інцыдэты
Калі CrewAI два разы выканала адзін інструмент у стадіі прадаўготавлення, аналіз прычын паказаў «зсув запросу». Калі AutoGen застаўся ў цыкле, аналіз прычын паказаў «выбор спікера». Калі LangGraph не заработаў, аналіз прычын паказаў конкрэтны вузол і абсенцыю редуктара — гэта можна было вылечыць без дагадак. Лячоўна толькі класыфікацыя інцыдэтаў падтрымала выбор рабочага процесу, сяродзінны платежам.
Запісы пра косцы і затрымкі з конкурсу
Система LLM для спікера ў AutoGen за кожны раунд дадавала затрымкі і токены. Перапробаванні CrewAI іноды прыводзілі да мнагакратнага выканання вызоў інструментам. LangGraph платіў невялікія косцы за постаўку чекпоінтам, але меў перавагу ў прыемнае стабільнасці витрачання. Для колькасці падтрымкі ў тыячах на дзень стабільнасць перажывае эпізодыя эконаміі.
Навыкі калектыва і працэўнае прабрамленне
Потрэба ў спецыялістах з “CrewAI experience” меньшая, чым потрэба ў спецыялістах з “state machines plus LLMs”. Навыкі, связаныя з LangGraph, можна перапрацаваць для будзь-каго іншага керуючага прыстрою. Якщо компанія стандартизуець процесы, лепш выбіраць переносныя концэпцыі: стан, ідемпотентнасць, HITL, атрыбуты ацэнкі. Циклы развіцця фреймворкаў праходзяць быстрэй, чым гэтыя концэпцыі.
Расшырэнне набора засобаў для керування хаосам
Пашчырэй, чым проста зупінка і пачатак занова: трэба урахавляць ситуацыі з кодамі 503 у гэйтвейзах, дуплікацыю падачы вебхук-сігналаў, асэнтрасію часу ў моменты выканання правілаў, а таксама людзей, якія адхоўляюць прабныя запускі. Графы, якія функцыонуюць толькі па “шчасліваму” шляху, застаюцца проста іграшкамі. Трэба автаматызаваць весь набор засобаў у процесе CI за дапамогою дэтерміністычных сімуляцый, каб переработкі не моглі таямна паслабіць меры безпекі.
Мягкая посадка пратотыпаў
Застаўце сандбоксы CrewAI/AutoGen для рабочых практык з кантэнтам, дзе участвуюць людзкія рэдактары. Не блакуйце експерыментаванню — блакуйце толькі крантэдыцыям для прадукцыі. Палітыка платформы, якая забараняе викорыстоўвання інструментаў платежаў у сістэмах, керованых запитамі, спакойвае рызыкі, не паслабляючы любопытства.
Апошні акцэнт
Тверджэнне статыі ўздрэжанае і чыстае: у разліцоўках з рэальнымі паслядкамі LangGraph працаваў, дзе CrewAI і AutoGen не змоглі, незважаючы на ідэнтычныя інструменты. Абавязкова аднойчы розглянуць усе аспекты. Свабодна перенесіце мета-урок — адмэтражвайце канструкцыі на аспектах вашых няудач, а не на візуальных эстэтычных характерыстыках дэманаў — і тады цяжкі кампейн будзе вартым усіх затрачаных часоў.
Дзейнік няудач з першых працоў
Першыя тры дні: дэманстрацыя CrewAI захапіла увагу заўсёдніх партнероў. Другія тры дні: два спробы подвойнага вярнення грошаў у тэставанні пасля нестабільнасці гейтвэя. Трэція частка: пілотны проект AutoGen спалоўваў токены пад час повтарных запускаў у разы, калі замовленні былі адхілены. Чэтвёртыя тры дні: система керавання хаосам LangGraph прымусова завершала процес вярнення грошаў. Календар мае значэнне, таму што організацыйны імпульс часта зупіняецца пасля першай дэманстрацыі; неабходна запісаць хронологію адзінакоў у документ ADR, каб імпульс не могаў стерць доказы.
Ідэмпотентнасць як міжвышэўскія трэбаванні
Кожная праметка, якая тут працавала, могла вызываць інструменты. Толькі тыя проекты, якія викорыстоўваюць стабільны ключ пад час повтарных спроб, є безпечныя пад час адбывання платежаў. Зберагайце ключ у стане графа пры першай спробе. Адмовіцеся ад стварэння новага ключа пад час повтарных запускаў. Запісвайце ключ, ідэнтыфікатор замовлення та коды адпаведзей гейтвэя разам. Якщо праметка створюе такія труднасці, гэтыя труднасці є сигналам, а не проблемай з дакументацыяй.
Эрганаміка паднятка спрабы ў людзей
Тэкст абаранення павінен уключаць ідэны пунктам правіл, часы стварэння замовленняў і колькісць ранейшых вярненняў грошаў — структуру, якая вытэкла з даных стану, а не проста свабодна напісаныя тэксты. Менеджеры павінны бачыць тыя ж поля, якія бачыў узел правіла. LangGraph гэта спроставаў, таму што стан выражаецца за дапамогою TypedDict; Crew/AutoGen вымагалі пераконструювання фактов з транскрыпцый, і самэ гэта стварае прасоўкі ў аудыті.
Што мы залилі з таго, што не паспела
Метафоры ролей CrewAI дапамаглі у размовах пра продукт — іх трэба пераклаць у назвы вузелаў LangGraph. Актыўны список агентаў AutoGen падказаў, як чышчэ зафіксаваць адпаведальнасць за інструменты па кожным вузелу. Дазволяецца крастаць ідэі UX, адмовляючыся ад небяпечных планаў керування.
Расширэны чакліст для працы
- Хаос: выключэнне пад час викорыстоўвання інструмента, пад час чакання на перарыв, пад час повторных спроб.
- Тэсты власнасці: тыя, хто не паспелі, ніколі не даступаюць да вузла вярнення грошаў.
Чаму падход “проста дадзіце ўтолькі іншаг агента” не спрацаваў
Даданне агента “PolicyEnforcer” у CrewAI так і заставіла процес прыменення правіл у форме верагатыбізма. Даданне агента “RefundGuardian” у AutoGen так і заставіла яго працаваць толькі в месцах чату. Агенты, якія не можаць жорстка аблокаваць певныя канекты, ёсць толькі дэкоратывамі. Жорсткая блокавацыя павінна выконвалівацца ў топологіі графа.
Заканчэнне
Тыя ж засобы, той ж модель, але разная філасофія кантролю. Толькі явны граф выжыў пасля тых аберанцэй, якія маюць значэнне для вырачэння грошоў. Іспользуйце команды і чаты, дзе неправільны порядак не мае вялікага значэння; іспользуйце графы, дзе неправільны порядак ёстэблююцца як змест кнігі рахункоў. Публікуйце гэтыя правіла ўнутршна, каб захаваць наступную команду ад чатырох тыдзяней працы.
Дадатковыя практікі забезпечэння надзеі для графаў вырачэння грошоў
Політыкі, якія залежаць ад часу, павінны выкарыстоўваць час сервера, збераглі выкананнем запыту, а не даты, зазначаныя ў модэлі. Перакананні па категоріях павінны быць заданыя ў коде. Колькасць паказваных раней вырачэннях грошоў выходзіць з кніги рахункоў, а не з памяці чату. Кожны з гэтых выбораў усунеяць адпаведную групу спроб втрымкі інфармацыі, якія прагначаюць перапісаць умовы аблікавання на нейтральнай мове. Графы робяць гэтыя выборы відчутнымі; команды ж хаваюць іх у анамнезе агентаў, дзе рэвізоры перестаюць іх адзірваць.