Local Embedding 模块是一个本地矢量化模块,用于将文本句子嵌入到一个高维向量空间中,以便进行各种文本相关任务,如文本相似度计算等。 Local Embedding 主要依赖于 ONNX 来进行本地推理,诸如于 SentenceTransformers 等模型。

Onnx 是一个跨平台机器学习推理加速器。通常用于在客户端、服务端引入小模型推理,诸如于引入 SentenceTransformers 在本地进行相似式搜索。 从实现上,ONNX 使用的是 C++ 实现的,所以其它语言下使用的也是 FFI 的形式。

Local Embedding

Sentence Transformers 是一个自然语言处理工具,用于将文本句子嵌入到一个高维向量空间中,以便进行各种文本相关任务,如文本相似度计算、 文本分类、聚类等。它是通过预训练的深度学习模型实现的,通常使用诸如BERT、RoBERTa、DistilBERT等预训练模型作为其基础架构。

在这里,我们使用的 SentenceTransformers 模型是:sentence-transformers/all-MiniLM-L6-v2, 在体积上只有 22M,因此被 Bloop、GitHub Copilot 作为本地向量化模型,也因此是 Chocolate Factory 的默认的本地矢量化模块。

  • all-MiniLM-L6-v2 支持转为 384 维稠密向量空间(dimensional dense vector space),即 384

可以使用 optimum 优化模型,将模型转换为 ONNX 格式,以便于在本地进行推理。

Embedding 示例

val semantic = STSemantic.create()
val embedding = semantic.embed("what is the weather today?")

Decode 和 Encode 示例

val semantic = STSemantic.create()
val embedding = semantic.getTokenizer().encode("blog")

embedding.ids shouldBe listOf(101L, 9927L, 102L)

embedding.attentionMask shouldBe listOf(1L, 1L, 1L)

val text = semantic.getTokenizer().decode(embedding.ids)
text shouldBe "[CLS] blog [SEP]"

其它 Sentence Transformers 模型

M3E (中文支持好)

M3E 是 Moka Massive Mixed Embedding 的缩写

  • Moka,此模型由 MokaAI 训练,开源和评测,训练脚本使用 uniem ,评测 BenchMark 使用 MTEB-zh
  • Massive,此模型通过千万级 (2200w+) 的中文句对数据集进行训练
  • Mixed,此模型支持中英双语的同质文本相似度计算,异质文本检索等功能,未来还会支持代码检索
  • Embedding,此模型是文本嵌入模型,可以将自然语言转换成稠密的向量

M3E 分为 small 和 base

M3E 对应的 Tips

  • 使用场景主要是中文,少量英文的情况,建议使用 m3e 系列的模型
  • 多语言使用场景,并且不介意数据隐私的话,我建议使用 text-embedding-ada-002
  • 代码检索场景,推荐使用 text-embedding-ada-002
  • 文本检索场景,请使用具备文本检索能力的模型,只在 S2S 上训练的文本嵌入模型,没有办法完成文本检索任务

Intellij

SearchEverywhere—SemanticSearch

估计可能是这个版本:https://huggingface.co/prajjwal1/bert-tiny

{
  "clean_up_tokenization_spaces": true,
  "cls_token": "[CLS]",
  "do_basic_tokenize": true,
  "do_lower_case": true,
  "mask_token": "[MASK]",
  "model_max_length": 512,
  "never_split": null,
  "pad_token": "[PAD]",
  "sep_token": "[SEP]",
  "strip_accents": null,
  "tokenize_chinese_chars": true,
  "tokenizer_class": "BertTokenizer",
  "unk_token": "[UNK]"
}

Intellij 的 tokenizer_config.json 配置:

{
  "do_lower_case": true,
  "unk_token": "[UNK]",
  "sep_token": "[SEP]",
  "pad_token": "[PAD]",
  "cls_token": "[CLS]",
  "mask_token": "[MASK]",
  "clean_up_tokenization_spaces": true,
  "tokenize_chinese_chars": true,
  "strip_accents": null,
  "special_tokens_map_file": null,
  "do_basic_tokenize": true,
  "never_split": null,
  "tokenizer_class": "BertTokenizer",
  "model_max_length": 512
}