Skip to content

多源Web表格自动填写系统的设计与实现

字数
10038 字
阅读时间
39 分钟

姓名: [学生姓名]   学号: [学号]   专业: 计算机科学与技术

指导教师: [教师姓名]


摘要

在日常工作中,我们经常需要将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查询并将结果转换为DataFrame

  • read_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方法,采用双引擎策略保证兼容性。核心代码如下:

python

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 df

4.2.2 SQL文件解析

SQL文件解析工具通过正则表达式提取CREATE TABLE和INSERT语句,核心代码如下:

python

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 网页表格抓取

网页表格抓取采用动静结合的两阶段策略,核心代码如下:

python

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创建无头浏览器实例:

python

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 数据清洗

数据清洗工具实现了五个标准清洗步骤,核心代码如下:

python

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_df

4.3 字段匹配模块实现

4.3.1 匹配智能体构建

匹配智能体基于LangChain框架构建,核心代码如下:

python

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 系统提示词设计

系统提示词明确了任务要求、分析步骤和输出格式:

python

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 后备匹配策略

当大模型推理失败时,系统降级为基于规则的后备匹配策略:

python

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 数据转换

数据填充前需要进行格式转换,核心代码如下:

python

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,核心代码如下:

python

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

元素定位采用四级回退策略:

python

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 选项匹配

对于下拉框和单选复选框,需要进行选项值匹配:

python

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.


致谢

本文的研究工作是在导师[教师姓名]的悉心指导下完成的。导师严谨的治学态度、深厚的学术造诣和高尚的人格魅力使我受益匪浅。在此,向导师表示衷心的感谢!

感谢[实验室/学院名称]的各位老师和同学,在课题研究过程中给予的帮助和支持。

感谢家人在我求学期间给予的关心和理解,他们的支持是我完成学业的动力。

最后,向所有关心和支持我的朋友们表示诚挚的谢意!

贡献者

The avatar of contributor named as freeway348 freeway348

文件历史

撰写