v0.2.10版本如何自定义文档嵌入和文档检索逻辑 #3015
-
如题:v0.2.10版本能否自定义文档嵌入和文档检索逻辑? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
🤖 嘿,@michaelxu1107!很高兴再次见到你。期待这次又是怎样的有趣对话呢?👾 是的,Langchain-Chatchat v0.2.10版本支持自定义文档嵌入和文档检索逻辑。您提供的上下文显示了一个Python脚本,该脚本修改了嵌入模型的分词器,以在模型中包含用于嵌入的关键词。这是通过 然而,需要注意的是,从0.3.0版本开始,这个功能被标记为已弃用,如 以下是相关代码: @deprecated(
since="0.3.0",
message="自定义关键词 Langchain-Chatchat 0.3.x 重写, 0.2.x中相关功能将废弃",
removal="0.3.0"
)
def get_keyword_embedding(bert_model, tokenizer, key_words):
tokenizer_output = tokenizer(key_words, return_tensors="pt", padding=True, truncation=True)
input_ids = tokenizer_output['input_ids']
input_ids = input_ids[:, 1:-1]
keyword_embedding = bert_model.embeddings.word_embeddings(input_ids)
keyword_embedding = torch.mean(keyword_embedding, 1)
return keyword_embedding 这个函数接收一个BERT模型,一个分词器,和一个关键词列表作为输入。它对关键词进行分词,并获取它们的输入ID。然后,它使用BERT模型的词嵌入来获取这些输入ID的嵌入。然后,对第一维度进行平均以获取关键词嵌入。 然后, def add_keyword_to_model(model_name=EMBEDDING_MODEL, keyword_file: str = "", output_model_path: str = None):
key_words = []
with open(keyword_file, "r") as f:
for line in f:
key_words.append(line.strip())
st_model = SentenceTransformer(model_name)
key_words_len = len(key_words)
word_embedding_model = st_model._first_module()
bert_model = word_embedding_model.auto_model
tokenizer = word_embedding_model.tokenizer
key_words_embedding = get_keyword_embedding(bert_model, tokenizer, key_words)
embedding_weight = bert_model.embeddings.word_embeddings.weight
embedding_weight_len = len(embedding_weight)
tokenizer.add_tokens(key_words)
bert_model.resize_token_embeddings(len(tokenizer), pad_to_multiple_of=32)
embedding_weight = bert_model.embeddings.word_embeddings.weight
with torch.no_grad():
embedding_weight[embedding_weight_len:embedding_weight_len + key_words_len, :] = key_words_embedding
if output_model_path:
os.makedirs(output_model_path, exist_ok=True)
word_embedding_model.save(output_model_path)
safetensors_file = os.path.join(output_model_path, "model.safetensors")
metadata = {'format': 'pt'}
save_model(bert_model, safetensors_file, metadata)
print("save model to {}".format(output_model_path))
def add_keyword_to_embedding_model(path: str = EMBEDDING_KEYWORD_FILE):
keyword_file = os.path.join(path)
model_name = MODEL_PATH["embed_model"][EMBEDDING_MODEL]
model_parent_directory = os.path.dirname(model_name)
current_time = datetime.now().strftime('%Y%m%d_%H%M%S')
output_model_name = "{}_Merge_Keywords_{}".format(EMBEDDING_MODEL, current_time)
output_model_path = os.path.join(model_parent_directory, output_model_name)
add_keyword_to_model(model_name, keyword_file, output_model_path) 来源: 关于
请注意, Sources
|
Beta Was this translation helpful? Give feedback.
🤖
嘿,@michaelxu1107!很高兴再次见到你。期待这次又是怎样的有趣对话呢?👾
是的,Langchain-Chatchat v0.2.10版本支持自定义文档嵌入和文档检索逻辑。您提供的上下文显示了一个Python脚本,该脚本修改了嵌入模型的分词器,以在模型中包含用于嵌入的关键词。这是通过
add_keyword_to_model
和add_keyword_to_embedding_model
函数完成的。然而,需要注意的是,从0.3.0版本开始,这个功能被标记为已弃用,如
get_keyword_embedding
函数中的@deprecated
装饰器所示。这意味着这个功能将在未来的版本中被移除,不建议在新项目中使用。以下是相关代码: