大家好,我发现当前一些前沿大模型存在一些问题,想跟大家分享一下
数学与代码混合时的幻觉问题
记录一次把数学和代码放在同一个提示词里,导致模型出错的案例
案例一
初始提示(p0)
如果输入下面这段提示:
make code implementation of sub rieman applied to mitigate hallucination in llm using lora, pretrained llm(such as qwen, mistral, llama,etc) and training pipeline in pytorch.
模型会生成类似这样的代码:
..._, singular_values, vh = torch.linalg.svd(centered.float(), full_matrices=False) # from gpt...对比情况
| 提示方式 | 结果 |
|---|---|
| 像初始提示 p0 那样,要求在 LLM 训练代码里实现子黎曼几何 | 生成的是用 SVDPCA投影等方法的代码 |
| 不要求把子黎曼几何写进代码,而是直接说“实现子黎曼几何”或“写子黎曼相关代码” | 能较好地生成涉及测地线等概念的代码 |
(子黎曼几何是几何学的一个分支测地线指的是两点之间的最优距离)
因为算测地线的成本很高实现也复杂,模型就改用了常见且便宜的 SVDPCA投影等方法但 SVDPCA投影并不属于黎曼几何
主要发现
只要求写纯数学内容的代码|`-- 代码写得不错
但如果是:
把代码和数学混在一起|`-- 模型会在用户不知情的情况下,擅自改掉要用的数学公式
再看:
让它实现子黎曼几何|`-- 实现得不错
可一旦:
把子黎曼几何和编程内容混在一起|`-- 就会出问题
换句话说:
如果只让模型写纯数学内容的代码,它写得挺好;但一旦把代码和数学混在一个提示里,它就会在用户不知情的情况下,擅自改掉本应使用的数学公式
同样,单独让它实现子黎曼几何,它也能做好问题出在把编程内容和子黎曼几何结合在一起的时候
案例二
如果让模型写使用隐空间潜向量的 LLM 训练代码,以我的情况来说,对于某个 nn 模块输出 z,它有时会写出让 |z| 等于 1 或者把 |z| 变小的代码
隐空间潜向量|`-- z:某个 nn 模块的输出 | |-- 让 |z| 等于 1 `-- 或者让 |z| 变小