Семантический поиск с помощью Google flan-t5

Я пытаюсь использовать Google Flan T5-Large для создания вложений для простой семантической поисковой системы. Однако косинусное сходство сгенерированных вложений с моим запросом очень незначительно. Что-то я делаю не так?

      import torch
from transformers import AutoTokenizer, AutoModel
import torch
from sklearn.metrics.pairwise import cosine_similarity
from scipy.spatial.distance import euclidean

tokenizer = AutoTokenizer.from_pretrained('google/flan-t5-large')
model = AutoModel.from_pretrained('google/flan-t5-large')

# Set the text to encode

def emebddings_generate(text):
  all_embeddings = []
  for i in text:
    input_ids = tokenizer.encode(i, return_tensors='pt')
    with torch.no_grad():
      embeddings = model(input_ids, decoder_input_ids=input_ids).last_hidden_state.mean(dim=1)
      all_embeddings.append((embeddings,i))
  return all_embeddings

def run_query(query,corpus):
  input_ids = tokenizer.encode(query, return_tensors='pt')
  with torch.no_grad():
        quer_emebedding=model(input_ids,decoder_input_ids=input_ids).last_hidden_state.mean(dim=1)

  similairtiy = []

  for embeds in corpus:
    sim = euclidean(embeds[0].flatten(),quer_emebedding.flatten())
    similairtiy.append((embeds[1],float(sim)))
  return similairtiy


text = ['some sad song', ' a very happy song']
corpus = emebddings_generate(text)

query = "I'm feeling so sad rn"
similairtiy = run_query( query,corpus)
for i in similairtiy:
  print(i)
  print(i[1],i[0])

Я пробовал различные методы объединения, а также другие метрики расстояния.

1 ответ

Проблема, с которой вы здесь сталкиваетесь, заключается в том, что вы предполагаете, что встраивание предложений FLAN подходит для показателей сходства, но это не так. Джейкоб Девлин однажды написал о BERT:

Я не уверен, что это за векторы, поскольку BERT не генерирует осмысленные векторы предложений.

Но это не проблема, поскольку FLAN предназначен для других случаев использования. Он был обучен на различных наборах данных с подходящей подсказкой инструкции для этой задачи, чтобы обеспечить возможность подсказки с нуля (т. е. выполнения задач, для которых модель не была обучена). Это означает, что вы можете выполнить задачу по сходству, сформулировав правильную подсказку без какого-либо обучения. Например:

      from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

model_id = "google/flan-t5-large"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSeq2SeqLM.from_pretrained(model_id)

prompt = """Which song fits the query.
QUERY: I'm feeling so sad rn 
OPTIONS 
-some sad song 
-a very happy song"""

input_ids = tokenizer(prompt, return_tensors="pt").input_ids  
outputs = model.generate(input_ids)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

Выход:

      some sad song

В зависимости от вашего варианта использования вы можете столкнуться с проблемами, когда количество опций увеличивается или когда вы хотите работать с встраиванием предложений. Если это так, вам следует взглянуть на преобразователи предложений . Это преобразователи, которые были обучены создавать осмысленные вложения предложений и поэтому могут использоваться для расчета косинусного сходства двух предложений.

Другие вопросы по тегам