You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求基于Streamlit_chat的预定义问题调查聊天机器人基础实现代码

Streamlit 调查聊天机器人基础实现方案

核心思路

通过Streamlit的会话状态(st.session_state)精准跟踪调查进度:

  • 记录当前处理的主问题索引
  • 标记流程节点(发送主问题/等待主问题回复/发送跟进问题/等待跟进问题回复)
  • 存储用户所有回复,方便后续存入数据库

基础实现代码

import streamlit as st

# 初始化会话状态变量,避免页面刷新丢失数据
if "current_step" not in st.session_state:
    # 0: 发送主问题;1: 等待主问题回复;2: 发送跟进问题;3: 等待跟进问题回复
    st.session_state.current_step = 0
if "main_question_idx" not in st.session_state:
    st.session_state.main_question_idx = 0
if "chat_history" not in st.session_state:
    st.session_state.chat_history = []
if "user_responses" not in st.session_state:
    st.session_state.user_responses = {}

# 预定义主问题和跟进问题列表(后续可替换为Hugging Face模型生成逻辑)
MAIN_QUESTIONS = [
    "Q1: 你对我们产品的整体满意度如何?",
    "Q2: 你使用我们产品的频率是?",
    "Q3: 你最喜欢产品的哪个功能?"
]
FOLLOW_UP_QUESTIONS = [
    "FQ1: 能说说影响你满意度的主要原因吗?",
    "FQ2: 是什么因素让你保持这个使用频率?",
    "FQ3: 这个功能帮你解决了什么具体问题?"
]

# 渲染聊天历史记录
for message in st.session_state.chat_history:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# 处理调查流程逻辑
if st.session_state.main_question_idx < len(MAIN_QUESTIONS):
    if st.session_state.current_step == 0:
        # 发送当前主问题
        current_q = MAIN_QUESTIONS[st.session_state.main_question_idx]
        st.session_state.chat_history.append({"role": "assistant", "content": current_q})
        st.session_state.current_step = 1
        st.rerun()

    elif st.session_state.current_step == 1:
        # 获取用户对主问题的回复
        user_input = st.chat_input("请输入你的回复")
        if user_input:
            st.session_state.chat_history.append({"role": "user", "content": user_input})
            st.session_state.user_responses[f"Q{st.session_state.main_question_idx+1}"] = user_input
            st.session_state.current_step = 2
            st.rerun()

    elif st.session_state.current_step == 2:
        # 发送当前跟进问题
        current_fq = FOLLOW_UP_QUESTIONS[st.session_state.main_question_idx]
        st.session_state.chat_history.append({"role": "assistant", "content": current_fq})
        st.session_state.current_step = 3
        st.rerun()

    elif st.session_state.current_step == 3:
        # 获取用户对跟进问题的回复
        user_input = st.chat_input("请输入你的回复")
        if user_input:
            st.session_state.chat_history.append({"role": "user", "content": user_input})
            st.session_state.user_responses[f"FQ{st.session_state.main_question_idx+1}"] = user_input
            # 推进到下一个主问题,重置流程节点
            st.session_state.main_question_idx += 1
            st.session_state.current_step = 0
            st.rerun()
else:
    # 调查结束提示
    with st.chat_message("assistant"):
        st.markdown("感谢你的参与!所有问题已完成。")
    # 展示收集到的回复(实际场景可替换为存入数据库操作)
    with st.expander("查看你的所有回复"):
        for q, resp in st.session_state.user_responses.items():
            st.markdown(f"**{q}**: {resp}")

# 数据库存储示例(可根据实际数据库调整)
# def save_to_db(responses):
#     import sqlite3
#     conn = sqlite3.connect("survey.db")
#     cursor = conn.cursor()
#     cursor.execute("CREATE TABLE IF NOT EXISTS survey_responses (question TEXT, response TEXT)")
#     for q, r in responses.items():
#         cursor.execute("INSERT INTO survey_responses VALUES (?, ?)", (q, r))
#     conn.commit()
#     conn.close()
# # 调查结束后调用存储函数
# if st.session_state.main_question_idx >= len(MAIN_QUESTIONS):
#     save_to_db(st.session_state.user_responses)

关键功能扩展说明

  • Hugging Face跟进问题生成:将预定义的FOLLOW_UP_QUESTIONS替换为模型生成逻辑,示例代码如下:
    from transformers import pipeline
    
    def generate_follow_up(main_q, user_resp):
        generator = pipeline("text-generation", model="distilgpt2")
        prompt = f"基于用户对问题'{main_q}'的回复'{user_resp}',生成一个简短的跟进问题:"
        result = generator(prompt, max_new_tokens=40, temperature=0.7)
        return result[0]["generated_text"].split(":")[-1].strip()
    
    调用时直接替换current_fq = generate_follow_up(MAIN_QUESTIONS[st.session_state.main_question_idx], st.session_state.user_responses[f"Q{st.session_state.main_question_idx+1}"])即可
  • 会话状态稳定性:所有流程节点和数据都存在st.session_state中,确保页面刷新后不会丢失当前进度

内容的提问来源于stack exchange,提问作者Kris Saldana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:14:55