Skip to content

毕业设计系统技术深度解析指南

字数
3747 字
阅读时间
16 分钟

目标:系统化讲解本系统的功能实现流程技术选型选型理由,并对比同类技术,帮助你深入理解技术决策背后的逻辑,从容应对答辩中的技术类提问。


第一部分:整体功能实现流程(一步一步看)

Step 1:用户在前端选择数据源并上传

  • 用户操作:选择数据源类型(Excel / SQL文件 / 网页表格URL),上传文件或填写URL。
  • 前端实现index.html + main.js,通过FormData封装,调用后端/api/source/preview接口。
  • 后端接收DataIngestionService根据type分发到对应的读取工具。

Step 2:后端读取并清洗数据

  • Excel文件ExcelReadTool.read_from_bytes(),支持.xlsx(openpyxl)和.xls(xlrd)双引擎。
  • SQL文件SQLFileTool.parse_sql_file(),解析CREATE TABLEINSERT语句,重建DataFrame。
  • 网页表格URLWebScraperTool.extract_tables(),先尝试静态解析(pd.read_html),若失败则启动Selenium无头浏览器动态渲染。
  • 清洗DataCleanerTool.clean_dataframe():清理列名、删除备注行、清除空行/重复行、标准化字符串。
  • 返回:列名、前5行示例数据、行列形状、数据类型给前端预览。

Step 3:用户输入目标表单URL,后端解析表单结构

  • 调用/api/target/preview?target_url=...
  • 工具WebScraperTool.extract_form_structure(),启动Selenium驱动Firefox,等待<form>出现。
  • 提取内容
    • 每个输入控件的nameidtype
    • 通过labelfor属性、父级labelaria-labelplaceholder等获取显示标签
    • 对于select,提取所有optionvaluelabel
    • 对于radio/checkbox,按name分组,收集所有选项
  • 返回前端:字段列表(含标签、名称、类型、选项)、字段类型映射、示例空值。

Step 4:用户点击“获取智能推荐映射”

  • 请求/api/mapping/recommend,携带源数据列信息、示例值、数据类型,以及目标字段信息。
  • 核心处理FieldMatchingServiceMatchingAgent
  • MatchingAgent工作流
    1. 使用LangChain的create_agent创建代理,配备两个工具:analyze_source_columnsanalyze_target_fields
    2. 代理调用工具获取源列和目标字段的详细描述(列名+类型+示例值)。
    3. 代理调用通义千问大模型(通过ChatOpenAI兼容接口),传入精心设计的系统提示词。
    4. 大模型返回JSON格式映射,每条映射带置信度(0~1)。
    5. 解析JSON,若失败则降级为子串匹配。
  • 返回前端:推荐映射字典、置信度字典、未匹配列表。

Step 5:前端展示映射表格,用户可手动调整

  • 渲染v-for遍历目标字段,生成表格行,每行一个下拉框绑定源列。
  • 颜色标注:根据置信度添加confidence-high/medium/low类,背景色绿/黄/红。
  • 用户修改:下拉框v-model实时更新映射关系,系统暂存。

Step 6:用户点击“确认填充”

  • 请求/api/fill/execute,携带最终映射、目标URL、字段信息等。
  • 后端处理DataFillingService.fill_target_form()
    • 根据映射选出源数据相关列,重命名为目标字段名。
    • 日期格式转换、空值填充为空字符串。
    • 调用FillAgent.fill()
  • FillAgent:循环每条记录,调用BrowserFillerTool.fill_single_record()
  • BrowserFillerTool填充流程
    • 启动Firefox浏览器(可配置无头/有头)。
    • 访问目标URL,等待表单加载。
    • 对每个映射字段:
      • 四级定位(name → id → placeholder → label关联)。
      • 判断控件类型:
        • 普通input/textarea:clear() + send_keys()
        • select:Select对象,尝试按visible_text/value/index匹配
        • radio/checkbox:若有选项列表,调用OptionMatchingTool匹配源值到选项值,然后点击对应控件
      • 异常捕获,失败则跳过但记录。
    • 填充完成后若keep_open=True则保持浏览器打开,用户手动关闭后继续下一条(当前版本每个记录新建浏览器)。
  • 返回结果:成功/失败状态、成功条数、详细消息。

Step 7:导出结果

  • 请求/api/export?format=excelcsv
  • 后端:从DataFillingService获取已填充的DataFrame,列名替换为目标字段的显示标签,通过to_excel/to_csv写入临时文件,返回FileResponse触发下载,后台删除临时文件。

第二部分:技术选型及对比分析

2.1 后端核心框架:FastAPI vs Flask/Django

对比项FastAPI(本系统)FlaskDjango
异步支持原生async/await需要额外库(如quart)部分异步,但主要同步
自动API文档自动生成/docs需手动配置(如flasgger)需插件
数据校验Pydantic模型,自动类型校验需手动或Marshmallow内置Form/Model,较重
性能极高(基于Starlette)一般一般
学习曲线平缓平缓较陡
适用场景API服务、微服务小型应用、简单API全栈网站、ORM重度使用

为什么选FastAPI?

  • 本系统是前后端分离,只需要RESTful API,不需要Django的模板和ORM。
  • 需要异步处理Selenium调用(虽然实际用了asyncio.to_thread,但框架支持异步有利于后续优化)。
  • 自动生成API文档便于前后端联调。
  • 性能好,启动快。

2.2 大模型框架:LangChain vs 直接调用API

对比项LangChain直接调用OpenAI/DashScope API
工具调用内置@tool装饰器,Agent自动决策调用时机需手动编写函数调用逻辑,自己管理循环
提示词模板支持ChatPromptTemplate,可组合手动拼接字符串
输出解析PydanticOutputParser,可强制结构化输出需自己用正则或JSON解析
链式组合LCEL语法,易于构建复杂流程手动写条件分支
生态集成丰富的已有工具(搜索、数据库等)
学习成本中等

为什么选LangChain?

  • 本系统需要大模型“先观察数据再推理”,LangChain的Agent模式天然支持这种“工具调用+推理”循环。
  • 输出JSON格式的映射和置信度,LangChain的输出解析器可以简化代码。
  • 未来可能扩展更多工具(如数据清洗建议、转换规则推理),LangChain易于添加。
  • 虽然增加了依赖,但提高了代码的可维护性和扩展性。

2.3 自动化工具:Selenium vs Playwright vs Puppeteer

对比项Selenium(本系统)PlaywrightPuppeteer
浏览器支持Chrome, Firefox, Edge, SafariChrome, Firefox, Edge, Safari主要Chrome/Chromium
语言绑定Python, Java, JS, C#等Python, JS, Java, .NET主要Node.js
等待机制显式等待+Expected Conditions自动等待+内置断言基于Promise的等待
速度较慢(WebDriver协议)较快(DevTools协议)
稳定性成熟老牌,社区大较新,但日益流行稳定
无头模式支持支持支持
本系统需求需要Python、需兼容Firefox也支持,但本系统初始选型时Selenium更熟悉仅Chrome,不够通用

为什么选Selenium?

  • 本系统开发前团队成员对Selenium最熟悉,资料多,问题易解决。
  • 需要支持Firefox(论文中指定),Selenium对Firefox驱动(geckodriver)支持完善。
  • Playwright虽快,但当时对于Python的生态成熟度略逊于Selenium。
  • 作为学术演示系统,Selenium的稳定性足够。

2.4 前端框架:Vue.js vs React vs Angular

