这个看板让你查看已经给定的人工复核状态、筛选样本并导出当前结果。适合先把 AI 训练数据或评测记录交给同事核查,避免每次在完整表格里手动找待复核行。
五条记录与复核状态均为人工构造;Streamlit 负责界面,没有调用模型自动判定“通过”或“退回”。本例只查看和导出,不能在页面里修改状态。示例实际使用 Windows、Python 3.11.15、Streamlit 1.64.0、pandas 2.3.3。

先跑通本地演示
在空的练习目录里创建独立环境。以下为 Windows PowerShell 命令;macOS/Linux 的激活命令用 source .venv/bin/activate。输出文件只用于本次演示,重复执行会更新这些演示文件。
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install streamlit==1.64.0 pandas==2.3.3
把下面代码保存为 sample_dashboard.py,再执行 python -m streamlit run sample_dashboard.py –server.address=127.0.0.1。浏览器打开终端显示的本地网址,通常是 http://127.0.0.1:8501;若端口已占用,以终端实际给出的端口为准。
import pandas as pd
import streamlit as st
st.set_page_config(page_title='AI 样本复核', layout='wide')
st.title('AI 样本复核看板')
st.caption('人工构造的演示数据;状态由人工给定,筛选和下载不会修改原表。')
frame = pd.DataFrame({
'sample_id': ['s01', 's02', 's03', 's04', 's05'],
'input_text': ['识别猫的图片', '总结一段文章', '检索产品手册', '分类客户问题', '提取发票字段'],
'review_status': ['待复核', '通过', '退回', '待复核', '通过'],
})
if frame['sample_id'].isna().any() or not frame['sample_id'].is_unique:
st.error('样本编号为空或重复,请先检查数据源。')
st.stop()
status = st.selectbox('复核状态', ['全部', '待复核', '通过', '退回'])
view = frame if status == '全部' else frame.loc[frame['review_status'].eq(status)]
st.metric('当前样本数', len(view))
st.dataframe(view, hide_index=True)
csv_bytes = view.to_csv(index=False).encode('utf-8-sig')
st.session_state['export_csv'] = csv_bytes
st.download_button(
'下载当前筛选 CSV', data=csv_bytes, file_name='review_selection.csv',
mime='text/csv', on_click='ignore',
)
按四个状态验收
| 选项 | 应显示编号 | 应显示数量 |
|---|---|---|
| 全部 | s01、s02、s03、s04、s05 | 5 |
| 待复核 | s01、s04 | 2 |
| 通过 | s02、s05 | 2 |
| 退回 | s03 | 1 |
选择“待复核”时,页面只显示 s01、s04,数量是 2;选择“通过”显示 s02、s05;选择“退回”只显示 s03。下载按钮拿到的是当前 view 生成的 CSV,显示表格和下载使用同一份筛选结果。
点“下载当前筛选 CSV”,打开文件,确认只有 sample_id、input_text、review_status 三列,行数和编号与表中一致,没有额外的 DataFrame 索引列。然后切换到另一个状态再下载,确认下载内容随筛选改变;不要仅凭文件能打开就认为范围正确。
utf-8-sig 是带 UTF-8 标记的编码,便于部分表格软件识别中文;真实文件若仍乱码,检查软件导入时的编码设置。文件名固定,所以再次下载时要留意浏览器是否加了编号后缀,不要误看上一次文件。
用 AppTest 核对页面状态
下面的短检查与 sample_dashboard.py 放在同一目录,保存为 check_dashboard.py 并执行 python check_dashboard.py。它模拟选择“待复核”,检查页面表格、数量与下载按钮输入的 CSV。
from io import BytesIO
import pandas as pd
from streamlit.testing.v1 import AppTest
app = AppTest.from_file("sample_dashboard.py").run()
app.selectbox[0].select("待复核").run()
assert len(app.exception) == 0
assert app.dataframe[0].value["sample_id"].tolist() == ["s01", "s04"]
assert int(app.metric[0].value) == 2
exported = pd.read_csv(BytesIO(app.session_state["export_csv"]))
assert exported["sample_id"].tolist() == ["s01", "s04"]
print("pending rows and export:", len(exported))
这份短检查应输出 pending rows and export: 2。本站使用 Streamlit AppTest 实际验证四种筛选状态、页面表格和下载输入字节的一致性;没有执行浏览器下载点击或多人部署测试。AppTest 是模拟应用的测试接口,浏览器保存文件和页面外观仍应按上一节操作检查。
换成你的 CSV 时先检查什么
将 frame = pd.DataFrame(…) 换成 pd.read_csv(“samples.csv”, dtype={“sample_id”: “string”}),并确认三列存在、编号非空且唯一、状态取值属于约定集合。不要把未知状态悄悄改成“通过”。CSV 里的状态应由你的真实复核流程产生,并保留审核人、时间和版本在源系统。
本例没有登录、角色权限、状态编辑和数据库写回,不应直接当作多人生产审核系统。保持绑定 127.0.0.1 可限制本地访问;需要远程共享时先补齐身份和数据访问规则。下载会生成新文件,不会更新源 CSV。
Streamlit 的交互会重跑脚本;这里重跑只创建演示表和筛选结果。接真实数据库时,不要把发布、扣费或覆盖写入放在每次重跑都会执行的位置。download_button 的数据在内存中,较大文件应按官方文档评估内存占用,不能承诺任意大小的样本表都能直接导出。
官方资料与版本范围
本文于 2026 年 10 月 1 日读取下列官方文档;示例的实际版本见正文。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32538.html