求教!怎么尽量使大模型生成结果保证确定性,可复现

LZ最近在给甲方做一个文档校审工作流,审核逻辑挺复杂的,各种关联绕啊绕。现在是功能都做完了,但是有个很麻烦的结果体验问题:
这里的校审可以粗略分为规则校审跟LLM校审
用户每次跑同一个文档,规则审核的结果是一致的,但大模型校审给的意见可能每次会有点不一样。
甲方要是拿两次结果对比,感觉肯定会被怼啊。 :innocent:
我理解 LLM 本身就有随机性,除了我们能调的参数,背后还有很多控制不了的细节在浮动,感觉完全没法根治(温度跟top_p都拉满也没用)。试过一些工程上的优化,但都是治标不治本。现在已经在考虑直接在界面上挂个提示tips算了(解决不了就直接把问题抛出来hhh :enraged_face:)。求大佬们指点,有没有啥靠谱的思路啊!

拉满吗?印象里这个是数字越大随机性越大
拉到最低才对吧

不过这个确实没办法模型都有随机性,挂个tips,只要不太离谱就行了

是的,就是温度拉到0,top_p干到1哇,我的表述有点问题 :smiling_face_with_tear:
我现在就是想挂tips,没法子的话我就要想法子对甲方以理服人了 :dotted_line_face:

因为大模型本身就是做概率预测,一个掩耳盗铃的做法是把规则审核的结果也塞进Prompt里,否则不可能达到一致性,但是糊弄甲方足够了。

温度 0 + 固定 seed 只是基础,GPU 浮点并行和模型版本迭代都会让输出漂移,严格意义上的可复现基本做不到。更务实的做法是分层:规则校审兜底做确定性判断,LLM 只处理规则覆盖不到的灰色地带;再给 LLM 输出加结构化约束(比如 JSON mode)+ 后校验,不合格式直接重试。对甲方演示时可以加一层结果缓存,相同输入直接返回历史结论,既稳定又省成本。

直接保存输入输出对,然后缓存击中直接就不打 LLM 了,按照缓存输出 ()
如果输入一样要保证输出一样,那就不用打 LLM 了 :bili_040:

启用thinking时不接受温度和top_p参数吧,我这边做法是指定json schema再根据结果本地渲染

是的,我现在的想法就是对结果加缓存了,但是总感觉跟业务逻辑有些冲突,这就真的有点掩耳盗铃了,此招不可轻易使用 :dotted_line_face:

再sleep一下再给结果 :innocent:

保存 token per second,然后按原样原速输出 :bili_040:

本地部署可以做到,但会影响性能

常用引擎的一些batch编排会损害一些可重现性,需要单独设置,各种引擎都有

本质上llm是确定的,只有采样是可能随机的

温度temperature 往低了调
固定 seed
top_p越低,候选范围越窄

很难, 因为你需要做到全流程复现, 然后给一个 bellard 的解法: LibNC: C Library for Tensor Manipulation 他自己写了一个库, 做到了 Fully deterministic: return the same results at each run.
一般人就不要想这种解法了.

不知道,但是我在想缓存第一次的答案下来,然后第二次假装思考了但是还是第一次的输出

技术上很难,产品上其实可以,同一个机构提交的针对同一件事情的结论,可以直接缓存返回或者把上次的报告当成输入上下文和最新报告一起给模型,然后加个提示词避免微小改动变更结论。