Галоўная / Артыкулы / Практычныя прыемы: стварэнне та адпрацоўка спецыяльнага модэлю з Azure ML, а пасля ўз’ём у сістэму

Практычныя прыемы: стварэнне та адпрацоўка спецыяльнага модэлю з Azure ML, а пасля ўз’ём у сістэму

Практычныя прыказкі: стварэнне та адпрацоўка спецыяльнага модэлю з Azure ML, а таксама інструкцыі па налагоджэнні: кантракты, перакрыцчы і месца для коду для команд, якія викорыстоўваюць гэты патэрн.

1928 слоў

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

Спачатку ментальны модэль

Калі працюеце над першым этапам «Ментальнага модэлю», спачатку запісайце умовы: неабяжлівыя данні, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае залічваць змяны ў кодзе чыста. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача должна вказваць на адну адпаведальнасць, а не на заплутаны ланцюг задач. Зберагаеце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перадзял у тое ж самае прамаргінале — частая прычына витрачання ресурсаў.

Прыямыя прычыны

Калі працюеце над стадзіяй прабэральных умов, спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўвае чыстасць пазнейшых змян у кодзе. Спрыятліва ставіцеся да гэтай стадзіі як да контракту межа даннімі і перакананымі выходамі. Дайце назву рэзультатам, задаце критэрыя успеху і не падтрымвайце тыхі частковыя завершэння. Зберагаце ў кешы стабільныя інструкцыі системы і схемы інструментаў. Перадача таго ж прамэра ёсць частым выклікам зношвання ресурсаў.

pip install azure-ai-ml azure-ai-projects azure-identity
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

ml_client = MLClient(
    DefaultAzureCredential(),
    subscription_id="<subscription-id>",
    resource_group_name="<resource-group>",
    workspace_name="<aml-workspace-name>",
)

Шаг 1: адучанне модэлю

Калі працуеце над стадзіяй адучэння з 1-го крока, спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцьварыць пазнейшыя змены коду. Запісвайце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца раней, таму не будзе неспакою, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Зберагаеце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перасылка ідэнтычных прамуслов ёсць частым выклікам для ресурсаў. Калі працуеце над стадзіяй адучэння з 1-го крока, спачатку запісайце контракт: неабяжлівыя даннэ, сігнал успеху і тое, што выходзіць пад частыя неудачы. Такі список контроля дапамагае заліцьварыць пазнейшыя змены коду. Аддокументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў ёсцю частынай продукту, а не пазнейшым дапрацоўкам.

from azure.ai.ml import command, Input, Output

train_job = command(
    code="./src",
    command="python train.py --data ${{inputs.training_data}} --model_output ${{outputs.model_output}}",
    inputs={"training_data": Input(type="uri_folder", path="azureml://datastores/workspaceblobstore/paths/churn-training/")},
    outputs={"model_output": Output(type="uri_folder")},
    environment="azureml://registries/azureml/environments/sklearn-1.5/labels/latest",
    compute="cpu-cluster",
    display_name="churn-model-training",
)
returned_job = ml_client.jobs.create_or_update(train_job)
ml_client.jobs.stream(returned_job.name)

2-й крок: зарэўнаваць адучаны модель

На другым кроку регистрацыі этапа найкращае працюе, калі яго спрыяваць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адин прыклад неудачы і прыметку па анулюванні змян перш чым расширваць масштаб. Валіце малыя, тэставаныя елементы замест большых скрыптаў. Калі крок не выйшоў, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Задаўце ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.

from azure.ai.ml.entities import Model
from azure.ai.ml.constants import AssetTypes

model = ml_client.models.create_or_update(
    Model(
        path=f"azureml://jobs/{returned_job.name}/outputs/model_output",
        name="churn-classifier",
        type=AssetTypes.MLFLOW_MODEL,
        description="Customer churn classifier, trained on 18 months of account history.",
    )
)

Крок 3: размістіце яго за кераваным канцэнтрам

Этап 3, які выконуецца пасля развертвання, працюе найэфектыўней, калі яго розглядаць як мерыябельную плошчу. Зафіксавайце адна ідеальная версія рэзультата, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Разглядзайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць критэрыя успеху і не падзеўляйцеся частым, непূরным выкананням задач. Задаць ліміт токенав на кожны раунд і на кожную сесію. Інструменты-агенты агрэсывна расширваюць контекст; жорсткія ліміты не дазволяюць дэмам ператварыцца на неспакоўлівыя рахункі.

from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment

endpoint = ManagedOnlineEndpoint(name="churn-endpoint", auth_mode="key")
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
deployment = ManagedOnlineDeployment(
    name="blue",
    endpoint_name="churn-endpoint",
    model=model,
    instance_type="Standard_DS3_v2",
    instance_count=1,
)
ml_client.online_deployments.begin_create_or_update(deployment).result()
endpoint.traffic = {"blue": 100}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()

