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

慈云数据 2024-04-02 技术支持 69 0

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

AI系统性学习04—文本嵌入模型
(图片来源网络,侵删)

文章目录

  • 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)。

              AI系统性学习04—文本嵌入模型
              (图片来源网络,侵删)

              例如: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 SentenceTransformer
                            model = 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 OpenAI
                            client = 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 SentenceModel
                              m = SentenceModel()
                              r = m.encode("人工只能真好玩儿!")
                              print(r)
                              

                              输出:

                              [-2.04385534e-01 -2.95479000e-01  7.88224220e-01  9.25866365e-01
                                4.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 SentenceModel
                                def compute_emb(model):
                                    # Embed a list of sentences
                                    sentences = [
                                        '卡',
                                        '银行卡',
                                        '如何更换花呗绑定银行卡',
                                        '花呗更改绑定银行卡',
                                        '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 arrays
                                    for 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 path
                                    t2v_model = SentenceModel("/huggingface/shibing624-text2vec-base-chinese")
                                    compute_emb(t2v_model)
                                    # Load the multilingual sentence embedding model from local path
                                    sbert_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
                                 (7, 768)
                                Sentence: 卡
                                Embedding shape: (768,)
                                Embedding head: [-0.35981426 -0.3186864   0.13830365  0.64885354 -0.01408281 -0.48738423
                                  1.30226    -0.39590654  0.18606906  0.26202226]
                                Sentence: 银行卡
                                Embedding shape: (768,)
                                Embedding head: [ 0.8671567  -0.60671663  0.02293688  0.4132002  -0.5967976  -0.5103181
                                  1.4806948   0.8551277   0.22801681  0.63256466]
                                Sentence: 如何更换花呗绑定银行卡
                                Embedding shape: (768,)
                                Embedding head: [-4.4358522e-04 -2.9734722e-01  8.5790163e-01  6.9065177e-01
                                  3.9645979e-01 -8.4892750e-01 -1.9156864e-01  8.4548742e-02
                                  4.0232992e-01  3.1966275e-01]
                                Sentence: 花呗更改绑定银行卡
                                Embedding shape: (768,)
                                Embedding head: [ 0.6536202  -0.076667    0.9596226   1.2794415  -0.00143553 -1.0384411
                                  0.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.4039396
                                  1.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.6978756
                                  0.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.7682689
                                  0.02202583  1.2257732  -0.4276425  -0.24545906]
                                2024-03-18 15:21:55.567 | DEBUG    | text2vec.sentence_model:__init__:80 - Use device: cpu
                                 (7, 384)
                                Sentence: 卡
                                Embedding shape: (384,)
                                Embedding head: [ 0.12097563  0.3195333  -0.3903885  -0.10349016 -0.0327206  -0.15486524
                                  0.4462906   0.29238302  0.3376441   0.08386162]
                                Sentence: 银行卡
                                Embedding shape: (384,)
                                Embedding head: [ 0.15900336  0.40306988 -0.46625367 -0.14987263 -0.0500416  -0.19523916
                                  0.39799288  0.20468327  0.1518769   0.074183  ]
                                Sentence: 如何更换花呗绑定银行卡
                                Embedding shape: (384,)
                                Embedding head: [ 0.07825766  0.3953699   0.00506953  0.12258322 -0.26160595 -0.25759614
                                  0.07189055 -0.23021507 -0.0203216  -0.0229045 ]
                                Sentence: 花呗更改绑定银行卡
                                Embedding shape: (384,)
                                Embedding head: [ 0.07381158  0.37328285  0.02697924  0.18422425 -0.15165754 -0.18603897
                                  0.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.15637867
                                  0.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.1901154
                                  0.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.45246696
                                  0.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问答
Draggable Icon