AI系统性学习04—文本嵌入模型

文本嵌入(text embedding)是自然语言中的一项重要技术,是将文本转换了固定长度的低密度集向量的表示。

文章目录

  • 1、文本嵌入介绍
    • 1.1 介绍
    • 1.2 文本嵌入与文本向量
    • 1.3 应用场景
    • 1.4 常用的文本嵌入模型
  • 2、M3E文本嵌入模型
    • 2.1 模型介绍
    • 2.2 模型对比
    • 2.3 模型使用
  • 3、OpenAI Embeddings文本嵌入模型
    • 3.1 定义
    • 3.2 使用embeddings模型
  • 4、Text2Vec文本嵌入模型
    • 4.1 定义
    • 4.2 安装
    • 4.3 计算文本向量例子
  • 5、BGE模型FlagEmbedding
    • 5.1 FlagEmbedding
    • 5.2 例子

1、文本嵌入介绍

1.1 介绍

文本嵌入(text embedding)是自然语言中的一个中重要概念,它的目标是将文本的词表示成固定长度的稠密向量,也称为词向量(word vector)。
例如:Girl和Boy,Queen和King,Sport和Game这三对词都有相近的意思,所以他们文本向量的几何距离都比较接近。操作中,文本嵌入可以通过神经网络模型进行无监督学习得到,比如word2vec中的CBOW、SKIP-GRAM模型、GloVe等。这些模型通过大规模文本的统计信息来学习每个词的向量表示

1.2 文本嵌入与文本向量

通过文本嵌入模型(embedding)可以计算出文本的特征向量,在文本嵌入中,每个词或短语被赋予一个向量。这些向量可以组成文本的向量表示,从而表示整个文本的含义,也叫文本特征向量,因为这些向量可以表示文本的语义信息等关键特征信息。会得到一个长度为768的浮点数数组。

1.3 应用场景

文本嵌入可以用于各种NLP任务,如下所示:

  • 文本相似度搜索
  • 文本分类任务
  • 情感分析
  • 垃圾邮件过滤
  • 文本推荐
  • 自动翻译
  • 实体识别
  • 问答系统

1.4 常用的文本嵌入模型

以下是一些流行的文本嵌入模型:

  • Word2Vec:一种基于神经网络的模型,用于生成单词的向量表示。
  • Glove:一种基于共现矩阵的模型,用于生成单词的向量表示。
  • FastText:Facebook开发的一种基于字符级别的文本嵌入模型,可以为单词和短语生成向量表示。
  • BERT:一种基于Transfomer的语言模型,可以生成单词、短语甚至是整个句子的向量表示。
  • M3E:Moka Massive Mixed Embedding的缩写。
  • OpenAI Embedding:这是OpenAI官方发布的Embeddings的API接口,目前主要有text-embedding-ada-002模型。

2、M3E文本嵌入模型

2.1 模型介绍

M3E是Moka Massive Mixed Embeding的缩写,该模型是文本嵌入模型,可以将自然语言转换低维度的向量用于计算文本向量。

  • Moka:模型有MokaAI训练、开源和评测,训练脚本使用uniem,评测BenchMark使用MTEB-zh。
  • Massive:此模型通过千万级(2200w+)的中文句对数据集进行训练。
  • Mixed:此模型支持中英双语的同质文本相似度计算,异质文本检索功能,未来还会支持代码检索功能。

2.2 模型对比

M3E目前提供两个版本:M3E-small、M3E-base

Embedding model参数数量维度中文英文s2ss2ps2c开源兼容性s2c Accs2p ndcg
m3e-small24M5120.58340.7262
m3e-base110M7680.61570.8004
Text2Vec110M7680.57550.6346
openai-ada-002未知15360.59560.7786

说明:⭐️⭐️⭐️

  • s2s:即sentence to sentence,代表了同质文本之间的嵌入能力,使用任务:文本相似度,重复问题检测,文本分类等;
  • s2p:即sentence to passage,代表了异质文本之间的嵌入能力,使用场景:文本检索,GPT记忆模型块等;
  • s2c:即sentence to code,代表了自然语言和程序语言之间嵌入能力,使用场景,代码检索;
  • 兼容性,代表了模型在开源社区中各种项目被支持的程度,由于 m3e 和 text2vec 都可以直接通过 sentence-transformers 直接使用,所以和 openai 在社区的支持度上相当

