在 LLM 应用开发里,我们经常需要处理多轮消息、对话历史等结构化内容。理论上,这些对象应该是简单、透明、可控的——但在 NumPy 和特定字典工具(如 addict.Dict)参与后,一些微妙的行为会悄悄改变数据结构,让输出变得诡异甚至完全不对。本篇记录我在实际开发(尤其是 verl 与 transformers)中遇到的两个“小问题”:一个来自 NumPy 的自动维度推断,另一个来自字典工具的默认属性行为。它们不是 bug,却可能让你花一阵子 debug。
TL;DR
- NumPy 变长消息问题:当使用
np.array(..., dtype=object)处理长度不一致的消息列表时,NumPy 可能返回不同维度的数组,导致后续处理出错。改用np.fromiter或预分配 object 数组并赋值,可确保输出结构统一。 - 字典赋值工具干扰问题:使用
addict.Dict等动态字典工具包装消息数据时,其默认行为会干扰 transformers 对消息结构的正确判断,导致模板生成错误。可换用OmegaConf或修改addict源码禁用自动建键功能以修复问题。
