支持高性能结构化数据提取的 Embedding 模型——NuExtract-v1.5
NuExtract 是一个用户友好型模型,设计用于从长文档中提取信息。它可以处理长达 20,000 个标记的输入,是合同、报告和其他商业通信的理想选择。NuExtract 的与众不同之处在于它能够处理和理解文档的整个上下文。这意味着它可以捕捉到可能分散在长文本不同部分的关系和信息。
NuExtract 具有高效性和可扩展性。它可以管理大量文本数据,而不需要更多的计算能力,这对于同时处理多个长文档来说非常有利。这种效率得益于它的文本到文本模型架构,也就是善于理解和总结文本的花哨说法。
NuExtract 的另一个亮点是它的多功能性。它可以使用 JSON 模板提取各种结构化信息。因此,无论是姓名、日期、地点还是其他重要细节,NuExtract 都能为你找到并组织这些信息。
总之,NuExtract 就像一个超级高效的全能助手,能帮你理清冗长复杂的文档,准确提取出你需要的信息。
多语言能力
我们收到的最常见请求之一是让 NuExtract 能够处理英语以外的语言。 为此,我们需要一个多语言数据集和一个多语言基础模型。 幸运的是,Phi-3.5 mini 最近在这方面取得了很大进展,现在可以处理阿拉伯语、中文、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、德语、希伯来语、匈牙利语、意大利语、日语、韩语、挪威语、波兰语、葡萄牙语、俄语、西班牙语、瑞典语、泰语、土耳其语和乌克兰语。 我们选择 Phi-3.5 mini 作为 NuExtract 的基础。
对于训练数据集,我们需要原始文档。 我们再次从 C4 数据集中获取这些文档。 我们选择了 50% 的英文文档和 50% 的其他语言文档(主要是法语、德语、西班牙语、意大利语和葡萄牙语)。 为了让 NuExtract 能正确处理长文档,我们还加入了比原始 NuExtract 更长的文档。
我们需要对这些文档进行注释,这意味着要为每份文档生成模板和输出。 现在有一个重要的问题:模板应该使用哪种语言? 我们选择对一半的文档使用英文模板,而另一半文档则使用与文档相同的语言。 这样,当用户需要处理多种语言的文档时,就可以创建一个独特的英文模板。 然后,我们使用与 NuExtract 相同的自动注释程序。 下面是一个带有英文模板的法文文档示例:
请注意,与最初的 NuExtract 一样,该数据集仍然是纯粹的提取型:我们训练模型复制粘贴文档的部分内容,而不是生成任何新内容。 我们打算在下一个版本中增加抽象/重构能力。
无限语境
由于使用了 Phi-3.5 mini 作为基础模型,NuExtract 1.5 现在的上下文大小为 128k 标记(约 200 页),这对于绝大多数应用来说应该足够了。 尽管如此,仍然存在一个问题:使用这样的转换器模型处理长文档需要消耗大量内存(和计算量),因为每个标记都需要在其他标记之上进行处理。 以下是 NuExtract 在处理给定长度的序列时所需要的 GPU 内存:
我们可以看到,对于小于 10,000 个标记的序列,内存主要用于存储约 10GB 的模型。 然而,超过 10,000 个标记后,我们就进入了二次扩展阶段(存储标记-标记注意力分数)。 最大 128k 标记上下文需要 1TB 的 GPU 内存! 这意味着,对于小于10,000个字节的序列,像L4这样的标准GPU就可以为NuExtract提供服务,而对于更长的序列,我们则需要多个高端昂贵的GPU。
为了解决长序列的内存问题,我们采用了一种独创的解决方案:我们训练NuExtract,使其能够在获得先前信息的情况下从文档中提取信息。 为了让 NuExtract 1.5 具备这种能力,我们在数据集中添加了新的示例,这些示例都提供了先前的信息,例如
持续提取示例。 输出结果来自文本、模板和之前提取的信息。 请注意,这里的温度值会被覆盖。 (注:此示例仅供参考,不作为训练集的一部分)。
有了这样的例子,模型就应该学会合并以前的信息和新信息。 这种合并并非易事,有时会出现信息冲突。
这种 "延续 "能力允许我们在通过滑动上下文窗口处理文本时,通过迭代重新注入当前信息状态来处理任意长的文档,这让人联想到递归神经网络。 这个过程的好处在于,内存占用受窗口大小的限制。 下面是一个 10k 的提取窗口所需的内存,假设输出大小恒定为 2k 左右:
使用 NuExtract 的 GPU 内存需求比较:全提取窗口和 10k 标记提取窗口,2k 标记输出。
我们看到,无论文档大小如何,内存现在都小于 30GB。
这种策略的缺点是需要多次生成输出,如果滑动窗口太小,性能就会下降(见结果部分)。 此外,这种方法只有在输出比文档小很多的情况下才会起作用,而长文档通常就是这种情况。
英语性能
我们先来看看训练有素的模型在英语基准测试中的性能。 该基准由来自 12 个提取问题的 600 个示例组成,涵盖各种使用情况。 在现阶段,它仍然是一个实验性基准,但对于比较模型已经非常有用(我们计划在完成后公开发布)。 请注意,该基准还测试了 NuExtract 尚不具备的抽象能力。
我们可以看到,NuExtract 1.5 比原来的 NuExtract 要好得多。 此外,NuExtract 甚至比 GPT-4o 还要好一些!
现在我们来看看模型访问输入-输出示例时的结果。 我们使用与之前相同的基准,并在 12 个问题中的每个问题的 45 个示例上对 NuExtract 1.5 进行微调。 我们还通过将所有 45 个示例都放入提示中(又称上下文学习)来对 GPT-4o 进行基准测试,之所以能做到这一点,是因为我们的基准示例都很短,通常只有 1k 个词组,这意味着提示内容约为 50k 个词组:
不出所料,所有模型都大幅提高了性能(阴影部分)。 我们可以看到,GPT-4o 现在比 NuExtract 1.5 好,但好得不多。 值得注意的另一点是,NuExtract 1.5 比 NuExtract 1.5 tiny 要好得多,这暗示着更大的 NuExtract 很大程度上可以击败 GPT-4o。 有待证实…
总体而言,NuExtract 1.5 和 GPT-4o 在零次和多次运行情况下的性能非常相似。 令人惊讶的是,一个小 500 倍且不具备抽象能力的模型竟然能与如此强大的前沿模型相媲美。 我们认为这有三个原因。 首先,通过只关注结构化提取任务,NuExtract 能够重新分配一些权重以提高文本理解能力。 其次,训练程序能够迫使 NuExtract 精确地遵循模板,并只返回 JSON 输出。 最后但并非最不重要的一点是,通过强制模型提取部分输入文本并在必要时训练其返回空结果,我们的训练大大减少了幻觉。
多语言性能
现在让我们来看看多语言基准的性能(每种语言包含 250 个文档,由英语基准的一部分翻译而来):
我们看到,NuExtract 1.5 比原始 NuExtract 要好得多,但在这种情况下,GPT-4o 仍然更好。 我们认为,模型的大小对多语言性相当重要(我们无法将微小的 NuExtract 训练成多语言模型的事实证实了这一点)。 我们可能会用更大的 NuExtract 来填补这一空白。
长文档性能
最后,让我们来看看长文档的性能。 我们首先测试的是 8k-10ktoken 范围内的文档(约 20 页),因为我们无需滑动窗口即可轻松处理这些文档:
结果令人印象深刻: NuExtract 1.5 优于 GPT-4o! 我们应该注意到,这一机制中的基准并不像较小文档那样完整和多样化,但它仍然表明 NuExtract 1.5 非常善于处理长文档(这也证明了 Phi-3.5 mini 对长上下文的正确处理)。 我们还发现,NuExtract 1.5 tiny 比 NuExtract 1.5 差很多,目前我们还不能确定这仅仅是由于模型大小造成的,还是由于使用的基础模型造成的。 现在我们测试更长的文档,在 10k-20k tokens 范围内。 这次我们必须设置 10k 的提取窗口,以保持内存可控:
同样,NuExtract 1.5 是性能最好的模型,即使在提取窗口缩小的情况下也是如此,这表明之前的结果并非偶然。 这也表明–至少在 10k 个词组的窗口大小下–延续策略运行良好。 现在我们来分析提取窗口大小对性能的影响。 我们再次使用 8k-10k 个词组的基准:
我们可以看到,NuExtract 1.5 的性能随着提取窗口大小的减小而降低,但幅度不大! NuExtract 1.5 的性能比 GPT-4 差,但仍比 NuExtract 1.5 的微小窗口好得多。 使用小窗口可减少内存:全窗口为 20GB,而 2k 窗口为 10GB(其中大部分是模型权重)。 对于较长的序列,这一比例会变得更大。
使用这样的延续程序并不完美,当然也有改进的方法,但它避免了在所需内存大于 GPU 内存时简单地失败。 我们的推理模块(企业解决方案的一部分,请联系我们😊)会根据给定的 GPU 内存自动调整窗口大小。
numind/NuExtract-v1.5
NuExtract-v1.5 是对 Phi-3.5-mini-instruct 的微调,在一个用于结构化信息提取的私有高质量数据集上进行了训练。 它支持长文档和多种语言(英语、法语、西班牙语、德语、葡萄牙语和意大利语)。 要使用该模型,请提供输入文本和描述所需提取信息的 JSON 模板。
注:该模型经过训练,优先提取纯文本,因此在大多数情况下,该模型生成的所有文本都与原文一致。
还提供基于 Qwen2.5-0.5B 的微小(0.5B)版本: NuExtract-tiny-v1.5
import json
from transformers import AutoModelForCausalLM, AutoTokenizerdef predict_NuExtract(model, tokenizer, texts, template, batch_size=1, max_length=10_000, max_new_tokens=4_000):template = json.dumps(json.loads(template), indent=4)prompts = [f"""<|input|>\n### Template:\n{template}\n### Text:\n{text}\n\n<|output|>""" for text in texts]outputs = []with torch.no_grad():for i in range(0, len(prompts), batch_size):batch_prompts = prompts[i:i+batch_size]batch_encodings = tokenizer(batch_prompts, return_tensors="pt", truncation=True, padding=True, max_length=max_length).to(model.device)pred_ids = model.generate(**batch_encodings, max_new_tokens=max_new_tokens)outputs += tokenizer.batch_decode(pred_ids, skip_special_tokens=True)return [output.split("<|output|>")[1] for output in outputs]model_name = "numind/NuExtract-v1.5"
device = "cuda"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, trust_remote_code=True).to(device).eval()
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)text = """We introduce Mistral 7B, a 7–billion-parameter language model engineered for
superior performance and efficiency. Mistral 7B outperforms the best open 13B
model (Llama 2) across all evaluated benchmarks, and the best released 34B
model (Llama 1) in reasoning, mathematics, and code generation. Our model
leverages grouped-query attention (GQA) for faster inference, coupled with sliding
window attention (SWA) to effectively handle sequences of arbitrary length with a
reduced inference cost. We also provide a model fine-tuned to follow instructions,
Mistral 7B – Instruct, that surpasses Llama 2 13B – chat model both on human and
automated benchmarks. Our models are released under the Apache 2.0 license.
Code: <https://github.com/mistralai/mistral-src>
Webpage: <https://mistral.ai/news/announcing-mistral-7b/>"""template = """{"Model": {"Name": "","Number of parameters": "","Number of max token": "","Architecture": []},"Usage": {"Use case": [],"Licence": ""}
}"""prediction = predict_NuExtract(model, tokenizer, [text], template)[0]
print(prediction)
滑动窗口提示:
import jsonMAX_INPUT_SIZE = 20_000
MAX_NEW_TOKENS = 6000def clean_json_text(text):text = text.strip()text = text.replace("\#", "#").replace("\&", "&")return textdef predict_chunk(text, template, current, model, tokenizer):current = clean_json_text(current)input_llm = f"<|input|>\n### Template:\n{template}\n### Current:\n{current}\n### Text:\n{text}\n\n<|output|>" + "{"input_ids = tokenizer(input_llm, return_tensors="pt", truncation=True, max_length=MAX_INPUT_SIZE).to("cuda")output = tokenizer.decode(model.generate(**input_ids, max_new_tokens=MAX_NEW_TOKENS)[0], skip_special_tokens=True)return clean_json_text(output.split("<|output|>")[1])def split_document(document, window_size, overlap):tokens = tokenizer.tokenize(document)print(f"\tLength of document: {len(tokens)} tokens")chunks = []if len(tokens) > window_size:for i in range(0, len(tokens), window_size-overlap):print(f"\t{i} to {i + len(tokens[i:i + window_size])}")chunk = tokenizer.convert_tokens_to_string(tokens[i:i + window_size])chunks.append(chunk)if i + len(tokens[i:i + window_size]) >= len(tokens):breakelse:chunks.append(document)print(f"\tSplit into {len(chunks)} chunks")return chunksdef handle_broken_output(pred, prev):try:if all([(v in ["", []]) for v in json.loads(pred).values()]):# if empty json, return previouspred = prevexcept:# if broken json, return previouspred = prevreturn preddef sliding_window_prediction(text, template, model, tokenizer, window_size=4000, overlap=128):# split text into chunks of n tokenstokens = tokenizer.tokenize(text)chunks = split_document(text, window_size, overlap)# iterate over text chunksprev = templatefor i, chunk in enumerate(chunks):print(f"Processing chunk {i}...")pred = predict_chunk(chunk, template, prev, model, tokenizer)# handle broken outputpred = handle_broken_output(pred, prev)# iterateprev = predreturn pred
相关文章:

