type
status
date
slug
summary
tags
category
icon
password
感想
本次实习的主要工作围绕联影公司的各类文本解析任务展开。
公司部署了多种开源大模型,在公司内部提供网页版服务和API调用服务。在这里,大模型除了满足日常使用需求外,还被用于体系文档审核,能高效处理工业生产过程中产生的各种审核文档。通过大模型接近人类的理解能力,系统能够灵活应对文档中的各种非标准化情况,像人一样理解文档想要表达的本质含义。
对事后补救类型的工作必要性的反思
在参与这些工作的过程中,我对其必要性产生了深入思考。诚然,目前的硬编码方式确实无法很好地识别和处理非标准化文档,使用大模型能够有效解决这个问题。但深究其根源,许多文档的不规范本质上是由于数据收集方式的落后导致的。如果能够在源头上改进——比如提供标准化模板、使用专业的问卷收集软件——其实都能从根本上解决这些问题。
这让我联想到了数据处理的"事前规划"与"事后补救"现象。我们使用大模型处理的正是后处理过程,这类似于学术研究中的两种模式:一种是提前规划好实验设计,实验完全为特定目的服务,整个流程非常顺畅;另一种是基于已完成的实验去撰写论文,需要在既有数据中挖掘价值,这就相对困难。这种"事后补救"现象有其存在的必要性——善后工作本身也需要人力投入,通过自动化能够显著提升效率。从公司运营的角度看,这种效率提升带来的价值是实实在在的。
大模型在医学领域的应用思考
这次实习让我对大模型在医学领域的应用有了更深层的思考。在本次实习中,大模型的应用主要体现在一般工业场景。而在之前参与的一些学术会议中,我了解到大模型在智能问诊、病历管理等领域已有诸多应用。那么,对于更深层次的疾病诊断,大模型的作用又体现在哪里呢?
"事后补救"现象实际上揭示了一个也许更深层的问题:信息的原始形态与可计算形态之间的鸿沟。在联影的文档处理场景中,这个鸿沟表现为非结构化文本与结构化数据之间的转换;而在脑机接口领域,这个鸿沟则表现为神经信号与意图识别之间的映射。
脑机接口面临的挑战更为根本——我们无法像改进文档模板那样去"规范化"大脑的信号输出。每个人的神经活动模式都是独特的,这种个体差异性不是缺陷,而是生物系统的本质特征。这就要求我们的系统必须具备适应性理解能力,而不仅仅是模式匹配能力。
那么能否通过大模型来增强脑电信号识别的鲁棒性,使得不同人的信号都能够很好的识别呢?目前是比较困难的,毕竟二者相比,文档处理是人已经先验理解的,而脑电中的很多我们还不能直接读懂,Prompt自然也无从谈起……
比较可行的思路是——将大模型的上下文理解能力与脑机接口的实时信号处理结合。当脑机接口捕获到模糊的神经信号时,大模型可以基于上下文推断最可能的意图,就像它现在处理不规范文档一样。这种也称的上是一种多模态融合。
对自身研究项目的新认识
这次实习也让我对自己研究项目的本质有了新的思考。我意识到,自动化评估本质上是一种数字孪生技术,个性化评估的核心就是将人体进行动态孪生——即在数字空间中构建物理实体的精确模型表示。按照这个思路,当我们想要实现自动化评估时,本质上是基于采集的运动数据构建行为模型,然后判断运动能力在该行为模型中的表现结果。
因此,如果能够基于采集的数据,完成对患者行为模型(数学方程)的精确构建,将会更加接近问题的本质。我们目前使用的机器学习方法正是在尝试线性地模拟这个过程,而深度学习则是尝试通过非线性方式构建更复杂的模型,以更好地捕捉人体运动的复杂性。
而运动评估是对人体物理行为的数字孪生,BCI则是在尝试构建认知过程的数字孪生。这涉及三个递进的层次:
- 信号层孪生:将神经电信号精确复制到数字空间(前端采样)
- 模式层孪生:识别和重建神经活动的时空模式(分类模型)
- 意图层孪生:理解并预测认知意图的形成过程(编码解码能够闭环的程度才算是数字孪生)
这里的关键洞察是:深度学习的非线性建模能力可能更接近大脑的实际工作方式。大脑本身就是一个高度非线性的动态系统,线性方法只能捕捉其局部特征(非线性的案例就比如transformer等架构的注意力机制,某种程度上模拟了大脑的选择性注意过程)
技术技能提升
在技术层面,这次实习让我精进了Docker、PyInstaller、OpenAI API等工具的使用,技术熟练度得到了显著提升。虽然这些看似都是工具层面的进步,但对未来的研究和开发工作都有重要意义。另外,我还学会了构建类MCP(Model Context Protocol)的框架。虽然其本质是API调用和Prompt工程的结合,但这种系统化的思维方式和架构设计能力,相信在未来的工作中会发挥重要作用。
实习工作总结
实习背景
在本次实习期间,我参与了一个技术驱动的项目,涉及容器化技术、文本处理、人工智能模型集成以及前端仪表盘开发等多个领域。我的主要职责是优化现有系统功能、开发新模块以及解决技术实现中的实际问题。通过完成多项任务,我深入学习并实践了Docker、Python、LLM(大语言模型)以及前端开发相关技术,提升了解决复杂问题的能力。
主要任务与成果
1. Docker封装(Pandoc Server)
任务描述:负责将
pandoc_server
的代码及运行环境打包为Docker容器(pandoc_server_container
),确保环境一致性和可移植性。工作内容:
- 配置Dockerfile,定义了Pandoc服务所需的依赖和运行环境。
- 优化容器构建流程,确保镜像轻量化并符合生产环境要求。
- 测试容器在不同环境下的兼容性,确保服务稳定运行。成果:成功生成了高效的
pandoc_server_container
,简化了部署流程,提升了系统的可维护性。
2. 多文本服务Docker集成
任务描述:将5个子功能的文本服务集成到一个统一端口,解决Python环境和相关库版本冲突的问题。
工作内容:
- 分析各子功能依赖的Python版本和库需求,制定版本兼容方案。
- 采用“clone再删除”的策略精简库依赖,减少镜像体积。
- 解决部分库因无白名单无法联网安装的问题,通过本地调用文件配置环境。
- 测试并上传集成后的环境,确保服务稳定运行。成果:成功实现5个子功能在单一端口的集成运行,优化了资源使用并提升了系统的可扩展性。
3. 基于LLM的鲁棒性文档预处理方案
任务描述:搭建类MCP(Model Context Protocol)框架,定义统一的文档处理交互规则,设计并实现3个Agent协同工作。
工作内容:
- Agent1:开发文档读取模块,支持
docx
和pdf
格式,提取三部分内容: - 默认字段(
key
) - 处理函数名称(
method
) - 各字段对应的内容(
content
)
- Agent2:实现
method
和key
的错误检测与修正功能,确保输出结果的准确性。
- Agent3(可选):集成LLM,优化
content
内容,修正开头和结尾的无效部分,提升文档处理的鲁棒性。
- 定义统一的交互协议,规范Agent间的协作流程。成果:成功搭建了一个高效的文档预处理框架,显著提高了文档处理的自动化程度和准确性,为后续LLM应用奠定了基础。
4. Python Streamlit打包
任务描述:将前端仪表盘的Python代码(基于Streamlit)打包为可执行的
exe
文件,并实现自动化环境配置。工作内容:
- 使用PyInstaller将Streamlit应用及其依赖打包为
exe
文件,确保跨平台运行。
- 开发自动化脚本(
bat
文件),实现虚拟环境的自动配置和打包流程。
- 测试打包后的仪表盘在不同操作系统中的稳定性。成果:生成了可独立运行的仪表盘程序,简化了部署流程,降低了用户的技术门槛。
5. 仪表盘白名单功能添加
任务描述:修改前端仪表盘代码,添加白名单配置状态显示功能。
工作内容:
- 分析现有仪表盘代码,定位白名单相关的逻辑。
- 修改前端界面,添加白名单启用状态及列表展示功能。
- 测试功能在不同场景下的显示效果,确保用户体验流畅。成果:仪表盘新增白名单状态显示功能,提升了系统的透明性和用户交互体验。
技能收获
通过本次实习,我在以下方面取得了显著提升:
- 容器化技术:深入掌握了Docker的配置、优化与部署,理解了容器化技术在生产环境中的应用。
- Python开发:熟练使用Python进行环境管理、自动化脚本开发和前端应用(Streamlit)开发。
- 人工智能与LLM:通过搭建类MCP框架,积累了基于大语言模型的文档处理经验,掌握了Agent设计和协作逻辑。
- 问题解决能力:在解决版本冲突、库依赖和白名单限制等复杂问题时,锻炼了分析和调试能力。
- 团队协作:通过与团队沟通需求、测试和部署,增强了跨部门协作和项目管理能力。
个人反思
本次实习让我从理论走向实践,深刻体会到技术开发中细节和整体优化的重要性。在面对版本冲突和环境限制等挑战时,我学会了通过系统化的分析和创新方法解决问题。同时,我也意识到持续学习和适应新技术的重要性,未来我将进一步深入学习容器化、AI框架和前端开发技术,以应对更复杂的项目需求。
Task 1 DBL PDF 解析服务开发
1.1 任务概述
开发基于 PaddleOCR v3 的 PDF 解析服务,实现对 DBL 格式 PDF 文件的自动化文本识别与结构化数据提取。
1.2 项目时间规划
项目周期: 2025年7月1日 - 2025年7月15日
工期: 15个工作日
1.3 部署环境配置
- 服务器地址: 10.6.12.221
- 部署路径:
/mnt/iso/tyj_workspace/OCR
- 环境管理: 使用 Conda 进行环境管理
- 重要提醒: 环境变更时必须使用
conda create
命令复制环境后再进行修改,严禁直接修改现有环境
1.4 技术实现要求
核心功能规范
- OCR 解析引擎
- 使用 PaddleOCR v3 作为核心解析引擎
- 支持 PDF 文件的批量处理
- 保证文本识别的准确性和完整性
- 数据处理流程
- PDF 文档转换为图像格式
- 使用 PaddleOCR 进行文本识别
- 在每个解析文本块后添加标识符
[IMAGE_MASK]
- 生成对应的 JPG 图像文件并保存至服务器
- 图像管理
- 每个
[IMAGE_MASK]
标签对应一个 JPG 图像文件 - 图像文件按解析顺序存储,确保序列不乱序
- 图像存储路径记录在返回数据中
1.5 API 接口规范
返回数据结构
json
{
"img_list": ["图像文件服务器路径列表"],
"title_name": ["文件实际名称"] * len(text_content),
"text_content": ["完整解析数据列表"]
}
字段说明
- img_list (Array): 存储解析生成的 JPG 图像在服务器上的完整路径,按顺序排列
- title_name (Array): 原始 PDF 文件名称,数组长度与 text_content 保持一致
- text_content (Array): 完整的文本解析结果,包含
[IMAGE_MASK]
标识符
1.6 质量保证
- 服务端开发:实现稳定的 HTTP 服务接口
- 客户端测试:开发配套的测试客户端,确保服务功能完整性
- 部署验证:在目标服务器上完成部署并通过全面测试
Task 2 Pandoc 服务 Docker 容器化
2.1 任务概述
将现有的 Pandoc 服务进行 Docker 容器化,提高服务的可移植性和部署效率。
2.2 项目时间规划
项目周期: 2025年7月1日 - 2025年7月8日
工期: 8个工作日
2.3 技术环境配置
基础环境
- Conda 环境: qw_vl_mil2
- 服务文件路径:
/mnt/iso/cri_dtl_workspace/rag_update/pandoc_server.py
- Docker 构建目录:
/mnt/iso/cri_dtl_workspace/rag_update/pandoc_docker_make
2.4 Docker 化实施要求
容器化步骤
- 环境迁移
- 基于 qw_vl_mil2 Conda 环境创建 Docker 镜像
- 确保所有依赖包正确安装和配置
- 服务配置
- 将 pandoc_server.py 集成到 Docker 容器中
- 配置容器内的服务启动脚本
- 端口管理
- 重要提醒: 由于原服务正在运行中,Docker 容器需要使用不同的端口号
- 需要修改
pandoc_server.py
中的端口配置 - 建议端口映射策略,避免与现有服务冲突
构建要求
- 生成轻量化的 Docker 镜像
- 确保容器启动的稳定性和可靠性
- 提供完整的容器运行文档和命令示例
2.5 交付成果
- 完整的 Dockerfile 和相关配置文件
- Docker 镜像构建脚本
- 容器部署和运行说明文档
- 端口配置变更记录
Task 3 子功能的文本服务集成
任务描述:将5个子功能的文本服务集成到一个统一端口(9035),解决Python环境和相关库版本冲突的问题,并优化镜像体积。
工作内容:
集成方法
- 服务封装:将每个子功能封装为独立函数,统一集成到main_server.py中,通过传入函数名称作为参数实现动态调用。
- 对于除mineru外的服务,直接通过脚本封装为函数。
- 对于mineru,尝试直接调用容器内脚本,但因缺失magic_pdf库导致报错。最终通过调用服务端口的方式,在已有客户端基础上封装为函数,成功实现集成。
- 端口统一:将5个子功能的服务统一映射到端口9035,确保接口一致性和调用效率。
问题解决
- 版本冲突:
- 各子功能使用的Python版本和库版本不一致(例如,paddlex依赖Python 3.8,fitz依赖Python 3.10),导致兼容性问题,如初始化异常、函数调用失败等。
- 尝试以Pandoc的Python 3.10环境(qw_vl_mli2)为基础兼容其他库,但paddlex在初始化OCR时因字体下载被服务器拦截而失败,且存在numpy等基础库的兼容问题。
- 尝试使用OCR的Python 3.8环境(OCR2),但fitz(PyMuPDF)因同名库冲突导致文件读取异常。
- 解决方案:放弃使用fitz,改用PyPDF2和pdf2image组合实现PDF转JPG功能,经测试与原始结果一致。
- Mineru问题:
- mineru服务因容器内缺少magic_pdf库无法直接调用脚本。
- 最终通过调用服务端口的方式解决,避免直接依赖容器内脚本。
- 库精简:
- 采用“clone再删除”策略精简不必要库,减少镜像体积。
- 通过逐一排查依赖关系,删除未使用的库(如torch),但保留关键依赖(如paddle、nvidia、faiss等)。
- 解决paddlex初始化OCR时因字体下载被拦截的问题,通过本地配置文件和模型文件上传绕过限制。
- 精简后环境从12GB减至9GB,主要占用空间的库包括:
- paddle(4.22GB)
- nvidia(3.00GB)
- faiss(109.83MB)
- opencv_contrib_python.libs(89.34MB)
- opencv_python.libs(88.97MB)
Docker打包
- 尝试方案:
- 方案一:导出requirements.txt并重新安装,但paddlex初始化OCR时因字体下载被拦截失败。
- 方案二:从本地打包环境后上传,包含OCR配置文件、本地模型文件等,确保完整性。
- 系统依赖:
- 安装必要的系统依赖(如libcuda.so.1以支持GPU、libjpeg-dev、libpng-dev等),避免运行时库缺失问题。
- 具体依赖包括:
- 成果:
- 成功生成镜像unified_service:latest(IMAGE ID: cb8e5f4b347d,大小:28.3GB)。
- 通过命令docker run --gpus all -d -p 9035:9035 --name unified_service_container unified_service启动容器,进程名为unified_service_container,端口号为9035。
- 镜像经测试稳定运行,支持所有子功能的集成调用。
成果:成功实现5个子功能在单一端口的集成运行,解决了版本冲突和库依赖问题,优化了镜像体积,提升了系统的可扩展性和稳定性。
Task 4 基于LLM的鲁棒性文档预处理方案
任务描述
开发一个基于大语言模型(LLM)的文档预处理方案,用于从docx和pdf等格式文档中提取目标信息(如测试用例的ID、Title、Description),并以JSON格式输出。目标是通过LLM提升预处理的鲁棒性,解决传统规则依赖方式在字段名称变化、格式变异(如换行、表格转纵向列表)时的失效问题,确保输出高准确率、完整且格式正确,同时避免模型幻觉导致的错误。
问题分析
当前examples目录下的脚本(如test_cds_uts_check.py、test_cos_uts_check.py)依赖固定规则(如字段名、格式、表格结构)进行信息提取,存在以下问题:
- 字段变化:字段名称或格式变化(如换行符、表格转列表)导致提取失败。
- 部分case遗漏:固定字段提取忽略文中其他case内容。
- 缺乏鲁棒性:无法适应复杂或非标准格式的文档。
改进目标:
- 利用LLM自动适应字段名、格式和结构变化。
- 确保技术文档的高准确率(原文一致、提取完整、格式正确)。
- 通过对比验证和兜底机制,严防LLM幻觉导致的错误。
工作内容
1. Case内容查找优化
- 问题:现有代码依赖固定字段提取文本范围,易因字段变化导致匹配失败或遗漏部分case。
- 改进:依据文末需求列表查找并拼接case内容,使用库如python-docx和mammoth+html2text以支持复杂格式解析。
2. 类MCP框架设计
- 目标:定义统一的交互规则(Model Context Protocol),规范代码与LLM的信息传递逻辑,确保流程可控。
- 实现:
- 设计标准化的字段格式和方法调用方式。
- 预设多场景处理函数(如horizontal_table、vertical_table),应对格式变体(如字段名同义词、表格/清单差异)。
- 定义默认字段库(key,如ID、Title、Description),作为LLM提取的基准,确保输出一致性。
3. LLM处理逻辑
- 字段处理:
- LLM自主判断字段是否需变更,若文档字段与默认key差异,识别语义关联。
- 变更时强制返回新字段名,并记录映射关系。
- 方法选择:
- LLM基于文档格式分析,从预设函数中选择匹配方法,禁止生成新方法以避免流程失控。
- 特殊情形:
- 若文档格式超出预设方法覆盖范围(如混合表格和清单),LLM识别不适用原因,代码端记录警告日志。
- LLM将原文本转换为可处理格式,替代原始输入后调用对应函数。
- 错误处理:
- 若LLM返回结果无法执行,采集错误信息并反馈,重新获取LLM建议。
- 验证与兜底:
- 对比硬编码结果与LLM输出,验证效果。
- 使用LLM二次验证结果。
- 不确定内容标记为“需进一步处理”。
4. Agent搭建
构建了一个类MCP框架,包含三个Agent,协同完成文档预处理:
- Agent1:读取docx和pdf文档,返回三部分内容:
- key:提取字段(如ID、Title、Description),支持多case,识别语义关联并记录映射。
- method:选择预设处理函数(如horizontal_table)。
- content:以字典存储各key对应内容。
- 实现:
- 使用OpenAI API,设计Prompt(包含任务、要求、案例模块),实现格式化输出key、method、content。
- 修改Prompt以支持错误修正,解决格式化失败或函数无法处理的问题。
- 整合处理函数,完成key提取与方法选择。
- Agent2:修正method和key错误。
- 输入:Agent1的LLM结果(fields)和硬编码结果(result),均为字典格式(如{"ID": "DS936035", "Title": "DS_PSS_EXAM_PA_Modify"})。
- 处理:
- 按字段分批次输入LLM(字符限制10000,至少包含一个对象),分析差异并修正硬编码结果。
- 输出processed_result(修正结果)和verification(修改说明)。
- 解决文件过大问题:更换模型(QwenLong-L1-32B),分批次输入。
- 诊断:对比前3个对象,检查method错误(如horizontal_table应为vertical_table)或key不全导致的空结果,反馈错误给LLM重新识别。
- 代码示例:
- Agent3(可选):修正content部分,移除无效内容(如页头、页尾、图片标题)。
- 输入:Agent1的fields["content"]和硬编码result,分批并行输入(162批次,字符限制10000)。
- 处理:LLM理解key-content关系,甄别无效内容,保留有意义部分,尤其关注过长内容。
- 输出:修正后的result_assist3,保存为JSON至./outputs。
5. 测试与结果
- 测试案例:处理CDS文档(88002023-CDS-AII-01.docx):
- Agent1输出:
- key:["ID", "Title", "Description", "UT", "Rearranged", "PRA", "Status", "Rearranged Reason"]
- method:horizontal_table
- content:3个case(ID:DS910907、DS1460318、DS1406362)详细信息。
- Agent2诊断:发现method错误(应为vertical_table),修正后输出JSON。
- 最终提取8个ID,保存至./outputs/agent_test/88002023-CDS-AII-01.json。
- 问题与解决:
- 初始method错误导致部分结果为空,通过Agent2反馈LLM重新识别。
- 文件内容过大,采用分批次输入和更换模型(Qwen3-235B-2507)解决。
- 待完成:
- 完善case提取逻辑,确保完整提取所有case。
- 测试更多文档,验证JSON输出与硬编码结果一致性。
- 进一步验证流程稳定性(无报错、结果正确)。
6. To Do List
理解任务需求及代码仓
完善case提取逻辑(使用python-docx、mammoth+html2text)
集成OpenAI API
设计Prompt,支持格式化输出
提取LLM输出的key、method、content并替换代码内容
测试JSON输出与硬编码结果匹配
在Prompt中增加错误修正机制
进一步验证流程和结果准确性
成果
成功搭建基于LLM的类MCP框架,包含3个Agent协同工作,实现文档预处理的鲁棒性提升。测试中成功提取8个测试用例ID,纠正method错误,输出JSON格式结果,显著提高处理复杂格式文档的能力,减少规则依赖,增强系统适应性。
技术收获
- LLM应用:掌握Prompt设计、语义关联识别、错误修正机制。
- 文档处理:熟练使用python-docx、mammoth等库处理复杂文档。
- 问题解决:通过分批处理和模型优化解决大文件问题,提升系统稳定性。
Task 5 Python Streamlit打包
任务描述
将基于Streamlit的Python应用(task_dashboard.py)及其运行环境打包为可独立运行的exe文件,确保用户无需配置环境即可运行。同时,开发自动化脚本(bat文件)实现虚拟环境配置和打包流程的自动化。核心挑战在于Streamlit应用的运行方式(通过streamlit run而非直接python执行)以及依赖库的兼容性问题。
工作内容
1. 打包尝试与问题分析
- 目标:将task_dashboard.py及其依赖打包为exe,支持Windows环境运行,隐藏控制台窗口。
- 难点:
- Streamlit应用通过streamlit run task_dashboard.py运行,常规打包工具(如PyInstaller)无法直接识别Streamlit依赖。
- Conda虚拟环境与PyInstaller的兼容性问题,导致DLL处理异常。
- 部分依赖(如streamlit)未被自动检测,需手动配置。
2. 打包方案探索
思路一:使用PyInstaller
- 步骤:
- 确保task_dashboard.py位于项目根目录,所有依赖已安装。
- 执行命令:
- -onefile:打包为单一exe文件。
- -windowed:隐藏控制台窗口,适合GUI应用。
- 解决Streamlit依赖未被检测问题:
- 创建hooks/hook-streamlit.py:
- 修改task_dashboard.spec,在Analysis部分添加:
- 使用命令重新打包:
- 问题:
- 打包失败,报错:
- 原因:PyInstaller无法正确识别Streamlit的元数据和依赖。
思路二:使用cx_Freeze
- 步骤:
- 安装cx_Freeze:
- 问题:未提供具体测试结果,尝试未成功。
思路三:使用auto-py-to-exe
- 步骤:
- 安装auto-py-to-exe:
- 问题:生成exe后运行闪退,未能解决。
思路四:使用Nuitka
- 步骤:
- 执行命令:
- Nuitka尝试下载编译工具链(如MinGW),但因网络问题失败:
- 问题:网络限制导致工具链下载失败,Nuitka编译未完成。
3. 最终方案
- 核心问题:
- Streamlit库未被主流打包工具正确识别,需手动添加依赖。
- Conda虚拟环境与PyInstaller的DLL处理不兼容。
- 解决方案:
- 切换环境:放弃Conda环境,改用原生Python的venv虚拟环境,确保DLL处理一致。
- 手动配置依赖:在task_dashboard.spec中添加Streamlit相关依赖,确保打包完整。
- 打包命令:使用PyInstaller重新打包,生成可运行exe。
- 成果:
- 生成的exe文件可直接运行Streamlit仪表盘,无需额外环境配置。
- 后续代码更新只需替换task_dashboard.py,无需重新安装依赖。
4. 新需求:自动化虚拟环境配置与打包
- 目标:通过bat脚本实现虚拟环境创建、依赖安装和exe打包的自动化。
- 实现:
- 开发bat脚本,包含以下步骤:
- 创建venv虚拟环境。
- 安装Streamlit及相关依赖(numpy, pandas, matplotlib, etc.)。
- 执行PyInstaller打包,包含Streamlit依赖配置。
- 上传脚本及说明文档至:
- 成果:自动化脚本成功实现一键配置与打包,简化开发与部署流程。
成果
- 成功将Streamlit应用打包为独立exe文件,支持无环境运行。
- 开发自动化bat脚本,实现虚拟环境配置和打包流程的自动化,上传至指定仓库并附说明文档。
技术收获
- 打包技术:掌握PyInstaller配置,学会处理Streamlit等复杂依赖的打包问题。
- 环境管理:理解Conda与原生Python环境的差异,熟练使用venv解决兼容性问题。
- 自动化脚本:通过bat脚本实现环境配置和打包自动化,提升开发效率。
Task 6 Streamlit仪表盘中添加白名单
任务描述
在现有Streamlit仪表盘中添加白名单管理功能,支持显示和修改当前系统的白名单配置,包括用户白名单和部门白名单。目标是提升系统的透明性和用户交互体验,确保管理员能够直观地查看和动态调整白名单设置。
工作内容
1. 显示白名单配置
- 功能目标:
- 在仪表盘界面中展示当前系统中白名单功能的启用状态(开启/关闭)以及对应的白名单列表(用户和部门)。
- 实现:
- 修改前端代码,添加白名单状态显示区域,展示以下内容:
- 用户白名单启用状态(usr_whitelist_enable)及用户列表(usr_whitelist)。
- 部门白名单启用状态(dept_whitelist_enable)及部门列表(department_whitelist)。
- 使用Streamlit组件(如st.write或st.table)渲染白名单数据,确保界面清晰、直观。
- 测试不同场景(白名单启用/禁用、空列表、非空列表)下的显示效果,确保用户体验流畅。
2. API设计
- 后端API:
- 设计并实现两个GET请求接口,用于获取用户和部门白名单配置。
- API 1: 获取用户白名单配置
- URL: /admin/config/usr
- 请求类型: GET
- 功能: 返回用户白名单的启用状态和用户列表。
- 返回数据格式示例:
- API 2: 获取部门白名单配置
- URL: /admin/config/dept
- 请求类型: GET
- 功能: 返回部门白名单的启用状态和部门列表。
- 返回数据格式示例:
- 实现:
- 集成后端API到仪表盘前端,通过HTTP请求(使用requests库)获取白名单数据。
- 确保API返回数据格式规范,处理异常情况(如空数据或请求失败)。
3. 修改白名单配置
- 功能目标:
- 支持在仪表盘中动态修改用户白名单和部门白名单(添加/删除用户或部门,切换启用状态)。
- 实现:
- 在仪表盘界面添加交互组件(如st.text_input、st.multiselect或st.checkbox),允许管理员编辑白名单列表和启用状态。
- 开发后端API(未提供具体接口,推测为POST请求)支持更新白名单配置。
- 实现前端与后端的联动:
- 用户通过界面提交修改,触发POST请求更新后端配置。
- 更新后重新调用GET接口刷新界面显示。
- 测试修改功能,确保数据一致性(前端显示与后端存储同步)及操作稳定性。
成果
- 成功在仪表盘中添加白名单管理功能,支持显示用户和部门白名单的启用状态及列表内容。
- 实现两个后端API(/admin/config/usr和/admin/config/dept),提供白名单配置的查询功能。
- 支持动态修改白名单配置,提升了仪表盘的交互性和系统管理效率。
技术收获
- 前端开发:
- 熟练使用Streamlit组件实现动态界面展示和交互功能。
- 掌握前端与后端API的集成流程,优化用户体验。
- 后端接口:
- 学习API设计规范,确保数据格式清晰、请求稳定。
- 问题解决:
- 调试界面显示和交互逻辑,确保不同场景下功能稳定。
- 处理API异常情况,提升系统鲁棒性。
自动化仪表盘说明文档
📋 工具概述
自动化任务监控仪表盘生成工具是一套完整的解决方案,帮助开发者快速将 Python 编写的仪表盘应用程序打包为独立可执行文件。用户无需安装 Python 环境即可运行生成的应用程序,极大地简化了部署和分发过程。
🎯 核心价值
- 零依赖部署:生成的应用可在任何 Windows 系统上直接运行
- 一键自动化:全程自动化打包,无需复杂配置
- 灵活维护:支持快速功能更新,无需重新打包
- 环境隔离:使用虚拟环境确保依赖管理的安全性
📁 核心文件架构
文件名 | 功能描述 | 作用域 |
run_dashboard.spec | PyInstaller 打包配置文件 | 定义应用程序打包参数、资源文件和执行设置 |
run_dashboard.py | 应用程序启动入口 | 负责初始化和启动仪表盘主程序 |
auto_dashboard_exe.bat | 自动化打包脚本 | 完整的环境配置、依赖安装和应用打包流程 |
requirements.txt | Python 依赖清单 | 定义项目所需的所有第三方库及版本 |
dashboard.py | 仪表盘核心实现 | 包含用户界面逻辑和业务功能实现 |
📂 推荐项目结构
⭐ 主要特性
🚀 自动化程度高
- 智能环境检测:自动检查 Python 环境完整性
- 依赖管理:自动创建虚拟环境并安装依赖
- 一键打包:无需手动配置 PyInstaller 参数
🔧 维护友好
- 热更新支持:修改功能无需重新打包
- 模块化设计:核心逻辑与界面分离
- 版本控制友好:清晰的文件结构便于团队协作
📦 部署便捷
- 独立可执行:生成的 .exe 文件包含所有依赖
- 跨机器运行:无需目标机器安装 Python 环境
- 绿色软件:无需安装,双击即用
💻 系统要求
基础环境
- 操作系统:Windows 7/8/10/11(推荐 Windows 10 及以上)
- Python 版本:3.6 - 3.11(推荐 3.8+)
- 内存要求:至少 2GB RAM
- 磁盘空间:至少 500MB 可用空间
网络要求
- 首次运行:需要互联网连接下载依赖包
- 后续使用:可离线运行
Python 环境验证
🚀 快速开始指南
第一步:环境准备
Python 安装验证
- 检查现有安装
如果显示版本号,说明 Python 已正确安装
- 全新安装 Python(如果需要)
- 访问 Python 官网
- 下载适合您系统的 Python 安装包
- 重要:安装时必须勾选 "Add Python to PATH"
- 验证安装:重新打开命令提示符,输入
python --version
项目文件准备
确保所有核心文件位于同一文件夹中:
第二步:生成应用程序
- 启动自动化打包
- 右键点击
auto_dashboard_exe.bat
- 选择"以管理员身份运行"(推荐)
- 监控打包进程 打包过程将显示以下阶段:
- 验证生成结果
- 在项目文件夹中找到
run_dashboard/
目录 - 确认
run_dashboard.exe
文件存在
第三步:运行应用程序
- 启动应用
- 进入
run_dashboard/
文件夹 - 双击
run_dashboard.exe
- 验证功能
- 确认仪表盘界面正常加载
- 测试各项功能是否工作正常
🔧 维护与更新
场景一:仅修改功能逻辑
适用情况:修改界面布局、业务逻辑,但不引入新的第三方库
操作步骤:
- 直接编辑
run_dashboard/dashboard.py
文件
- 保存修改
- 重新运行
run_dashboard.exe
查看效果
优势:
- ⚡ 立即生效,无需重新打包
- 🔄 支持快速迭代开发
- 💾 节省时间和磁盘空间
场景二:添加新依赖库
适用情况:需要引入新的 Python 库来实现新功能
操作步骤:
- 更新依赖清单
编辑项目根目录的
requirements.txt
:
- 修改核心功能
编辑项目根目录的
dashboard.py
:
- 重新打包
运行
auto_dashboard_exe.bat
- 测试新功能
运行新生成的
run_dashboard.exe
🛠️ 高级配置
自定义打包参数
编辑
run_dashboard.spec
文件以自定义打包行为:🚨 故障排除
常见错误及解决方案
1. Python 环境问题
错误信息:
"Python environment not found"
解决方案:
2. 依赖安装失败
错误信息:
"Could not install packages due to an EnvironmentError"
解决方案:
3. 打包过程错误
错误信息:
"PyInstaller failed to execute script"
解决方案:
- 检查代码语法
- 检查隐式依赖
在
run_dashboard.spec
中添加缺失的库:
- 启用调试模式
4. 应用运行时错误
错误信息:应用启动后立即关闭
调试步骤:
- 通过命令行启动
- 检查日志文件 查看是否生成了错误日志文件
- 验证文件完整性
确认
dashboard.py
文件在应用文件夹中
🔍 批处理脚本深度解析
脚本执行流程
关键技术点
- 虚拟环境隔离
- 避免全局 Python 环境污染
- 确保依赖版本一致性
- 便于项目间依赖管理
- PyInstaller 优化
- 使用 spec 文件进行精确控制
- 合理配置隐式依赖
- 平衡文件大小与功能完整性
- 错误处理机制
- 每个关键步骤都有错误检查
- 提供详细的错误信息
- 支持快速定位问题
📚 最佳实践
开发阶段建议
- 依赖管理
- 使用版本范围而非固定版本
- 定期更新依赖到最新稳定版
- 记录依赖选择的原因
- 代码组织
- 性能优化
- 使用 Streamlit 的缓存机制
- 避免在循环中进行重复计算
- 合理使用数据加载策略
部署阶段建议
- 文件管理
- 保持项目根目录的整洁
- 使用
.gitignore
排除临时文件 - 定期清理旧的打包输出
- 版本控制
- 为每次重要更新创建标签
- 维护更新日志
- 保留关键版本的打包文件
- 用户体验
- 提供详细的使用说明
- 考虑添加应用图标和版本信息
- 处理常见的用户操作错误
📖 扩展资源
相关文档
进阶功能
- 添加应用程序图标和版本信息
- 集成自动更新机制
- 支持配置文件外部化
- 添加日志记录功能
社区支持
如遇到问题,可咨询:
- 内部支持:联影大模型
- 社区论坛:Python 开发者社区
- 技术文档:查看相关库的官方文档
📋 总结
这套自动化仪表盘生成工具为 Python 应用的打包和分发提供了完整的解决方案。通过标准化的流程和丰富的配置选项,开发者可以快速将复杂的数据分析应用转换为用户友好的独立程序。
核心优势:
- 🚀 一键自动化打包流程
- 🛡️ 虚拟环境确保依赖安全
- 🔄 支持快速功能迭代
- 📦 生成独立可执行文件
- 🔧 灵活的配置和扩展能力
遵循本指南的建议和最佳实践,您可以高效地开发、打包和维护专业级的仪表盘应用程序。