对比项Vue.js(本系统)ReactAngular
学习曲线平缓(模板语法接近HTML)中等(JSX)陡峭(TypeScript、RxJS、依赖注入)
数据绑定双向绑定(v-model单向数据流双向绑定
包大小小(~30KB)中等
性能快(虚拟DOM)
本系统适用性快速开发表单交互,颜色标注等同样适用过于重量级

为什么选Vue.js?

  • 开发速度快:不需要配置JSX,直接用模板语法。
  • v-model对表单控件(下拉框、复选框)的双向绑定非常方便,适合映射表格的交互。
  • 响应式系统简单直观,v-if控制步骤化显示容易实现。
  • 体积小,加载快,适合单页应用。

2.5 数据处理:Pandas vs 原生Python

对比项Pandas原生Python(list/dict)
表格操作内置read_excel, read_sql, merge, groupby需手动实现
性能向量化操作,C底层,快循环慢
缺失值处理dropna, fillna便捷手动判断
数据类型自动推断,支持datetime等需自己转换
本系统需求多源统一为DataFrame,清洗方便代码量巨大

为什么选Pandas?

  • Excel、SQL、HTML表格都可以直接用Pandas的函数读取,几行代码搞定。
  • 数据清洗(去重、去空、列名清理)有现成方法。
  • 本系统后续需要将填充结果导出为Excel/CSV,Pandas直接支持。

2.6 大模型:通义千问 vs GPT-3.5/4 vs 本地模型(如ChatGLM)

对比项通义千问(本系统)GPT-3.5/4本地模型(如ChatGLM-6B)
成本便宜(阿里云按量付费)GPT-4较贵,GPT-3.5中等硬件成本高(需GPU)
中文能力优秀(原生中文)良好(但英文更强)优秀
API兼容性支持OpenAI格式,LangChain可直接用原生支持需自己部署和封装
延迟中等取决于硬件
稳定性SLA保证自建不稳定
教育优惠阿里云学生优惠可用-

为什么选通义千问?

  • 本系统是毕设,预算有限,通义千问有免费额度且便宜。
  • 任务主要是中文语义匹配,通义千问效果足够。
  • API兼容OpenAI格式,无缝集成LangChain。
  • 不选本地模型是因为个人电脑无GPU,部署困难。

第三部分:技术栈总览图

┌─────────────────────────────────────────────────────────────┐
│                        前端(Vue 3)                         │
│  index.html + main.js + styles.css                          │
│  响应式数据、步骤化引导、映射表格、颜色标注、文件上传       │
└───────────────────────────┬─────────────────────────────────┘
                            │ HTTP (RESTful API)

┌─────────────────────────────────────────────────────────────┐
│                   后端(FastAPI + Uvicorn)                  │
│  ┌───────────────────────────────────────────────────────┐ │
│  │  API路由层 (api/endpoints.py)                         │ │
│  │  /source/preview  /target/preview  /mapping/recommend │ │
│  │  /fill/execute  /export                               │ │
│  └───────────────────────────────────────────────────────┘ │
│  ┌───────────────────────────────────────────────────────┐ │
│  │  业务服务层 (services/)                               │ │
│  │  DataIngestionService, FieldMatchingService,          │ │
│  │  DataFillingService                                   │ │
│  └───────────────────────────────────────────────────────┘ │
│  ┌───────────────────────────────────────────────────────┐ │
│  │  智能体/工具层 (agents/ + tools/)                     │ │
│  │  MatchingAgent (LangChain)  →  通义千问              │ │
│  │  FillAgent (Selenium)        →  Firefox + geckodriver│ │
│  │  OptionMatchingTool (大模型+降级)                     │ │
│  └───────────────────────────────────────────────────────┘ │
│  ┌───────────────────────────────────────────────────────┐ │
│  │  数据层 (tools/)                                      │ │
│  │  ExcelReadTool, SQLFileTool, WebScraperTool,         │ │
│  │  DataCleanerTool                                      │ │
│  └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

第四部分:答辩可能追问的技术对比问题

Q1:为什么不用RPA工具(如UiPath、影刀)而自己开发?

  • RPA一般需要预先录制操作步骤,对字段变化敏感。本系统基于大模型动态理解字段语义,即使目标表单的字段顺序或标签有小变化,仍能匹配。
  • RPA商业软件成本高,本系统开源免费。
  • 本系统专注于“字段语义匹配”这个技术难点,体现学术创新。

Q2:为什么不在前端直接用<input>原生自动填充功能?

  • 浏览器原生自动填充仅支持已保存的表单数据,无法从Excel等外部数据源读取。
  • 无法自定义映射关系,不支持不同数据源列与表单字段的灵活配对。

Q3:Selenium效率低,为什么不用requests模拟提交?

  • 现代网页大量使用JavaScript动态渲染,requests只能获取静态HTML,无法与需要点击、下拉等交互的表单交互。
  • Selenium通过真实浏览器执行,能处理复杂的前端逻辑(如校验、异步加载选项)。
  • 虽然牺牲了速度,但换来了通用性和可靠性。

Q4:如果大模型API断网,系统还能用吗?

  • 系统设计了降级机制:当大模型调用失败或超时时,自动回退到子串匹配(_fallback_matching)。
  • 用户仍可获得一个基础的映射建议,且可手动调整。
  • 选项匹配也有降级策略(同义词扩展)。

Q5:你的提示词工程具体是怎么做的?

  • 系统提示词要求模型严格按步骤:先调用工具获取源列和目标字段信息,再推理。
  • 输出格式强制为JSON,包含recommended_mappingconfidence_scores等字段。
  • 置信度由模型自行评估(通过语义相似程度)。
  • 提示词中还强调了“仅映射有明确对应关系的字段”,避免错误匹配。

第五部分:总结与建议

你的技术栈亮点(答辩时突出):

  1. 混合架构:前后端分离 + 异步API + 同步阻塞工具(Selenium)通过asyncio.to_thread隔离。
  2. LLM工程化:LangChain Agent + 结构化输出 + 降级策略,兼顾智能与稳定。
  3. 多源统一模型:Pandas作为数据中枢,无论输入是什么,内部统一为DataFrame。
  4. 人机协同:置信度可视化+手动修正,不是盲目自动化。

可以补充说明的改进方向(显示你有思考):

  • 引入浏览器会话池,批量填充时复用driver,提升性能。
  • 支持本地小模型(如BERT)做轻量级字段匹配,作为大模型的缓存或降级。
  • 前端增加填充进度条和实时日志。

最后的叮嘱:

  • 理解每个技术选型背后的trade-off(取舍),面试官/老师喜欢听你分析利弊。
  • 能够手绘架构图并解释每一层。
  • 对性能数据中的“慢”有合理解释和改进思路,比回避强。

祝你答辩时对答如流!

贡献者

The avatar of contributor named as freeway348 freeway348

文件历史

撰写