支持高性能结构化数据提取的 Embedding 模型——NuExtract-v1.5
NuExtract 是一个用户友好型模型,设计用于从长文档中提取信息。它可以处理长达 20,000 个标记的输入,是合同、报告和其他商业通信的理想选择。NuExtract 的与众不同之处在于它能够处理和理解文档的整个上下文。这意味着它可以捕捉到可能分散在长文本不同…...

【C#】设计一个选购计算机配置的应用程序
文章目录 1. 创建新的 Windows Forms 应用程序项目2. 设计界面2.1 添加控件和设置属性 3. 编写事件处理代码4. 运行和测试应用程序 1. 创建新的 Windows Forms 应用程序项目 打开 Visual Studio。选择“创建新项目”。在项目类型中选择“Windows Forms 应用程序”(…...

solo博客源码使用idea编译运行
solo博客源码使用idea编译运行 solo博客开源地址本地运行IDEA 编译执行默认直接编译jar 包编译 solo博客开源地址 项目地址:GitHub - 88250/solo: 🎸 B3log 分布式社区的 Java 博客端节点系统,欢迎加入下一代社区网络。B3log distributed co…...

VBA07-方法
一、方法的定义 方法指对象所能执行的动作,它是一个动词。 二、方法的表达方式 三、关于工作簿的方法操作 3-1、新增一个工作簿 示例1: 此时,新增的工作簿的名字是系统默认的。 示例2: 【注意】: 当你尝试将工作簿…...
spring boot 统一异常处理
在 Spring Boot 应用中实现统一异常处理是非常重要的,它可以帮助我们更好地管理和响应应用程序中的错误。通过使用 ControllerAdvice 和 ExceptionHandler 注解,我们可以创建一个全局的异常处理器来捕获并处理不同类型的异常。 步骤 1: 创建一个异常处理…...
跟着小土堆学习pytorch(六)——神经网络的基本骨架(nn.model)
文章目录 一、model介绍二、Module三、张量3.1 定义3.2 用法 一、model介绍 容器 Containers 卷积层 Convolution Layers 池化层 Pooling layers 填…...
数字化落地过程中的研发效能治理如何开展?
数字化落地过程中,针对数字化识别到的问题和短板进行专项治理,是通过数字化手段持续提升研发效能非常重要的一环。组织级的数字化专项治理需要组织级团队和技术团队共同配合协同来完成。其中组织级团队负责制定整体的治理目标、流程和策略,根…...

Windows安装配置node.js
下载安装 下载 访问下载 | Node.js 中文网,下载 推荐使用长期支持版本,但是此次是学习用的,使用最新版本试一下 安装 其实一路next基本就可以了,注意调整下安装目录 查看版本 C:\Users\PC>node -v v22.11.0 C:\Users\PC>…...

Javaweb梳理9——JDBC
Javaweb梳理9——JDBC 1.JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处 2.JDBC快速入门2.1 编写代码步骤2.2 具体操作 3 JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行对象3.2.2 事务管理 3.3 Statement3.3.1 概述3.3.2 代码实现 3.4 ResultSet3.4.1 概述3.4.2 …...

逆向CTF入门(如何找main)
Hello, world of reverse! start函数它在执行一些初始化操作,如获取命令行参数、获取环境变量值、初始化全局变量等,一切准备工作完成之后,再调用main函数 快速定位关键函数: 长驱直入法:当程序功能非常明确时,从程序…...

c语言归并排序
归并排序思想: 归并排序可以解释为是将放在数组里的一串数字进行拆分,拆分之后再判断大小合并的过程,每次都是从中间位置拆分,例如有七个数,第一次拆分就将它们分成前三个数为一个数组,后四个数为一个数组&…...

碳化硅陶瓷膜的特性
无机膜包括金属膜、陶瓷膜、玻璃膜等等,其中在水处理领域里出镜最多、应用最广的当属陶瓷膜。比起高分子有机膜,陶瓷膜硬度更高、通量更大、寿命更长,然其性能优越,成本也很“高昂”,故其生存空间自然是受到高分子有机…...

机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)
目录 关于1 基本流程2 划分属性的选择2.1 方法一:依据信息增益选择2.2 方法二:依据增益率选择2.3 方法三:依据基尼指数选择 3 剪枝处理:防止过拟合3.1 预剪枝3.2 后剪枝 4 连续与缺失值4.1 连续值处理4.2 缺失值处理 5 多变量决策…...

