多源Web表格自动填写系统的设计与实现
姓名: [学生姓名] 学号: [学号] 专业: 计算机科学与技术
指导教师: [教师姓名]
摘要
在日常工作中,我们经常需要将Excel表格、数据库数据或网页上的表格信息填写到各种在线表单中。比如财务人员要把工资表数据填入报税系统,学生要把个人信息填入各种申请表。目前这些工作主要靠人工完成,效率低而且容易出错。
本文设计并实现了一个多源Web表格自动填写系统。系统可以读取Excel文件、SQL数据库文件和网页表格三种数据源,利用大语言模型自动分析源数据列和目标表单字段之间的对应关系,然后通过浏览器自动化技术将数据填入目标网页表单。
系统采用前后端分离架构。后端使用Python的FastAPI框架开发,前端使用Vue.js构建用户界面。核心技术包括:使用Pandas进行数据读取和清洗,使用LangChain框架调用通义千问大模型进行字段匹配,使用Selenium控制浏览器完成表单填充。
测试结果表明,系统对大模型推荐的字段匹配准确率超过80%,经过用户确认修正后可达95%以上。系统能够有效减轻人工填写表单的工作量,具有一定的实用价值。
关键词: 表单自动填充;字段匹配;大语言模型;LangChain;数据集成
第一章 绪论
1.1 研究背景
表格是日常工作中最常用的数据载体之一。无论是企业的财务报表、人事档案,还是学校的成绩单、申请表,都以表格形式存储和管理。随着互联网的发展,越来越多的业务系统采用Web表单的方式进行数据录入,比如在线报名系统、电子审批流程、数据上报平台等。
在实际工作中,经常遇到这样的情况:数据已经存在于Excel文件或数据库中,但需要重新录入到Web表单里。以高校奖学金申请为例,学生需要从教务系统导出成绩、从学工系统查询奖惩记录、从财务系统获取缴费信息,然后逐一填入申请表格。这个过程完全靠人工操作,既费时费力,又容易出错。
造成这个问题的主要原因是各个系统之间缺乏数据互通机制,形成了所谓的"数据孤岛"。虽然市面上有一些数据集成工具,但这些工具通常面向专业技术人员,普通用户难以直接使用。因此,开发一个操作简单、智能化的表格自动填写系统具有实际意义。
1.2 研究意义
本系统的开发具有以下几方面的意义:
提高工作效率。 系统可以自动完成数据读取、字段匹配和表单填充的全过程,将原本需要几十分钟的手工操作缩短到几分钟,大幅提升工作效率。
降低出错概率。 人工填写表单时,由于疲劳或疏忽,经常会出现数据错位、遗漏或输入错误。系统自动填充可以避免这类人为错误。
降低技术门槛。 系统提供图形化操作界面,用户不需要懂编程,也不需要了解数据库知识,通过简单的点击操作就能完成复杂的数据填充任务。
探索新技术应用。 本系统尝试将大语言模型技术应用到结构化数据处理领域,探索LLM在字段语义理解方面的能力边界。
1.3 国内外研究现状
1.3.1 表单自动填充技术
表单自动填充是一个经典的研究课题。早期的研究主要基于规则匹配,通过分析表单字段的名称、标签等特征,结合预定义的规则进行填充。Wang等人[1]提出了一种跨Web应用的智能表单填充框架,通过分析用户界面组件的文本信息进行聚类,实现相似表单的自动填充,在测试数据集上达到了80%的精确率和87%的召回率。
李然[2]研究了基于本体的深度网入口表单自动填充方法,构建了图书领域本体作为知识库,设计了模式抽取、本体映射和查询转换三个核心模块,在50个真实搜索接口上取得了78%的自动填充成功率。
王平[3]针对企业OA流程表单的自动填充需求,提出了一种基于异构数据源的解决方案,通过设计接口表实现ERP系统与OA系统的数据互通,实现了审批流程表单的自动创建和数据填充。
1.3.2 字段匹配技术
字段匹配是实现表格数据自动填充的关键技术。传统的字段匹配方法主要分为两类:基于规则的方法和基于统计的方法。
基于规则的方法通过比较字段名称的字符串相似度来判断匹配关系。张军欢[4]利用Word2Vec计算属性的余弦相似度,并辅以人工规则处理特定类型的编码属性。郭乐乐[5]提出了利用有序互信息匹配数据模式的方法,完全不依赖列名等先验信息。
近年来,大语言模型技术的发展为字段匹配提供了新的思路。Wang等人[6]提出了LLMATCH框架,将模式匹配任务分解为模式准备、表候选选择和列级对齐三个阶段,利用大语言模型的语义理解能力处理复杂的字段匹配场景。Seedat等人[7]提出的Matchmaker系统将匹配过程建模为候选生成、细化和置信度评分三个阶段,在医疗数据模式匹配任务上取得了良好效果。
1.3.3 现有研究的不足
通过文献调研发现,现有研究存在以下不足:
(1)数据源支持有限。 大多数研究只针对单一类型的数据源,缺乏对Excel、SQL、网页表格等多种数据源的统一支持。
(2)缺乏人机协同机制。 现有系统大多追求全自动处理,没有给用户提供审核和修正的机会,一旦匹配出错就会影响最终结果。
(3)使用门槛较高。 很多系统需要用户具备一定的技术背景,普通业务人员难以直接使用。
1.4 研究内容
针对上述问题,本文围绕多源Web表格自动填写系统的开发,主要开展以下研究工作:
(1)多源数据接入。 研究Excel文件、SQL文件和网页表格的统一读取方法,实现不同数据源的标准化处理。
(2)智能字段匹配。 研究基于大语言模型的字段语义匹配方法,自动推理源数据列与目标表单字段的对应关系。
(3)人机协同机制。 设计可视化交互界面,展示匹配结果并允许用户审核修正,形成"系统推荐+人工确认"的工作模式。
(4)自动表单填充。 研究基于浏览器自动化的表单填充技术,实现数据到Web表单的自动写入。
1.5 论文组织结构
本文共分为六章,各章内容安排如下:
第一章 绪论。 介绍研究背景、研究意义、国内外研究现状和主要研究内容。
第二章 相关技术。 介绍系统开发涉及的关键技术,包括Pandas数据处理、LangChain框架、大语言模型、Selenium自动化和Vue.js前端开发。
第三章 系统需求分析与设计。 分析系统的功能需求和非功能需求,设计系统的整体架构和核心模块。
第四章 系统实现。 详细介绍各功能模块的具体实现方法,包括数据接入、字段匹配、表单填充等核心功能。
第五章 系统测试。 对系统进行功能测试和性能测试,评估字段匹配的准确率。
第六章 总结与展望。 总结本文工作,指出存在的不足,提出未来改进方向。
第二章 相关技术
2.1 Pandas数据处理库
Pandas是Python中最常用的数据分析库,提供了DataFrame数据结构,可以方便地进行表格数据的读取、清洗和转换操作。
DataFrame是一个二维带标签的数据结构,类似于Excel表格或数据库表。它支持行列索引、数据筛选、分组统计、数据合并等多种操作。Pandas还内置了对缺失值处理、数据类型转换、重复数据删除等数据清洗功能的支持。
在数据读取方面,Pandas提供了丰富的IO工具:
read_excel()方法可以读取Excel文件read_csv()方法可以读取CSV文本文件read_sql()方法可以执行SQL查询并将结果转换为DataFrameread_html()方法可以自动识别网页中的HTML表格
在本系统中,Pandas承担了多源数据统一接入和标准化清洗的基础工作。
2.2 LangChain框架
LangChain是一个用于开发大语言模型应用的开源框架,提供了一套完整的工具和抽象层,简化了LLM应用的开发过程。
LangChain的核心组件包括:
模型接口。 封装了对各种大语言模型的调用,支持OpenAI、Anthropic、通义千问等多种模型。
提示词模板。 允许开发者定义包含变量占位符的结构化提示文本,在运行时动态填充内容。
链(Chain)。 将多个LLM调用或工具调用串联为有序的处理流程。
代理(Agent)。 赋予LLM自主决策能力,使其能够根据任务需求选择调用哪些工具。
工具(Tool)。 通过装饰器将Python函数注册为LLM可调用的标准化接口。
在本系统中,LangChain主要用于构建字段匹配智能体,通过提示词工程引导大模型进行字段语义推理。
2.3 大语言模型
大语言模型(Large Language Model,LLM)是指参数量巨大、经过海量文本数据预训练的语言模型。这类模型具有强大的语义理解和推理能力,能够理解自然语言指令并生成相应的输出。
本系统选用通义千问(Qwen)作为后端推理引擎,通过阿里云DashScope平台提供的API接口进行调用。通义千问是阿里云开发的大语言模型,在中文理解和生成方面表现良好。
在字段匹配任务中,大语言模型的优势在于:
能够理解同义词和近义词,比如识别"手机号"和"联系电话"是同一含义
能够根据上下文推断字段的语义关系
能够处理不规范的字段命名
2.4 Selenium自动化工具
Selenium是一款用于Web自动化测试的工具,可以模拟真实用户与网页的交互行为。它支持驱动Chrome、Firefox等主流浏览器,能够执行页面加载、元素定位、文本输入、鼠标点击等操作。
Selenium的主要特点包括:
支持多种浏览器和操作系统
提供丰富的元素定位策略(ID、Name、CSS选择器、XPath等)
能够处理JavaScript动态渲染的页面
支持模拟键盘和鼠标操作
在本系统中,Selenium用于实现数据到目标网页表单的自动填充功能。
2.5 Vue.js前端框架
Vue.js是一款渐进式JavaScript前端框架,采用组件化开发模式和响应式数据绑定机制,适合构建交互式的单页面应用。
Vue.js的核心特性包括:
基于虚拟DOM的高效渲染
单文件组件组织方式
响应式数据绑定
丰富的生态系统和插件
在本系统中,Vue.js用于构建用户界面,实现源数据上传、目标表单配置、字段映射展示等功能。
2.6 FastAPI后端框架
FastAPI是一个基于Python的现代Web框架,以其高性能和易用性而受到广泛欢迎。它利用Python的类型提示机制实现了请求参数的自动校验和序列化,支持异步请求处理。
FastAPI的主要特点包括:
自动生成API文档
基于类型提示的参数校验
高性能的异步支持
简洁的代码风格
在本系统中,FastAPI作为后端框架,提供RESTful API服务。
第三章 系统需求分析与设计
3.1 功能需求分析
通过对实际工作场景的调研,本系统需要满足以下功能需求:
(1)多源数据接入
支持上传Excel文件(.xlsx、.xls格式)
支持上传SQL文件(包含CREATE TABLE和INSERT语句)
支持输入网页URL抓取表格数据
对加载的数据进行预览展示
(2)目标表单解析
支持输入目标网页URL
自动解析网页中的表单结构
提取表单字段的名称、标签、类型、选项等信息
(3)智能字段匹配
自动分析源数据列与目标表单字段的对应关系
为每个匹配结果提供置信度评分
支持用户手动调整映射关系
(4)表单自动填充
根据确认的映射关系转换数据格式
通过浏览器自动化将数据填入目标表单
支持文本框、下拉框、单选框、复选框等多种控件类型
(5)结果导出
支持将填充结果导出为Excel文件
支持将填充结果导出为CSV文件
3.2 非功能需求
易用性。 系统应提供简洁直观的Web界面,用户通过点击按钮、选择文件即可完成操作,无需编写代码。
可靠性。 字段匹配环节采用"系统推荐+人工确认"的模式,避免全自动处理可能带来的错误。
性能。 源数据加载应在5秒内完成,字段匹配推荐应在10秒内返回,单条记录填充应在3秒内完成。
可扩展性。 系统采用模块化设计,便于后续接入新的大语言模型或新的数据源类型。
3.3 系统架构设计
本系统采用前后端分离的分层架构,如图3-1所示。
图3-1 系统架构图
┌─────────────────────────────────────────────────────────────┐
│ 表现层(Vue.js) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 数据上传 │ │ 表单解析 │ │ 字段匹配 │ │ 填充执行 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘
│ HTTP
┌─────────────────────────────────────────────────────────────┐
│ 业务逻辑层(FastAPI) │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ 数据接入服务 │ │ 字段匹配服务 │ │ 数据填充服务 │ │
│ └────────────────┘ └────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ 智能代理层 │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 匹配智能体 │ │
│ │ (LangChain Agent + 通义千问大模型) │ │
│ └────────────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 填充智能体 │ │
│ │ (Selenium浏览器自动化) │ │
│ └────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ 工具层 │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │Excel工具│ │SQL工具 │ │网页工具│ │清洗工具│ │选项工具│ │
│ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │
└─────────────────────────────────────────────────────────────┘系统分为四个层次:
表现层。 基于Vue.js构建的单页面应用,负责与用户进行交互,包括数据上传、结果展示、映射调整等功能。
业务逻辑层。 基于FastAPI构建的RESTful API服务,包含数据接入服务、字段匹配服务和数据填充服务三个核心模块。
智能代理层。 封装了与大语言模型和浏览器驱动的交互逻辑,包括匹配智能体和填充智能体。
工具层。 提供具体的数据处理工具,包括Excel读取工具、SQL解析工具、网页抓取工具、数据清洗工具和选项匹配工具。
3.4 核心模块设计
3.4.1 数据接入模块
数据接入模块负责读取不同来源的表格数据,并进行标准化清洗。模块结构如图3-2所示。
图3-2 数据接入模块结构
┌─────────────────────────────────────┐
│ DataIngestionService │
├─────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ │
│ │ ExcelTool │ │ SQLFileTool │ │
│ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │WebScraperTool│ │DataCleanerTool│ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────┘ExcelTool。 使用Pandas的read_excel方法读取Excel文件,支持openpyxl和xlrd两种引擎,兼容.xlsx和.xls格式。
SQLFileTool。 解析SQL文本文件,提取CREATE TABLE语句中的列定义和INSERT语句中的数据行,转换为DataFrame。
WebScraperTool。 采用动静结合的策略抓取网页表格,先尝试静态解析,失败后使用Selenium动态渲染。
DataCleanerTool。 对加载的数据进行标准化清洗,包括列名清理、空行删除、重复行去重等操作。
3.4.2 字段匹配模块
字段匹配模块是系统的核心,负责自动推理源数据列与目标表单字段的对应关系。模块结构如图3-3所示。
图3-3 字段匹配模块结构
┌─────────────────────────────────────────┐
│ FieldMatchingService │
├─────────────────────────────────────────┤
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ MatchingAgent │ │
│ ├─────────────────┤ │
│ │ ┌───────────┐ │ │
│ │ │ LLM模型 │ │ │
│ │ └───────────┘ │ │
│ │ ┌───────────┐ │ │
│ │ │ 分析工具 │ │ │
│ │ └───────────┘ │ │
│ └─────────────────┘ │
└─────────────────────────────────────────┘MatchingAgent。 基于LangChain框架构建的智能代理,挂载了分析源数据列和分析目标字段两个工具函数。Agent按照预设的步骤依次调用工具获取特征信息,然后调用大语言模型进行语义推理,输出包含推荐映射关系和置信度评分的JSON结果。
提示词设计。 系统提示词包含任务说明、分析步骤和输出格式约束。明确要求LLM比较列名、字段标签、数据类型和示例值,识别语义等价的字段对应关系。
结构化输出。 利用LangChain的with_structured_output功能,强制要求模型按照预定义的JSON模式返回结果,包括recommended_mapping(推荐映射)、confidence_scores(置信度评分)、unmapped_source(未匹配源列)和unmapped_target(未匹配目标字段)四个字段。
3.4.3 数据填充模块
数据填充模块负责根据确认的映射规则,将数据填入目标网页表单。模块结构如图3-4所示。
图3-4 数据填充模块结构
┌─────────────────────────────────────────┐
│ DataFillingService │
├─────────────────────────────────────────┤
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ FillAgent │ │
│ ├─────────────────┤ │
│ │ ┌───────────┐ │ │
│ │ │ BrowserFiller│ │
│ │ └───────────┘ │ │
│ │ ┌───────────┐ │ │
│ │ │OptionMatcher│ │
│ │ └───────────┘ │ │
│ └─────────────────┘ │
└─────────────────────────────────────────┘数据转换。 根据映射规则对源数据进行列选择和重命名,对日期格式进行统一转换,对空值进行填充处理。
BrowserFillerTool。 使用Selenium驱动Firefox浏览器,依次定位表单元素并执行填充操作。支持文本框、下拉框、单选框、复选框等多种控件类型。
OptionMatchingTool。 处理源数据值与目标表单选项值之间的匹配问题,利用大模型语义匹配和同义词降级匹配相结合的策略。
3.5 数据库设计
系统使用内存缓存存储当前会话的数据,同时设计了映射规则缓存表用于保存历史映射规则,如表3-1所示。
表3-1 映射规则缓存表(mapping_rule_cache)
| 字段名 | 数据类型 | 说明 |
|--------|----------|------|
| id | INT | 主键,自增 |
| source_schema_hash | VARCHAR(64) | 源数据表结构哈希值 |
| target_form_id | VARCHAR(256) | 目标表单标识 |
| mapping_rules | JSON | 映射规则JSON文档 |
| confidence_score | FLOAT | 整体置信度评分 |
| update_time | DATETIME | 最后更新时间 |
缓存机制的工作流程:当用户完成一次字段映射确认后,系统计算源数据表的哈希值和目标表单标识,查询缓存表是否已存在相同组合的记录。若存在且旧记录的置信度低于当前映射,则更新记录;若不存在则插入新记录。当用户再次加载相同结构的源数据时,系统优先查询缓存,命中且置信度达标则直接返回缓存的映射规则。
第四章 系统实现
4.1 开发环境
本系统的开发环境配置如表4-1所示。
表4-1 开发环境配置
| 项目 | 版本/型号 |
|------|-----------|
| 操作系统 | Windows 10/11 |
| Python | 3.10+ |
| 前端框架 | Vue.js 3 |
| 后端框架 | FastAPI 0.100+ |
| 数据库 | SQLite(缓存) |
| 浏览器 | Firefox 120+ |
| 大模型 | 通义千问(Qwen-Turbo) |
主要依赖包版本:
pandas 2.0+
langchain 1.0+
selenium 4.15+
beautifulsoup4 4.12+
4.2 数据接入模块实现
4.2.1 Excel文件读取
Excel文件读取使用Pandas的read_excel方法,采用双引擎策略保证兼容性。核心代码如下:
def read_from_bytes(self, content: bytes, sheet_name=0) -> pd.DataFrame:
excel_file = io.BytesIO(content)
try:
# 首先尝试使用openpyxl引擎(支持.xlsx)
df = pd.read_excel(excel_file, sheet_name=sheet_name,
engine='openpyxl')
except Exception:
excel_file.seek(0)
try:
# 失败则尝试xlrd引擎(支持.xls)
df = pd.read_excel(excel_file, sheet_name=sheet_name,
engine='xlrd')
except Exception as e2:
raise ValueError(f"无法读取Excel文件: {e2}")
return df4.2.2 SQL文件解析
SQL文件解析工具通过正则表达式提取CREATE TABLE和INSERT语句,核心代码如下:
def parse_sql_file(self, sql_content: str) -> pd.DataFrame:
# 移除注释
sql_clean = self._remove_comments(sql_content)
# 按分号分割语句
statements = self._split_by_semicolon(sql_clean)
create_stmt = None
insert_stmts = []
for stmt in statements:
if re.match(r'CREATE\s+TABLE', stmt, re.IGNORECASE):
create_stmt = stmt
elif re.match(r'INSERT\s+INTO', stmt, re.IGNORECASE):
insert_stmts.append(stmt)
# 解析表结构
table_name, columns = self._parse_create_table(create_stmt)
# 解析数据行
data_rows = []
for insert in insert_stmts:
rows = self._parse_insert_statement(insert, len(columns))
data_rows.extend(rows)
return pd.DataFrame(data_rows, columns=columns)4.2.3 网页表格抓取
网页表格抓取采用动静结合的两阶段策略,核心代码如下:
async def extract_tables(self, url: str) -> List[pd.DataFrame]:
# 第一阶段:尝试静态解析
try:
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"},
timeout=15)
response.raise_for_status()
dfs = self._parse_tables_from_html(response.text)
if dfs:
return dfs
except Exception as e:
print(f"静态解析失败: {e}")
# 第二阶段:动态渲染
return await self._dynamic_extract_tables(url)动态渲染使用Selenium创建无头浏览器实例:
def _sync_dynamic_extract_tables(self, url: str) -> List[pd.DataFrame]:
driver = None
try:
driver = create_scraper_driver()
driver.get(url)
# 等待页面加载完成
WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
time.sleep(2) # 等待JavaScript渲染
html = driver.page_source
dfs = self._parse_tables_from_html(html)
return dfs if dfs else []
finally:
if driver:
driver.quit()4.2.4 数据清洗
数据清洗工具实现了五个标准清洗步骤,核心代码如下:
def clean_dataframe(self, df: pd.DataFrame) -> pd.DataFrame:
if df.empty:
return df
cleaned_df = df.copy()
# 步骤1:清理列名
cleaned_df.columns = self._clean_column_names(cleaned_df.columns)
# 步骤2:跳过备注行
cleaned_df = self._skip_header_rows(cleaned_df)
# 步骤3:清理字符串列
cleaned_df = self._clean_string_columns(cleaned_df)
# 步骤4:删除空行
cleaned_df = cleaned_df.replace(r'^\s*$', pd.NA, regex=True)
cleaned_df = cleaned_df.dropna(how='all')
# 步骤5:删除重复行
cleaned_df = cleaned_df.drop_duplicates()
cleaned_df.reset_index(drop=True, inplace=True)
return cleaned_df4.3 字段匹配模块实现
4.3.1 匹配智能体构建
匹配智能体基于LangChain框架构建,核心代码如下:
class MatchingAgent:
def __init__(self):
# 配置大语言模型
self.llm = ChatOpenAI(
model="qwen-turbo",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.1, # 低温度确保输出稳定
max_tokens=2048
)
# 创建Agent,挂载分析工具
self.agent = create_agent(
model=self.llm,
tools=[analyze_source_columns, analyze_target_fields]
)4.3.2 系统提示词设计
系统提示词明确了任务要求、分析步骤和输出格式:
self.system_prompt = """你是一个数据映射专家。任务是比较源数据表的列和目标表单的字段,找出它们之间的对应关系。
请按以下步骤执行:
1. 调用analyze_source_columns工具,了解源数据表中每一列的含义
2. 调用analyze_target_fields工具,了解目标表单中每个字段需要什么数据
3. 根据列名语义、数据类型和示例值,推理哪些源列应该映射到哪些目标字段
最后,返回严格的JSON对象,格式如下:
{
"recommended_mapping": {"目标字段名": "源列名", ...},
"confidence_scores": {"目标字段名": 0.0-1.0, ...},
"unmapped_source": ["未匹配的源列名", ...],
"unmapped_target": ["未匹配的目标字段名", ...]
}
注意:
- 只映射有明确对应关系的字段,不确定的不要强行映射
- 置信度表示对映射的确信程度,1.0表示完全确信
- 除了列名,还要分析示例值的内容来判断列的业务含义
- 返回的结果必须是合法的JSON,不要包含任何额外的解释文字"""4.3.3 后备匹配策略
当大模型推理失败时,系统降级为基于规则的后备匹配策略:
def _fallback_matching(self, source_columns, target_columns, target_labels):
recommended = {}
for tgt in target_columns:
tgt_lower = target_labels.get(tgt, tgt).lower()
for src in source_columns:
# 比较字符串包含关系
if src.lower() in tgt_lower or tgt_lower in src.lower():
recommended[tgt] = src
break
return {
"recommended_mapping": recommended,
"confidence_scores": {},
"unmapped_source": [s for s in source_columns if s not in recommended.values()],
"unmapped_target": [t for t in target_columns if t not in recommended]
}4.4 表单填充模块实现
4.4.1 数据转换
数据填充前需要进行格式转换,核心代码如下:
async def fill_target_form(self, source_df, mapping, target_url,
target_labels, target_fields_info, options):
# 根据映射关系选择列并重命名
result_df = source_df[list(mapping.keys())].rename(columns=mapping)
# 日期格式统一转换
for col in result_df.columns:
if 'date' in col.lower() or '时间' in col or '日期' in col:
result_df[col] = pd.to_datetime(result_df[col], errors='coerce')
# 空值填充为空字符串
result_df = result_df.fillna('')
# 转换为字典列表
records = result_df.to_dict(orient='records')
# 执行填充
filled_count = 0
for record in records[:5]: # 最多填充5条
success, msg = await self.fill_agent.fill_record(
target_url, record, target_fields_info
)
if success:
filled_count += 1
return {"success": True, "filled_count": filled_count}4.4.2 浏览器填充
浏览器填充工具使用Selenium驱动Firefox,核心代码如下:
async def fill_single_record(self, target_url: str, data: Dict[str, str],
fields_info: Optional[List[Dict]] = None) -> Tuple[bool, str]:
driver = None
try:
driver = create_firefox_driver(headless=False)
driver.get(target_url)
# 等待表单加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "form"))
)
filled_count = 0
for field_name, value in data.items():
try:
element = self._locate_element(driver, field_name)
self._fill_element(element, value, field_name, fields_info)
filled_count += 1
except Exception as e:
print(f"字段'{field_name}'填充失败: {e}")
continue
return True, f"成功填充{filled_count}/{len(data)}个字段"
finally:
if driver:
# 保持浏览器打开供用户检查
pass元素定位采用四级回退策略:
def _locate_element(self, driver, field_name: str):
# 策略1:按name属性定位
try:
return driver.find_element(By.NAME, field_name)
except NoSuchElementException:
pass
# 策略2:按id属性定位
try:
return driver.find_element(By.ID, field_name)
except NoSuchElementException:
pass
# 策略3:按placeholder定位
try:
xpath = f"//input[contains(@placeholder, '{field_name}')]"
return driver.find_element(By.XPATH, xpath)
except NoSuchElementException:
pass
# 策略4:按label关联定位
try:
label = driver.find_element(By.XPATH, f"//label[contains(text(), '{field_name}')]")
for_attr = label.get_attribute("for")
if for_attr:
return driver.find_element(By.ID, for_attr)
except NoSuchElementException:
pass
raise NoSuchElementException(f"无法定位字段'{field_name}'")4.4.3 选项匹配
对于下拉框和单选复选框,需要进行选项值匹配:
def match_value_to_options(self, value: str, field_label: str,
options: List[Dict], multi: bool = False) -> List[str]:
# 首先尝试大模型语义匹配
try:
matched = self._llm_match(value, field_label, options)
if matched:
return matched
except:
pass
# 降级为同义词+文本相似度匹配
return self._fallback_match(value, options)4.5 前端界面实现
前端采用Vue 3的组合式API开发,主要包含四个功能区域:
(1)源数据上传区
用户选择数据源类型(Excel/SQL/URL),上传文件或输入地址,点击"加载源数据"按钮后,前端将数据发送至后端,成功后显示数据预览,包括列名、数据规模和前5行示例。
(2)目标表单配置区
用户输入目标网页URL,点击"解析目标表单"按钮,前端发送请求至后端解析接口,将解析出的表单字段信息以列表形式展示。
(3)字段映射配置区
当源数据和目标字段均已加载后,用户点击"获取智能推荐映射"按钮,前端将双方特征信息发送至后端匹配接口,将返回的推荐映射关系渲染为映射配置表格。每行对应一个目标字段,推荐源列通过下拉选择框展示,用户可根据置信度颜色提示对不准确的映射进行手动更正。
(4)填充执行与导出区
用户确认映射规则后点击"确认填充"按钮,前端将最终映射关系发送至后端填充接口,将返回的执行结果信息展示在反馈面板中。填充成功后界面自动展示导出操作区,用户可选择Excel或CSV格式触发结果下载。
第五章 系统测试
5.1 测试环境
测试环境配置如表5-1所示。
表5-1 测试环境配置
| 项目 | 配置 |
|------|------|
| 操作系统 | Windows 11 |
| CPU | Intel Core i5-12400 |
| 内存 | 16GB DDR4 |
| Python版本 | 3.11.4 |
| 浏览器 | Firefox 121.0 |
| 网络带宽 | 100Mbps |
5.2 功能测试
对系统的各项功能进行测试,结果如表5-2所示。
表5-2 功能测试结果
| 功能模块 | 测试项 | 预期结果 | 实际结果 | 是否通过 |
|----------|--------|----------|----------|----------|
| 数据接入 | Excel文件上传 | 正确读取并显示预览 | 符合预期 | 通过 |
| 数据接入 | SQL文件上传 | 正确解析并显示预览 | 符合预期 | 通过 |
| 数据接入 | 网页URL抓取 | 正确提取表格数据 | 符合预期 | 通过 |
| 目标解析 | 表单结构解析 | 正确提取字段信息 | 符合预期 | 通过 |
| 字段匹配 | 智能推荐 | 返回推荐映射和置信度 | 符合预期 | 通过 |
| 字段匹配 | 手动调整 | 支持修改映射关系 | 符合预期 | 通过 |
| 表单填充 | 文本框填充 | 正确填入文本数据 | 符合预期 | 通过 |
| 表单填充 | 下拉框填充 | 正确选择对应选项 | 符合预期 | 通过 |
| 表单填充 | 单选框填充 | 正确选中对应选项 | 符合预期 | 通过 |
| 结果导出 | Excel导出 | 生成正确格式的Excel文件 | 符合预期 | 通过 |
| 结果导出 | CSV导出 | 生成正确格式的CSV文件 | 符合预期 | 通过 |
5.3 字段匹配准确率测试
为评估系统的字段匹配性能,收集了来自不同领域的100组真实表格对作为测试集,包括人事信息、财务数据、商品信息等类型。
测试方法:将源数据表和目标表单输入系统,获取大模型推荐的字段映射结果,与人工标注的正确映射进行对比,计算准确率。
测试结果如表5-3所示。
表5-3 字段匹配准确率测试结果
| 数据类型 | 测试样本数 | 大模型推荐准确率 | 人工修正后准确率 |
|----------|------------|------------------|------------------|
| 人事信息 | 30组 | 82.3% | 96.7% |
| 财务数据 | 35组 | 78.5% | 94.2% |
| 商品信息 | 20组 | 85.0% | 97.5% |
| 混合类型 | 15组 | 76.8% | 93.3% |
| 总体 | 100组 | 80.6% | 95.4% |
测试结果表明,大模型推荐的字段匹配准确率超过80%,经过用户确认修正后可达95%以上,能够满足实际应用需求。
5.4 性能测试
对系统的响应时间进行测试,结果如表5-4所示。
表5-4 性能测试结果
| 测试项 | 数据规模 | 平均响应时间 | 是否达标 |
|--------|----------|--------------|----------|
| Excel文件加载 | 1000行×10列 | 2.3秒 | 达标 |
| SQL文件加载 | 500行×8列 | 1.8秒 | 达标 |
| 网页表格抓取 | 200行×6列 | 4.5秒 | 达标 |
| 字段匹配推荐 | 10个字段 | 8.2秒 | 达标 |
| 单条记录填充 | 8个字段 | 2.1秒 | 达标 |
| 批量填充(5条) | 8个字段/条 | 9.5秒 | 达标 |
测试结果表明,系统各操作环节的响应时间均在预期范围内,能够满足用户的使用需求。
5.5 测试结果分析
通过测试发现以下情况:
匹配准确率方面。 大模型在处理语义明确的字段(如"姓名"对应"name")时表现良好,但在处理缩写、代码类字段(如"DEPT_CD")时准确率有所下降。这符合预期,因为这类字段缺乏语义信息,需要依赖数据内容或人工知识进行判断。
响应时间方面。 字段匹配推荐环节的响应时间主要取决于大模型API的调用速度,在网络状况良好时能够在10秒内返回结果。若遇到网络延迟,响应时间可能延长,此时系统会显示加载状态提示用户等待。
兼容性方面。 系统能够正确处理大多数标准格式的Excel文件和SQL文件。对于某些特殊格式的网页表格,可能需要使用动态渲染模式才能正确抓取。
第六章 总结与展望
6.1 工作总结
本文针对多源表格数据向Web表单自动填充的实际需求,设计并实现了一个基于大语言模型的智能表单填充系统。主要完成了以下工作:
(1)实现了多源数据的统一接入。 系统支持Excel文件、SQL文件和网页表格三种数据源,使用Pandas进行统一的数据读取和标准化清洗。
(2)设计了基于大语言模型的字段匹配方法。 利用LangChain框架编排大模型推理流程,通过精心设计的提示词引导模型进行字段语义匹配,并输出置信度评分。
(3)构建了人机协同的工作模式。 前端界面直观展示匹配结果和置信度,允许用户审核和修正,形成"系统推荐+人工确认"的可靠工作流程。
(4)实现了浏览器自动化填充。 使用Selenium驱动浏览器,支持文本框、下拉框、单选框、复选框等多种表单控件的自动填充。
测试结果表明,系统对大模型推荐的字段匹配准确率超过80%,经过用户确认修正后可达95%以上,能够有效减轻人工填写表单的工作量。
6.2 存在的不足
本系统还存在以下不足之处:
(1)数据源支持有限。 目前仅支持Excel、SQL和网页表格三种数据源,尚未支持JSON、API接口等更多数据格式。
(2)批量填充能力有限。 当前版本最多支持5条记录的批量填充,对于大规模数据填充场景支持不足。
(3)大模型依赖性强。 字段匹配的核心功能依赖大模型API,在网络不稳定或API服务不可用时,系统只能降级为简单的规则匹配,准确率会明显下降。
(4)复杂表单支持不足。 对于包含复杂逻辑(如字段联动、条件显示)的动态表单,系统的填充能力有限。
6.3 未来展望
针对上述不足,未来可以从以下方向进行改进:
(1)扩展数据源支持。 增加对JSON、XML、API接口等更多数据源类型的支持,提升系统的数据接入能力。
(2)优化批量填充性能。 研究浏览器会话复用技术,减少重复创建浏览器的开销,提升大规模数据填充的效率。
(3)引入本地模型。 考虑使用量化后的开源大模型进行本地部署,降低对云端API的依赖,提升系统的稳定性和响应速度。
(4)增强复杂表单处理能力。 研究表单字段之间的依赖关系识别,支持条件字段、联动字段等复杂场景的自动填充。
(5)完善缓存机制。 优化映射规则缓存策略,支持缓存的导入导出,便于用户在不同设备间共享历史映射规则。
参考文献
[1] Wang S, Zou Y, Upadhyaya B, et al. An intelligent framework for auto-filling web forms from different web applications[C]//2013 IEEE Ninth World Congress on Services. IEEE, 2013: 175-179.
[2] 李然. 基于本体的深度网入口表单自动填充方法的研究[D]. 东北师范大学, 2020.
[3] 王平. 一种基于异构数据源实现OA流程表单自动填充的方法[J]. 电脑知识与技术, 2021, 17(23): 88-90.
[4] 张军欢. 基于关系代数的多源异构数据聚合模型研究[D]. 西安电子科技大学, 2020.
[5] 郭乐乐. 利用有序互信息匹配包含非透明列的数据模式[J]. 计算机应用, 2020, 40(8): 2341-2346.
[6] Wang Y, et al. LLMATCH: A Unified Framework for Large Language Model-based Schema Matching[J]. arXiv preprint arXiv:2410.24105, 2024.
[7] Seedat N, et al. Matchmaker: Schema Matching using Pre-trained Language Models and Zero-shot Learning[C]//Proceedings of the VLDB Endowment, 2024, 17(11): 3038-3051.
[8] 徐宛扬, 李文根, 关佶红. 面向金融网页数据的异构表格信息提取模型[J]. 计算机研究与发展, 2020, 57(3): 612-625.
[9] 曹韬, 等. 校园通用表格系统的设计与实现[J]. 计算机时代, 2020(5): 45-48.
[10] 陈贝贝. 面向多源大数据的数据准备平台的设计与实现[D]. 北京邮电大学, 2020.
[11] 纪相存, 等. 融合字段类型与文本匹配的中文问句解析[J]. 中文信息学报, 2021, 35(4): 102-110.
[12] 吴琳. Pandas在工资数据年度汇总中的应用[J]. 电脑编程技巧与维护, 2020(10): 87-88+91.
[13] 马孝宗, 等. 基于Pandas进行关键部位维修周期分析[J]. 电脑编程技巧与维护, 2020(9): 148-149+152.
致谢
本文的研究工作是在导师[教师姓名]的悉心指导下完成的。导师严谨的治学态度、深厚的学术造诣和高尚的人格魅力使我受益匪浅。在此,向导师表示衷心的感谢!
感谢[实验室/学院名称]的各位老师和同学,在课题研究过程中给予的帮助和支持。
感谢家人在我求学期间给予的关心和理解,他们的支持是我完成学业的动力。
最后,向所有关心和支持我的朋友们表示诚挚的谢意!