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