Практычныя прытамулкі: Практычны паўоддзь для архітектуры з калькамі агентаў
Практычныя прыказкі: Памятнік для роботы з архітектурамі на базе кальканоў: контракты, перакрыцчы і слоты для коду для команд, якія викорыстоўваюць гэты патерн.
У гэтым карыце парадоксальная дорага ад сыр'ёў да рабочай системы для: «Практычнага вёдара па архітектурама з калькольнікамі». Акцэнт ставяцца на практычныя крокі, чыстае перакананне і код, які можна проста падставіць у репазітарый без неабяснення меты. У стадзіі агульнага відгледу неабходна прадзефінаваць вхідныя даны, адпаведальную особу за крок і критэрыя завершэння прычыму змені коду. Аперацыйныя працавнікі должны магчымае перадзеўжаць крок з вядомага пункту перапытку без неабяснення схованага стану. Спрыятлівае ставленне да гэтай стадзіі як да кантракту межа вхіднымі данымі і падтверджанымі выходнымі рэзультатамі. Назваць артыфакты, прадзефінаваць перакананні на успех і адмовіцца ад беззвучнага частковага завершэння.
1. Іерархічныя системы з калькольнікамі
Калі працуеце над 1-ым этапам Іерархічных багатаэйентных систем, спачатку запісайце умовы вярбунка: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список дапамагае заліцвачыць змяны ў кодзе на адпаведны спосаб.
from fundamental_analysis_tools import evaluate_fundamentals
from langchain.agents import create_agent
from technical_analysis_tools import technical_analysis
agent = create_agent(
model=llm,
tools=[technical_analysis, evaluate_fundamentals]
)
Supervisor
├── Technical Analysis Tool
└── Fundamental Analysis Tool
Supervisor
├── Technical Analyst Agent
│ ├── Tool A
│ ├── Tool B
│ └── ...
└── Fundamental Analyst Agent
├── Tool C
├── Tool D
└── ...
from langchain.tools import tool
from langgraph_supervisor import create_supervisor
@tool
def get_weather(city: str) -> str:
"""Use this tool to get the weather of a city or location"""
return f"The weather is sunny in {city}"
weather_expert = create_agent(
model=llm,
tools=[get_weather],
name="weather_expert"
)
technical_analyst_agent = create_agent(
model=llm,
tools=[technical_analysis],
name="technical_analyst"
)
fundamental_analyst_agent = create_agent(
model=llm,
tools=[evaluate_fundamentals],
name="fundamental_analyst"
)
analysis_squad = create_supervisor(
[technical_analyst_agent, fundamental_analyst_agent],
model=llm,
supervisor_name="analysis_supervisor",
prompt=(
"You are a team supervisor managing a fundamental analyst and a "
"technical analyst..."
)
)
analysis_app = analysis_squad.compile(
name="fundamental_and_technical_analyst"
)
supervisor_graph = create_supervisor(
[analysis_app, weather_expert],
model=llm,
prompt=(
"You are a team supervisor managing a fundamental analyst, a "
"technical analyst and a weather expert..."
)
)
supervisor = supervisor_graph.compile()
Калі трэба вжываць іерархічную архітектуру?
Калі працюеце над пытаннем «Калі трэба викорыстоўваць стадію», спачатку запісайце угоду: неабходныя даны, сігнал успеху і тое, што выходзіць пад частым неудачам. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Зберагаюце настройкі праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжнага чытання всіх элементаў. Стварайце контрольныя пункты пасля дорогіх крокаў. Система вярнення не должна занова ставіць плату за той самы вызыв LLM, калі аператар перапрыяўляе роботу да пазнейшага вузла.
2. Явныя рабочыя практыкі з калькамі агентаў
Калі працуеце над стадзіяй 2 «Явныя багатаэўкароткія системы», спачатку запісайце угоду: неабходныя даны, сигнал успеху і тое, што выканаецца у разы частковага невясковання. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Документавайце як шлях успеху, так і шлях вясковання проблем. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам. Стварайце контрольныя пункты пасля дорогіх крокаў. Продовжэнне роботы не должна знову ставіць плату за той самы вызов LLM, калі аператар перапрыбуе пазнейшы вузел. Калі працуеце над стадзіяй 2 «Явныя багатаэўкароткія системы», спачатку запісайце угоду: неабходныя даны, сигнал успеху і тое, што выканаецца у разы частковага невясковання. Такі список контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрыятлівае ставленне да гэтай стадзіі як да угоды межа данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задайце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
def execute_plan(
plan: Plan,
state: State,
) -> Command[
Literal[
"fundamental_analysis_agent",
"technical_analysis_agent",
"respond",
]
]:
gotos = [
Send(
step.action.agent_to_use,
{"query": step.action.query_to_send},
)
for step in plan.steps
]
if not gotos:
gotos.append(
Send("respond", {"messages": state["messages"]})
)
return Command(goto=gotos)
def router(state: State) -> Command[
Literal["fundamental_analysis_agent", "technical_analysis_agent", "respond"]
]:
# Get plan
query = state['messages'][-1].content
response = llm_planner.invoke(query) #invoke planner
return execute_plan(response, state)
Калі вжываць явныя багатаэўкароткія рабочыя процесы
Падчынны элемент «Калі выкорыстоўваць явную стадію» працуе наякша, калі яго розглядаць як вимерную плошчу. Запісаўце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметку па адвярненню перад расшырэнням масштаба. Запісвайце часы выконання і косты токеноў або запытаў па боку функцыйнаых рэзультатаў. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі траекторыя пераходзіць з дэмаверсіі ў спакульнаныя сераўысы.
3. Агентскі рой
Этап „3 Agent Swarm“ працюе найкраща, калі яго розглядаць як вимерную паверхню. Зафіксавце адна „золатая“ транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Зберагаеце настройкі пазначэнныя за межамі коду прыемленае. Файлы сераўіснага сераўісу, хранілішчы секрэтных дадзеных і флагі функцый должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных. Зберагаеце стан графа ў простам і типаваным формате. Вярнутыя структуры дадзеных маскуюць інфармацыю пра тое, канкрэтны вузел запісаў канкрэтную палатку, і спакойваюць працу пасля перарываў.
from langgraph_swarm import (
create_handoff_tool,
create_swarm,
)
## We'll have to redefine our all agents to include the handoff tool
weather_expert = create_agent(
model=llm,
tools=[
get_weather,
create_handoff_tool(
agent_name="technical_analyst",
description="Transfer for technical analysis related questions"
),
create_handoff_tool(
agent_name="fundamental_analyst",
description="Transfer for fundamental analysis related questions"
),
],
name="weather_expert"
)
technical_analyst_agent = ...
fundamental_analyst_agent = ...
swarm_workflow = create_swarm(
[fundamental_analyst_agent, technical_analyst_agent, weather_expert],
default_active_agent="weather_expert" #a default agent must be specified.
)
swarm = swarm_workflow.compile()
Калі трэба вжываць swarm?
Метод «Калі час викорыстоўваць стадію» працуе найкраща, калі яго спрыявае можна змерыць паверхня. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і прыметку па адвярненню роботы перш чым расширваць масштаб. Дакументавайце як шлях успеху, так і шлях вяснавання разам. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пасляднім дапрацоўкам. Храніце стан графа ў простым і типаваным формате. Вярнутыя блокі маскуюць, який вузел запісаў канкрэтны поле, і спакшуюць продовжэнне роботы пасля перарываў. Метод «Калі час викорыстоўваць стадію» працуе найкраща, калі яго спрыявае можна змерыць паверхня. Зафіксавайце адны ідеальны прыклад, адзін прыклад неудачы і прыметку па адвярненню роботы перш чым расширваць масштаб. Спрыяйце цій стадіі як кантракту межаў вхідных дадзеных і перакананых выходных рэзультатаў. Даці назвы артыфактам, задаць критэрыя успеху і адмовіцца ад беззвучнага частковага завершэння.
4. Сістэмы з мнагацелевымі агентамі Blackboard
Для стадіі 4 Blackboard Multi Agent неабяжна ўзначыць вхідныя даны, абавесць крока і крэтыры завершэння пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Запісваць час выконання і кост токеноў або запытаў праза функцыйнае рэзультат. Відкрытыя даны пра косцы запобегаюць неспакоўным рахункам, калі парадок пераходзіць з дэмавай версіі ў спяльныя сераўры. Прабаваць людзкую апрацоўку для тых крокаў, якія витрачаюць грошы або зменяюць даны для працы. Працэс складання коду не ўзначае повнайсткіўнасці бізнес-процэса.
a. Чорная дошка
Для этапа на дошцы знакоў неабходна пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры зміне коду. Аператары должны магчыма было перзапускать крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Конфігурацыю трэба залічыць параду ад коду прыкладнення. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцыяй должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Прызначыць людскія апраўдкі для рэшэнняе, якія витрачаюць грошы або зменяюць даны у працэсе виробніцтва. Праця ў часе компілявання не є гарантыяй полнайасобнасці бізнес-процэсаў.
class Blackboard(TypedDict, total=False):
query: str
# Problem frame
problem_framed: bool
ticker: str | None
location: str | None
wants_technical: bool
wants_fundamental: bool
# Specialist panels
technical: dict | None
fundamental: dict | None
environmental: dict | None
# Integrated solution
synthesis: str | None
# Control state
next_knowledge_source: str | None
cycles: int
b. Істочнікі знаёмасцей
У стадії b «Адыянальныя выкладнікі» перад зменым коду неабходна адзначыць вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна аддзекуванне як «гарага працэйскага падходу», так і «працэйскага падходу да вярнення». Перапрыбуткі, людзкіе перакрыцця і обробка некоректных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Неабходна людзкая аправа на тыя крокі, якіе витрачаюць грошы або зменяюць даны працэйскага процесу. Прыўязка на час компілявання не є прамаравамым паказателем полнайшага адпрацоўвання. У стадії b «Адыянальныя выкладнікі» перад зменым коду неабходна адзначыць вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяць гэтай стадіі як даговору межа вхіднымі данымі і аправяраннымі выходнымі рэзультатамі. Назваць всі элементы, адзначыць критэрыі успеху і не прабаваць прыймать часткова завершаныя рэзультаты без падтверджэння.
def can_analyse_technicals(board: Blackboard) -> bool:
return (
board.get("ticker") is not None
and board.get("wants_technical", False)
and board.get("technical") is None
)
c. Компанента кантролю
Калі працуеце на стадзіі c. Компанента кантролю, спачатку запісайце умовы: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Запісвайце час выканання і кост токена або запыту праза функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя среды. Зробіце перапаказ пасля дорогіх крокаў. Функцыя адновлення не должна зноў нарахоўваць кост той самай вызову LLM, калі аператар прабуюць зноў запрацаваць пазнейшы вузел.
def control_component(board: Blackboard) -> dict:
eligible = [
source
for source in KNOWLEDGE_SOURCES #these are subagents
if source.precondition(board)
]
if not eligible:
return {"next_knowledge_source": None}
chosen = max(
eligible,
key=lambda source: source.priority,
)
return {
"next_knowledge_source": chosen.name,
"cycles": board.get("cycles", 0) + 1,
}
inspect → identify eligible specialists → activate one
→ contribute → inspect again
Выкананне ўмышлена абарочнае
Калі працуеце зэтап адкрытага выканання, які ўсвядомленаа последовальны, спачатку запішыце умаву: неабяжныя даны, сигнал успеху і тое, што выходзіць пад час частковага нявыпання. Такі список пераконтрацеў дапамагае залічваць змяны ў кодзе чыста. Зберагайце настройкі праза код аплікацыі. Файлы сяродавішча, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць без неабяжнага чытання всіх элементаў. Стварайце контрольныя пункты пасля дорогіх крокаў. Функцыя вярнення працы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да наступнага элемента.
Калі трэба вжываць архітектуру „чорнай дошкі“?
Калі працуеце над этапам «Калі трэба выкарыстоўваць», спачатку запісайце умовы кантракту: неабходныя данні, сігнал успеху і тое, што выходзіць у разе частковай нявыполнення. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Документавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є частью продукту, а не пазнейшым дапрацоўкам. Стварайце контрольныя пункты пасля дорогіх крокаў. Система не должна занова ставіць плату за той самы вызыв LLM, калі аператар перапрыбуе пазнейшы вузел. Калі працуеце над этапам «Калі трэба выкарыстоўваць», спачатку запісайце умовы кантракту: неабходныя данні, сігнал успеху і тое, што выходзіць у разе частковай нявыполнення. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрыятлівае ставленне да гэтага этапу як да кантракту межа даннімі і перакананымі выходамі. Дайце назвы элементам, задаце критэрыя успеху і не падтрымайце тыхню частковую завершэння.
5. Актар-Крытык (Адверсарыя) мнагаагентныя системы
5-а модель актар-крітык у адверсарскім мультіэтапнам формате працюе наяўней, калі яе розглядаць як вимерную паверхню. Перш чым расширваць масштаб, зафіксавайце адны ідеальны прыклад, адну справу з бягам і прыміткі па поверненню да пачатковага стану.
actor → critic → judge
↑ |
└──── revise ─────┘
a. Актар
Сцэна актора працюе наяўней, калі яе спрыяваць як мерыемую паверхню. Запісаце адна «золатая» транскрыпцыю, адин прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Храніце настройкі пазыром ад коду прыемліка. Файлы сераўіса, сховішчы секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць адбавляць контроль без неабяжнага чытання всіх дадзеных. Храніце стан графа у простам і типаваным формате. Вкладзеныя блокі дадзеных маскуюць інфармацыю пра тое, який вузел запісаў які поле, і спакоююць продаж чытання пасля перерываў.
def actor(state: AdversarialState) -> dict:
if state.get("latest_critique") is None:
prompt = f"Produce a first draft.\n\nTASK: {state['task']}"
else:
prompt = (
"Revise the current draft.\n\n"
f"TASK:\n{state['task']}\n\n"
f"CURRENT DRAFT:\n{state['draft']}\n\n"
f"CRITIQUE:\n{state['latest_critique']}\n\n"
f"JUDGE'S PRIORITY:\n{state['latest_verdict']['focus']}"
)
draft = llm.invoke(prompt).content
return {
"draft": draft,
"round": state.get("round", 0) + 1,
}
b. Крітык
Этап крітыка працюе найэфективней, калі яго спрыяваць як меравальную паверхню. Зафіксавайце адны ідеальны прыклад, адну справу абяцку і запіс пра выканэнне ролбеку перш чым расширваць масштабы. Документавайце як шлях успеху, так і шлях вярнення ў нормальны стан. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не наступным этапам дорабатка. Храніце стан графаў у простам і типаваным формате. Вярнутыя структуры маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакшуюць продовжэнне роботы пасля перарываў. Этап крітыка працюе найэфективней, калі яго спрыяваць як меравальную паверхню. Зафіксавайце адны ідеальны прыклад, адну справу абяцку і запіс пра выканэнне ролбеку перш чым расширваць масштабы. Спрыявайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задайце критэрыя успеху і адмовіцеся ад беззвучнага частковага завершэння.
class Issue(BaseModel):
severity: Literal["blocking", "major", "minor"]
description: str
class Critique(BaseModel):
issues: list[Issue]
summary: str
def weighted_issue_score(issues: list[dict]) -> int:
weights = {
"blocking": 5,
"major": 2,
"minor": 1,
}
return sum(
weights[issue["severity"]]
for issue in issues
)
c. Суддзя
Для стадіі рэшэння суддзейскага пытання неабяжна ўсунуць непазначанасці: прадзеяўнікаваць усі вхідныя даны, абярнучы ўсе крокі, і задаць критэрыя завершэння пры перадзмене коду. Аперацыйныя працавнікі павінны магчымае перадзрабатваць крокы з вядомага пункта контролю, не прымушаныя здагадвацца пра схованы стан. Запісваць час выконання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя среды. Неабяжна атрымваць пашчаткованне чалавека для тых крокоў, якія выкарыстоўваюць грошы або зміняюць даны ў працэсе виробніцтва. Кампайляванне коду не ўзначае абоўсюднай завершанасці бізнес-процэсаў.
class Verdict(BaseModel):
decision: Literal["accept", "revise"]
reasoning: str
focus: str
def judge(state: AdversarialState) -> dict:
verdict = llm.with_structured_output(Verdict).invoke(
[
HumanMessage(
content=(
"Evaluate the critic's findings on their merits. "
"Accept if only minor issues remain. "
"Request revision only for blocking or material problems.\n\n"
f"DRAFT:\n{state['draft']}\n\n"
f"CRITIQUE:\n{state['latest_critique']}"
)
)
]
)
return {
"latest_verdict": verdict.model_dump(),
}
Чаму все ўсё ж неабяжны стацыонарны нагляд
Кабы з’ясаваць, чаму певны этап ўважаецца критычным, неабходна прадзефінаваць вхідныя даны, адпаведальную за ўжоўэнне гэтага этапу особу і критэрыя завершэння пры перадзмене коду. Аперацыйныя працавнікі павінны магчымае перазапускаць гэты этап з вядомай точкі контролю, не прабуючы спадарацца пра схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыкладнення. Файлы сераўнавання сяродовішча, храненні секрэтных данных і флагі функцыйяў павінны быць у аднам месца, якое працавнікі можуць пераглядаць, не чытаючы весь код. Прызначайце людскія апраўленні для тых рэштоў, якія выкарыстоваюць грошы або зміняюць даны у працуючай сістэме. Прыўязкі, якія ствараюцца пад час компіляцыі, не є гарантіяй полнайасобнасці бізнес-процэсаў.
round 1: 12
round 2: 8
round 3: 8
round 4: 9
def watchdog(state: AdversarialState) -> dict:
round_number = state.get("round", 0)
scores = state.get("issue_counts", [])
if round_number >= HARD_ROUND_CAP:
return {
"halt_reason": "hard round cap reached",
}
if len(scores) >= STALEMATE_WINDOW:
window = scores[-STALEMATE_WINDOW:]
if window[-1] >= window[0]:
return {
"halt_reason": (
f"stalemate detected: {window}"
),
}
return {}
Фіналізацыя павінна разлічваць успех ад невыпадковасці
Для завершэння неабяжна разгранічыць стадію успеху, задаць вхідныя даны, адміністратара крока і критэрыя завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае перайсці на гэты крок з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення да нормальнасці. Перапрыбуткі, людзкія пераказы і обробка некоректных паведамленняў є часткай продукту, а не дадатковым доўнесенням пазнейша. Неабяжна атрыбут людзкага затверджэння для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны прадукцыі. Працэс складання коду не є эквівалентам повнай бізнес-готовасці. Для завершэння неабяжна разгранічыць стадію успеху, задаць вхідныя даны, адміністратара крока і критэрыя завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае перайсці на гэты крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрацавляйце з гэтай стадіяй як з контрактом межаў вхідных даных і перакананых выходных рэзультатаў. Назвіце артыфакты, задаць пераказы успеху і адмовіцеся ад беззвучнага частковага завершэння.
Іон.
Калі трэба выкорыстоўваць архітектуру протывнасупернічання?
Калі працуеце над пытаннем «Калі трэба выкорыстоўваць», спачатку запісайце умовы: неабходныя данні, сигнал успеху і тое, што выходзіць пад час частковага невыпання. Такі список дапамагае заліцвачыць змяны ў кодзе. Запісуйце час выканання і кост токенаў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі праця пераходзіць з дэмаверсіі ў спакульнаныя сераўсы. Стварайце контрольныя пункты пасля дорогіх крокаў. Функцыя вярнення не должна занова ставіць плату за той самы вызыв LLM, калі аператар перапрыяўляе роботу да пазнейшага вузла.
Выбір архітектуры
Калі працюеце над стадзіяй «Выбор архітектуры», спачатку запісайце умовы кантракту: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список контроля дапамагае заліцвачыць змяны ў кодзе пазнейша. Зберагайце настройкі за межамі коду прыемліка. Файлы сераўіснага сераўісу, хранілішчы секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аудыт без неабяжлівага чытання всей структуры. Ставьце контрольныя пункты пасля дорогіх крокаў. Система вярнення праблемы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да наступнага вузла.
Заключныя меркі
Калі працюеце над стадзіяй «Заключныя мыслі», спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пазнейшым дапрацоўкам. Ставіце контрольныя пункты пасля дорогіх крокаў. Система вярнення не должна зноў выклікаць той самы кантакт з LLM, калі аператар перапрыбуе пазнейшы вузел. Калі працюеце над стадзіяй «Заключныя мыслі», спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконвае ў тым, што пазнейшыя змены коду будуць чыстымі. Спрыймайце гэтую стадзію як кантракт межа даннімі і перакананымі выходамі. Дайце назвы элементам, задаце критэрыя успеху і не падтрымайце тыхню частковую завершэннасць.
Контрольны список для эксплуатацыі
Этап перагляду канцэлкі працюе найэфектывней, калі яго спрыяваць як мерыемую структуру. Запісаўце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы.
Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшаў, прычына неудачы павінна вказываць на аднойчыную адпаведальнасць, а не на заплутаную ланцюговую структуру.
Дзеянне графа павінна быць простым і типаваным. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў.
Калі бюджет дазволяе, дадзіце тэст на базовую працездатнасьць, які пераглядае критычны шлях у системе CI з викорыстаннем фіксатываў, а не рэальных платных API.
Спрыяваць этап як даговор між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
Дзеянне графа павінна быць простым і типаваным. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перарываў.
Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце способы абяроны. У спільных средах неабходны ліміты частоты запытанняў, пераконтроўкі прав на выкарыстоўванне ресурсаў і чысткі власнік для змены секрэтных даных. Валіце простую надзейнасць працы над крэатывнымі, але разовымі дамаваннямі.
Прыметкі для f6f8c689c406: не кладзіце ключы прадаўцаў у репазітарый, задаце ліміт токенаў на кожную сесію і зберагачыце транскрыпты празаўседы ў фіксы для ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.