语言模型:文本表征词嵌入技术调研

news2024/11/25 11:49:02

1 文本表征

文本表征是自然语言处理中的关键部分,尤其在当前大模型快速发展的背景下。由于大模型存在知识有限、处理文本长度有限、保密要求和大模型幻觉等问题,结合外部数据显得尤为重要。

为了便于存储和检索,除了保存纯文本外,还需要将文本转换为数组形式,以实现模糊查找和上下文语义理解。这使得在不同应用场景下如何进行编码成为一个重要课题。

我最近在优化本地知识存储,调研了一些文本表征方法,包括:文本表征发展过程、相关中文资源、检索增强生成的优化方法、词向量与早期文本数据库工具结合,以及在信息提取、社交网络和电子商务领域中词嵌入的优化方法。共八个部分,将在之后的 8 天内在公众号连载。本文作为开篇,先给出收获和总结。(下文中 Embedding 与嵌入同义)

关键字:embedding-based retrieval,RAG,Information Retrieval

2 问题与解答

在调研之前,我一直有以下一些疑问。在研读过程中,我得到了答案和启发。以下是我目前的个人理解,可能并不完全正确。

2.1 问题一

本地知识库是否必须使用深度学习表示?

目前,知识表示的主要方法包括:基于规则的方法、统计方法和基于神经网络的方法。

现在常说的 Embedding 一般指的是基于深度学习神经网络的稠密向量存储。它对文本理解的效果是目前最好的,但在存储、转换和索引过程中占用的资源和复杂度也更大。

是否需要使用 Embedding 主要取决于使用场景。如果多数情况下只做关键字搜索和模糊搜索,使用基于规则或者统计的方法即可,无需 Embedding。但是,如果想基于本地知识做问答系统,涉及较多文本理解和对话上下文,则需要 Embedding。

其核心逻辑是:Embedding 可以理解字面意思以外的深层意思。

2.2 问题二

除了知识库,文本表示的主要应用场景有哪些?

可以说,有文字并且需要整理、预测或决策的地方都能用到文本表示。

从几篇关于 Embedding 应用的较新论文可以看出,在电子商务、信息提取、社会网络中,匹配、分类和聚类这些场景都用到了 Embedding。

在电子商务领域可将技术转换成经济利益,该领域也最先尝试了各种先进技术。例如,京东和 Facebook Marketplace 分别对 Embedding 做了扩展。在用户层面上利用搜索关键字及用户特征进行编码;在商品层面上,对商品描述文本、商品特征和图片等进行编码。然后,将用户和商品编码映射到同一空间,以实现匹配。这种编码也可视为一种多模态复杂嵌入,是嵌入的广义解释。

在不同的专业领域,扩展和精调是嵌入的常用优化方法。而通用表示则可以不依赖具体数据集,就能像人一样理解文本的含义。编码后,可以进行进一步的分类、聚类以及预测。几乎所有涉及文字预测的场景都可以使用通用嵌入。

在信息提取时,对于特定领域(如识别病虫害),从各种格式和风格的文本中提取信息。之前需要使用规则、命名实体识别,关系识别,主题建模……涉及非常复杂的步骤和模型设计与训练。现在,通过大模型对文本解析,大部分功能可直接实现。从以人为主导变成以数据为主导,人只需做简单干预和审查。而嵌入在其中充当了特征提取和过程存储的重要角色。

在知识发现和特征挖掘方面,Embedding 可能起到很大的作用。

2.3 问题三

向量存储适用于哪些场景?如何选模型?

需要考虑具体的场景、响应速度要求以及成本预算。下面列出三种常见场景:

如果是个人知识库或者狭小领域的知识构建,比如我自己的知识库,内容基本都是手动撰写输入的,体量在百万字级别。无论是自己搭建的嵌入环境还是调用网络 API 工具,成本都不算高,因此不需要太多优化。如果是多人使用的知识库,可以先分用户,然后再检索,向量的计算量也并不大,可以考虑使用 pgvector 级别的解决方案。

如果是一个公司内部知识库,有相对较多的文档,可以考虑用 Lucene 或者 ElasticSearch 对向量扩展支持,自己选型和搭建 Embedding 本地服务。

如果是更大的商用场景,比如做商城,有很多商品和用户,多对多的检索场景,不仅需要做向量库向量检索,还需要针对 Embedding 模型进行优化。

对于 Embedding 模型选型,如果只是对一个简单领域做实验,那么可以选择一种排行榜前列中文的 Embedding 模型,或者调用 OpenAI 的 embedding API 即可。如果数据很多,而且是特定领域的数据,比如医学领域数据,则可以找相关领域的成熟模型,或者用自己的数据进行精调。

2.4 问题四

5000 个字和 5 个字的 embedding 可比吗?

这种问题通常出现在检索的场景中:搜索与关键字最匹配的文档。

在向量匹配过程中,最常用的算法是点积或者计算余弦距离。余弦距离可以看作是点积的归一化结果。点积简单来说就是将向量每个维度的值相乘然后相加。

对于离散稀疏的向量,比如 A:[1,1,1,1,0] 与 B:[0.1,0,0,0],相关于计算 A 和 B 的交集,点积结果是 [0.1, 0, 0, 0]。稠密向量也类似,当各维度值大且方向一致时,得分高。在查询场景下,对于 N 个文档,与关键词与文档交集越大分数越高。最佳匹配得分本身不一定很高,只要比其他文档高就得到了优先权。

同样由于没有一个绝对距离,无法确定阈值。虽然可以得到命中率的排序,但如果这个关键词与哪个文档相关度都不高,则会返回完全不相关的结果,显得很不靠谱。可以说 Embedding 能实现模糊搜索,但更擅长生成文本。

在有些场景下,统计方法也优于嵌入方法。例如 TF/IDF 利用词频能够定位到文档中一些关键性的词或短语。而使用嵌入方法做文档比较和检索,则更侧重文本本身的相似程度,而不是更有特点的内容。因此,目前很多优化方法使用多种检索方式结合起来。

2.5 问题五

在搜索场景下,embedding 需要考虑上下文吗?

这是一个与交互设计相关的问题。通常情况下,搜索是用户在一个框中输入关键字,这种情况下一般不涉及上下文。当然,也可以将当前文档或者之前的搜索作为背景上下文,但可能提升不多。

在一些特定的搜索场景中,比如商品搜索,用户的个人资料和之前的操作、购买记录都可以作为上下文,与关键字一起生成嵌入,用于匹配商品嵌入,这可能比较有价值。

另外,在社交场景或对话交互中的检索,例如用户想找 " 张三 ",可以将之前的对话、当前用户的社交网络和地域作为选择目标张三的上下文;近期事件和热点事件也应该有更高的命中率,而这些特征各自的权重参数可以通过学习训练获得,不但需要考虑上下文,还涉及进一步的优化 Embedding 方法。

2.6 问题六

大语言模型 LLM 与 Embedding 是什么关系

目前的嵌入技术与 LLM 的底层技术(如:GPT, BERT)和优化方法(如:多模态、多语言、整合知识图、领域定制)基本相同。理论上,可以用 LLM 的一些上层输出作为嵌入。不过,它们的侧重点有所不同。本地部署 7G-70G 左右的 LLM 模型是主流方法,而我们常常选用 1G 以内的模型作为嵌入模型。

总之,二者之间的技术基本是通用的,而侧重点不同。LLM 尽量融入更多知识,以适合复杂应用场景,对推理和数学等全科水平都有期待;而嵌入则相对简单,更侧重语文能力。可以说,嵌入是 LLM 的能力子集。

2.7 总结

很多程序员很喜欢拥抱新技术。有很多技术,一开始觉得还真不错,但装上之后,并不经常用。还带来了一定的资源占用。尝试固然是好的,但在工程领域,请不要为了使用新技术而使用新技术。请以问题为导向,尽量找到痛点,解决问题。

如非必要,勿增实体

