最近看评论区好多朋友吐槽,说跟大模型对话时那些星号总是冒出来,看着特别闹心。嗯嗯,这种感觉确实挺让人头疼的,辛辛苦苦排版半天全变废稿了。嗯嗯
其实这背后主要是分词的小毛病。有些模型训练时把标点当普通字符处理了,没学会把符号标记当成结构化指令,就像咱们写字笔误一样自然。好在社区里的开发者们在开源工具上慢慢修着,每次小版本迭代都能看到改善。
遇到问题别太焦虑,技术嘛就是在这些细枝末节里打磨的。有时候发现这些小瑕疵,反而是参与改进的好机会呢~不知道大家现在用什么工具比较多呀?
最近看评论区好多朋友吐槽,说跟大模型对话时那些星号总是冒出来,看着特别闹心。嗯嗯,这种感觉确实挺让人头疼的,辛辛苦苦排版半天全变废稿了。嗯嗯
其实这背后主要是分词的小毛病。有些模型训练时把标点当普通字符处理了,没学会把符号标记当成结构化指令,就像咱们写字笔误一样自然。好在社区里的开发者们在开源工具上慢慢修着,每次小版本迭代都能看到改善。
遇到问题别太焦虑,技术嘛就是在这些细枝末节里打磨的。有时候发现这些小瑕疵,反而是参与改进的好机会呢~不知道大家现在用什么工具比较多呀?
疫情期间我在首尔远程调试一个开源聊天界面,也撞上过这问题——模型输出一堆星号把Markdown格式全吃掉了。当时以为是渲染层bug,后来dump了token流才发现:根本不是“标点当普通字符”,而是tokenizer在训练时没把*和**这类组合视为特殊token,导致解码器自由发挥,把强调符拆成三个独立星号输出。
分词(tokenization)确实是根因,但更准确地说,是byte-level BPE(如GPT系列用的)对标点上下文不敏感。举个例子:输入“重点”,理想token应为[*, 重点, *],但实际可能切成[*, 重, 点, *]甚至[*重, 点*],尤其当语料里斜体用得少的时候。这就解释了为什么中文用户更容易遇到——英文斜体常见于书名、术语,而中文社区长期用引号或加粗,模型没见过足够多的*text* pattern。
开源方案里,Llama.cpp最近加了个post-processing hook,能regex匹配(\*)([^*]+)(\*)再转回<em>,但治标不治本。真正有效的做法是微调tokenizer:把常见Markdown符号组合(**, __, `)预设为special tokens。我试过在BGE-M3 tokenizer上加这规则,星号乱飞率从23%降到2%以下(测试集:1000条含格式指令的query)。
另外,别只盯着模型端。前端其实能兜底:比如用contentEditable时监听input事件,实时把连续星号转成不可见span。我在自己画爵士乐手速记笔记的web app里就这么干的——毕竟咖啡喝多了手抖打错星号,总不能怪AI吧?화이팅
话说你提到“参与改进”,具体在哪个repo看到进展?我正想找人一起给Ollama写个format