☰
本地AI自动生成库存盘点表:从零构建可复用落地链路
2026/10/16 11:20:04 网站建设 项目流程

先交代一下背景。前阵子帮一个做零售的朋友处理季度库存盘点,仓库里SKU三千多个,盘点单来自两个渠道:一部分是扫码枪导出的文本,一部分是盘库的人用手机拍的货架照片。往年这种活儿要拉两个实习生干三天,最后还要手工对账改错。这次我把整个过程改成“本地AI自动生成盘点表”,从原始记录到最终带差异的盘点表,一个晚上跑完,第二天上午复核,下午出了结果。

这篇文章就是这次操作的一次完整复盘。核心思路是用本地运行的智能模型,把杂乱的盘点记录自动整理成结构化表格,再直接落地成电子表格文件。为什么讲究“本地化”?因为库存成本、供应商价格、销售数据都是商业敏感信息,走外部接口心里不踏实,而且盘点很多时候在仓库现场,网络环境不稳定。本地化处理意味着数据不出设备,速度自己掌控,一套流程跑熟之后随时能用。文章会讲链路怎么搭、提示词怎么写、脚本怎么调、坑在哪里,全部按可直接复制的标准写。

这件事适合谁参考?如果你是电商小团队、零售门店、制造业仓库的管理人员,或者已经在用电子表格记账但每次盘点都头疼的运营同学,这篇文章可以给你一条完整的落地路径。

1. 先把问题看清楚:盘点表到底难在哪

1.1 盘点数据源天生就是“脏”的

库存盘点表的原始输入,几乎没有干净的时候。我把常见的数据来源梳理了一遍,基本逃不过这几种形态:

  • 扫码枪或PDA导出的TXT、CSV文件,字段顺序不固定,有些带库位有些不带,编码规则还不统一。
  • 现场手写单据,回到办公室再人工录入。字迹潦草和漏项是常态,一张单子上“数量”没写完全是家常便饭。
  • 手机拍的照片,货架标签、外箱喷码、系统截图,全靠人工认,识别过程还会引入各种错字。
  • 群里报上来的数字,格式千奇百怪,还有“大概”“左右”这种口语描述。
  • ERP系统导出的账面数,编码规范,但和以上现场数据处于两个世界,完全对不上格式。

传统做法是人肉把这些来源全部统一到一张表里:先判断每个记录是哪个商品、哪个库位、多少数量,再和账面数比对。数据量一旦上千行,两个小时起步,而且注意力一分散就出错。我见过最典型的一次事故:盘完后差异金额怎么都对不上账,最后发现是两个人对同一堆货重复录了两遍,一份数据混进了两行,谁也没看出来。

1.2 AI能替掉的是“整理”而不是“判断”

很多人以为AI生成盘点表就是把数据丢进去自动出结果,其实AI真正擅长的是替代中间那段又累又容易出错的整理工作。它做四件事:

第一,字段抽取。把一段口语记录“3排B区 瓶装水550ml 24瓶装 实盘3箱”拆成库位、品名、规格、单位、数量这几个字段。

第二,格式归一。把“瓶装水550ML”“瓶装水550毫升”“瓶装水 550ml瓶装”认成同一个东西,统一成一种写法。

第三,表格生成。按你指定的表头结构输出标准盘点表,含序号、库位、物料编码、品名、规格、单位、账面数、实盘数、差异、备注。

第四,初步校验。帮你标出明显异常的行,比如数量为负、单位不合理、品名疑似重复等。

判断“这家供应商的退货要不要冲减库存”这类业务决策,AI做不了,也不该让它做。把AI定位成“负责整理和格式化的干活的角色”,整套流程就清晰了。这个定位直接决定了后面提示词怎么写、校验程序怎么设计。

2. 链路搭建:本地化智能处理的方案选型

2.1 数据处理主链路怎么设计

我实际用的链路是五段式,每一段都有明确职责:

原始记录收集 → 文本预处理 → 本地AI解析整理 → 程序校验 → 生成电子表格

原始记录收集:扫码枪导出文件、现场照片统一丢到一个文件夹,照片先跑一遍OCR转成文本。

文本预处理:清洗特殊字符、把OCR错位的段落按行切开、文件编码统一成UTF-8。这一步用脚本做,不依赖AI,规则明确且速度极快。

