【大模型算法工程】大模型应用工具化、忠诚度以及知识库场景下PDF双栏解析问题的讨论
1. 大模型时代应用工具化以及无忠诚度现象讨论
接触大模型久了,也慢慢探到一些大模型能力表现非常自然和突出的场景,比如AI搜索(依赖大模型的理解总结能力)、AI对话(即chat,依赖大模型的生成能力)、AI工具使用(即智能体,依赖大模型的规划能力),应该说目前主流应用就是围绕这三个点进行的,没有例外。比如近期推出的夸克超级框、manus智能体工具、ima知识库都是如此。
另外,对于AI应用,当下用户其实完全没有忠诚度可言,这一特点是与之前移动应用时代app存在天壤之别。移动应用时代,更多是场景的扩展,将原来PC场景衍生到APP场景,用户忠诚的依然是平台资源本身。但到了AI应用时代,只要是哪一个产品使用更快更好更人性化,用户就会果断切换到新的产品。例如deepseek横空出世,包括腾讯、阿里云、字节在内的大厂,直接集成到自家云产品,用户也果断从之前的kimi、豆包、智谱清言,切换到各种deepseek chat工具。还有最近身边朋友看论文用夸克,但我推荐了另一款AI阅读助手后,他发现AI阅读助手表现更好,直接就放弃了夸克,改用我推荐的产品。这种现象和AI应用工具化有关,不需要依赖什么其他的资源,工具本身就是产品,随时可以切换,哪种效率提升更快就用哪一种。
所以说,要想从众多的模型、应用中凸显出来,必然需要不断追求对于场景最优的模型,用户体验越好的产品。这就绕不开产品匠心逻辑。反正当下既要速度也需要沉下心打磨出更好的产品。
说起产品打磨,回到知识库RAG场景,要想RAG能够又好又快又准确返回结果,一开始的文档解析工作就非常值得好好做。最近用了deepseek、智谱清言的工具,发现文档解析能力还有很多提升空间,只支持部分文档的解析,这或许是大模型公司更关注基础模型能力,只要有一个产品就行,但我觉得to C的产品还是有必要投入打磨。
2. 知识库生态建设之双栏PDF解析
对于文档解析,其中一个非常有意思的场景是对PDF双栏文档的解析,如果是按正常的解析工具以行为单位解析,会导致解析后的排版非常糟糕,比如夸克的解析,就不是很好。反而通义的工具表现很不错。
双栏解析的目标:
- 正确识别左右两栏
- 先处理左栏内容,再处理右栏内容
- 每栏内部按照从上到下的顺序排列
这里给一个简单的双栏解析思路:
- 利用CV工具将 pdf 每一页转换为图片
- 利用目标检测模型识别每一页中的元素并标注类型,即版面分析(例如yolo)
- 利用 OCR 来提取每一个元素中文字块信息(例如paddle系列)
- 利用表格抽取模型识别跨页表格(可以自己训)
- 完成版面分析,读取版面分析的JSON结果(包括每一模块的坐标信息)
- 对每一模块元素进行排序,排序逻辑如下:
- 计算每个元素在页面左右两侧的覆盖比例
- 根据覆盖比例确定元素属于左栏还是右栏
- 对于跨栏元素特殊处理
- 按照"先左栏后右栏,同栏内从上到下"的顺序输出
实施方案:
区分单栏和双栏:
- 计算所有文本块中心点的横坐标极差。
- 设定一个阈值(可以调整),如果极差小于阈值,则判定为单栏,否则为双栏。
单栏排序:
- 直接按中心点纵坐标(
top
)升序 排序。双栏排序:
- 计算页面中线(即所有文本块中心点的平均横坐标)。
- 文本块分类:
- 左栏:文本块的 右边界 < 中线
- 右栏:文本块的 左边界 > 中线
- 通栏:文本块的 左边界 < 中线 且 右边界 > 中线
- 排序顺序:
- 先对 左栏按
top
升序 排序。- 再对 右栏按
top
升序 排序。- 处理 通栏:
- 通栏上方 的 右栏拼接到左栏后。
- 通栏 内容放在其下方。
- 通栏下方 的 右栏拼接到左栏后。
其中:
页面宽度估计:
- 如果没有提供
page_width
,则从元素坐标中推断最大右边界作为页面宽度,可用于适配不同页面宽度的文档。中线计算:
- 采用
page_width / 2
计算页面的中线坐标,然后通过文本块覆盖比例(左/右)来判断其归属。更精准的左右栏判定:
- 计算文本块的左侧部分宽度和右侧部分宽度,再计算左右覆盖比例。
- 如果 90%以上的内容位于左侧,则归入左栏;如果 90%以上内容在右侧,则归入右栏。
- 这种方式比简单的 “右边界 < 另一文本块的左边界” 方法更加准确,能够适应不同尺寸的文本块,尤其是跨栏情况。
排序逻辑:
- 左栏文本块按照纵坐标排序,确保从上到下排列。
- 右栏文本块也按照纵坐标排序。
- 最终合并:左栏 → 右栏,保证自然的阅读顺序。
代码示例:
def sort_text_blocks(res):"""对文本块进行排序,支持单栏、双栏、通栏布局:param res: 文本块列表,每个文本块包含 'page_idx' 和 'extra_data'(包含 'position' 坐标):return: 经过排序的文本块列表"""# 按页码排序res.sort(key=lambda x: get_page_idx_value(x["page_idx"]))sorted_res = []pages = {}# 按页分组for block in res:page_idx = get_page_idx_value(block["page_idx"])pages.setdefault(page_idx, []).append(block)# 处理每一页for page_idx, blocks in pages.items():if not blocks:continuemax_page_width = extract_max_page_width(blocks)page_center_x = max_page_width / 2left_column, right_column, full_column = [], [], []for block in blocks:position = block["extra_data"]["position"]if isinstance(position, list) and len(position) > 0 and isinstance(position[0], list):x1, x2, y1, y2 = position[min(1, len(position) - 1)]else:x1, x2, y1, y2 = positionblock_width = x2 - x1left_part = max(0, min(x2, page_center_x) - x1)right_part = max(0, x2 - max(x1, page_center_x))left_ratio = left_part / block_width if block_width > 0 else 0right_ratio = right_part / block_width if block_width > 0 else 0if left_ratio >= 0.9:left_column.append(block)elif right_ratio >= 0.9:right_column.append(block)else:full_column.append(block)# 按从上到下排序key_func = lambda b: get_position_value(b["extra_data"]["position"], 2)left_column.sort(key=key_func)right_column.sort(key=key_func)full_column.sort(key=key_func)if full_column:min_full_top = get_position_value(full_column[0]["extra_data"]["position"], 2)max_full_bottom = get_position_value(full_column[-1]["extra_data"]["position"], 3)sorted_blocks = ([b for b in left_column if get_position_value(b["extra_data"]["position"], 3) < min_full_top] +[b for b in right_column if get_position_value(b["extra_data"]["position"], 3) < min_full_top] +full_column +[b for b in left_column if get_position_value(b["extra_data"]["position"], 2) > max_full_bottom] +[b for b in right_column if get_position_value(b["extra_data"]["position"], 2) > max_full_bottom])else:sorted_blocks = left_column + right_columnsorted_res.extend(sorted_blocks)return sorted_res
3. 参考材料
【1】LLM常见问题(基于 AI 的 pdf 解析)
【2】双栏学术论文转换为单栏Markdown
相关文章:
【大模型算法工程】大模型应用工具化、忠诚度以及知识库场景下PDF双栏解析问题的讨论
1. 大模型时代应用工具化以及无忠诚度现象讨论 接触大模型久了,也慢慢探到一些大模型能力表现非常自然和突出的场景,比如AI搜索(依赖大模型的理解总结能力)、AI对话(即chat,依赖大模型的生成能力࿰…...
Rust语言学习
Rust语言学习 通用编程概念所有权所有权引用和借用slice struct(结构体)定义并实例化一个结构体使用结构体方法语法 枚举 enums定义枚举match控制流运算符if let 简单控制流 使用包、Crate和模块管理不断增长的项目(模块系统)包和crate定义模块来控制作用…...
AI比人脑更强,因为被植入思维模型【16】反脆弱
毛选中就有言,不经历困难,我们就不会掌握战胜困难的方法。 这个世界纷繁复杂,不是强者总是运气好,而是他们能够失败后快速复原,不断找到战胜困难的方法。 定义 马斯洛需求层次模型是一种将人类需求从低到高按层次进…...
系统架构设计知识体系总结
1.技术选型 1.什么是技术选型? 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…...
计算机视觉的多模态模型
计算机视觉的多模态模型 是指能够同时处理和理解 多种类型数据(模态) 的模型。这些模态可以包括图像、文本、音频、视频、深度信息等。多模态模型的核心目标是利用不同模态之间的互补信息,提升模型的性能和泛化能力。 1. 多模态模型的核心思想…...
Scrapy 入门教程
Scrapy 入门教程 Scrapy 是一个用于爬取网站数据的 Python 框架,功能强大且易于扩展。本文将介绍 Scrapy 的基本概念、安装方法、使用示例,并展示如何编写一个基本的爬虫。 1. 什么是 Scrapy? Scrapy 是一个开源的、用于爬取网站数据的框架…...
Oracle OCP认证是否值得考?
Oracle OCP(Oracle Certified Professional)认证是数据库领域的传统权威认证,但随着云数据库和开源技术的崛起,其价值正面临分化。是否值得考取,需结合你的职业定位、行业需求及长期规划综合判断。以下是关键分析&…...
OpenCV中距离公式
一、各类距离公式总结 常见距离公式 欧氏距离: 曼哈顿距离(L1): 切比雪夫距离(Chessboard): 1、点与点距离(欧氏距离) 二维空间 设两点坐标为 P1(x1,y1)、P2(x2,y2),其距离…...
DeepSeek自学手册:《从理论(模型训练)到实践(模型应用)》|73页|附PPT下载方法
导 读INTRODUCTION 今天分享是由ai呀蔡蔡团队带来的DeepSeek自学手册:《从理论(模型训练)到实践(模型应用)》,这是一篇关于DeepSeek模型训练、应用场景及替代方案的综合指南文章,主要介绍了Deep…...
Doris官网上没有的一些Fe参数了,都在源码中
一、FE配置源码 apache-doris-src\fe\fe-common\src\main\java\org\apache\doris\common\Config.java 二、BE配置源码 apache-doris-src\be\src\common\config.cpp 三、FE源码 package org.apache.doris.common;public class Config extends ConfigBase {ConfField(descri…...
(一)丶Windows安装RabbitMQ可能会遇到的问题
一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…...
stm32g030移植RT-Thread
移植流程 移植前需要安装Keil.STM32G0xx_DFP.1.2.0.pack组件,大致的移植过程: CubeMX配置RT-Thread组件配置工程模板配置 参考例程配置:拷贝仓库原有的stm32g070-st-nucleo工程,然后另起一个名字,目录结构如下 完整…...
Parsing error: Unexpected token, expected “,“
今天在使用Trae AI 编程工具开发大文件切片上传功能,使用的是VUE3,TS技术栈,开发完成运行时,编译报错(Parsing error: Unexpected token, expected ","),让AI自行修复此问题多次后还是没有解决&a…...
Day23: 数组中数字出现的次数
整数数组 sockets 记录了一个袜子礼盒的颜色分布情况,其中 sockets[i] 表示该袜子的颜色编号。礼盒中除了一款撞色搭配的袜子,每种颜色的袜子均有两只。请设计一个程序,在时间复杂度 O(n),空间复杂度O(1) 内找到这双撞色搭配袜子的…...
目标检测——清洗数据
清洗VOC格式数据集代码示例 import os import xml.etree.ElementTree as ETdef process_annotations(image_folder, annotation_folder):# 遍历标签文件夹中的所有XML文件for xml_file in os.listdir(annotation_folder):if not xml_file.endswith(.xml):continuexml_path os…...
嵌入式基础知识学习:UART是什么?
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种广泛应用于嵌入式系统和通信设备的异步串行通信协议。它通过两根数据线(TX和RX)实现设备间的全双工数据传输,无需共享时钟信号…...
SpringBoot项目实战(初级)
目录 一、数据库搭建 二、代码开发 1.pom.xml 2.thymeleaf模块处理的配置类 3.application配置文件 4.配置(在启动类中) 5.编写数据层 ②编写dao层 ③编写service层 接口 实现类 注意 补充(注入的3个注解) 1.AutoWir…...
合成层优化
以下是关于 合成层(Composite Layer)优化 的系统梳理,涵盖基础原理、触发条件、优化策略及进阶实践,帮助深入理解如何通过分层渲染提升页面性能: 一、合成层基础概念 1. 什么是合成层? 定义:浏览器将页面元素提升为独立的图形层(Graphics Layer),由 GPU 单独处理,避…...
什么是MCP|工作原理是什么|怎么使用MCP|图解MCP
写在前面 Manus的爆火似乎推动了MCP的出圈,虽然Manus没有用MCP。这篇文章我们就讲讲MCP,当然我也是最近才学习到MCP的,如果理解有误的地方,欢迎评论区指出! 1. 为什么需要MCP? 1.1 LLM 现状 我们都知道…...
《Partial-label learning with a guided Prototypical classifier》23年CVPR 文献速读
论文地址 1. 引言 本文介绍了一种用于部分标签学习(Partial-Label Learning, PLL)的新框架 PaPi(Partial-label learning with a guided Prototypical classifier),旨在提高在视觉任务中处理部分标签数据时的性能。部…...
GitLens with `Commit Graph`
文章目录 GitLens with Commit Graph GitLens with Commit Graph 自己打包的 GitLens,能够查看 commit graph。 GitLens 持续更新中 下载之后,通过 VSCode 插件直接安装即可使用。...
python每日十题(6)
】函数定义:函数是指一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用其函数名即可。函数能提高应用的模块性和代码的重复利用率 在Python语言中,用关键字class来定义类 在Python语…...
UniRel论文复现过程中的问题解决办法(全)
注解写在前面:本文仅为解决各位同学在复现时面对的问题,有问题可以评论,看见会回复!!! [顶刊论文]UniRel:Unified Representation and Interaction for Joint Relational Triple Extraction2022.11.16&…...
js逆向之断点调试
1.XHR/提取断点用法 当刷新页面时候,有大量请求,并且你无法定位参数信息的时候,或者参数被混淆无法搜到,可以用该方法,该方法是会捕获所有请求连接,然后我们通过连接过滤出自己想要的请求,然后…...
Unity Shader编程】之渲染流程之深度及pass详解
关于透明物体的渲染,首先需要了解以下部分 深度缓冲区深度写入深度测试pass渲染和深度测试的过程深度测试和颜色混合过程 ** 一,深度缓冲区 ** 深度即物体距离相机的距离,深度写入即是把物体的距离相机信息记录下来,写入一个名…...
【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树
目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…...
Compose 原理解析
Compose 的组件都是放在 setContent() 之后才能显示的,那需要先看看这个函数的作用。 先看 ComponentActivity 的扩展函数 setContent(): /*** 将给定的可组合项合成到给定的 Activity 中。[content] 将成为给定 Activity 的根视图。* 这大致相当于使用…...
pyspark学习rdd处理数据方法——学习记录
python黑马程序员 """ 文件,按JSON字符串存储 1. 城市按销售额排名 2. 全部城市有哪些商品类别在售卖 3. 上海市有哪些商品类别在售卖 """ from pyspark import SparkConf, SparkContext import os import jsonos.environ[PYSPARK_P…...
个人学习编程(3-22) leetcode刷题
连续子数组:(难) 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…...
RabbitMQ八股文
RabbitMQ 核心概念与组件 1. RabbitMQ 核心组件及其作用 1.1 生产者(Producer) 作用:创建并发送消息到交换机。特点:不直接将消息发送到队列,而是通过交换机路由。 1.2 交换机(Exchange) 作…...
运维面试题(七)
1.statefulset用来管理有状态的应用程序,有状态是什么意思? 每一个pod都有一个固定的网络标识符,在整个生命周期中不会改变。每个实例都可以拥有自己的持久化存储卷,即使容器被删除并重新创建,存储卷仍然存在。Statef…...
【项目设计】网页版五子棋
文章目录 一、项目介绍1.项目简介2.开发环境3.核心技术4.开发阶段 二、Centos-7.6环境搭建1.安装wget工具2.更换软件源(yum源)3.安装scl工具4.安装epel软件源5.安装lrzsz传输工具6.安装高版本gcc/g编译器7.安装gdb调试器8.安装git9.安装cmake10.安装boost库11.安装Jsoncpp库12.…...
Netty——BIO、NIO 与 Netty
文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…...
Docker 安装 Mysql
以下是安装Docker版MySQL 8.0.25并实现目录挂载的步骤: docker仓库:https://hub.docker.com/_/mysql 1. 拉取Mysql镜像文件 docker pull mysql:8.0.252. 创建mysql临时容器服务 docker run -d \--name mysql \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD123…...
Electron打包文件生成.exe文件打开即可使用
1 、Electron 打包,包括需要下载的内容和环境配置步骤 注意:Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用程序的框架 首先需要电脑环境有Node.js 和 npm我之前的文章有关nvm下载node的说明也可以去官网下载 检查是否有node和npm环…...
线程和协程的区别了解
1.资源消耗 调度方式:线程由操作系统内核调度(抢占式),协程由程序自己控制调度(协作式)。切换开销:线程切换涉及内核态与用户态的转换,开销大;协程只在用户态切换上下文…...
楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用
在现代建筑中,为了实现高效、智能的管理,楼宇自控系统变得越来越重要。它就像建筑的 智能管家,可自动控制照明、空调、通风等各种机电设备,让建筑运行更顺畅,还能节省能源成本。而在楼宇自控系统里,有两种关…...
算法及数据结构系列 - 滑动窗口
系列文章目录 算法及数据结构系列 - 二分查找 算法及数据结构系列 - BFS算法 算法及数据结构系列 - 动态规划 算法及数据结构系列 - 双指针 算法及数据结构系列 - 回溯算法 算法及数据结构系列 - 树 文章目录 滑动窗口框架思路经典题型76. 最小覆盖子串567. 字符串的排列438. …...
【江协科技STM32】软件SPI读写W25Q64芯片(学习笔记)
SPI通信协议及S为5Q64简介:【STM32】SPI通信协议&W25Q64Flash存储器芯片(学习笔记)-CSDN博客 STM32与W25Q64模块接线: SPI初始化: 片选SS、始终SCK、MOSI都是主机输出引脚,输出引脚配置为推挽输出&…...
2025.3.23机器学习笔记:文献阅读
2025.3.23周报 题目信息摘要Abstract创新点网络架构实验不足以及展望 题目信息 题目: Enhancement of Hydrological Time Series Prediction with Real-World Time Series Generative Adversarial Network-Based Synthetic Data and Deep Learning Models期刊&…...
Day20-前端Web案例——部门管理
目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…...
实验3 以太坊交易周期的需求分析
区块链技术 实验报告 实验名称 实验3 以太坊交易周期的需求分析 一、实验目的 1、学习并掌握以太坊交易的内容; 2、学习并掌握以太坊交易周期的四个阶段; 3、学习并掌握结构化需求分析方法; 4、学习并掌握面向对象的需求分析方法&…...
Linux 通过压缩包安装 MySQL 并设置远程连接教程
一、引言 在 Linux 系统中,有时候我们需要通过压缩包的方式手动安装 MySQL 数据库,并且为了方便在其他设备上对数据库进行管理和操作,还需要设置允许远程连接。本文将详细介绍在 Linux(以 CentOS 为例)系统中通过压缩包安装 MySQL 8 并设置远程连接的步骤。 二、安装前准…...
【商城实战(56)】商城数据生命线:恢复流程与演练全解析
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Java学习笔记-XXH3哈希算法
XXH3是由Yann Collet设计的非加密哈希算法,属于XXHash系列的最新变种,专注于极速性能与低碰撞率,适用于对计算效率要求极高的场景。 极速性能 在RAM速度限制下运行,小数据(如 1-128 字节)处理可达纳秒级&…...
同旺科技USB to SPI 适配器 ---- 指令循环发送功能
所需设备: 内附链接 1、同旺科技USB to SPI 适配器 1、周期性的指令一次输入,即可以使用 “单次发送” 功能,也可以使用 “循环发送” 功能,大大减轻发送指令的编辑效率; 2、 “单次发送” 功能,“发送数据…...
在Mac M1/M2芯片上完美安装DeepCTR库:避坑指南与实战验证
让推荐算法在Apple Silicon上全速运行 概述 作为推荐系统领域的最经常用的明星库,DeepCTR集成了CTR预估、多任务学习等前沿模型实现。但在Apple Silicon架构的Mac设备上,安装过程常因ARM架构适配、依赖库版本冲突等问题受阻。本文通过20次环境搭建实测…...
【CXX-Qt】2.5 继承
某些 Qt API 要求你从抽象基类中重写某些方法,例如 QAbstractItemModel。 为了支持直接从 Rust 中创建这样的子类,CXX-Qt 提供了多种辅助工具。 某些基类可能需要特殊的构造参数。这可以通过使用自定义构造函数来实现。 访问基类方法 要在 Rust 中访…...
Linux系统之美:环境变量的概念以及基本操作
本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令(我们的exe) 我们以往的Linux编程经验告诉我们,我们在对一段代码编译形成可执行文件后…...
【nnUnetv2】推理+评估+测试
在 Windows 系统下设置环境变量 之前训练和推理的时候开着AutoDL的服务器,是在 Linux 系统下设置的环境变量。 但是现在开始研究具体代码了,就在本地跑(一直开着服务器有点费钱),所以就在Windows 系统下设置环境变量。 ①右键点击 “此电脑”,选择 “属性”。 ②在左侧…...