模型文件声明¶
使用 inspect_model_artifact(CLI:inspect-model-artifact)检查本地 GGUF v2/v3 或 safetensors 文件。检测基于内容(包括 GGUF 字节序),而非扩展名。REA 不加载模型、不解释权重、不运行推理、不导入 Python、不打开外部数据引用,也不使用网络。
不支持的 GGUF 版本仍会被拒绝。其诊断信息保留四个版本字节以及两种 UINT32 解释,并注明字节序未知,而不是从未识别的小端值推断大端。小端 v2/v3 和大端 v3 仍然支持;大端 v2 仍被拒绝。
rea inspect-model-artifact /absolute/path/model.gguf --json
rea inspect-model-artifact /absolute/path/model.safetensors --hash full --json
CLI 默认生成完整的 Evidence。如需紧凑交付并可移植地访问所有保留的观测结果:
rea inspect-model-artifact /absolute/path/model.gguf \
--detail summary --evidence_output /absolute/path/model-evidence.json --json
身份与读取¶
默认的 hash: "header" 只读取元数据和张量目录。结果记录精确选定的路径、文件大小、头部长度、头部 SHA-256、已读取字节数和读取范围。GGUF 对齐填充不在此前缀内。artifact.sha256 和 Evidence 主体为 null:头部摘要并非对权重的承诺。不同的文件可能具有相同的头部和大小。报告的 GGUF 张量数据偏移量在存在填充时跟随对齐后的张量目录。对于在目录处结束的零张量纯元数据文件,该偏移量即目录结束位置;并不暗示存在张量载荷。部分对齐间隙会被拒绝。header_length 仍以目录结束,在任何填充之前。
hash: "full" 额外将剩余文件字节流式传入 SHA-256。它返回完整文件摘要和 Evidence 主体,同时保留相同的头部摘要。它使用有界缓冲区,不解释张量数据,但确实会读取整个文件。因此成本随文件大小增长。两种模式在完成前都会检查描述符与所选路径的身份及元数据;这能检测观测到的替换或修改,但无法检测绕过文件系统元数据检查的对抗性修改。
如果完整文件哈希在任一格式的头部已被验证后失败或被取消,部分 Evidence 会保留已解析的元数据和张量目录。头部覆盖完整;摘要和最终文件身份仍然未知。Safetensors 头部解析是原子的,因此在验证之前中断不会暴露未验证的 JSON 行。
事实与选定查询¶
GGUF 报告版本、字节序、对齐方式、类型化元数据,以及每个张量的名称、原始类型 ID、维度、相对数据偏移量、文件偏移量和推导出的字节长度。对齐方式接受所有为正的、八的倍数的 UINT32 值,包括非二的幂。验证通过后,部分 Evidence 会保留显式对齐;默认对齐在元数据完成后变为已知。取消操作会保留已完成的声明,但其摘要未知且最终文件身份未经验证。元数据键保留其拼写,并使用由点、下划线或连字符分隔的小写 ASCII 字母数字组件;标准数字组件如 general.base_model.0.name 会被保留。连字符组件因兼容已发布的 llama.cpp v0.7.0 写入器而保留,该写入器会生成诸如 gpt-oss.context_length 和 wavtokenizer-dec.context_length 的键;当前 GGUF 规范 将 general.architecture 值限制为字母和数字。这记录了与书面限制相冲突的生成器输出,而非声称规范允许连字符。参见固定的 WAVTOKENIZER_DEC 和 GPT_OSS 架构名称、上下文长度键模板 以及 写入器方法。标量元数据完整。数组具有声明的元素类型、数量以及每个数组最多八个预览元素,并带有显式的 preview_complete 标志。这包括分词器词汇表:省略的值不会静默表示为完整数组。字符串为 UTF-8;64 位整数元数据和所有形状维度使用十进制字符串,不进行舍入。非有限浮点元数据使用 NaN、+Infinity 或 -Infinity,并带有其声明的浮点类型;负零为 "-0"。未知张量类型保留其数字 ID 和 null 字节长度;受影响的每类型和总体字节总计仍然未知。
Q8_1(类型 ID 9)有两种已发布的布局:llama.cpp b1500 中每 32 个元素 40 字节,以及固定的 现代 ggml 布局 中每 32 个元素 36 字节。两者均使用 GGUF v3 和量化版本 2,因此这些声明不会选择存储布局。REA 保留已知类型、形状、参数数量和起始偏移量,并带有 byte_length: null、storage_validation: "unknown"、部分存储/范围覆盖,以及对非空 Q8_1 张量的显式限制。受影响处的每类型和总体字节总计仍然未知。填充、下一个张量的偏移量和文件大小无法确定布局;保留的查询保持同样的不确定性。空的 Q8_1 张量仍然具有推导出的零字节长度,并且已知的 32 元素行块约束仍然强制执行。
K-quantization ID 10–15 也具有不兼容的已发布布局。b1500 构建选项 LLAMA_QKK_64 选择 GGML_QKK_64;同一发布的默认版本和 b3001 使用 256 元素块。b1500 结构 给出了这些源自源代码的大小:
| ID | 稳定名称 | 每 64 个元素的字节数(K64) | 每 256 个元素的字节数(K256) | 256 个元素在任一布局下的填充后长度 |
|---|---|---|---|---|
| 10 | Q2_K | 24 | 84 | 96 |
| 11 | Q3_K | 28 | 110 | 128 |
| 12 | Q4_K | 38 | 144 | 160 |
| 13 | Q5_K | 46 | 176 | 192 |
| 14 | Q6_K | 54 | 210 | 224 |
| 15 | Q8_K | 76 | 292 | 320 |
两个构建版本都写入 GGUF v3 和量化版本 2。量化器 直接从所选的 llama_ftype 写入 general.file_type,而不对 K64 构建选项进行编码。GGML_QNT_VERSION_FACTOR 在头文件中定义,但此 GGUF 序列化路径并不使用它。全局文件类型也无法标识单个张量类型:量化器会保留未选中的张量。写入器将每个负载填充 到默认的 32 字节对齐;最后一列说明了为什么即使是相同的文件范围也无需区分这些布局。
REA 保留每个 K 类型的名称,并强制使用通用的 64 元素行倍数,但这并未建立存储块大小。非空的 K 张量长度及受影响的总数现在未知,包括常见的现代文件。空的 K 张量仍然具有推导出的零字节存储。
整数 ID 也在每次添加 IQ 类型时发生了移位。以下已发布的 ggml.h 快照均声明为 GGUF v3 和量化版本 2:
| 已发布的快照 | I8 ID | I16 ID | I32 ID |
|---|---|---|---|
| b1500 | 16 | 17 | 18 |
| b1803 | 17 | 18 | 19 |
| b1871 | 18 | 19 | 20 |
| b2100 | 19 | 20 | 21 |
| b2172 | 20 | 21 | 22 |
| b2221 | 21 | 22 | 23 |
| b2253 | 22 | 23 | 24 |
| b2275 | 23 | 24 | 25 |
| b2300 | 24 | 25 | 26 |
上游 PR 6050 后来明确固定了整数值。现代 ID 16–23 分别表示 IQ2_XXS、IQ2_XS、IQ3_XXS、IQ1_S、IQ4_NL、IQ3_S、IQ2_S 和 IQ4_XS。因此每个 ID 16–25 都有多种已发布的含义。REA 保留其数字 type_id,对 type 使用 AMBIGUOUS_<id>,并在限制中记录已发布的候选名称。非空字节长度未知。空的声明仍然推导出零字节存储,但其文本标识仍然模糊。类型过滤器与报告的 AMBIGUOUS_<id> 标签匹配。ID 26 在这些快照中保持为 I32;后来的稳定条目保留其现有解释。本次审计并未确立与每个生产者分支或未来修订版的兼容性。
清单不会从模型名称、全局文件类型、填充或猜测的生产者来源中选择历史布局。源代码修订版连同其构建配置可以确立外部布局事实;这些头文件不携带该标识,且 REA 当前没有布局选择输入。编写的回归测试夹具使用上述来自源代码推导的大小;未运行历史可执行文件。
Safetensors 报告头部范围、精确的字符串 __metadata__ 值、dtype、形状和声明的数据范围。空的 __metadata__ 被视为已省略;在读取器的 32 层 JSON 嵌套限制内,张量条目上的未知字段会被忽略,同时必需的 dtype、形状和数据偏移量仍会被验证。JSON 重复键、无效的 UTF-8、文件外范围、重叠、间隙、尾部未索引数据以及已知的 dtype/形状字节长度矛盾,都会以类型化的 file_format_rejected 约束被拒绝(公共代码 target_unavailable,类别 unsupported_target)。缺失、非常规或无法使用的所选路径同样是 target_unavailable;对有效选择的主机 I/O 或资源故障(如 EMFILE 或 EIO)则属于 execution_failure,并在 details.diagnostics 中记录路径和原因。支持空张量和标量形状。读取器将形状维度保留为精确的无符号 64 位值,包括当零范围使存储为空时超过 JavaScript 安全整数范围的值。形状乘积按声明顺序检查,与64 位上游读取器一致;后面的零不会消除先前的乘积溢出。实际文件和数据的偏移量仍必须符合精确的主机偏移精度。打包的亚字节类型需要完整的字节存储。未知的 dtype 保留声明的范围和显式限制,即形状到存储的验证不可用。每个张量记录 storage_validation: "consistent" | "unknown";当无法检查该一致性时,coverage.storage_sizes 仍保持部分状态。张量过滤器接受这些 storage_validation 状态,与 dtype 或名称无关。
参数计数和按类型统计的总数是从声明中派生的,而非对有效参数或推理行为的度量。共享或重复的权重不会被去重。GGUF 维度保留其原始的 fastest-first 顺序;safetensors 形状保留 JSON 顺序。Safetensors 张量行使用名称顺序;GGUF 行使用目录顺序。索引标识的是其集合和头部摘要中的声明,而非张量内容或跨版本匹配。GGUF 支持零范围和标量形状,最多四个维度;已知的量化类型仍要求第一维度包含完整块。
MCP 默认返回紧凑摘要:包含计数、选定的简短标题元数据、聊天模板存在性(默认或具名模板内容)以及派生总计。仅有名称的 tokenizer.chat_templates 清单不能确立模板内容。完整的类型直方图和所有行仍保留在完整的 Evidence 中。标题元数据使用短键/类型和标量值;长值或复合值仍可通过显式元数据查询获取。使用返回的 parent_evidence_id:
{
"source": {
"kind": "retained-evidence",
"evidence_id": "<parent_evidence_id>"
},
"view": {
"kind": "model-artifact",
"collection": "tensors",
"names": ["token_embd.weight", "output.weight"],
"fields": ["name", "type", "shape", "file_offset", "byte_length"],
"offset": 0,
"limit": 32
}
}
若要在初始检查中回答已知问题,请将不带 kind 的相同选择作为 inspect_model_artifact 的可选 view 传入,例如 {"path":"/absolute/path/model.gguf","view":{"collection":"tensors","names":["token_embd.weight"],"fields":["type","shape","file_offset"]}}。这将返回一个包含紧凑模型上下文的所选页面,并保留完整的源 Evidence,从而避免再次调用工具。view 要求交付摘要;完整详情与选择会被视为冲突选项而拒绝。CLI 使用 --view '{"collection":"tensors","names":["token_embd.weight"]}' 搭配 --detail summary --evidence_output FILE。
如需更多页面,请使用上述历史查询对象调用 inspect_analysis_view。collection: "metadata" 接受精确的 keys、索引、字段和分页;可用于 tokenizer.chat_template 或分词器数组预览。collection: "types" 对派生的存储和参数总计进行分页,并接受精确的 types。张量页面同样接受 types。过滤器取交集;省略过滤器表示所有已记录行,空数组表示无匹配。每一行都保留其源范围内的索引。名称、键和类型标签遵循字段选择;fields: [] 仅返回索引。省略字段则返回所有已记录列。紧凑警告使用共享的有界视图预算,并在消息被省略时链接到完整的父级 Evidence。页面偏移量计算过滤后的匹配项,而行索引保留其原始范围。每个页面都携带源标识、头部覆盖范围、数组省略、未知项及父级 Evidence 链接。
页面读取的是历史保留事实,无需重新打开模型。完整 Evidence 也可以通过 source: {"kind": "evidence-file", "path": "/absolute/path/model-record.json"} 以内联方式或作为单条经过认证的 Evidence JSON 记录提供。CLI Evidence 捆绑包包含 records 数组;在使用保留查询之前,请使用 import_evidence_bundle 导入捆绑包,或将一条完整记录保存为独立的 Evidence 文件。捆绑包不是单条 Evidence 记录。会话持有已验证的索引,直到该 Evidence 被释放;不存在实时文件结果缓存或自动新鲜度声明。导入的报告必须保留位置索引以及唯一的名称、键和类型标识;格式错误的报告会在索引之前返回类型化输入错误。
边界与不支持的输入¶
读取器每个提供者仅允许一次活动检查。它强制执行 100,000,000 字节的头部上限(safetensors 将其声明的 JSON 字节与固定的八字节长度前缀分开计数;GGUF 计数完整头部),并在保留行或展开字符串之前设置独立的 32 MiB 保留表示预算。数值乘积使用精确整数运算。GGUF 遵循其四维张量布局,并将元数据数组嵌套限制为 32 层。资源拒绝是类型化的,而非作为完整的空清单返回。取消会加入描述符终结流程;失败的清理仍由持有者保留以供重试。
不支持 PyTorch pickle 和 ZIP 模型反序列化;请使用可信的外部工作流进行转换,并提供 GGUF 或 safetensors。ONNX、TFLite、Core ML、模型执行和转换不在本操作范围内。
格式参考:GGUF specification、 ggml tensor layouts、 safetensors format。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea