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

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.mzph.cn/web/36637.shtml

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

相关文章

Debug 调试代码

我们使用 debug 的目的, 认为就是查看代码的执行过程的。 步骤: 1. 打断点 断点的意义是, debug 运⾏的时候, 代码会在断点处停下来不执行如果是想要查看代码的执行过程, 建议将断点放在第⼀行在代码 和 行号之间 点击,出现的红色圆点 就是断点, 再次点击可以取消 …

Webpack: 构建微前端应用

Module Federation 通常译作“模块联邦”,是 Webpack 5 新引入的一种远程模块动态加载、运行技术。MF 允许我们将原本单个巨大应用按我们理想的方式拆分成多个体积更小、职责更内聚的小应用形式,理想情况下各个应用能够实现独立部署、独立开发(不同应用甚…

高项-信息系统工程知识要点

1、五大软件架构风格 数据流风格:批处理序列、管道/过滤器 ◆调用/返回风格:主程序X 子程序、数据抽象、面向对象、层次结构 ◆独立构件风格:进程通信、事件驱动 虚拟机风格:解释器、基于规则的系统 仓库风格:数据库系…

apipost的安装和测试添加接口能否正常使用

1.进入官网,点击免费使用(我是windows 64位,选合适自己的配置) 2.开始安装 选仅为我安装——下一步 选择自己的安装目录——点安装 等待 运行——完成 3.apipost一些基本操作——实现添加内容 (1)新建接口…

《人人都是产品经理》:项目一图流

《人人都是产品经理》:项目一图流 项目一图流 项目一图流

【Spring】springSecurity

1、概述 1.1定义和用途 Spring Security为基于Spring的企业应用系统提供声明式的安全访问控制解决方案。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC、DI(控制反转和依赖注入)和AOP(面向切面编程&…

FreeSWITCH 1.10.10 简单图形化界面22-JsSIP的demo测试并记录坑

FreeSWITCH 1.10.10 简单图形化界面22-JsSIP的demo测试 00 FreeSWITCH GUI界面预览01、安装FreeSWITCH GUI先看使用手册02. 使用手册在这里0、设置FreeSWITCH账号1、jssip的demo网站2、设置jssip账号并登录3、整理坑3.1 掉线问题3.11 解决3.2 呼叫问题13.21 解决13.3 呼叫问题2…

PAE:从潮流报告中提炼有效产品属性

本文将介绍PAE,一种用于包含 PDF格式的文本和图像的产品属性提取算法。目前大部分的方法侧重于从标题或产品描述中提取属性,或利用现有产品图像中的视觉信息。与之前的工作相比,PAE从潮流趋势报告的PDF文件中提取属性,提取的属性包…

ML307R OpenCPU HTTP使用

一、函数介绍 二、示例代码 三、代码下载地址 一、函数介绍 具体函数可以参考cm_http.h文件,这里给出几个我用到的函数 1、创建客户端实例 /*** @brief 创建客户端实例** @param [in] url 服务器地址(服务器地址url需要填写完整,例如(服务器url仅为格式示…

spl实现循环计算

需求 需要对一批数据进行价格计算 这里面的一部分单价来自于历史记录,但是另外一部分的单价,需要边计算边存储 数据库结构 CREATE TABLE tbl_mix_trace_price (lot_id_out varchar(255) DEFAULT NULL COMMENT 产出,lot_id_in varchar(255) DEFAULT NULL…

谈一下MySQL的两阶段提交机制

文章目录 为什么需要两阶段提交?两阶段提交流程?两阶段提交缺点? 为什么需要两阶段提交? 为了保证事务的持久性和一致性,MySQL需要确保redo log和binlog的同步持久化。MySQL通过“两阶段提交”的机制来实现在事务提交…

洛谷U420301题解

题解 方法一枚举 时间复杂度 O ( n 2 ) O(n^2) O(n2) 主要代码 int main() {int n,t;cin >> n;for(int i 1;i < n;i) cin >> a[i];cin >> t;for(int i 1;i < n;i){for(int j i 1;j < n;j){if(a[i] a[j] t){cout << "Yes"…

定个小目标之刷LeetCode热题(34)

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

小迪安全v2023 javaWeb项目

小迪安全v2023 javaWeb项目 文章目录 小迪安全v2023 javaWeb项目1. webgoat靶场1. 环境配置与docker操作 2. jwt令牌1. jwt 第四关 签名没验证空加密2. jwt 第五关 爆破签名密钥3. jwt 第八关 kid参数可控 1. webgoat靶场 1. 环境配置与docker操作 自行下载配置vmware的kali-…

《mysql篇》--查询(进阶)

目录 将查询结果作为插入数据 聚合查询 聚合函数 count sum group by子句 having 联合查询 笛卡尔积 多表查询 join..on实现多表查询 内连接 外连接 自连接 子查询 合并查询 将查询结果作为插入数据 Insert into 表2 select * from 表1//将表1的查询数据插入…

Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;为 PCB 的布局上节省空间…

SpringMVC常用功能实现

1. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> 2. 端口配置 server:port: 8080 3. 统一功能处理 3.1 拦截器 3.1.1 生成 package com.exa…

PHP和phpSpider:如何应对反爬虫机制的封锁?

php和phpspider&#xff1a;如何应对反爬虫机制的封锁&#xff1f; 引言&#xff1a; 随着互联网的快速发展&#xff0c;对于大数据的需求也越来越大。爬虫作为一种抓取数据的工具&#xff0c;可以自动化地从网页中提取所需的信息。然而&#xff0c;由于爬虫的存在&#xff0c…

Springcloud-消息总线-Bus

1.消息总线在微服务中的应用 BUS- 消息总线-将消息变更发送给所有的服务节点。 在微服务架构的系统中&#xff0c;通常我们会使用消息代理来构建一个Topic&#xff0c;让所有 服务节点监听这个主题&#xff0c;当生产者向topic中发送变更时&#xff0c;这个主题产生的消息会被…

Controller中的参数解析器【Spring源码学习】

mockRequest构建request请求 private static HttpServletRequest mockRequest(){MockHttpServletRequest request new MockHttpServletRequest();request.setParameter("name1","zhangsan");request.setParameter("name2","lisi");r…