Tips:⭐️⭐️⭐️

  • 使用场景如果主要是中文,少量英文的情况,不想花钱,不想泄露私有数据,建议使用m3e系列模型;
  • 多语言使用场景且不建议数据隐私的话,就使用OpenAI text-embedding-ada-002
  • 代码检索场景,推荐使用上训练的文本嵌入模型,没有办法完成文本检索任务。

2.3 模型使用

  • 先安装sentence-transformer
pip install -U sentence-transformers
  • 调用代码
from sentence_transformers import SentenceTransformermodel = SentenceTransformer('moka-ai/m3e-base')# 准备一些测试文本,用于生成文本向量
sentences = ['* Moka 此文本嵌入模型由 MokaAI 训练并开源,训练脚本使用 uniem','* Massive 此文本嵌入模型通过**千万级**的中文句对数据集进行训练','* 欢迎访问 www.tizi365.com'
]# 调用模型生成文本向量
embeddings = model.encode(sentences)# 打印向量计算结果
for sentence, embedding in zip(sentences, embeddings):print("文本内容:", sentence)print("文本向量:", embedding)print("")

3、OpenAI Embeddings文本嵌入模型

3.1 定义

OpenAI Embeddings提供嵌入的功能和其他的嵌入功能类似,但是目前在文本向量计算这块,OpenAI的embedding模型效果比较好,缺点就是需要花钱,不过价格还是便宜。

3.2 使用embeddings模型

from openai import OpenAIclient = OpenAI(api_key="REPLACE BY YOUR API KEY")
r = client.embeddings.create(model="text-embedding-ada-002",input="人工智能真好玩儿!")print(r.data)

4、Text2Vec文本嵌入模型

4.1 定义

Text2Vec:text to vector,get sentence embeddings,文本向量化,把文本(包括词、句子、段落)计算为特征向量。
text2vec实现了Word2Vec、RankBM25、BERT、Sentence-BERT、CoSENT等多种文本表征、文本相似度计算模型,并在文本语义匹配(相似度计算)任务上比较了各模型效果。

4.2 安装

pip install torch
pip install -U text2vec

4.3 计算文本向量例子

  • 简单使用
from text2vec import SentenceModelm = SentenceModel()
r = m.encode("人工只能真好玩儿!")
print(r)

输出:

[-2.04385534e-01 -2.95479000e-01  7.88224220e-01  9.25866365e-014.56570178e-01 -6.61403418e-01  5.00589669e-01 -8.20730180e-02........-9.63875711e-01  5.55880088e-03 -6.99731112e-01 -1.78207383e-01]
  • 更复杂的情况
from text2vec import SentenceModeldef compute_emb(model):# Embed a list of sentencessentences = ['卡','银行卡','如何更换花呗绑定银行卡','花呗更改绑定银行卡','This framework generates embeddings for each input sentence','Sentences are passed as a list of string.','The quick brown fox jumps over the lazy dog.']sentence_embeddings = model.encode(sentences)print(type(sentence_embeddings), sentence_embeddings.shape)# The result is a list of sentence embeddings as numpy arraysfor sentence, embedding in zip(sentences, sentence_embeddings):print("Sentence:", sentence)print("Embedding shape:", embedding.shape)print("Embedding head:", embedding[:10])print()if __name__ == '__main__':# Load the Chinese sentence embedding model from local patht2v_model = SentenceModel("/huggingface/shibing624-text2vec-base-chinese")compute_emb(t2v_model)# Load the multilingual sentence embedding model from local pathsbert_model = SentenceModel("/huggingface/shibing624-text2vec-base-multilingual")compute_emb(sbert_model)

输出如下:

2024-03-18 15:21:52.313 | DEBUG    | text2vec.sentence_model:__init__:80 - Use device: cpu
<class 'numpy.ndarray'> (7, 768)
Sentence: 卡
Embedding shape: (768,)
Embedding head: [-0.35981426 -0.3186864   0.13830365  0.64885354 -0.01408281 -0.487384231.30226    -0.39590654  0.18606906  0.26202226]Sentence: 银行卡
Embedding shape: (768,)
Embedding head: [ 0.8671567  -0.60671663  0.02293688  0.4132002  -0.5967976  -0.51031811.4806948   0.8551277   0.22801681  0.63256466]Sentence: 如何更换花呗绑定银行卡
Embedding shape: (768,)
Embedding head: [-4.4358522e-04 -2.9734722e-01  8.5790163e-01  6.9065177e-013.9645979e-01 -8.4892750e-01 -1.9156864e-01  8.4548742e-024.0232992e-01  3.1966275e-01]Sentence: 花呗更改绑定银行卡
Embedding shape: (768,)
Embedding head: [ 0.6536202  -0.076667    0.9596226   1.2794415  -0.00143553 -1.03844110.13855436 -0.9394696   0.33802456  0.15471926]Sentence: This framework generates embeddings for each input sentence
Embedding shape: (768,)
Embedding head: [-0.07267489  0.13551307  0.8715128   0.32199794  0.04113241 -1.40393961.0236042   0.4870898  -0.32605407 -0.08317855]Sentence: Sentences are passed as a list of string.
Embedding shape: (768,)
Embedding head: [-0.06514414  0.07455871  0.2267004   1.1061312  -0.27176154 -1.69787560.29453832 -0.12722531  0.09710422 -0.36989313]Sentence: The quick brown fox jumps over the lazy dog.
Embedding shape: (768,)
Embedding head: [-0.19875857 -0.67079747 -0.07586769  0.4634221   0.9580124  -0.76826890.02202583  1.2257732  -0.4276425  -0.24545906]2024-03-18 15:21:55.567 | DEBUG    | text2vec.sentence_model:__init__:80 - Use device: cpu
<class 'numpy.ndarray'> (7, 384)
Sentence: 卡
Embedding shape: (384,)
Embedding head: [ 0.12097563  0.3195333  -0.3903885  -0.10349016 -0.0327206  -0.154865240.4462906   0.29238302  0.3376441   0.08386162]Sentence: 银行卡
Embedding shape: (384,)
Embedding head: [ 0.15900336  0.40306988 -0.46625367 -0.14987263 -0.0500416  -0.195239160.39799288  0.20468327  0.1518769   0.074183  ]Sentence: 如何更换花呗绑定银行卡
Embedding shape: (384,)
Embedding head: [ 0.07825766  0.3953699   0.00506953  0.12258322 -0.26160595 -0.257596140.07189055 -0.23021507 -0.0203216  -0.0229045 ]Sentence: 花呗更改绑定银行卡
Embedding shape: (384,)
Embedding head: [ 0.07381158  0.37328285  0.02697924  0.18422425 -0.15165754 -0.186038970.08140875 -0.17768659  0.06038244  0.01786209]Sentence: This framework generates embeddings for each input sentence
Embedding shape: (384,)
Embedding head: [-0.10125275 -0.12747736 -0.31334925 -0.04386095  0.0064016   0.156378670.42076212 -0.00064787  0.2419882   0.07633833]Sentence: Sentences are passed as a list of string.
Embedding shape: (384,)
Embedding head: [ 0.0256436   0.2687917   0.07968786  0.05905652  0.09481868 -0.19011540.40289983 -0.16571264  0.2011836   0.11741532]Sentence: The quick brown fox jumps over the lazy dog.
Embedding shape: (384,)
Embedding head: [ 0.17666592  0.43902877 -0.24750058  0.1760914  -0.0160051  -0.452466960.36169243  0.20897985  0.2373922  -0.20034151]

5、BGE模型FlagEmbedding

5.1 FlagEmbedding

智库发布最强开源可商用中英文语义向量模型BGE(BAAI General Embedding),在中英文语义检索精度与整体语义表征能力均超越了社区所有同类级别的模型,如openai 的text embedding 002等。此外,BGE保持了同等参数量级别模型中的最小向量维度,使用成本更低。

