通义点金案例分享:表格修订

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 本文介绍了在通义点金平台搭建知识库时遇到的表格解析问题及解决方案。问题表现为表格数据被独立存储为chunk,缺少前后说明文字和表名信息,导致大模型回答错乱。解决方法是通过API将前后chunk内容合并到table类型的chunk中,补充表名和说明信息。具体步骤包括获取文档chunk列表、按顺序排序、修订table类型chunk并更新。示例展示了修订前后效果,同时说明了点金平台近期更新对部分问题的优化情况。

问题背景:

笔者在使用通义点金平台搭建知识库的过程中遇到了如下问题:

通义点金的文档库在解析带表格的文档时,会将每个表格的数据以markdown的格式存储到独立的chunk中,chunk类型为table,并且该chunk仅包含表格本身的内容,不会包含表格前后的说明文字,也就是会丢失表格的辅助信息甚至是表格名称(如果表名没有在表格内)。

上述问题会导致,针对包含大量相似结构表格的文档进行问答时,大模型的回答会出现错乱,例如把A表的数据误认为B表中的同名数据了;根本原因是在召回以及召回后的分析中,大模型无法识别某个字段到底属于那张表。

例如下面这个表格chunk就仅包含表格内容,无表名等信息。

解决方法:

总体思路:

利用点金平台的API对table类型的chunk进行修订,将物理意义上的前一个chunk和后一chunk中的内容合并到table类型的chunk中。这样可以使table类型的chunk中包含到表名以及前后的各种解释性文字。

将上述逻辑封装成一个工具程序,输入为文档库id和文档名前缀,工具会扫描指定文档库中的所有文档并找出符合文档名前缀的文档,对这些文档中所有类型为table的chunk进行修订。

具体步骤:

(1)调用“获取⽂档库内⽂档信息(/api/library/listDocument)”API获取指定文档库id下的所有文档。

(2)根据输入的文件名前缀过滤全量文档列表得到待处理的文档列表。

(3)针对待处理列表逐条进行修订:

i.调用“查看⽂档对应的⽂档块(/api/library/getDocumentChunk)”API 获取当前文档的全量chunk列表

ii.按页面顺序对chunk进行升序排序(页面 + 起始纵坐标)。

iii.扫描全量chunk列表,对于table类型的chunk生成新的chunkText:将前序和后继chunk的chunkText拼接到当前chunkText

iv.调用“更新⽂档块(/api/library/updateDocumentChunk)”API 更新第iii步修订的chunk。

部分代码参考:

#对文档中的表格chunk做上下文补充
def updateFileTable(library_id: str = None, file_list: list = None):
    docInfoList = serchFileList(library_id=library_id, file_list=file_list) #查询待处理文件列表
    for docInfo in docInfoList: 
        updateSingleFileTbale(library_id=library_id, docId=docInfo['docId']) #逐个文档进行修订
def serchFileList(library_id: str = None, file_list: list = None):
    doc_list = []
    result = LLM_Dianjin_RAG_Interface.search_file(library_id=library_id) #查询指定文档库下的所有文档列表(封装了 /api/library/listDocument API)
    for record in result:
        if file_list is not None:  # 判断是否需要根据文件名过滤
            match = False
            for file_name in file_list:
                if record['title'].startswith(file_name):
                    match = True
            if not match:
                continue
        if record['statusCode'] != 'Completed':
            continue  # 如果文件状态不是Completed,跳过该记录
        doc_info = {"docId": record['docId'], "title": record['title']}
        doc_list.append(doc_info)
    return doc_list
def updateSingleFileTbale(library_id: str = None, docId: str = None):
    #获取全量文档块(内部封装了/api/library/getDocumentChunk)
    fileChunks = getFileChunks(library_id=library_id, docId=docId)
    my_utils.log('ori table', f'fileChunks:{fileChunks}', 'debug')
    #对文档块进行重排序(按页码和起始纵坐标排序)
    fileChunks.sort(key=lambda x: (x['pos'][0]['page'], x['pos'][0]['axisArray'][1]))
    my_utils.log('sorted table', f'fileChunks:{fileChunks}', 'debug')
    #生成待更新数据
    updateChunkList = []
    preChunk = None
    nextChunk = None
    for index,chunk in enumerate(fileChunks):
        #获取当前chunk的前续和后继chunk
        if index > 0:
            preChunk = fileChunks[index - 1]
        if index < len(fileChunks) - 1:
            nextChunk = fileChunks[index + 1]
        else:
            nextChunk = None
        if chunk['chunkType'] == 'table': #仅修订table类型的chunk
            chunkText = appendTableChunk( curChunkInfo=chunk, preChunk=preChunk, nextChunk=nextChunk) #拼接chunkText
            updateChunkList.append({
                "chunkId": chunk['chunkId'],
                "chunkText": chunkText,
            })
    #更新文档块
    return updateDocumentChunk(library_id=library_id, chunkInfoList=updateChunkList) #更新对应的chunk(内部封装了/api/library/updateDocumentChunk)

实现效果

示例1

原chunk信息:不包含表名等信息。

更新后的chunk信息:可以看到在原表格内容的前面拼接了前续chunk的内容,即表名和部分说明信息;在原表格内后面可以看到拼接了后续chunk的表格内容。

示例2:

原chunk信息:不包含表后的说明信息