本地AI解析整理:核心环节。把预处理后的文本按批次送进本地模型,带着定义好的字段结构和约束条件,让模型输出标准表格。

程序校验:对AI输出的结果做机器检查。数量字段能否转成数字、合计是否等于各明细之和、有没有重复行等硬性错误,全部在这一层拦截。

生成电子表格:最后用程序把校验通过的表格写成最终的电子表格文件,带表头样式、冻结窗格、差异标色。

为什么不让AI直接生成最终文件?因为AI输出的是文本内容,格式稳定性和计算能力都不可靠,数字合计这种事交给程序更稳妥。这个分工是整套方案的关键,所有可能产生“业务损失”的环节都必须由确定性程序兜底,AI只负责理解语义和整理结构。

2.2 为什么坚持本地模型

这里需要解释一下“本地化”三个字的考量。我见过不少人直接用外部接口处理库存数据,也不是不行,但我自己踩过几次之后还是切回了本地方案,原因有三点。

一是数据敏感。库存数量、采购成本、客户订单这些数据,很多企业连内网共享都要设权限,更不用说把数据送到外部接口去解析。本地模型所有请求都发生在自己电脑或内网服务器上,数据不出边界,这一条没有商量余地。

二是盘点场景的网络不固定。仓库往往在郊区,盘点现场有时候连手机信号都勉强,更不用说稳定调用外部接口。本地推理完全不依赖外网,断网照样干活,在仓库现场配合扫码枪直接可用。

三是长期成本可控。按调用量计费的外部接口,盘一次几千行数据,解析加汇总很快就产生不少费用。本地模型是一次性投入,硬件是自己的,电费几乎可以忽略,盘点频次越高越划算。

维度本地模型外部接口
数据隐私数据不出设备,完全自控需要上传第三方服务器
网络依赖完全不依赖外网必须保持联网
单批速度看硬件配置,秒级到分钟级一般秒级返回
长期成本一次性硬件投入,越用越省按量计费,量大有压力
可控程度可调参数、可换模型、可离线运行受平台规则和版本限制

本地模型的短板也摆在明面上:没有高端显卡速度会慢,小参数模型的理解能力弱一些,需要在提示词和预处理上多花功夫。但就盘点表这种字段固定、规则明确的任务,本地模型完全够用。

2.3 硬件和模型怎么配

先说结论:一台内存16GB的普通电脑就能跑,集显或没有独立显卡也能接受,只是速度慢一些。我自己测试用的是一台16GB内存加中端独显的机器,跑量化后的开源模型,每批几十条记录,单条反馈时间在几秒到十几秒,完全在可接受范围内。

模型参数规模建议优先考虑7B到14B的量化版本。参数太低,字段抽取和同物归一能力明显下降;参数太高,普通机器带不动。量化格式能显著降低内存占用,一张7B模型量化后大约占4到6GB,配合16GB内存比较稳妥。如果你只是偶尔盘一次,手头又是办公电脑,可以先跑最轻量的版本验证流程,不够再升级。

本地推理环境我用的是支持标准兼容接口的推理工具,启动后本机会开一个本地端口,程序用HTTP请求就能对话。这个兼容接口最大的好处是:以后从本机迁到内网服务器,或者换成更强的模型,调用代码一行都不用改,切换成本极低。

3. 实操:从一堆乱记录到一张标准盘点表

3.1 第一步:把原始材料变成“可投喂”的文本

这一步千万别省。模型处理的是文本,输入越规整,输出质量越高。我具体做了三件预处理:

一是把扫码枪导出的文件和OCR出来的文本统一转成UTF-8编码,避免中文乱码。数量不少的文件是GBK编码导出的,脚本里加一步转码能省掉后续所有乱码困扰。

二是用脚本把每条记录按行拆分,空行过滤掉,首尾空格清理干净。这一步虽然简单,但对提升AI解析准确率帮助很大。模型对“中间夹杂十几个空行和制表符”的文本,识别效果会明显下降。

三是给图片类记录加一行来源标注,比如“以下记录来自货架标签照片的OCR结果”,让模型知道上下文里可能有不完整的识别片段,解析时会更保守。

预处理脚本我用的是Python标准库加pandas。简单示例:

import pandas as pd import re def clean_line(line: str) -> str: line = line.replace("\t", " ").strip() line = re.sub(r"[\ufffd]", "", line) # 去掉乱码字符 return line with open("raw_records.txt", "r", encoding="utf-8") as f: raw_lines = f.readlines() clean_lines = [] for x in raw_lines: x = clean_line(x) if x: clean_lines.append(x) with open("clean_records.txt", "w", encoding="utf-8") as f: f.write("\n".join(clean_lines))

这段代码的核心逻辑很简单:制表符统一成空格,去掉乱码字符,删掉空行。运行一次之后,你会看到原始记录从“乱七八糟的堆砌”变成“一行一条的记录”,后面AI解析的准确率能提一截。

3.2 第二步:提示词是这套方案的核心

同样的模型,提示词写得好不好,盘点表的可用性能差出一大截。我经过多轮迭代,把提示词固定成了五个模块:角色定义、任务说明、字段结构、处理规则、输出格式。这套写法背后的逻辑是:角色让模型调用仓储场景的常识,字段结构限定输出边界,处理规则控制模型不要自作聪明,输出格式保证结果可直接程序解析。

下面是我实际使用的提示词模板,可以直接复制修改:

你是一位有十年经验的仓库盘点数据整理助理。 请将下面提供的原始盘点记录整理为标准库存盘点表。 字段要求: - 库位:原始记录中的货架/区域编号,没有则为"未知" - 物料编码:只保留原始记录中出现的编码,未出现则留空 - 品名:归一化后的物料名称 - 规格:体积/容量/数量/型号等信息 - 单位:箱/瓶/件/桶/公斤等 - 账面数量:ERP账面数,原始数据中没有则填写"未提供" - 实盘数量:现场盘点数,必须是数字,没有则为"缺失" - 盘点人:现场记录人,没有则留空 处理规则: 1. 品名归一:凡指向同一物料的表述都合并为同一个品名,如"瓶装水550ml""瓶装水550毫升""瓶装水 550ml"统一为"瓶装水 550ml"。 2. 不编造数据:物料编码、数量、库位等字段只能来自原始记录,缺失就按要求标记,绝不能自行补充或估算。 3. 不进行单位换算:原始记录用"箱"就用"箱",用"瓶"就用"瓶",不要自作主张统一换算。 4. 每条原始记录只生成一行盘点表记录,不合并同类物料,数量保持原样。 输出格式: 先输出Markdown格式表格,表头为: 序号|库位|物料编码|品名|规格|单位|账面数量|实盘数量|盘点人|备注 再输出一个"按库位汇总"的小表格,列为: 库位|记录条数|实盘数量合计 最后用一行文字说明:哪些行被你判定为信息缺失。 以下是原始记录: """ <粘贴原始记录> """

这个提示词有三个细节值得注意。第一,“不编造数据”这条必须放在显眼位置,并且明确说缺失字段怎么写,否则模型很容易脑补编码或数量。第二,“不进行单位换算”是为了防止模型把3箱改成72瓶,换算本身没错,但和原始单据对不上时会制造新的差异。第三,“每条原始记录只生成一行”是为了保证后续能和原始单据逐条核对,同类物料要不要合并放到程序阶段处理,不要依赖模型做合并。

3.3 第三步:用脚本调本地模型批量跑

手工一条条复制到对话界面也行,但上千条记录不现实。我写了一个简单的Python脚本,逐批把清洗后的文本发给本地推理服务,再把返回的Markdown表格保存下来。核心代码长这样:

import requests LOCAL_API_URL = "http://127.0.0.1:1234/v1/chat/completions" def ask_local_model(prompt: str) -> str: payload = { "model": "inventory-model", "messages": [{"role": "user", "content": prompt}], "temperature": 0.2, "max_tokens": 4096, } resp = requests.post(LOCAL_API_URL, json=payload, timeout=300) resp.raise_for_status() return resp.json()["choices"][0]["message"]["content"] with open("clean_records.txt", "r", encoding="utf-8") as f: records = f.read() full_prompt = PROMPT_TEMPLATE.replace("<粘贴原始记录>", records) result = ask_local_model(full_prompt) print(result)

temperature设成0.2是关键。我刚开始用默认温度跑,模型偶尔会把单位从“瓶”改成“罐”,还会在汇总表里自己加一行合计。温度压到0.2之后,这类“自由发挥”明显减少。做数据整理类任务,模型的创造力越低越好,它不需要有创意,它需要的是忠实。

