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

Практычныя нататкі: палявы даведнік па шматагентных архітэктурах

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

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

Крыніцы: A field guide to multi-agent architectures

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

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: не кладзіце ключы прадаўцаў у рэпазітарый, задаце ліміт токенаў на кожную сесію і зберагачыце транскрыпты празаўседы ў фіксы для ацэнкі, каб пазнейшыя замены мадэляў заставаліся пораўнанымі.