内容提要
近期两个 .NET 项目让 AI 直接输出程序可用的判断,而非文字。TensorSharp 用 26B 扩散模型实现 /v1/systemone,支持图片输入,单步读取概率,比生成 JSON 快 4-5 倍;IoTSharp 的 Sezika 用小编码器加决策头,纯 C# 实现,Native AOT 运行。两者接口相似但思路相反,都强调概率未经校准,需调用方自行评估。
延伸解读
两条技术路线的本质差异
TensorSharp 基于 26B 扩散模型,通过单步去噪从输出层直接读取概率,支持图片输入,适合需要视觉或常识的复杂决策;Sezika 则用小编码器加决策头,纯 C# 实现,Native AOT 运行,完全非自回归,适合高频、低延迟的简单判断。两者接口相似但实现相反,一个依赖大模型的多模态能力,一个追求轻量嵌入。
概率未校准:共同的风险提示
两个项目都明确强调输出概率未经校准,不能直接当作正确率使用。TensorSharp 在文档中提醒条件置信度不是经验校准的正确率,上线前需用自己的数据评估;Sezika 则将每个答案标记为 uncalibrated,并允许设置浓度门槛,不达标的答案标记为 abstained。这意味着调用方必须自行评估风险,不能盲目信任高概率结果。
不确定性的不同处理方式
TensorSharp 通过多次采样(samples: "auto")来应对不确定性,返回平均值并在 diagnostics 中提供一致性和标准误;Sezika 是确定性的,一次前向给出一个答案,但通过浓度门槛将低置信答案标记为 abstained,由调用方决定是否采纳。一个靠“多想几遍”,一个靠“明说不敢答”,体现了不同的设计哲学。
可复现性与工程约束
TensorSharp 提供 seed 但仅保证同环境可复现,不保证与 Python/NumPy 噪声一致;Sezika 没有随机源,依赖固定模型版本和完整 hash 校验链确保复现性。此外,TensorSharp 对图片输入有严格限制:最多 8 张 base64 内联图片,拒绝远程 URL 和本地路径,未加载视觉塔时返回 503,避免服务器被滥用。
Q&A
Jev 风格的做法和传统让大模型输出 JSON 再解析有什么不同?
Jev 风格不让模型“写”答案,而是直接从模型输出层把概率“读”出来。传统做法需要模型生成 JSON 文本,程序解析,格式错了还要重试;Jev 风格则通过预填答案模板、单步去噪读取候选词的 logprobs,直接得到概率分布,没有逐 token 生成和 JSON 解析,也就没有格式错误和重试。
TensorSharp 的 /v1/systemone 端点是如何实现单步读取概率的?
它基于 26B-A4B 的 DiffusionGemma 扩散模型,将 canvas 宽度缩到 16 或 32,预填答案模板(如 "billing": "?"),只跑一步去噪,然后读取空位上候选词的 logprobs 并归一化得到概率分布。同时采用稀疏输出投影,只计算答案位置和候选标签对应的几行,不分配完整张量,比生成 JSON 再解析快 4 到 5 倍。
TensorSharp 的图片输入功能有什么特别之处?
TensorSharp 支持在请求中加入 images 字段(最多 8 张 base64 内联图片),让图片直接参与决策。由于市面上的 DiffusionGemma GGUF 文件都是纯文本的,视觉塔被丢弃,TensorSharp 直接读取上游官方 checkpoint 的第 11 个 safetensors 分片(2.84 GB)来获取视觉塔的全部 356 个张量。如果服务器未加载视觉塔,收到带图请求会返回 503 明确拒绝,远程图片 URL 和本地文件路径也一律拒绝。
Sezika 的推理栈有什么特点?它是如何实现纯 C# 运行的?
Sezika 的推理栈完全用 C# 编写,包括 embedding、attention、RoPE、归一化、MLP 和决策头,不依赖 Python、PyTorch 或 ONNX Runtime。CPU 上有标量 FP32、SIMD FP32、W8A32 量化三条路径;GPU 路径在构建期用 ILGPU 将 kernel 编译成 PTX,运行时 Native AOT 程序通过静态绑定直接调 CUDA Driver 执行,以绕开与 Native AOT 不兼容的 ILGPU 运行时代码生成,且不使用 cuBLAS、cuDNN。
TensorSharp 和 Sezika 在处理“不确定”时有什么不同?
TensorSharp 遇到不确定的题会自己多读几次(samples: "auto"),最后给平均值,并在 diagnostics 中提供一致性和标准误。Sezika 是确定性的,一次前向只给一个答案,但允许设置最低浓度门槛,不达标的答案标记为 abstained,由调用方决定如何处理。一个靠“多想几遍”,一个靠“明说不敢答”。
TensorSharp 和 Sezika 的接口字段有哪些主要差异?
类型名上,TensorSharp 用 noul,Sezika 用 boolean。TensorSharp 需要将候选编译成具体 token 标签(布尔用 yes/no,choice 用 A/B/C…,score 用数字),并验证每个标签恰好占一个 token,否则拒绝请求;Sezika 没有这层编译,每题编码成固定 marker 序列,决策头直接打分。此外,TensorSharp 的 confidence 是条件分布中最大概率,Sezika 的 concentration 是归一化熵算出的集中度,两者不可比。
这两个项目都强调概率未经校准,具体是怎么体现的?
Sezika 把每个答案都标记为 uncalibrated,并在协议中提供校准状态字段;TensorSharp 在文档中专门写明“条件置信度不是经验校准的正确率,上线前请用自己的数据评估”。两者都不允许“概率高”自动等于“可以执行”,最终是否执行由调用方决定。