首页 / 文章 / 实用提示:配备SmolLM3“思考模式”的本地支持代理、工具及

实用提示:配备SmolLM3“思考模式”的本地支持代理、工具及

《实用笔记》操作指南:使用 SmolLM3 的本地支持代理——思维模式、工具,以及适用于采用该模式的团队的合同、检查项和即插即用代码模块。

1641 词

可将此内容视为《使用SmolLM3的本地支持代理:思考模式、工具及何时无需推理》中理念面向操作员的重构版本:包含清晰的阶段划分、有序的代码模块,以及能在交接时保留的恢复说明。 将“概览”阶段视为可量化的界面使用效果最佳。在扩大范围之前,先记录一份理想的对话 transcript、一个故障案例以及回滚说明。 将该阶段视为输入与经过验证的输出之间的契约。为相关成果命名,明确成功标准,杜绝默许的半完成状态。

准备工作

在准备阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。除了功能结果外,还需记录执行时间以及令牌或查询成本。提前了解这些成本可以避免在从演示环境过渡到共享环境时出现意外费用。当下一步操作是编写代码或调用工具时,应优先选择具有架构验证的结构化输出,而非自由形式的文本。

使用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的批量处理说明:请将提供商密钥移出代码仓库,设定单会话令牌上限,并将日志存储在评估用示例文件旁,以便后续模型更换时保持数据可比性。

在处理强化安全性的第0阶段时,首先需明确相关规范:所需输入参数、成功标识,以及部分失败时的处理方式。这样的检查清单能确保后续代码修改的规范性。 同时记录正常流程与故障恢复流程。重试机制、人工审核环节以及错误处理方式都是产品不可或缺的部分,而非后续才需要补充的功能。

强化细节 0/868:测量该记录的耗时、错误类型以及令牌消耗情况,然后依据固定的问题集而非个人经验来判断是否保留该变更。

强化笔记的第1阶段若被视为可测量的对象,则效果最佳。在扩大范围之前,需记录一份理想案例、一个故障实例以及回滚说明。将此阶段视为输入与经过验证的输出之间的契约,为相关文档命名、定义成功标准,并拒绝默许的不完整处理。

强化细节 1/868:测量该记录的耗时、错误类型以及令牌消耗情况,然后依据固定的问题集而非个人经验来判断是否保留该变更。

在强化措施的第2阶段,应在修改代码之前明确输入参数、该步骤的负责人以及结束标准。操作人员应能够从已知的检查点重新运行该步骤,而无需猜测隐藏状态。 配置信息应置于应用程序代码之外。环境文件、密钥存储以及功能标志应集中存放于一个位置,这样操作人员无需查看整个系统结构即可进行审计。

强化措施细节2/868:需统计该措施的墙钟时间、错误类型以及令牌消耗情况,然后根据固定的评估标准而非主观经验来决定是否保留该变更。

在处理强化措施的第3阶段时,首先写下相关契约:所需的输入参数、成功信号以及部分失败时的处理方式。这样的检查清单能确保后续的代码修改保持一致性。 建议使用小型、可测试的单元,而非冗长的脚本。当某个步骤失败时,故障应能指向单一责任点,而非复杂的流程链。

强化措施细节3/868:需测量该步骤的运行时间、错误类型以及令牌消耗情况,然后依据固定的评估标准而非主观判断来决定是否保留该修改。