更新后的chunk信息:补充了表后的说明信息。

后记:

1、通义点金近期的更新已经把table的标题加进到chunk中,基本不会出现表格的chunk中无表名的情况了,但是表前的说明文字暂然未能添加到表格的chunk中,如果需要自动化添加仍可以参考本文所述的工具逻辑。

2、通义点金近期的更新后,chunk查询的默认排序已经是按页面顺序排了,chunk列表的排序步骤可以略掉了。

目录
相关文章
|
2月前
|
存储 设计模式 缓存
OkHttp源码解析(小白必看,建议收藏)
本文详细解析了OkHttp3的源码及其实现机制,适合初学者学习。文章从Request与Response结构、HTTPS握手过程、响应码含义、Socket概念到责任链模式的应用逐一讲解。重点分析了OkHttp的工作流程:通过Call对象的enqueue()或execute()方法发起请求,核心是getResponseWithInterceptorChain(),利用拦截器链处理请求,包括用户自定义拦截器、重试、桥接、缓存、连接等步骤。最后还探讨了Dispatcher的任务调度机制。
486 71
|
2月前
|
数据库 Android开发
Android使用EditText+Listview实现搜索效果(使用room模糊查询)
本文介绍如何在Android中使用EditText与ListView实现搜索功能,并结合Room数据库完成模糊查询。主要内容包括:Room的模糊查询语句(使用`||`代替`+`号)、布局美化(如去除ListView分割线和EditText下划线)、EditText回车事件监听,以及查询逻辑代码示例。此外,还提供了相关扩展文章链接,帮助读者深入了解ListView优化、动态搜索及Room基础操作。
231 65
|
2月前
|
存储 人工智能 Kubernetes
AI 场景深度优化!K8s 集群 OSSFS 2.0 存储卷全面升级,高效访问 OSS 数据
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,是用户在云上存储的高性价比选择…
|
2月前
|
机器学习/深度学习 人工智能 安全
基于YOLOv8的路面缺陷(路面裂缝、井盖、坑洼路面)识别项目【完整源码数据集+PyQt5界面+完整训练流程+开箱即用!】
本项目基于YOLOv8与PyQt5,打造路面缺陷检测系统,支持裂缝、井盖、坑洼识别,涵盖图片、视频、摄像头等多种输入方式。提供完整训练数据、预训练模型及图形化界面,开箱即用,本地运行,方便二次开发。适用于智慧城市建设与道路安全巡检,推动AI检测技术实际应用。项目包含源码、数据集、训练代码,支持科研学习与工程实战。
217 15
基于YOLOv8的路面缺陷(路面裂缝、井盖、坑洼路面)识别项目【完整源码数据集+PyQt5界面+完整训练流程+开箱即用!】
|
2月前
|
存储 SQL 大数据
从 o11y 2.0 说起,大数据 Pipeline 的「多快好省」之道
SLS 是阿里云可观测家族的核心产品之一,提供全托管的可观测数据服务。本文以 o11y 2.0 为引子,整理了可观测数据 Pipeline 的演进和一些思考。
259 34
|
1月前
|
消息中间件 运维 监控
企业级短信验证码服务架构设计与最佳实践
随着移动互联网的发展,短信验证码成为用户身份验证的重要手段。本文从企业级应用角度出发,探讨如何构建高可用、高并发和安全可靠的短信验证码服务。通过多通道冗余、故障自动切换和服务降级保障高可用性;利用异步处理与消息队列应对高并发;借助多层防刷、内容审核和数据加密提升安全性。同时,提供了详细的架构设计、核心模块代码示例以及监控运维方案,帮助读者理解并实现一个完整的短信验证码系统。
|
2月前
|
人工智能 小程序 API
DeepSeek‑R1-0528 重磅升级:蚂蚁百宝箱免费、无限量调用
DeepSeek-R1-0528 版本重磅升级,推理能力显著增强,在数学、编程和通用逻辑等基准测评中表现卓越,媲美国际顶尖模型。此次更新提供免费、无限量调用通道——蚂蚁百宝箱,用户可通过简单五步构建智能体并发布至多端平台。模型基于 DeepSeek V3 Base,参数规模达 685B,上下文长度最高支持 128K,助力开发者快速嵌入顶尖推理能力,打造创新应用。立即访问蚂蚁百宝箱体验!
209 11
|
2月前
|
数据可视化 数据挖掘 BI
指标透明化+管理敏捷化:Dataphin指标关系图与业务指标管理
通过Dataphin的业务指标定义和管理功能,业务人员能够以标准化方式快速创建业务指标并详细说明其详情,从而实现与技术人员的高效沟通,促进相关技术指标的快速开发。此外,业务人员还可以利用Dataphin的指标关系图功能,直观地理解指标的加工逻辑,并迅速定位异常数据根因,从而显著提高问题解决的效率。
172 8
|
1月前
|
人工智能 监控 数据挖掘
6/14 上海,Apache Doris x 阿里云 SelectDB AI 主题线下 Meetup 正式开启报名!
6 月 14 日,由 Apache Doris 社区、飞轮科技、阿里云联合发起的湖仓数智融合、AI 洞见未来:Apache Doris x 阿里云 SelectDB 联合 Meetup 将在上海·汇付天下总部大楼正式开启,邀您一同探索 AI 与数据分析的融合实践!
255 76

热门文章

最新文章