批次大小同样要控制。上下文窗口有限,一次性塞太多记录容易被截断,截断之后后面的记录直接丢了,而且模型不会主动告诉你。我通常每批控制在60到100条,视模型上下文长度调整。宁可多跑几批,也不要贪多导致数据丢失。

3.4 第四步:程序校验,别信模型给的数字

AI输出内容之后,我会再跑一道程序校验。这一步是必须的,因为模型在复制数字和计算合计时偶尔会出错。校验我拆成四层:

字段完整性检查,逐行确认品名不为空、实盘数量是数字、库位格式符合预期。这一层过滤的是模型漏字段的问题。

一致性检查,把模型输出的“按库位实盘数量合计”和明细行重新求和的结果做对比,不一致就重新生成该批次。这一层防的是模型算错合计。

重复检查,把品名和规格拼接后去重,发现重复行就回头核对原始记录是不是重复录入。这一层防的是录入重复。

抽样核对,随机抽5%的行,回到原始记录人工复核,重点看编码和数量。这一层是对整体可信度做最后确认。

我遇到的情况是:90%以上的批次能一次通过,偶尔有一批合计对不上,重新送一次基本能修复。这种“模型输出加程序校验”的组合,比单纯信任模型输出稳健得多。省掉任何一层校验,都可能把模型的一个小幻觉变成差异表里的大问题。

3.5 第五步:输出最终盘点表和差异表

校验通过后,把结果组装成最终的电子表格文件。结构分三个工作表:盘点明细表、按库位汇总表、账实差异表。这次生成不交给AI,用openpyxl之类的库直接写,保证格式完全可控。

from openpyxl import Workbook from openpyxl.styles import Font wb = Workbook() ws = wb.active ws.title = "盘点明细表" headers = ["序号", "库位", "物料编码", "品名", "规格", "单位", "账面数量", "实盘数量", "盘点人", "备注"] ws.append(headers) for row_data in parsed_rows: ws.append(row_data) ws2 = wb.create_sheet("账实差异表") # 根据校验结果填充差异表内容 # 冻结窗格、加粗表头等样式设置 wb.save("2025年第一季度库存盘点表.xlsx")

差异表的计算口径我想多说一句。账实差异分数量差异和金额差异两种口径。零售和电商建议以数量差异为主,因为成本价波动会干扰判断;制造企业通常数量和金额都要看。不管选哪种,差异字段必须在程序里统一计算,不要依赖模型逐个算,效率和准确度都差很多。

4. 踩坑实录:本地AI盘点最常见的五个问题

4.1 模型脑补严重,编出了不存在的编码

第一次跑的时候我比较大意,提示词里只写了“整理成表格”,没写约束条件。结果模型把缺失的物料编码位置自动填成了类似“SKU-0089”的编号,还顺手编出了账面数量。这些数据如果直接用来对账,差异表会完全失真,库存盈亏判断会错得离谱。

排查思路很简单:先检查输出的物料编码是否和原始记录或ERP编码表匹配,匹配不上的基本就是编的。对策就是3.2节写的——增加“不编造数据”约束,同时要求缺失字段必须显式标注。实测加上这两条之后,脑补问题基本绝迹。

4.2 长记录被截断,后面几条消失

上下文窗口再大也有上限。第一次处理一份整文件的1200行盘点记录,输出到后半部分戛然而止。我还以为是模型卡住了,检查之后才发现是超出上下文长度,最坑的是已输出部分里最后几行还是截断的半句,不仔细看根本发现不了。

解决办法就是分片处理,按库位或按行数切成60到100条一批,每批独立生成。分片还带来一个额外好处:某批出错时,重跑成本只限于这一批,不影响其他结果。实测下来,分片之后截断问题彻底消失。

4.3 同一个东西三种写法,归一不彻底

“瓶装水550ml”“瓶装水550ML”“瓶装水 550毫升”这种差异,模型通常能处理。真正难的是业务层面的同一物品:“罐装汽水330ml”和“汽水罐330ml”,模型不知道这是同一个东西,因为名称本身就不一致。

我的办法是提前维护一张同义词对照表,把常见简称、别名、旧名称映射到标准品名,放在提示词里一并交给模型。例如:

标准品名对照(用于归一): =汽水罐330ml: 罐装汽水 330ml =汽水听装330ml: 罐装汽水 330ml =瓶装水550: 瓶装水 550ml

