V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Need4more
V2EX  ›  问与答

大模型的 api 为什么设计成无状态的?

  •  
  •   Need4more · 2 天前 · 2739 次点击

    在看 openai 的 messages api ,发现客户端需要做大量得状态管理,来维护历史消息,为什么不和网站 cookie 一样弄个 sessionId 这样的状态字段。另外,聊天场景下,每次请求都携带重复的历史数据,得浪费多少带宽资源!

    请问,从技术角度分析这样设计的好处是啥?

    这是官方的 python 客户端示例:

    33 条回复    2025-06-05 07:45:35 +08:00
    zhlxsh
        1
    zhlxsh  
       2 天前 via iPhone   ❤️ 5
    无状态的好处,就是不需要保存状态。谜底就在谜面上。

    想象一下,你需要给一百个用户提供打扑克的出牌预测服务,每个人的步骤不一样,你需要保存这 100 个人之前出过的所有状态,如果谁中途掉了你还得一直保存,因为说不定他啥时候连上来。

    而如果是无状态的,每个人发出的请求里携带之前出过的人牌就可以了,只需要在客户端保存数据,而服务端每次只需要做都是当前状态的分析,结束就是结束了。你的代码只需要做一件事,已知出过的牌和手里的牌,预测最佳的出牌方法
    beyondstars
        2
    beyondstars  
       2 天前
    国外宽带资源不那么贵吧,然后,无状态便于水平横向拓展?容易 scale up?
    RedNax
        3
    RedNax  
       2 天前   ❤️ 2
    大概是因为和 AI 计算的消耗比起来,那点带宽根本不算钱吧。
    msg7086
        4
    msg7086  
       1 天前   ❤️ 1
    因为有 session 以后横向扩展更难,你需要维护一个 session storage 。

    而且在有 session id 的情况下你计算节点不还是要通过网络去 session storage 读取数据?这不还是要带宽?
    从用户的网络传历史数据对企业来说并没有多浪费啊。
    neteroster
        5
    neteroster  
       1 天前 via Android
    你是否在找:Responses API
    neteroster
        6
    neteroster  
       1 天前 via Android
    @neteroster 不过我不怎么喜欢 Responses API ,感觉整体还是无状态的设计比较好
    Ljxtt
        7
    Ljxtt  
       1 天前
    感觉是因为大模型本身就是无状态的吧。同时上下文是需要成本的,而且上下文大小也是有限制的,你可以自行决定怎么去处理上下文。
    allplay
        8
    allplay  
       1 天前 via Android
    @zhlxsh 这样能理解为什么 ai 在最终给出答案的时候才知道自己说出了不该说的话。用户利用这一点还能规避审查。比如让 ai 在答案中插入字符,拼音表示等等,扰乱。
    cowcomic
        9
    cowcomic  
       1 天前
    这个问题其实技术不是重点
    商业模式才是重点,有状态的话,怎么收费
    zx9481
        10
    zx9481  
       1 天前
    为了隐私?
    mumbler
        11
    mumbler  
       1 天前
    长期记忆太贵了,支持 32K 上下文就需要 150G 显存
    acorngyl
        12
    acorngyl  
       1 天前
    因为大模型本来就没状态。所谓的多轮对话和上下文,都是模拟出来的。你给个简单问题,大模型根据简单问题给个回答;给个带上下文的对话,大模型根据这个对话内容,给个回答。模型只有输入、输出的概念,没有轮的概念。这就是为什么 chat 刚出来的时候限制 50 轮对话了,问题超过 50 轮的拼接,大模型一次处理不过来。
    elevioux
        13
    elevioux  
       1 天前
    因为 llm 本身就是必须每次都提供完整的上下文,api 的设计只是反映了这一点而已。

    当然,各公司也可以在此基础之上再封装一层( api 或 sdk ),帮用户维护 session ,就看成本了。

    对我来说,提供完整上下文反而可能更灵活些,因为有些场景会对用户的输入或上下文进行修改。
    ckvv
        14
    ckvv  
       1 天前
    模型有上下文大小限制 1M 都没有
    zdl0929
        15
    zdl0929  
       1 天前
    wulili
        16
    wulili  
       1 天前
    应该就是出于成本考虑,如果额外加一层历史消息存储得浪费不少资源,那干脆就将问题抛给前端用户了,省时省力。
    不过感觉这种 api 设计迟早得改,不然随着以后上下文越来越长,每次带着一坨屎山一样的历史数据传来传去,带宽成本早晚得超过存储成本。
    maokg
        17
    maokg  
       1 天前
    没有什么是加一个中间层不能解决的,如果不行,就加两层
    irrigate2554
        18
    irrigate2554  
       1 天前
    无状态好处很多,我举例一个,比如你和 AI 进行了 5 轮会话,这个时候你感觉从第 3 轮开始有些跑偏了,想从第三轮开始重新对话,如果是有状态 API 这个挺麻烦的,要么设计回滚对话的 API 要么重新从第一轮开始进行对话(由于大模型的不稳定性你不一定能得到一样的对话),如果是无状态则很简单,删除 4 ,5 轮的对话记录继续对话就行。
    wnpllrzodiac
        19
    wnpllrzodiac  
       1 天前 via Android
    @mumbler 人脑值几百亿了
    jonsmith
        20
    jonsmith  
       1 天前 via Android
    可能是现在的 LLM 上下文不大,做 session 没有必要。等以后上下文越来越大,可能会做了。
    hwdq0012
        21
    hwdq0012  
       1 天前
    热知识:有状态服务可以通过 redis 之类的服务转换为无状态,弹性扩容更方便
    min
        22
    min  
       1 天前
    带宽值几个钱?
    Need4more
        23
    Need4more  
    OP
       1 天前
    @zdl0929 是的
    mumbler
        24
    mumbler  
       1 天前
    @wnpllrzodiac #19 人脑内存并不大,验证码超过 6 位都要分至少两次输入,背单词背课文更是困难,一会就忘了,记忆都是极其精简的摘要和画面,上下文不足 1K ,只不过人脑效率高,而且容错率极高,哪怕真错了也可以不承认
    Need4more
        25
    Need4more  
    OP
       1 天前
    @min
    @RedNax
    可是他们现在月活都超 5 亿了呀,这么大的流量不考虑带宽成本吗?
    个人感觉是历史遗留问题,早期纯文本对话这样设计不是问题,可是现在支持多模态,输入会包含图片、视频、文件了,带宽成本不容小觑!
    他们现在也有带状态的 api ,pdf 上传:
    https://platform.openai.com/docs/guides/pdf-files?api-mode=responses
    coefuqin
        26
    coefuqin  
       1 天前
    今年都加大权重的堆砌记忆能力了,还需要 web 的状态做什么。
    DTCPSS
        27
    DTCPSS  
       1 天前
    方便 scale
    wyntalgeer
        28
    wyntalgeer  
       1 天前
    因为状态在应用层,LLM 你把它理解成一个高级算法。你见过给 SDK/工具类/算法库加状态的?
    ipwx
        29
    ipwx  
       1 天前
    大模型的上下文是内部的某种 embedding 输出啊。。。

    ====

    这个 embedding 不同模型都不一样,同一个模型的不同版本都不一样。只有精确到某个版本、某个模型,才有可能存储这个真正的上下文。你调用的是通用接口,所以没办法拿到这个真正的上下文,那你只能把 history 再喂给它一遍,让它重新构造出这个内部上下文。

    有些模型有 streaming api ,一个合理的实现方法是客户端只存某个 id ,让服务器去存储这个上下文 context 。用 id 去关联 context 。但用户啥时候弃用这个 context ?多长时间过期?这些问题都很麻烦,特别是互联网场景,用户很多的情况下。所以很多 api 不支持 streaming 也很合理嘛。

    更何况如果你用着某个上下文,服务器那边模型更新了,瞬间原来的 context embedding 废了,进去就是一堆乱码,用户这不得骂娘,还不如浪费些算力让大模型重新看一遍历史。

    ====

    当然不得不存储 embedding 的场景也是有的,那种就叫做 rag 。这也算是一种折中:让大模型每次都看一遍整个资料库显然计算开销太大了,但是让大模型每次都把所有对话的 embedding 都存下来那存储(和检索)开销又太大了。那么不得已,就采用资料库的 embedding 存起来、对话不存 embedding 。这不是很合理么
    willchen
        30
    willchen  
       1 天前
    计费透明呗
    chanChristin
        31
    chanChristin  
       1 天前
    @Need4more #25 5 亿带宽成本高,那 5 亿的状态保存成本就不高了?
    sakeven
        32
    sakeven  
       1 天前 via iPhone
    别给无状态 API 找各种理由了,OpenAI 已经在主推 Responses API 了😁
    lan894734188
        33
    lan894734188  
       20 小时 22 分钟前 via iPhone
    因为综合来说 显存和运行性能划算 无状态还能吃你 input tokens
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   939 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:08 · PVG 04:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.