求基于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
相关产品推荐
相关产品推荐