请遵循“奥卡姆剃刀”(Occam's Razor)原理,如非必要,勿增实体。根据需要选择:关键字 -> 统计 -> 深度学习。在当前已有稳定系统的情况下,如果没有特定的需求,不要大改,因为效果,稳定性,支出各个方面都不一定好。

比如我在优化本地知识库 Obsidian 时,先后尝试过基本于统计的搜索 OmniSearch,本地插件文本嵌入 Smart connection,以及可部分在服务端的 khoj 做进一步的知识管理。一开始原的时候觉得功能很好。但在日常使用时,使用场景非常少,而因为它需要做各种索引,还让系统变慢,让使用体验变差了。

这个方向的新技术确实对应更高的成本,而且可以考虑多模式并存的方式,

对话与检索,稀疏与稠密

在检索中不一定非要使用深度学习方法,深度学习方法相对于统计方法,可以参考上下文语义理解关键字,并且可以生成通用的语义。而如果只检索需要关键字,也没有什么上下文。

RAG 检索增强生成,它初始的目标是更好的生成,而不是简单的检索。也可以说,其主要的应用领域是生成而非检索。所以,方法的选择取决于具体应用和预算,不一定非要使用新方法。

稀疏与稠密向量的存储、匹配和索引方法各不相同,用于存储不同方法产出的结果。它们还可以相互转化,例如,通过特征筛选或特征映射将稀疏向量变为稠密向量。未来,也可能会出现像 LORA 这样的方法,将稠密向量进一步压缩。

通用模型与特定任务模型

通用文本嵌入比特定于任务的文本嵌入更具挑战性。目前的评测工具,不论是中文还是英文,都可对语义相似度、分类、聚类、检索、重排等多种能力打分。可以参考 huggingface 嵌入排行榜选型。

目前,也有一些开放的训练数据,可以参考这些数据,加入自己的数据,在基模上微调。不过请注意,本地数据可能会导致模型偏差。微调后,可以使用工具(如 C-PACK)评测微调后的模型在旧任务上的得分,而不是随意想几个问题自己测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1879285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习基础:开源库学习-Numpy科学计算库

目录 Numpy科学计算库 什么是多维数组 数组基础 高维数组 操作和创建数组 Numpy介绍 创建数组 数组的属性 二维数组 三维数组 数组元素的数据类型 创建特殊的数组 np.arange() np.ones() np.zeros() np.eye() np.linspace() np.logspace() asarray() 数组运…

数据结构—判断题

1.数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的存储结构。 答案:错误 2.(neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。 答案:正确 3.若一个栈的输入序列为{1, 2, 3, 4, 5},则不…

模拟城市5: 未来之城 全DLC for Mac 下载安装包

模拟城市5:未来之城(SimCity BuildIt)是一款由Maxis开发并由 Electronic Arts(EA)发行的城市建设和管理模拟游戏。这款游戏最初在2014年发布,适用于iOS、Android以及Windows Phone平台,随后在20…

每天五分钟计算机视觉:人体姿势识别

本文重点 人体姿势识别是计算机视觉领域的一个重要研究方向,旨在通过图像或视频数据自动检测并识别出人体的各种姿势和动作。随着深度学习技术的快速发展,基于神经网络的方法在这一领域取得了显著进展。神经网络,特别是卷积神经网络(CNN)和循环神经网络(RNN),因其强大…

NVIDIA Visual Profiler启动失败报错

在银河麒麟V10安装完NVIDIA后,想着试着运行一下NVIDIA Visual Profiler,发现报错,如下图。 照着提示翻阅日志文件。看见其中写着 !ENTRY com.nvidia.viper.birt 2 0 2024-06-30 08:39:39.806 !MESSAGE Could not resolve module: com.nvidi…

【保姆级教程+配置源码】在VScode配置C/C++环境

目录 一、下载VScode 1. 在官网直接下载安装即可 2. 安装中文插件 二、下载C语言编译器MinGW-W64 三、配置编译器环境变量 1. 解压下载的压缩包,复制该文件夹下bin目录所在地址 2. 在电脑搜索环境变量并打开 3. 点击环境变量→选择系统变量里的Path→点击编…

内容营销专家刘鑫炜:碎片化时代,小微企业内容营销如何乘风破浪

当下,互联网高度发达,技术的飞速进步和社交媒体的普及,使得信息的产生和传播速度达到了前所未有的高度。互联网上的内容如同潮水般汹涌而来,不断刷新着我们的认知边界,但与此同时,这也导致了人们的注意力被…

SpringBoot:集成机器学习模型进行预测和分析

引言 机器学习在现代应用程序中扮演着越来越重要的角色。通过集成机器学习模型,开发者可以实现智能预测和数据分析,从而提高应用程序的智能化水平。SpringBoot作为一个强大的框架,能够方便地集成机器学习模型,并提供灵活的部署和…

各省地区市场化指数及分项指数+匹配上市公司+计算代码(1997-2023年)

数据简介:市场化指数是一个用于评估国家市场化程度的指标体系。该指数由中国经济学家樊纲提出,旨在衡量中国经济中市场化的程度和质量。 市场化指数包括经济自由度、金融市场化、行政干预程度以及社会保障水平等四个方面的指标。 其中,经济…

有关主流编程语言的几个问题及对比

参考:编程语言的历史(https://blog.csdn.net/david_lv/article/details/104765347) 静态与动态语言的优缺点分析 什么是强类型,什么是弱类型?哪种更好些?为什么? 强类型和弱类型的区别 几种常见的开发语言…

Springboot学习中错误与解决方法合集

1. 报错CONDITIONS EVALUATION REPORT (1)现象 类似: 出现问题原因:日志文件过多 (2) 解决方法: 在application.yml配置文件中增加 logging:level:org.springframework.boot.autoconfigure…

ComfyUI效率节点Efficient示例

文生图工作流 Efficient Loader节点用于高效加载和缓存模型 ckpt_name:选择要加载的检查点模型的名称。通常选择你的主要模型名称 vae_name:定义要使用的VAE(变分自编码器)模型。一般选择与你的主要模型匹配的VAE,或者…

OpenGL3.3_C++_Windows(24)

渲染平行光阴影 阴影作用: 有了阴影的渲染,更容易地区分出物体之间的位置关系,如何判断片段是否在阴影中? 普通思路: 以光的位置为视角进行渲染,我们绘制一条从光源出发的射线,测试更新射线经过…

015、HBase分布式数据库与传统数据库的深度对比

目录 HBase分布式数据库与传统数据库的深度对比 1. 数据模型 1.1 传统关系型数据库 1.2 HBase 2. 扩展性 2.1 传统关系型数据库 2.2 HBase 3. 查询语言 3.1 传统关系型数据库 3.2 HBase 4. 事务支持 4.1 传统关系型数据库 4.2 HBase 5. 数据一致性 5.1 传统关系型…

seq2seq原理介绍

视频介绍 seq2seq 一、介绍 Seq2Seq模型,即序列到序列模型,是一种深度学习架构,它能够接收一个序列作为输入,并通过特定的生成方法生成另一个序列作为输出。这种模型的一个关键特点是,输入序列和输出序列的长度可以是…

恢复策略(下)-事务故障后的数据库恢复、系统故障后的数据库恢复(检查点技术)、介质故障后的数据库恢复

一、数据库恢复-事务故障 系统通过对事物进行UNDO操作和REDO操作可实现故障后的数据库状态恢复 1、对于发生事务故障后的数据库恢复 恢复机制在不影响其他事务运行的情况下,强行回滚夭折事务,对该事务进行UNDO操作,来撤销该事务已对数据库…

【Python系列】Python 项目 Docker 部署指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Hadoop3:MapReduce中的ETL(数据清洗)

一、概念说明 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库&#…

bgr24包装为bmp图像

code void BGR24ToBMP(const int width, const int height, uint8_t *framedata, const char *outfile) {BITMAPFILEHEADER bmp_header; // 声明BMP文件的头结构BITMAPINFOHEADER bmp_info; // 声明BMP文件的信息结构unsigned int data_size (width * 3 3) / 4 * 4 * heig…

springboot系列六: springboot底层机制实现 下

实现SpringBoot底层机制[Tomcat启动分析 Spring容器初始化 Tomcat如何关联Spring容器] 实现任务阶段1-创建Tomcat, 并启动🥦说明:创建Tomcat, 并启动🥦分析代码实现🥦完成测试 实现任务阶段2-创建Spring容器🥦说明&a…