写在前面
\1. 当前比较主流的Embedding开源模型有哪些?
答:1. m3e(Moka Massive Mixed Embedding) 2. BAAI/bge-large-zh-v1.5。更多的开源模型评测榜单可见:
https://huggingface.co/spaces/mteb/leaderboard
\2. 模型的作用?
答:通过词,句子或者上下文的向量生成,从而来实现更高效的语义检索,语言理解的相关任务。
\3. 模型是如何捕获语义信息的?
答:在训练的过程中,模型学习用来反映语义相似性的方式将向量分配给单词或序列。简言之,通过分析数据中的词共现模式来实现。
\4. 为什么需要对Embedding 模型进行微调?
答:因为稀疏性的问题,在垂类数据下微调,可以得到更好的效果。
领域微调实现
如何从0-1的训练一个Embedding model 可以参考智源的论文:
https://arxiv.org/pdf/2309.07597.pdf,从中我们可以看到如果需要一个特定的领域向量模型,那么就需要这个行业的相关文本,和特定任务的文本对。例如某一个医学问题及其对应的内容的文本对。
这篇文章将从文本对的构建和微调上进行展开。
数据构建:
在通常情况下,我们可以比较容易的获取到一些垂类相关的无监督文本,比如:垂类书籍,论文等来源。难的是获取文本对,以往这些数据都是依赖于开源或者人工标注,但现在有了另一种解决方案,LLM生成文本对。
具体的做法是:
\1. 解析垂类数据,比如:pdf,docx等格式
\2. 将数据进行chunk 切分。
\3. 用LLM对每一个chunk 生成N个问题(或者生成简要的摘要),从而组合成文本对。
接下来是代码实现:
# coding=utf-8
import json
from llama_index import SimpleDirectoryReader
from llama_index.node_parser import SimpleNodeParser
from llama_index.schema import MetadataMode
def load_corpus(files):
reader = SimpleDirectoryReader(input_files=files)
docs = reader.load_data()
parser = SimpleNodeParser.from_defaults()
nodes = parser.get_nodes_from_documents(docs, show_progress=True)
corpus = {node.node_id: node.get_content(metadata_mode=MetadataMode.