实测加上对照表后,归一准确率提升很明显。盘点范围固定的话,这张表会越用越顺手,平时发现新写法就加一行,属于典型的“一次投入,长期受益”。

4.4 OCR把数字识别错

照片里的货架标签,OCR最常见的错误是数字串识别错位,“330ml”变成“33Oml”,“20240115”变成“2024011S”。这类错误模型常常发现不了,因为它会把错字当成正常数据照单全收。

对策分两层。第一层在OCR后、AI解析前,用正则清理明显不合法的字符,比如规格字段里出现字母O的本应是数字的位置。第二层在程序校验阶段,对物料编码和批号做格式校验,比如批次号不符合日期规则的直接标记人工复核。别指望AI替你发现OCR错字,它只会忠实地把错字整理进表格。

4.5 单位混用导致汇总失真

实际盘点中,同一种物料可能有“箱”和“瓶”两种记录。提示词里特意加了“不进行单位换算”,但这只是AI解析阶段不换算,程序汇总阶段必须做换算。比如“瓶装水 550ml”有3箱(24瓶/箱)和12瓶的记录,分库位汇总时如果不统一单位,数量总和就是错的。

我的做法是在程序里维护一张换算系数表,汇总前先统一到最小单位,再换算回展示单位。这张表同样要人工维护,别指望模型或程序自动猜,猜错一次就会带偏整个差异表。

问题现象常见原因解决措施
编码被编造提示词缺少约束增加“不编造数据”规则,缺失字段显式标注
末尾记录丢失上下文窗口超限按60到100条分片处理
同物异名品名本身不一致维护同义词对照表放入提示词
数字错字OCR识别误差正则预清理加程序格式校验
汇总数量失真箱和瓶混用程序内维护换算系数统一单位

5. 从一次盘点到一套可以重复用的流程

5.1 模板沉淀比什么都值钱

做完这次之后,我把提示词、预处理脚本、校验脚本、输出脚本整理成了一个项目目录,每次盘点唯一要换的就是原始数据文件和同义词表。提示词模板经过这轮实际检验,字段结构、约束规则、输出格式都已经稳定,后面基本原样复用,每次最多根据盘点范围微调一下品名对照表。

我个人体会是,这套东西最值钱的不是模型本身,而是沉淀下来的模板和规则。模型更新换代,提示词和校验脚本改一改就能继续用;同义词表和换算系数表是业务资产,越攒越厚实,属于别人拿不走的积累。

5.2 从季度大盘点到日常小盘点

季度大盘点是低频场景,但日常小盘点更值得复用这套流程。比如每周对高流转SKU做循环盘点,原始数据量小,跑一次只要几分钟。我现在会把日常盘点素材统一丢进约定目录,跑定时脚本,早上到公司直接看昨天的差异明细表,有异常再人工介入。整个环节下来,人工投入从“专职半天”压缩到“核对十分钟”。

这种玩法能在小团队里落地的前提,是前面几步都足够稳定。如果每次都还要人工修提示词,那日常自动化的价值就大打折扣。所以先把季度盘点的模板跑熟,再谈日常化。

5.3 再往前一步:和出入库单据形成闭环

如果公司出入库已经有电子记录,这套本地化流程还能再扩一步:把每日出入库流水也交给模型做字段抽取,生成每日库存变动汇总,再和盘点差异表交叉验证。这样不仅知道“盘点时差了多少”,还能追溯“这段时间哪些单据可能录错了”。当然,这个扩展要看业务复杂度,单体门店直接上没问题,多仓多货主就要谨慎设计数据边界。

最后补充一个值得记住的小细节:所有批次的AI原始输出都保留一份,不要覆盖。后面如果对账意见不一致,能快速回溯当时模型是怎么解释这批数据的,省掉很多“当时到底怎么处理的”这种扯皮。

库存盘点这件事,听起来是脏活累活,但它恰恰是数据规则最清晰、最适合用本地AI提速的场景。只要链路搭对了、提示词约束住了、校验环节兜住底,你就能把原来好几天的加班压缩成几个小时,而且结果比人工整理更规整。下次盘点,不妨先拿一批旧数据试跑,通了20条样例再放到全量。我保证你跑完第一遍,就不想再回到纯手工对表的时代。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询