Галоўная / Артыкулы / Практычныя прытамулкі: Агент локальнай падтрымкі з SmolLM3: режым раздумаў, інструменты та

Практычныя прытамулкі: Агент локальнай падтрымкі з SmolLM3: режым раздумаў, інструменты та

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

1641 слоў

Існавайце гэта як перапрацоўку ідэй з кнігі “A Local Support Agent with SmolLM3: Think Mode, Tools, and When Not to Reason” для аператараў: чыстыя этапы, арранжаваныя блакі коду і прыметкі па вяснаванню, якія застаюцца пасля перадачы. Этап Апглэву лепш працюе, калі яго спрыяваць як вимерную паверхню. Запісаўце адна ідеальная транскрыпцыю, адзін кейс неудачы і прыметкі па адвярнуцьцю перад тым, як расшырваць масштаб. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і адмовіцеся ад безсловеснага частковага завершэння.

Настройка

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

Выбор между Think і no_think — гэта рашэнне праекта

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

messages = [
    {"role": "system", "content": "/no_think"},
    {"role": "user", "content": prompt},
]
tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=False,  # the /no_think flag in the system prompt wins if both are set
)
<|im_start|>assistant
<think>

</think>
final = re.sub(r"<think>.*?</think>", "", raw, flags=re.DOTALL).strip()
<tool_call>
{"name": <function-name>, "arguments": <args-json-object>}
</tool_call>
TOOLS = [
    {
        "name": "lookup_order_status",
        "description": (
            "Look up the current status, estimated delivery date, and carrier "
            "for a specific customer order. Call this when the customer mentions "
            "an order number or asks where their order is."
        ),
        "parameters": {
            "type": "object",
            "properties": {
                "order_id": {
                    "type": "string",
                    "description": "The order ID, usually in the format ORD-XXXXXX.",
                }
            },
            "required": ["order_id"],
        },
    }
]
ORDERS = {
    "ORD-4821": {"status": "shipped", "eta": "June 18, 2026", "carrier": "DHL"},
    "ORD-3307": {"status": "processing", "eta": "June 20, 2026", "carrier": None},
    "ORD-1190": {"status": "delivered", "eta": None, "carrier": "FedEx"},
}
def respond_with_tools(user_message: str) -> str:
    messages = [{"role": "user", "content": user_message}]
    turn1 = generate_reply(messages)
    name, args = parse_tool_call(turn1)
    if name == "lookup_order_status":
        result = lookup_order_status(**args)
        messages += [
            {"role": "assistant", "content": turn1},
            {"role": "tool", "content": json.dumps(result), "name": name},
        ]
        return generate_reply(messages)
    return turn1
<tool_call>
{"name": "lookup_order_status", "arguments": {"order_id": "ORD-4821"}}
</tool_call>

Электронны тыкет — гэтае месца, дзе памерла наўмовітная петля

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

<tool_call>
{"name": "lookup_order_status", "arguments": {"order_id": "your_order_id"}}
</tool_call>

Абсаргі, які не выкаліваюцца

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

ORDER_RE = re.compile(r"^ORD-\d{4,}quot;)
PURE_TOOL_RE = re.compile(r"^\s*<tool_call>(.*?)</tool_call>\s*quot;, re.DOTALL)

def parse_executable_tool_call(output: str):
    cleaned = re.sub(r"<think>.*?</think>", "", output, flags=re.DOTALL).strip()
    match = PURE_TOOL_RE.match(cleaned)
    if not match:
        return None
    payload = json.loads(match.group(1).strip())
    order_id = str(payload.get("arguments", {}).get("order_id", "")).strip()
    if not ORDER_RE.match(order_id):
        return None
    return payload

Што гэта не дазваляе падтвердзіць

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

Запускайце

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

python llm-learning/smollm3-local-support-agent/code/think_vs_nothink.py
python llm-learning/smollm3-local-support-agent/code/support_agent.py
python llm-learning/smollm3-local-support-agent/code/support_agent_guarded.py

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

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

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

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

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

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

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

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

Прыметка для 0e44ad944ff5: не кладзіце ключы прадаўца ў репазітарый, задаце верхнюю межу токенаў на сесію і зберагачыце транскрыпты празаўсёды пад фікстурамі eval, каб пазнейшыя замены модэляў заставаліся пораўнанымі.

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

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

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

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

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

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

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

Дзеянні па забезпечэнню безпекі 3/868: вымерайце час выканання, класію каштоўкаў і колькасць выкарыстоўваных токенав для гэтай практыкі, а потым выберыце, чы робіць змены на адной основе фіксаванага набора пытанняў, а не на адной лячбе.