下载目录里常见“最终版”“新建文档”“截图加一串数字”这样的文件名。直接让 AI 批量改名很危险:它可能猜错内容、覆盖同名文件,或者给出不适合 Windows 的名称。一个更稳妥的起点,是让本地模型只提出命名建议,再由程序和人工分别检查。

本文使用 Ollama 与官方模型库中的 qwen3:0.6b 标签,在 Windows 上搭建本地调用流程。任务只处理三条虚构文件名,不扫描磁盘、不读取正文、不执行重命名。成果是一份编号对应的建议清单,以及能拒绝非法名称的检查脚本。

本文核对了官方安装、模型与接口资料,但没有在本次制作中下载模型或运行推理。文中模型回答属于预期结构,不能当作实际输出或速度测试;后面的名称校验可以独立离线验证。

一、先确认本地运行是否适合你

Ollama 用于管理和运行模型,千问模型负责根据输入生成建议,两者不是同一款软件。这里采用本地模型标签和本机 API,不使用云模型标签,也不把云服务功能默认套用到本地环境。

官方 Windows 文档当前要求 Windows 10 22H2 或更新版本,并列出不同显卡的驱动与加速条件。安装程序本身至少需要四 GB 可用空间,模型还要另占磁盘空间。模型下载体积不等于运行内存需求,实际加载和响应速度要在自己的硬件上确认。

本例选小型标签是为了控制练习规模,不代表它能准确理解所有中文缩写。遇到“方案终版二”这样的名称,模型并不知道文件内容,更不能替你判断哪个版本应该保留。需要理解正文时,应另设有明确授权的读取与核验流程。

第一次安装和下载需要网络。若希望之后离线使用,应先确认模型已经完整下载,并在断网环境下自行测试本地调用;不要仅凭界面上写着本地,就宣布所有连接、更新或其他功能都不会联网。

二、安装 Ollama 并检查服务

从 Ollama 官方 Windows 页面进入下载,按官方安装程序完成安装。安装后打开新的 PowerShell 窗口,检查命令是否可用:

ollama --version
ollama list

前者显示客户端版本,后者列出本地模型。如果提示找不到命令,先关闭旧终端再重新打开,并确认安装是否完成,不要立即从不明网站下载同名程序。

Windows 应用运行时,官方文档说明本地 API 位于 localhost 的一一四三四端口。可以查看本机模型列表接口:

Invoke-RestMethod -Uri http://localhost:11434/api/tags

能收到模型列表说明接口可以连接,不代表指定模型已经存在或能够成功生成。连接失败时检查托盘应用是否运行;如果应用已启动,不要再重复启动多个服务,避免端口冲突。本文不要求修改监听地址,也不把接口开放到公网。

三、先安排模型存储位置

如果系统盘空间有限,先阅读官方文档的模型位置说明。Windows 版可以在当前用户环境变量中设置 OLLAMA_MODELS,指向准备好的模型存储目录;修改后需要完全退出托盘应用,再从开始菜单重新启动,让新设置生效。只关闭聊天窗口不一定等于退出后台应用。

更改之前记录原有位置和模型列表,确认目标盘可访问、空间充足,再按官方步骤操作。完成后重新运行列表检查与一次小请求;不要把环境变量已经写入,误认为旧文件已迁移或所有模型都能加载。首次练习也可以先保留默认位置,避免同时排查安装、存储和模型三个问题。

四、下载指定标签,不盲目换大模型

在终端执行官方模型标签对应的下载命令:

ollama pull qwen3:0.6b
ollama list

下载结束后,核对列表中确实出现 qwen3:0.6b,并记录实际显示的模型标识和大小。标签可能随维护发生变化,复现任务时应保留自己的运行记录,不把本文的标签当作永久不变的二进制版本。

官方标签页列出了相应模型文件与许可信息。若后续分发模型或用于商业项目,应阅读模型与运行工具各自的许可,不把“能下载”理解为任何用途都没有约束。本文不重新打包或提供模型网盘文件。

加载失败先检查可用内存、磁盘和官方硬件要求。较小标签仍可能因为环境不兼容而失败,也可能在某些电脑上响应较慢;不要为赶进度不断拉取更大的版本,导致磁盘和内存压力继续增加。

本地千问文件名建议从安装下载到本机调用再到双重核验的流程示意

五、把任务限制成建议清单

准备三条虚构数据,分别为 F1 对应“读书会资料最终.pdf”,F2 对应“花园观察截图.png”,F3 对应“摄影练习说明新建.docx”。编号只是稳定索引,文件本身并不存在,脚本不会打开这些文件。

要求模型保留扩展名,只整理已经出现在原名里的信息,不添加日期、姓名、版本优先级和文档内容。遇到无法判断的地方,应在理由中说明不确定,不能编造一个看起来更专业的名称。

先有编号映射,再考虑名称建议。 如果只返回三个新名字而没有编号,人很容易把建议套到错误文件。即使后续做真实整理,也应先生成可审核清单,并保留原始名称,不能根据模型数组顺序直接执行文件操作。

六、通过本机 API 请求 JSON

准备官方 Python 三环境。下方代码仅使用标准库,保存为 filename_proposals.py。Ollama 服务与指定模型准备好后,运行 python filename_proposals.py。

import json
import urllib.request
from pathlib import PureWindowsPath

FILES = {'F1': '读书会资料最终.pdf', 'F2': '花园观察截图.png',
         'F3': '摄影练习说明新建.docx'}
