Агенты парадзявання грошай: LangGraph выжыў там, дзе CrewAI і AutoGen зазналі невясці.
Тэксты прызначэння грошэй і правілы іх выдачы аднаковыя ў LangGraph, CrewAI і AutoGen. Калі працэсы былі зупінены, засталіся толькі явнае становішча, ідэмпатэнтнасць і контрольныя точкі.
Крыніцы: I Built the Same App in LangGraph, CrewAI, and AutoGen Only One Didn’t Fall Apart
Рабочая навантажэння, якія разбіваюць агенты-дэманты
Фрэймворкі з колька агентаў выглядаюць гладкія ў дэмантах для даследжэнняў і блогаў. Не ёсць нічага крытычнага, калі інструмент запускаецца два разы. Агент для апрацоўкі вярнення грошаў менш тэрпячы. Прымуўшы паведамленне ад кліента, ён павінен класіфікаваць мету, завантажыць замовленне, адмацаваць правілы (вакансія, катэгорыя, пакульшыя вярнення), вызваць платэжны шлюз ў максымум аднае разы, калі цэлкам дапускаецца, у разы працягвання — з пісьмовым обгрунтаваннем, і залішыць след для аўдыту.
Такі фармат ўжываецца часта ў прымэнні: вырашыць, змяніць становыя сістэмы, застацца адпаведальным. Ён выкалікае патрэбу ў стойкім стане на всіх этапах, дэтэрміністычным розгалужэнні межаў між вярненням грошаў і працягванням, ідэмпатэнтным побачным эфектам, а таксама перыядамі паузы для чалавека, якія застаюцца пасля перачынення процэсу — а не проста снам.
Тры рэалізацыі выкорыстоўвалі тыя ж інструменты, мадэль і логіку правілаў. Толькі адна перажыла тэсты хаосу, якія зупінялі процэс у падчас працы.
Спакушаныя інструменты
Зберагаеце чыстую барацьбу: ідэнтычныя функцыі засобаў, укладзеных у аднойчыныя шлюзы і канцэлеркі ідэмпотэнцыі, прычаленыя да 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 так і заставіла яго працаваць толькі в месцах чату. Агенты, якія не можаць жорстка аблокаваць певныя канекты, ёсць толькі дэкоратывамі. Жорсткая блокавацыя павінна выконвалівацца ў топологіі графа.
Заканчэнне
Тыя ж засобы, той ж мадэль, але разная філасофія кантролю. Толькі явны граф выжыў пасля тых аберанцэй, якія маюць значэнне для вырачэння грошоў. Іспользуйце команды і чаты, дзе неправільны парадак не мае вялікага значэння; іспользуйце графы, дзе неправільны парадак ёстэблююцца як змест кнігі рахункоў. Публікуйце гэтыя правіла ўнутршна, каб захаваць наступную команду ад чатырох тыдзяней працы.
Дадатковыя практыкі забезпечэння надзеі для графаў вырачэння грошоў
Політыкі, якія залежаць ад часу, павінны выкарыстоўваць час сервера, збераглі выкананнем запыту, а не даты, зазначаныя ў модэлі. Перакананні па катэгорыях павінны быць заданыя ў кодзе. Колькасць паказваных раней вырачэннях грошоў выходзіць з кнігі рахункоў, а не з памяці чату. Кожны з гэтых выбораў усунеяць адпаведную групу спроб втрымкі інфармацыі, якія прагначаюць перапісаць умовы аблікавання на нейтральнай мове. Графы робяць гэтыя выборы відчутнымі; команды ж хаваюць іх у анамнезе агентаў, дзе рэвізоры перастаюць іх адзірваць.