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

2024-03-18 17:28

本文主要是介绍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

这篇关于AI系统性学习04—文本嵌入模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/823088

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav