首页/新闻资讯/正文详情

AI 提问建议(Prompt Suggestions)的动态流式弹出

发布时间:2026/9/26 4:22:42 来源:云帆数科 栏目:资讯中心
AI 提问建议(Prompt Suggestions)的动态流式弹出
AI 提问建议Prompt Suggestions的动态流式弹出在对话交互系统中用户很多时候并不知道下一句该问什么。大语言模型输出完一长串技术分析或操作方案后页面若只是死寂地停留在光标闪烁状态交互回路就出现了断崖式的冷场。动态跟随上下文生成“下一步追问建议Follow-up Suggestions”或“快捷操作药丸Action Chips”已经成为新一代智能助理的标配能力。然而如果等模型完整吐出全部回答、后端再开启一次耗时两三秒的独立请求去获取推荐问题用户早就视线转移或直接关闭了窗口。高水准的交互实现是将追问建议作为主流式响应的“尾随数据流”或者通过独立的轻量旁路流与主回答近乎并行输出并以前端细腻的交错动效Stagger Animation平滑浮现。数据协议设计主副数据流拆分与协议隔离在基于 Server-Sent Events (SSE) 或 WebSocket 的传输通道中推荐问题的下发有两种常见策略带外事件Out-of-band Events在同一个 SSE 流中以不同的event类型发送数据。例如主文本使用event: text_delta尾随的推荐词使用event: suggestions_delta或整包event: suggestions_complete。结构化标记定界Delimiter Delimited模型在正文结束后输出特定定界符如SUGGESTIONS后续内容解析为 JSON 或每行一条的纯文本数组。在生产环境中带外事件是更稳妥的选择能彻底避免模型在正文里偶然出现定界符而导致前端解析错乱的问题。// sse-parser.ts export interface SuggestionItem { id: string; text: string; category?: deepen | expand | action; } export interface StreamEventHandlers { onTextDelta: (chunk: string) void; onSuggestionReceived: (suggestions: SuggestionItem[]) void; onComplete: () void; onError: (err: Error) void; } export async function consumeChatStream( url: string, payload: Recordstring, unknown, handlers: StreamEventHandlers, signal: AbortSignal ) { const response await fetch(url, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(payload), signal }); if (!response.ok || !response.body) { throw new Error(HTTP error: ${response.status}); } const reader response.body.getReader(); const decoder new TextDecoder(utf-8); let buffer ; try { while (true) { const { done, value } await reader.read(); if (done) break; buffer decoder.decode(value, { stream: true }); const lines buffer.split(\n\n); buffer lines.pop() || ; for (const block of lines) { const rawEvent block.trim(); if (!rawEvent) continue; let eventType message; let dataStr ; for (const line of rawEvent.split(\n)) { if (line.startsWith(event:)) { eventType line.slice(6).trim(); } else if (line.startsWith(data:)) { dataStr line.slice(5).trim(); } } if (eventType text_delta) { handlers.onTextDelta(dataStr); } else if (eventType suggestions_complete) { try { const parsed JSON.parse(dataStr) as SuggestionItem[]; handlers.onSuggestionReceived(parsed); } catch (e) { console.warn(Failed to parse suggestions payload, e); } } } } handlers.onComplete(); } catch (error) { if ((error as DOMException).name ! AbortError) { handlers.onError(error as Error); } } }空间位移与交错微动效Stagger Motion当建议数据包到达前端时最忌讳的是瞬间将一组 DOM 节点突兀地插在对话气泡下方。这种硬切换会造成页面高度瞬时跳变Layout Shift如果视口恰好固定在底部还会引发滚动条剧烈抖动。优雅的处理手法包含以下几个细节占位与平滑高度过渡利用 CSS Grid 或max-height配合requestAnimationFrame让建议容器的高度像展开画卷般平滑张开避免视口猛烈下移。交错延时入场Staggered Fade-in每个建议药丸以 60ms 到 80ms 的微小延迟依次向上滑入并淡入给用户视觉引导。触控与按键适配每个药丸不仅支持点击还带有数字角标快捷键如Alt 1、Alt 2按下即可直接把文本推入输入框并触发发送。// PromptSuggestions.tsx import React, { FC } from react; import ./PromptSuggestions.css; export interface Props { suggestions: SuggestionItem[]; onSelect: (item: SuggestionItem) void; disabled?: boolean; } export const PromptSuggestions: FCProps ({ suggestions, onSelect, disabled }) { if (!suggestions || suggestions.length 0) return null; return ( div classNamesuggestions-wrapper roleregion aria-label相关追问建议 div classNamesuggestions-header span classNamesuggestions-icon✨/span span classNamesuggestions-title建议继续探讨/span /div div classNamesuggestions-list {suggestions.map((item, index) ( button key{item.id || index} typebutton classNamesuggestion-chip style{{ animationDelay: ${index * 70}ms }} onClick{() onSelect(item)} disabled{disabled} aria-keyshortcuts{Alt${index 1}} span classNameshortcut-badge{index 1}/span span classNamechip-text{item.text}/span /button ))} /div /div ); };配合 CSS 的硬件加速变换属性让药丸从下方 8 像素处平稳归位/* PromptSuggestions.css */ .suggestions-wrapper { margin-top: 14px; padding: 12px 16px; background: rgba(246, 248, 250, 0.85); border-radius: 12px; border: 1px solid rgba(220, 225, 230, 0.6); backdrop-filter: blur(8px); transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1); } .suggestions-list { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; } .suggestion-chip { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; background: #ffffff; border: 1px solid #e1e4e8; border-radius: 20px; font-size: 13px; color: #24292e; cursor: pointer; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); opacity: 0; transform: translateY(8px); animation: chipSlideIn 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards; transition: transform 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease; } .suggestion-chip:hover:not(:disabled) { transform: translateY(-1px); border-color: #0969da; box-shadow: 0 3px 8px rgba(9, 105, 218, 0.12); color: #0969da; } .shortcut-badge { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; font-size: 10px; background: #f1f3f5; color: #57606a; border-radius: 50%; } keyframes chipSlideIn { to { opacity: 1; transform: translateY(0); } }竞态条件与中断取消控制当用户在模型还在输出正文或建议刚刚开始浮现的瞬间手动输入了新的问题并敲下回车必须具备清晰的状态归零逻辑主动中断未决的流利用AbortController立即断开当前的流式通道丢弃任何正在传输或待渲染的建议列表。历史卡片的交互禁用旧消息下方的建议药丸在用户发出下一轮提问后应自动置为只读Disabled或降为次级透明度防止用户误触旧上下文引发意图分裂。滚动锚定协同在建议弹出触发容器高度扩增时如果当前滚动条已经贴底Pinned to Bottom需利用ResizeObserver配合平滑滚动继续锚定在可视区域最下端确保用户视线不会被突然顶出屏幕。将建议弹出的时机、流式协议的边界与动效渲染严丝合缝地组合在一起AI 界面才能褪去机械生成的冰冷感呈现出行云流水般的连续交互体验。

