Nanbeige 4.1-3B Streamlit WebUI 添加对话评分与反馈功能
1. 我们要做什么:功能预览与价值
1.1 功能效果长什么样?
想象一下,在原来那个清爽的聊天界面里,每一条 AI 回复的气泡下面,都会多出一行小按钮和输入框:
- 评分按钮:通常是一个'👍'(赞)和一个'👎'(踩),或者用星星、爱心等图标。点击后,按钮状态会变化(比如高亮),表示你已经评过分了。
- 反馈输入框:一个不那么显眼的小文本框,你可以在这里输入具体的意见,比如'这个例子举得很好'、'这里的信息过时了'或者'请用更简单的语言解释'。
- 提交按钮:输入反馈后,点击提交,这条评分和反馈就会和对应的对话记录关联起来,被保存到文件或数据库里。
整个交互过程会非常流畅,就像你在常用的 App 里给服务评价一样自然,完全不会破坏原有聊天界面的美感。
1.2 为什么需要这个功能?
你可能觉得,自己用用而已,要反馈干嘛?其实,这个小小的功能价值很大:
- 帮你优化提示词:如果你发现模型在某些问题上总是回答不好,通过反馈可以定位到是哪些类型的问题,从而有针对性地改进你的提问方式或系统提示。
- 评估模型表现:长期收集的评分数据,可以直观地告诉你,这个模型在你关心的任务上,整体表现如何,是越来越好,还是存在某些固有缺陷。
- 为模型微调提供数据:如果你未来打算用自己的数据对模型进行微调,这些带有正负向标注(赞/踩)和具体原因(反馈文本)的对话记录,就是极其宝贵的训练数据。
- 提升应用交互感:给用户一个表达的出口,会让应用感觉更完整、更专业,也更能吸引用户持续使用。
接下来,我们就从最简单的步骤开始,一步步实现它。
2. 前期准备:理解原有代码结构
在添加新功能之前,我们需要先打开原来的 app.py 文件,快速理解一下它的核心结构。别担心,我们不需要改动那些复杂的 CSS 和流式输出逻辑,只需要找到显示消息和记录历史的地方。
2.1 找到消息显示的核心循环
用你的代码编辑器打开 app.py。通常,Streamlit 聊天应用的核心逻辑是遍历一个消息列表,并把每条消息显示出来。这个列表可能叫 messages、chat_history 或者 st.session_state 里的某个变量。
你需要找到类似下面这样的代码块,它负责在页面上渲染每一条对话:
# 示例:原有代码中显示消息的部分可能长这样
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
或者,因为我们的 UI 是高度自定义的,它可能用的是 st.markdown() 配合 CSS 类来渲染气泡。找到显示 AI 回复(role 为 assistant)的那部分代码,这是我们后面要添加评分按钮的地方。
2.2 确认会话状态存储
为了把评分和对话关联起来,我们需要知道每条消息的唯一标识。最简单的方法是利用消息在历史列表中的索引(位置)。
检查一下,对话历史是否保存在 st.session_state 中,例如 st.session_state.messages。我们新增的评分数据也会以类似方式存储,比如 st.session_state.feedbacks,它是一个列表,每个元素对应一条 AI 消息的反馈。