RESERVED = {'CON', 'PRN', 'AUX', 'NUL'} | {
    f'{prefix}{i}' for prefix in ('COM', 'LPT') for i in range(1, 10)
}

def validate(data):
    if not isinstance(data, dict) or set(data) != {'items'}:
        raise ValueError('expected items object')
    rows = data['items']
    if not isinstance(rows, list) or len(rows) != len(FILES):
        raise ValueError('wrong number of rows')
    ids, names = set(), set()
    for row in rows:
        if not isinstance(row, dict) or set(row) != {'id', 'name', 'reason'}:
            raise ValueError('wrong fields')
        ident, name, reason = row['id'], row['name'], row['reason']
        if not isinstance(ident, str) or ident not in FILES or ident in ids:
            raise ValueError('unknown or repeated ID')
        if not isinstance(name, str) or not 1 <= len(name) <= 100:
            raise ValueError('invalid name length')
        if name != name.strip() or name.endswith('.'):
            raise ValueError('edge spaces or dots')
        if any(c in '<>:"/\\|?*' or ord(c) < 32 for c in name):
            raise ValueError('invalid Windows filename character')
        if name.split('.')[0].upper() in RESERVED:
            raise ValueError('reserved device name')
        if PureWindowsPath(name).suffix.lower() != PureWindowsPath(FILES[ident]).suffix.lower():
            raise ValueError('extension changed')
        if name.casefold() in names:
            raise ValueError('duplicate proposed name')
        if not isinstance(reason, str) or not reason.strip() or len(reason) > 100:
            raise ValueError('invalid reason')
        ids.add(ident); names.add(name.casefold())
    return rows

def request_proposals():
    prompt = ('只根据原名整理文件名,不添加未知信息,保持扩展名。'
              '保留每个编号,遇到不确定情况在reason说明。'
              '输出JSON对象items,每项仅含id、name、reason。'
              '不要执行任何文件操作。输入:' + json.dumps(FILES, ensure_ascii=False))
    payload = {'model': 'qwen3:0.6b', 'stream': False, 'format': 'json',
               'messages': [{'role': 'user', 'content': prompt}]}
    req = urllib.request.Request('http://localhost:11434/api/chat',
        data=json.dumps(payload).encode('utf-8'),
        headers={'Content-Type': 'application/json'})
    with urllib.request.urlopen(req, timeout=180) as response:
        outer = json.load(response)
    if not outer.get('done') or outer.get('done_reason') == 'length':
        raise ValueError('generation incomplete')
    rows = validate(json.loads(outer['message']['content']))
    for row in rows:
        print(row['id'], FILES[row['id']], '=>', row['name'], row['reason'])

if __name__ == '__main__':
    request_proposals()

这里把 stream 设为 false,便于一次读取完整响应;format 设为 json,用来请求 JSON 格式。它不保证字段正确、文件名有效或事实可靠,所以仍然需要检查外层完成状态、解析内容并运行校验。

这个脚本没有重命名调用,也没有读取目录的逻辑。请求仅包含示例字典;不要自行替换成遍历整盘后自动执行模型建议的程序。本地处理同样需要范围控制,特别是涉及真实客户资料和多人共享目录时。

七、校验通过以后还要看什么

程序检查编号数量、未知编号、重复编号、名称长度、非法字符、保留设备名、扩展名变化和重名建议。例如 CON.pdf 会被拒绝,包含路径分隔符的名称也不会通过。

这些规则只覆盖本例中的常见问题,不是完整 Windows 文件系统命名验证器,更不证明某个名字适合真实目标目录。真实目录还可能已有同名文件、路径过长、权限受限或其他软件依赖原名。静态名称检查通过,不等于可以执行改名。

人工要核对三个问题:建议是否仍只表达原名已有信息,编号是否对应正确对象,以及“最终”“新建”这样的词删去后会不会丢掉有用线索。没有打开并核实正文之前,不要让模型决定哪个文件是正式版本。

预期输出应包含三个编号、三个保留扩展名的名称以及各自理由。具体命名不只有一个正确答案;如果模型把“截图”改成“检测报告”,即使通过格式校验,也应判为事实越界并退回修改。

文件名建议的编号扩展名非法字符检查与人工事实核验示意

八、常见故障与下一步

提示模型不存在,先用 ollama list 核对完整标签,再检查下载是否结束。接口连接被拒绝,先确认本机服务与端口,不要通过开放防火墙公网入口来解决本地连接问题。加载内存不足时,先关闭其他高占用程序并查看官方兼容说明。

响应很慢,先用一条简单输入检查能否完成,再增加到三条;第一轮可能包含模型加载开销,不能直接把这次耗时当作稳定推理速度。连接超时不代表改名已经执行,本例根本没有改名能力,也不应通过无止境重试掩盖问题。

JSON 无法解析或字段校验失败,保留报错与非敏感输入,重新明确只返回约定字段;不要删除校验让脚本继续。空白名称、未知日期和重复编号都是需要处理的失败,不是为了自动化可以忽略的小问题。

完成练习后,保存模型标签与实际标识、Ollama 版本、提示词、建议和审核理由。先把小任务做成可解释、可恢复的流程,再考虑真实文件的备份、冲突检测与人工确认界面。模型适合辅助整理,文件操作的责任和授权仍应由人明确控制。

官方参考资料