相关推荐

16k业务语义协议:用16个字段定义可验证、可执行的业务规则
16k业务语义协议:用16个字段定义可验证、可执行的业务规则

1. 这不是又一个文档生成器,而是一次业务语言的“协议层”重建你有没有经历过这样的场景:产品同学在飞书文档里写了30页PRD,开发拿到后第一句话是“这个‘用户点击按钮后触发校验’,到底是前端校验、后端校验,还是两者… · 2026/9/26 4:22:42

离线生成与实时生成的混合策略:平衡生成成本与游戏响应度
离线生成与实时生成的混合策略:平衡生成成本与游戏响应度

离线生成与实时生成的混合策略:平衡生成成本与游戏响应度在游戏工业界引入 AIGC(文本、纹理、语音、关卡、NPC 行为)的过程中,不少团队容易走向两个极端:要么试图将所有内容全部依赖云端大模型实时生成(导致… · 2026/9/26 4:22:42

轻量级Web开发实战:WorkBuddy+Flask+SQLite快速搭建失物招领平台
轻量级Web开发实战:WorkBuddy+Flask+SQLite快速搭建失物招领平台

1. 为什么我放弃了重型CMS,转投WorkBuddyFlaskSQLite这套轻量组合去年年底我接手了一个校园失物招领平台的搭建需求,甲方给的时间窗口只有两周,要求能本地部署、支持信息发布、还得带智能匹配推荐。我第一反应是上WordPress——毕竟生态成熟、… · 2026/9/26 4:22:42

办公网网络基建指南:从物理布线到VLAN规划与排障
办公网网络基建指南:从物理布线到VLAN规划与排障

1. 网络基建到底在“建”什么很多刚开始接触桌面运维或者网络基础的朋友,会把“基建”两个字想得很宏大,觉得要配机房、拉光纤、上核心交换机才叫基建。实际上,日常工作中遇到的网络基建,绝大多数是从一张桌子开始的。我最早接手公… · 2026/9/26 5:07:21

CORBA Explorer:分布式系统协议层调试与IOR可视化工具
CORBA Explorer:分布式系统协议层调试与IOR可视化工具

简介:本资源是一款面向CORBA开发与测试工程师的实用工具集——CORBA Explorer,专为服务端功能验证、对象引用(IOR)调试、IDL接口解析及ORB环境配置提供支持,适用于分布式系统开发、中间件集成测试等场景。压缩包共538个… · 2026/9/26 5:07:21

奇安信零信任身份安全落地实践:从PPT到Docker沙箱验证
奇安信零信任身份安全落地实践:从PPT到Docker沙箱验证

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

电厂数字化转型方案:从DCS到SIS的规划与落地要点
电厂数字化转型方案:从DCS到SIS的规划与落地要点

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

敏捷开发落地全攻略:核心概念、实操步骤与避坑指南
敏捷开发落地全攻略:核心概念、实操步骤与避坑指南

经常有同事或同行跑过来问我:敏捷开发到底是什么。我听过各种各样的回答,有人说就是每天站着开个小会,有人说是把需求写在小卡片上贴满墙,还有人说是让开发自己给自己派活。这些说法都沾了点边,但都没说到要害。敏捷开… · 2026/9/26 5:07:09

IT6616不是转接头:HDMI转MIPI协议桥接芯片深度解析
IT6616不是转接头:HDMI转MIPI协议桥接芯片深度解析

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

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

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

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码