Этап 4: паказваць, што все працуе, перш чым хтось іншы будзе з яго працаваць

На стадыі 4 «Пакутная перакананне» лепша працюе, калі яе розглядаць як вимерную паверхню. Зберажыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відразлівае паказанне костаў з’являецца перашкоду неспакою, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Задаце бюджет токеноў на кожны раунд і на кожную сесію. Агентныя інструменты агрэсывна расширваюць контекст; строгі ліміты не дазволяюць дэмаверсіям ператварыцца на неспакойныя рахункі.

import json

test_input = {"input_data": {"columns": ["tenure_months", "monthly_spend", "support_tickets"], "data": [[14, 89.50, 3]]}}
response = ml_client.online_endpoints.invoke(
    endpoint_name="churn-endpoint",
    request_file=None,
    deployment_name="blue",
    input_data=json.dumps(test_input),
)
print(response)

На стадыі 4 «Пакутная перакананне» лепша працюе, калі яе розглядаць як вимерную паверхню. Зберажыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных запытаў є часткай продукту, а не чымсь, што дадаецца пазней.

Шаг 5: абгорткі канцэнтраў як функцыя інструмента агента Foundry

Для пятага крока, пры зміне коду, спачатку неабяжна абгародзіць этап, задаць вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аперацыяныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не прабуючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына неудачы павінна вказываць на адзін конкрэтны элемент, а не на заплутаны ланцюг задач. Калі наступны крок — це код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з пераканальваннем схэмы, замест вольнага формата тэксту.

import os
import requests
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, Tool, FunctionTool
from azure.identity import DefaultAzureCredential

def get_churn_score(tenure_months: int, monthly_spend: float, support_tickets: int) -> dict:
    payload = {"input_data": {"columns": ["tenure_months", "monthly_spend", "support_tickets"], "data": [[tenure_months, monthly_spend, support_tickets]]}}
    resp = requests.post(
        "https://churn-endpoint.<region>.inference.ml.azure.com/score",
        headers={"Authorization": f"Bearer {os.environ['AML_ENDPOINT_KEY']}", "Content-Type": "application/json"},
        json=payload,
        timeout=10,
    )
    resp.raise_for_status()
    return {"churn_probability": resp.json()[0]}
