跳转到内容

字面输入与动态词表

ARTI 的字面运行时是一个 alpha API,建立在一个简单约束上:词表身份以刚性张量的形式在运行时传入。学习发生在这些张量之后的神经读取器和评分器中,而不是固化在用全局 token ID 索引的永久 embedding 行里。

字面字符串
→ 字形 / 控制 / 坐标张量
→ 动态词表 [K, ...]
→ 可学习键 [K, D]
→ 局部 logits [..., K]

输出 ID 只是本次调用所提供词表视图中的局部槽位。重新排列词表会以相同方式重新排列 logits,而不会改变词项本身的表示。

TextTensorRenderer 提供 Unicode 感知的布局,显式保留三类字段:

  • 字形外观;
  • 空格、制表符、换行/分页、零宽字符、连接符、BOM 和组合标记等控制通道;
  • 字符、行和页面位置坐标。

规范化模式可以是 rawNFCNFD。身份模式从字形优先扩展到针对控制字符和回退字形的辅助码点通道。该接口仍为 alpha,不应被描述为已经冻结的 tokenizer 替代品。

对于固定尺寸的视觉字面量,render_text_bitmap()render_text_vocab() 会生成位图张量,并提供碰撞、距离和熵检查。

import arti
layout = arti.render_text_layout("r\u200br")
sequence = layout.to_sequence_tensor()
vocab = arti.render_text_vocab(["strawbery", "strawberry", "strawberrry"])
report = arti.bitmap_vocab_report(vocab)
assert report.collision_count == 0

LiteralVocabModel 刻意解耦输入词表视图和输出词表视图。

import arti
import torch
input_vocab = arti.render_text_vocab(["a", "b", ""])
output_vocab = arti.render_text_vocab(["yes", "no", "?"])
ids = torch.tensor([[0, 1, 2]])
model = arti.LiteralVocabModel(
input_vocab_tensor_dim=input_vocab[0].numel(),
output_vocab_tensor_dim=output_vocab[0].numel(),
hidden_dim=64,
)
logits = model(ids, input_vocab, output_vocab)
assert logits.shape == (1, 3, 3)

LiteralInput 在当前输入视图下读取局部 ID;OutputLexiconContext 让隐状态在进入主体前观察可用输出范围;LiteralOutputHead 对提供的 K 个字面量执行最终动态 softmax。

输出词表既可以共享为 [K, ...],也可以批量提供为 [B, K, ...]。布尔 mask 支持填充后的按样本视图。LiteralVocabCache 可以在解码步骤间复用已编码键;推理时可 detach,训练编码器时则应在每次优化器更新后重建。

LiteralSequenceDecoder 可以把上下文状态——例如冻结模型的 BPE 级表示——桥接到当前提供的字面输出词表。它支持 teacher forcing、贪心生成、按样本 EOS 槽位、词表 mask 与一个小型张量原生拟合流程。

  • 它不定义应用的 tokenizer、语义、任务头或全局数据模式。
  • 词表张量或哈希不是发布者签名。
  • 字面与文本张量接口仍为 alpha;稳定 1.x 承诺仅覆盖稳定性与安全中列出的核心层接口。