良心无广,这五款电脑软件堪称必备,最后一个比快播都猛
来吧,直接上狠货! 哔哔音乐 这是一个基于哔哩哔哩开发的电脑听歌软件,众所周知!B站其实就是一个巨大的曲库,啥歌各种版本都能在这里找到。 所以如果依托B站开发听歌软件,那就是真的香,而且软件…...

Vue3中实现原生CSS完成圆形按钮点击粒子效果和定点旋转动画
效果: 源码: <script setup> import { ElMessage } from "element-plus"; const isClick () > {ElMessage.success(Clicked); }; </script><template><button click"isClick" class"button">…...

百度网盘 服务器开小差了
有会员,新上传文件到百度网盘,分享链接, 别人打开链接,显示【服务器开小差了,请稍后重试~】,保存不了 试了几个都不行,文件是视频MP4 可行的方法是百度网盘加好友,然后在聊天页面单…...
数据分析师招聘要求
在当今数据驱动的世界中,数据分析师的角色变得愈发重要,他们被赋予从海量数据中提炼洞察的关键任务。数据分析师的招聘要求反映了这个职位多方面的需求,从教育背景到技能,再到软技能和行业特有的知识。本文将详细探讨这些要求&…...

【C语言】实战-力扣题库:回文链表
题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 提示: 链表中节点数目在范围[1, 105] 内0 < Node.val < 9 进阶:你能否用 O(n) 时间…...
Centos安装Minio
文章目录 1 远程下载二进制文件2 创建目录:文件存储、日志3 授权执行4 启动5 创建配置文件6 注册服务并开机自启7 创建key附录参考文档 1 远程下载二进制文件 [rootlocalhost bin]# cd /opt/package [rootlocalhost package]# wget https://dl.min.io/server/minio…...

二叉树的基本概念和底层实现
1. 树型结构 1.1 认识树 在学习二叉树之前我们需要了解一下树型结构 树是一种非线性的数据结构,它是由n个结点组成的一个有层次关系的集合,看起来像个倒挂的树,也就是根朝上,枝叶朝下. 特点: 1. 根结点没有前驱结点 2. 除了根结点外其他的结点被分为互不相交的集合,每个集合又…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...