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

使用Streamlit构建多标签数据集标注界面遇异常求助

Streamlit多标签标注界面问题修复思路

问题根源

  1. 状态未持久化:Streamlit每次交互都会重新执行整个脚本,你没有把「当前选中的标签」「已标注数据」存入st.session_state,导致每次点击多选框时,选中状态丢失,脚本重跑后出现类似跳转下一条记录的错误表现。
  2. 标注逻辑错误:annotated_data是每次脚本重跑时新建的空列表,无法累积标注数据;点击Save时先切换记录再处理标注,导致当前标签未被正确保存。
  3. Session State初始化不全:初始只初始化了剩余记录和当前记录,缺少已标注数据、当前选中标签的初始化。

修复方案

把所有需要跨交互保留的状态存入st.session_state,调整标注流程为「选标签→点击Save保存并切换记录」,具体修改如下:

import pandas as pd
import streamlit as st

def save_data(data):
    # 补充你的保存逻辑,比如存储为pickle文件
    pd.DataFrame(data).to_pickle("annotated.pkl")

# 初始化Session State:所有需要持久化的状态都在这里
if "remaining_records" not in st.session_state:
    df = pd.read_pickle("unlabeled.pkl")
    st.session_state.remaining_records = df.to_dict("records")
    st.session_state.current_record = st.session_state.remaining_records[0] if st.session_state.remaining_records else None
    st.session_state.annotated_data = []
    st.session_state.selected_labels = []  # 保存当前选中的标签

if st.session_state.current_record:
    # 提取当前记录的内容
    available_labels = st.session_state.current_record["labels"]
    example = st.session_state.current_record["example"]
    text = st.session_state.current_record["text"]

    # 渲染展示内容
    demo = "\n".join([f"- {ee}" for ee in example])
    st.write(f"# Example\n{demo}\n# Output\n- {text}")

    # 多选框:从Session State读取当前选中的标签,确保状态保留
    st.session_state.selected_labels = st.multiselect(
        label="Select Labels",
        options=available_labels,
        default=st.session_state.selected_labels  # 默认值设为之前选中的标签
    )

    st.write('You Selected:', st.session_state.selected_labels)

    # 点击Save时的逻辑:先保存标注,再切换记录
    if st.button("Save"):
        # 将当前记录和选中标签存入已标注数据
        st.session_state.annotated_data.append({
            **st.session_state.current_record,
            "label": st.session_state.selected_labels
        })
        # 移除当前记录,切换到下一条
        st.session_state.remaining_records.remove(st.session_state.current_record)
        st.session_state.current_record = st.session_state.remaining_records[0] if st.session_state.remaining_records else None
        # 清空当前选中标签,准备下一条标注
        st.session_state.selected_labels = []

        # 每50条保存一次
        if len(st.session_state.annotated_data) % 50 == 0:
            save_data(st.session_state.annotated_data)

# 脚本结束时保存所有已标注数据(避免中途丢失)
if st.session_state.annotated_data:
    save_data(st.session_state.annotated_data)

关键改动说明

  • 新增remaining_records存储剩余未标注记录,避免直接修改原始列表导致的状态混乱。
  • 用st.session_state.selected_labels持久化当前选中的标签,多选框默认值设为该状态,确保交互时选中状态不丢失。
  • 调整Save按钮逻辑:先保存当前标注,再切换记录,最后清空选中标签状态。
  • 把annotated_data存入Session State,确保标注数据可以跨交互累积。

内容的提问来源于stack exchange,提问作者Mr.Robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:40:24