5.2 例子

from FlagEmbedding import FlagModel
sentences = ["样例数据-1", "样例数据-2"]
model = FlagModel('BAAI/bge-large-zh-v1.5', query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:",use_fp16=True) # 设置use_fp16为True可以加快计算,效果会稍有下降
embeddings_1 = model.encode(sentences)
embeddings_2 = model.encode(sentences)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)# 对于短查询到长文档的检索任务,请对查询使用 encode_queries() 函数,其会自动为每个查询加上指令
# 由于候选文本不需要添加指令,检索中的候选集依然使用 encode() 或 encode_corpus() 函数
queries = ['query_1', 'query_2']
passages = ["样例文档-1", "样例文档-2"]
q_embeddings = model.encode_queries(queries)
p_embeddings = model.encode(passages)
scores = q_embeddings @ p_embeddings.T

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

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

相关文章

Games101笔记-模型、视图、投影

在旋转点&#xff0c;旋转矩阵的逆等于矩阵的转置 视图变换和投影变换 三维变换 左边3*3是线性变换&#xff0c;右边一列是仿射变换(平移) 先线性再平移 缩放、旋转、平移 x叉乘y得到z&#xff0c;y叉乘z得到x&#xff0c; xyz给任何两个可以得到另一个 (循环对称) z叉乘x得…

sqllab第十一关通关笔记

知识点&#xff1a; 发现登录框就可以尝试注入登录框一般都是字符型注入通过注入可以获取其他表的信息绕过手段 单引号闭合联合注入也可以进行错误注入 首先看界面是一个登录框&#xff1b;通过admin admin登录进去&#xff0c;发现页面会把用户名和密码的登录信息打印出来&am…

美区PayPal绑visa卡注意事项

很多小伙伴都有绑定paypal的需求&#xff0c;但是如果你是绑定美区的paypal这里有几点建议&#xff1a; 1、建议使用US的网络环境注册 2、使用美区的账号 3、使用美区的visa卡 三者统一才可以绑定成功&#xff0c;点击获取可以绑定美区paypal的visa卡&#xff0c;办理简单

【超细完整版】C# 获取WebService所有方法并调用 【调用篇】

注意&#xff1a;该文章涉及到的调用方法若找不到 请移步第一部分内容查找 C# 生成wsdl和dll教程请移步 【超细完整版】C# WebService 通过URL生成WSDL文件和DLL文件> 【生成篇】 开始 首先实现一个类&#xff0c;用于实现对URL的验证等 public class InputFormatVerifica…

【vue elementUI】修改el-dropdown样式

实现效果如下&#xff1a; 代码如下&#xff1a; <el-dropdown trigger"click" command"handleCommand" active-text-color"#606266"><span class"product-card">{{getCategoryName(categoryId)}}</span><el-dro…

docker安装华为opengauss高斯数据库

opengauss高斯数据库 openGauss是一款企业级开源关系型数据库&#xff0c;由华为公司推出。它深度融合了华为多年的数据库领域经验&#xff0c;充分结合企业级场景需求&#xff0c;基于openGauss自研生态而打造。 在架构上&#xff0c;openGauss着重于传统数据库的企业级能力和…

Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

背景介绍 书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》&#xff0c;在头条工程切换至 Bazel 构建系统后&#xff0c;为了支持用户使用 Xcode 开发的习惯&#xff0c;我们使用了开源项目 Tulsi 作为生成工具&#xff0c;用于将 Bazel 工程转换为 Xcode 工程。但是…

sqllab第二十七关通关笔记

知识点&#xff1a; union select 关键字过滤 通过<> /**/进行截断处理 un<>ion sel<>ect 没效果uni/**/on sel/**/ect 被过滤了双写绕过 这关对select进行了多重过滤&#xff0c;无法进行双写绕过 大小写绕过 UNion SElect (这关可以用&am…

亚马逊优惠券新规颁布,卖家应该如何应对?

