尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AI 回复比用户提问还早?一个空字符串引发的“时间倒流“
我今天在查 AI 聊天记录时看到一条很离谱的数据assistant message 的 created_at 竟然比触发它的 user message 还早。AI 难道会时间倒流当然不是。最后查下来根因居然是一个空字符串id 。项目背景:考虑需要快速开发,以及方便定位问题和拓展新需求,所以该项目的技术栈选用的是 Next.js Vercel AI SDK Supabase。服务端持久化消息:用户消息在流式响应前存,assistant 消息在 onEnd 回调里用 upsert(..., { onConflict: id }) 存。UI 一切正常,数据库里却是另一个世界。问题一:数据库里 assistant 消息的 id 是空字符串我在 Postgres 表结构中将 id 设置的属性为 primary key。PRIMARY KEY 隐含 NOT NULL,我以为空值必然被拦住。但是居然出现了毫无报错,但是 assistant 的 id 为空字符串的情况。后面我才发现,PRIMARY KEY 能拦住 NULL但拦不住 。在 Postgres 眼里 是一个合法字符串。想要真正的保护得加 CHECK 约束:ALTER TABLE chat_messages ADD CONSTRAINT id_not_empty CHECK (length(trim(id)) 0);问题二:为什么会出现 id 为空字符串的情况根因:AI SDK 只有在你传了 generateMessageId 时才会生成服务端消息 id。不传的话,SDK 内部直接兜底:messageId: messageId ! null ? messageId : 于是持久化回调里拿到的 responseMessage.id 就是 。start chunk 只有在你传了 generateMessageId 时才会带 messageId。不传的话,服务端这份 id 永远不会被覆盖。问题三:时间倒流的真相每一轮 assistant 消息的 id 都是 ,onConflict: id 的 upsert 让它们全部撞到同一行。用一个时间线看会更明显:事件写入 id数据库动作created_at第一次 assistant 回复INSERT 一行10:00第二次 user 提问msg_user_2INSERT 新行10:05第二次 assistant 回复命中同一个主键,UPDATE 旧行仍然是所以并不是 assistant 真的早于 user,而是第二次 assistant 回复没有创建新记录,而是覆盖了第一次那条 id 的旧记录。created_at 记录的是这行数据第一次 INSERT 的时间,不会因为后面的 UPDATE 自动变成当前时间。这就是时间倒流的真相:表面上是时间戳异常,本质上是所有 assistant 回复都被 upsert 到同一行,历史回复一直在被静默覆盖。这不是展示问题,而是数据丢失。那我们应该怎么办?核心修复是让服务端明确生成 assistant message id。比如:import { createIdGenerator } from ai; createAgentUIStreamResponse({ agent, uiMessages: messages, generateMessageId: createIdGenerator({ prefix: msg, size: 16, }), onEnd: async ({ responseMessage }) { await saveMessage(responseMessage); }, });这样 AI SDK 在创建 assistant response message 时,会给它一个稳定的服务端 id,onEnd 里拿到的 responseMessage.id 就不再是 。如果涉及续写已有 assistant 消息,再配合 originalMessages 使用,让 SDK 正确判断这次是在延续旧消息,还是创建一条新的 assistant 消息。数据库层也要加一道兜底,不要让空字符串 id 再混进来:ALTER TABLE chat_messages ADD CONSTRAINT id_not_empty CHECK (length(trim(id)) 0);前者解决源头,后者防止同类坏数据再次入库。最后这个 bug 反而验证了我当初的选型。我选 Vercel AI SDK 就是看中它够薄——出问题时可以直接读源码。这次从症状 → 持久化回调 → SDK 内部 → 根因,只花了几分钟。换成重型黑盒 Agent 框架,同样的问题可能要查比较久。几条教训:用 AI SDK 做服务端持久化,一定要传 generateMessageId(续写场景再加 originalMessages)PRIMARY KEY / NOT NULL ≠ 非空字符串我正在公开构建一个 AI 会议总结应用,这是开发记录的第一篇,后续会持续分享踩坑实录和从 demo 走向生产的全过程。欢迎关注,一起见证它上线。
RELATED

相关推荐

框架表示法 vs 产生式规则:5 个维度对比结构化与因果式知识建模

框架表示法 vs 产生式规则:5 个维度对比结构化与因果式知识建模

框架表示法与产生式规则:5个维度解析结构化与因果式知识建模的抉择在构建专家系统或业务规则引擎时,知识表示方法的选择往往决定了系统的表达能力、推理效率和维护成本。框架表示法与产生式规则作为两种经典的知识建模范式,分别代表了结构化思…

📅 2026/8/22 19:35:38
pandas多维聚合生产实践:滚动计算、列名扁平化与自定义函数规范

pandas多维聚合生产实践:滚动计算、列名扁平化与自定义函数规范

1. 项目概述:为什么多维聚合不是“加个groupby”就能搞定的事我在银行数据平台组干了八年,从最早用SQL写几十行嵌套子查询做客户分层,到后来带团队重构整个风险指标计算引擎,踩过的坑比写的代码还多。今天聊的这个主题——“多维聚…

📅 2026/7/18 9:48:31
NI HIL自动化测试05-测试环境的搭建

NI HIL自动化测试05-测试环境的搭建

软件的下载 NI 还是很Open的,下载相关软件很简单,不像dSPACE管理的那么严格,下个软件都那么费劲。登录NI官网,找到 包管理器下载完成后打开,直接在这里下载或者卸载相关的软件软件的安装软件安装顺序 Labview--…

📅 2026/8/3 3:17:13
MORE NEWS

更多资讯

📰

RapidJSON 入门实战:C++ 高性能 JSON 解析与生成的 SAX/DOM 双风格 API 全解

RapidJSON 入门实战:C 高性能 JSON 解析与生成的 SAX/DOM 双风格 API 全解 【免费下载链接】rapidjson A fast JSON parser/generator for C with both SAX/DOM style API 项目地址: https://gitcode.com/GitHub_Trending/ra/rapidjson RapidJSON 是腾讯开源…

📰

若依框架优化明细

序号时间优化内容优化原因备注12024-8-23com.ruoyi.common.core.domain中TreeSelect的增加code属性和其他对接时,如组织选择时,增加部代码功能22024-6-8minio配置修改为从数据库中来读取配置一套代码适合不同的用户使用32024-10-21优化企业微信配置从数据…

📰

Wasp 访问应用配置详解:Server 与 Client 配置对象、环境变量及源码级实现解析(v0.14)

Wasp 访问应用配置详解:Server 与 Client 配置对象、环境变量及源码级实现解析(v0.14) 【免费下载链接】wasp The batteries-included full-stack framework for the AI era. Develop JS/TS web apps (React, Node.js, and Prisma) using dec…

📰

LMS与RLS自适应波束形成算法详解:MATLAB实现与参数调优

简介:面向通信与信号处理方向的学习者,这套 MATLAB 源码完整实现了智能天线自适应波束形成中的 LMS 与 RLS 算法,涵盖 SNR 对比分析以及 MVDR1、MVDR2 两种波束形成器实现,覆盖阵列信号建模、权向量更新到方向图形成的完整流程&am…

📰

数据资产入表:技术实现与企业管理实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

陀螺仪噪声分析:交叠式Allan方差详解与MATLAB实现

简介:一款基于交叠式Allan方差(Overlapped Allan Variance)的陀螺仪数据处理MATLAB例程,面向嵌入式、航空航天、机器人等需要评估惯性传感器稳定性的开发与研究人员,解决传感器随机漂移和噪声特性的量化分析问题。资源…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