func_tool = FunctionTool(
    name="get_churn_score",
    description="Predict churn probability for a customer given tenure, spend, and support ticket history.",
    parameters={
        "type": "object",
        "properties": {
            "tenure_months": {"type": "integer", "description": "How many months the customer has been active."},
            "monthly_spend": {"type": "number", "description": "Average monthly spend in dollars."},
            "support_tickets": {"type": "integer", "description": "Number of support tickets in the last 90 days."},
        },
        "required": ["tenure_months", "monthly_spend", "support_tickets"],
        "additionalProperties": False,
    },
    strict=True,
)
project = AIProjectClient(endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"], credential=DefaultAzureCredential())
tools: list[Tool] = [func_tool]
agent = project.agents.create_version(
    agent_name="retention-agent",
    definition=PromptAgentDefinition(
        model="gpt-4.1-mini",
        instructions="Help the team assess churn risk. Call get_churn_score whenever specific customer numbers are provided.",
        tools=tools,
    ),
)

Крок 6: запуск з початку да канца

Для выканання 6-го кроку неабяжна падзець на яго стадыі: перад змянайом коду трэба задаць вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аперацыяныя працавнікі павінны магчымае пераканаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Спрыяць гэтую стадыю як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даць назвы артыфактам, задаць перакананні на успех і адмовіцца ад тыхняе частковага завершэння без паведамлення. Калі наступны крок — гэта код або вызов інструмента, лепш выкарыстоўваць структураваныя выходныя даны з перакананнем схэмы, чым вольныя тэкстовыя форматы.

import json
from openai.types.responses.response_input_param import FunctionCallOutput

openai_client = project.get_openai_client()
conversation = openai_client.conversations.create()
response = openai_client.responses.create(
    input="A customer's been with us 14 months, spends about $90/month, and filed 3 tickets recently. Churn risk?",
    conversation=conversation.id,
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)
for item in response.output:
    if item.type == "function_call" and item.name == "get_churn_score":
        result = get_churn_score(**json.loads(item.arguments))
        follow_up = openai_client.responses.create(
            input=[FunctionCallOutput(type="function_call_output", call_id=item.call_id, output=json.dumps(result))],
            conversation=conversation.id,
            extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
        )
        print(follow_up.output_text)

Як гэта пасляўляецца да большага кантэксту

Для вярнення адказу на пытанне «Дзе гэта паслужыць у стадіі?» неабходна ўзгадка пра вхідныя даны, адпаведальнага за крок і крэтарыя выходу пры змены коду. Аператары должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выканання і кост токенаў або запыткаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Калі наступны крок — гэта код або вызов інструмента, лепш выкарыстоўваць структураваныя адказы з перакананнем схэмы, чым вольныя тэксты. Для вярнення адказу на пытанне «Дзе гэта паслужыць у стадіі?» неабходна ўзгадка пра вхідныя даны, адпаведальнага за крок і крэтарыя выходу пры змены коду. Аператары должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабходна аддзеўнаваць дакументацыю пра стандартны і адновальны патэрыны роботы. Перапробы, людзкія контрольны пункты і обработка некоректных запыткаў є часткай продукту, а не чымсь, што дадаецца пазней.

Аспекты вырабаткі пры падготовцы да запуску

Калі працуеце над аспектамі вырабаткі пры падготовцы да запуску, спачатку запісайте умовы контракту: неабяжлівыя данні, сігнал успеху і тое, што выканаецца у разы частковага невясковасці. Такі список контроля дапамагае залічваць пазнейшыя змены ў кодзе чыста. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, невясковасць должна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Зберагаеце у кэшы стабільныя інструкцыі системы та схемы інструментавання. Перадзесланне ідэнтычных даных — частая прычына зайвых витрацоў.

Што застаецца пасля гэтага

Калі працюеце над этапам «Дзе гэта застаўляе вас», спачатку запісайце контракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разы частковага нявыпання. Такі список пераконтроўкаў дапамагае заліцвачыць пазнейшыя змены ў кодзе. Спрыймайце гэты этап як контракт межа данымі і перакананымі выходамі. Дайце назву рэзультатам, задаць тэсты на успех і не падпішывайцеся на частковае завершэння без паведамлення. Зберагачыце у кэшы стабільныя інструкцыі системы і схемы інструментаў. Перадача ідэнтычных прамулкіў — частая прычына некароткага часу выканання.

Справы

Калі працюеце на стадыі Рэферэнсаў, спачатку запішыце кантракт: неабходныя даннэ, сігнал успеху і тое, што выканаецца у разы частковага нявыпалення. Такі список пераканальвае залічваць усі змяны коду адпаведна. Запішыце час выканання і кост токенаў або запытаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца рана, таму не будзе неспакою, калі працэс перейдзе з дамавайна на спяльныя среды. Зберагаце ў кэшы стабільныя інструкцыі системы і схемы інструментаў. Перадача тых самых прамэраў занова — частая прычына некалькіх разоў выкарыстоўвання ресурсаў. Калі працюеце на стадыі Рэферэнсаў, спачатку запішыце кантракт: неабходныя даннэ, сігнал успеху і тое, што выканаецца у разы частковага нявыпалення. Такі список пераканальвае залічваць усі змяны коду адпаведна. Аддзеўжыце дакументацыю як пра стандартны ход задачы, так і пра шлях ўстранення проблем. Перапрыбуткі, людзкія контралі і обработка некантактных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.

Чэк-ліст для эксплуатацыі

Этап перагляду канцэлекту працюе наяўней, калі яго спрыяваць як мерыемую структуру. Зафіксавайце адну ідеальную версію дадзеных, адны прыклад неудачы і запіс пра анулювання змян перш чым расширваць сферу дзеяння.

Зберагаюце настройкі пазырочна ад коду прыемліка. Файлы сяродавішча, хранільнікі секрэтных дадзеных і пазначкі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабяжнага чытання всіх дадзеных.

Установіце ліміты бюджэту на кожны раунд і кожную сесію. Інструменты з автонамным кераванням агрэсіўна расширваюць контекст; жорсткія ліміты не дазволяюць, каб дэманстрацыі ператварыліся на неспакоўныя рахункі.

Забезпечыце людзкую апраўдку для тых крокаў, якія витрачаюць грошы або зменяюць данні ў працэсе вырабніцтва. Праця ў часе компілявання не абавязкова значыць повную адпраўненасць бізнес-процэсаў.

Напісце кароткі путаводзіцель: як зменяць канфігурацыйныя ключы, як спрабаваць очысці чергу, як анулюваць пярэднія змены.

Спрытваце гэты ўраг як кантракт межа вхіднымі дадзеннямі і пасвярджанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і не падтрымвайце безсловеснае часткова завершэння.

Перад павышэнням рангу стака заморозьце версіі, зафіксуйце «золаты» транскрыпты для критычнага маршруту і падтвердзіце крокі для абраткі. У спадзяльных сэрвісах неабходны ліміты частоты запытоў, перакананні ў прыналежнасці і чыстае адпаведальнае аб’екта для змены секрэтных даных. Валіце надзейнасць працы над крэатывнымі разовымі дамазамі.

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