最近亚马逊优惠券新规引发了很多跨境卖家的热议&#xff0c;内容显示&#xff0c;亚马逊于2024年3月12日实施新的优惠券规则&#xff0c;在这之后卖家提报优惠券需要遵守新的定价要求。到底发生了哪些变化和调整呢&#xff1f;今天就跟大家分析亚马逊优惠券新规政策的调整以及卖…

OpenvSwitch 配置 Trunk 端口实验

OpenvSwitch 配置 Trunk 端口实验 Open vSwitch(OVS)作为一款领先的软件交换机&#xff0c;为构建灵活、可扩展的虚拟网络架构提供了强大的支持。其中Trunk口(Trunk Port)功能就是OVS中一个非常实用的特性。 Trunk口允许在同一个物理端口上传输多个VLAN的数据流量。通过配置T…

蓝桥杯每日一题(BFS)

1562 微博转发 开始思路错误点&#xff1a;在用拉链法保存关注信息的时候&#xff0c;因为要看一个用户发的有多少转发的&#xff0c;所以要以用户为坑位&#xff0c;所有关注这个坑位的用户为链表。&#xff08;开始弄反了&#xff09; e数组存某个用户的idx&#xff0c;ne是…

西门子上位机软件WINCC的项目改造及其多元化报警功能实践:巨控GRM560智能远程控制终端

标签: #西门子WINCC #OPC通讯 #短信报警系统 #项目改造 #智能报警 西门子上位机软件WINCC的项目改造及其多元化报警功能实践 在工业自动化领域&#xff0c;有效的监控和及时的异常响应是保障生产安全和效率的关键。西门子的WINCC上位机软件升级&#xff0c;整合了巨控的OPC560…

Python 计算1~100 求和

result0 for i in range(101):print(i)result result i print(result)

Redis 内存是如何划分的?

查询内存命令 info memory 查询Redis自身使用内存的统计数据。通过这个命令&#xff0c;可以了解 Redis 实例的内存分配情况、内存碎片、键空间使用情况等 内存分配情况&#xff1a; used_memory&#xff1a;Redis 实例当前使用的内存总量&#xff08;以字节为单位&#xff0…

LeetCode 面试经典150题 45.跳跃游戏II

题目&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到…

【初学者】Visual Studio 2019没有 C 项目,只有C++怎么办? 怎么创建第一个项目教程。

起因&#xff1a; 想要在 Visual Studio 上创建一个 C 项目&#xff0c;发现只有 C 的。 解决&#xff1a; C 是 C 的超集。只要创建 C 的项目就行了&#xff0c;将新增的 .cpp 文件改后缀为 .c 即可。不会有问题的。 C 的语法更加严格&#xff0c;而 C 的项目更宽松。虽然…

【云呐】固定资产管理系统的功能有哪些?管理工具

为了提高经营效率&#xff0c;降低企业成本&#xff0c;许多企业选择固定资产管理系统。那么&#xff0c;固定资产管理系统有什么作用呢&#xff1f; 资产登记&#xff1a;  固定资产管理系统可以方便地登记公司的固定资产&#xff0c;包括资产名称、规格型号、购买日期、使…

3dmax渲染卡光子、灯光缓存的处理方法

1、在vray全局开关勾选最大射线强度 2、将场景材质转换为vray类型 3、关闭置换 4、清理空物体等场景垃圾 可以试一下优化场景的工具&#xff0c;清理空物体、空代理、适当塌陷精简场景、清理场景垃圾等 有3dmax效果图渲染需求可以使用渲染100&#xff08;注册填邀请码‘7788…

微信小程序简单实现手势左右滑动和点击滑动步骤条功能

使用微信小程序实现左右滑动功能&#xff0c;自定义顶部图案&#xff0c;点击文字滑动和手势触屏滑动&#xff0c;功能简单&#xff0c;具体实现代码如下所示&#xff1a; 1、wxss代码&#xff1a; /* 步骤条 */ .tab-box {display: flex;flex-direction: row;position: fix…

Netty服务器结合WebSocke协议监听和接收数据

目录 1.pom依赖2.配置属性3.创建netty服务器4.建立监听和响应5.创建启动器6.前端static下页面7.前端js8.注意异常问题9.创建netty服务器--使用守护线程 1.pom依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId>&l…