如何在Streamlit中用streamlit_chat实现类ChatGPT流式响应?
在Streamlit中用streamlit_chat实现ChatGPT式流式响应
streamlit_chat的message组件本身没有内置streaming=True参数,但可以结合Streamlit的流式输出能力和会话状态(session_state)实现类似ChatGPT的逐字/逐块响应效果,以下是具体实现方案:
实现思路
- 维护会话状态,区分历史消息和正在生成的流式消息
- 使用
st.empty()创建占位符,实时更新流式输出的内容 - 流式获取LLM的响应内容,逐块拼接并更新占位符,完成后将完整内容存入历史消息列表
完整代码示例
from streamlit_chat import message import streamlit as st import time # 初始化会话状态 if 'past' not in st.session_state: st.session_state['past'] = [] if 'generated' not in st.session_state: st.session_state['generated'] = [] if 'current_stream' not in st.session_state: st.session_state['current_stream'] = "" # 模拟LLM流式响应(实际场景替换为真实接口调用) def stream_response(prompt): response_text = "这是模拟的流式响应内容,会逐块输出展示。" for chunk in response_text: time.sleep(0.1) yield chunk # 用户输入区域 user_input = st.text_input("输入你的问题:", key="input") if user_input: # 保存用户消息到历史 st.session_state['past'].append(user_input) # 清空当前流式内容 st.session_state['current_stream'] = "" # 创建流式消息的占位符 stream_placeholder = st.empty() # 流式获取响应并更新占位符 for chunk in stream_response(user_input): st.session_state['current_stream'] += chunk # 用message组件渲染当前流式内容(模拟AI消息样式) stream_placeholder.markdown(message(st.session_state['current_stream'], key="stream_temp", is_user=False, avatar_style="bottts", seed=42)) # 流式完成后,将完整内容存入历史消息 st.session_state['generated'].append(st.session_state['current_stream']) # 清空临时流式内容 st.session_state['current_stream'] = "" # 渲染历史对话 for i in range(len(st.session_state['generated']) - 1, -1, -1): message(st.session_state['past'][i], is_user=True, key=str(i) + '_user') message(st.session_state["generated"][i], key=str(i))
关键说明
- 会话状态管理:通过
current_stream临时存储正在生成的流式内容,避免历史消息重复渲染 - 占位符更新:
st.empty()允许我们实时替换该位置的内容,实现流式滚动效果 - 组件复用:历史消息仍使用你原有的循环逻辑,流式消息在生成过程中单独渲染,完成后加入历史列表
内容的提问来源于stack exchange,提问作者iamamir
相关产品推荐
相关产品推荐

