写点什么

单月 30k+ Downloads!一款头部 Embedding 开源模型

  • 2024-10-23
    上海
  • 本文字数:2701 字

    阅读完需:约 9 分钟

单月30k+ Downloads!一款头部Embedding开源模型

在数字化转型的浪潮中,文本数据的处理和分析成为了各行各业关注的焦点。如何将人类阅读的文本转换为机器可理解的形式,并且能够准确地召回和提取这些转换结果,成为了提升我们工作效率和体验的关键。


无论是从社交媒体中提取情感倾向,还是对大量文档进行内容相似性分析,或是在复杂的对话系统中实现精准的语义理解,文本向量化(Embedding)技术都扮演着至关重要的角色——纯文本无法通过数学方式计算,而转换为向量后,即可进行最基础的数学运算。


今天,我们和大家分享一款令人兴奋的开源模型——acge_text_embedding。今年三月,acge 模型在 Massive Text Embedding Benchmark (MTEB) 中文榜单(C-MTEB)登顶第一,目前模型已在 Hugging Face 和 Github 平台开源。


项目简介


acge_text_embedding 模型由 TextIn 团队开发,是一个通用的文本编码模型——可变长度的向量化模型。Embedding 是一种用于机器学习和自然语言处理领域的表示技术,它将高维的离散数据(如单词、句子或者图像的特征等)转换为低维的连续向量,这些向量能够捕捉到数据的语义特征和关系,将单词、短语或整个文档的语义和上下文信息封装在一个密集的、低维的向量空间中。


acge 模型使用了 Matryoshka Representation Learning,建议使用的维度为 1024 或者 1792。


在 Hugging Face 平台上,acge 模型单月下载量为 30,423。


性能优势


优秀的召回效果:采用对比学习技术,通过最小化正对之间的距离和最大化负对之间的距离来呈现文本语义表示,提升整体召回效果。


强大的模型泛化能力:基于多场景、高质量、数量庞大的数据集,打造强大泛化能力,加快模型收敛。


改善模型“偏科”与遗忘问题:技术开发过程中,采用多任务混合训练,多 loss 适配场景,适应各种下游任务,避免模型“偏科”;引入持续学习训练方式,改善引入新数据后模型灾难性遗忘问题。


更快的处理速度:运用 MRL 技术,训练可变维度的嵌入,提高处理速度,降低了存储需求。


使用方式


重现 C-MTEB 结果示例代码


import torchimport argparseimport functoolsfrom C_MTEB.tasks import *from typing import List, Dictfrom sentence_transformers import SentenceTransformerfrom mteb import MTEB, DRESModel


class RetrievalModel(DRESModel):def init(self, encoder, **kwargs):self.encoder = encoder


def encode_queries(self, queries: List[str], **kwargs) -> np.ndarray:    input_texts = ['{}'.format(q) for q in queries]    return self._do_encode(input_texts)
def encode_corpus(self, corpus: List[Dict[str, str]], **kwargs) -> np.ndarray: input_texts = ['{} {}'.format(doc.get('title', ''), doc['text']).strip() for doc in corpus] input_texts = ['{}'.format(t) for t in input_texts] return self._do_encode(input_texts)
@torch.no_grad()def _do_encode(self, input_texts: List[str]) -> np.ndarray: return self.encoder.encode( sentences=input_texts, batch_size=512, normalize_embeddings=True, convert_to_numpy=True )
复制代码


def get_args():parser = argparse.ArgumentParser()parser.add_argument('--model_name_or_path', default="acge_text_embedding", type=str)parser.add_argument('--task_type', default=None, type=str)parser.add_argument('--pooling_method', default='cls', type=str)parser.add_argument('--output_dir', default='zh_results',type=str, help='output directory')parser.add_argument('--max_len', default=1024, type=int, help='max length')return parser.parse_args()


if name == 'main':args = get_args()encoder = SentenceTransformer(args.model_name_or_path).half()encoder.encode = functools.partial(encoder.encode, normalize_embeddings=True)encoder.max_seq_length = int(args.max_len)


task_names = [t.description["name"] for t in MTEB(task_types=args.task_type,                                                  task_langs=['zh', 'zh-CN']).tasks]TASKS_WITH_PROMPTS = ["T2Retrieval", "MMarcoRetrieval", "DuRetrieval", "CovidRetrieval", "CmedqaRetrieval",                      "EcomRetrieval", "MedicalRetrieval", "VideoRetrieval"]for task in task_names:    evaluation = MTEB(tasks=[task], task_langs=['zh', 'zh-CN'])    if task in TASKS_WITH_PROMPTS:        evaluation.run(RetrievalModel(encoder), output_folder=args.output_dir, overwrite_results=False)    else:        evaluation.run(encoder, output_folder=args.output_dir, overwrite_results=False)
复制代码


在 sentence-transformer 库中的使用方法,并算出两个文本的相似度:


from sentence_transformers import SentenceTransformer


sentences = ["合合信息是一家伟大的公司", "介绍一下合合信息公司"]model = SentenceTransformer('acge_text_embedding')print(model.max_seq_length)embeddings_1 = model.encode(sentences, normalize_embeddings=True)embeddings_2 = model.encode(sentences, normalize_embeddings=True)similarity = embeddings_1 @ embeddings_2.Tprint(similarity)


在 sentence-transformer 库中的使用方法,选取不同维度的向量:


from sklearn.preprocessing import normalizefrom sentence_transformers import SentenceTransformer


sentences = ["数据 1", "数据 2"]model = SentenceTransformer('acge_text_embedding')embeddings = model.encode(sentences, normalize_embeddings=False)matryoshka_dim = 1024embeddings = embeddings[..., :matryoshka_dim] # Shrink the embedding dimensionsembeddings = normalize(embeddings, norm="l2", axis=1)print(embeddings.shape)

=> (2, 1024)

现有应用


当前,acge 模型已在多个应用场景下展现其优势:


(a) 文档分类:通过 ocr 技术精确识别图片、文档等场景中的文字,利用 acge 强大的文本编码能力,结合语义相似度匹配技术,构建通用分类模型;


(b) 长文档信息抽取:通过文档解析引擎与层级切片技术,利用 acge 生成向量索引,检索抽取内容块,提升长文档信息抽取模型精度;


(c) 知识问答:通过文档解析引擎与层级切片技术,利用 acge 生成向量索引,定位文件内容,实现精准问答。


更多模型细节,可以到项目地址查看:


链接:https://huggingface.co/aspire/acge_text_embedding


模型 API 调用:https://www.textin.com/market/detail/acge_text_embedding


更多福利、大模型应用技术学习材料,关注合合君即刻领取!

用户头像

上海合合信息科技股份有限公司人工智能团队 2022-08-01 加入

在上海市领军人才合合信息董事长镇立新博士带领下,于复杂场景文字识别、智能图像处理、自然语言处理等人工智能领域拥有10 余年研发创新与技术积累,具备专业的行业理解与技术成果。

评论

发布
暂无评论
单月30k+ Downloads!一款头部Embedding开源模型_开源_合合技术团队_InfoQ写作社区