Embedding documents with this model

#14
by dayosalam - opened

I am building an RAG system and want to use this model to embed the knowledge base and also for the retriever. I need help to get the model locally and use it with the Langchain framework

Variables de modelo de Embedding (1024 dimensiones)

emb_model = "dunzhang/stella_en_400M_v5" # Modelo de embedding
emodel = SentenceTransformer(emb_model, trust_remote_code=True, device="cpu", config_kwargs={"use_memory_efficient_attention": False, "unpad_inputs": False})
k_retrieve = 5 # Documentos a retornar con el Semantico

This model supports two prompts: "s2p_query" and "s2s_query" for sentence-to-passage and sentence-to-sentence tasks, respectively.

They are defined in config_sentence_transformers.json

query_prompt_name = "s2p_query"

Embedding

def doc_embeddings(all_md_header_splits):
only_content = [doc.page_content for doc in all_md_header_splits] # Crear una lista con solo el page_content de cada documento
doc_embeddings = emodel.encode(only_content) # Hago los embeddings
return doc_embeddings, only_content # Retorno los vectores de embedding y los chunks

Retrieve

def similarity_search(query, doc_embeddings, only_content): # Busco el contexto con la busqueda de similaridad
query_embeddings = emodel.encode(query, prompt_name=query_prompt_name) # Hago el embedding de la query
all_docs = emodel.similarity(query_embeddings, doc_embeddings) # Hago la busqueda

# Asegurarse de que k_retrieve no sea mayor que la cantidad de documentos disponibles
num_docs = all_docs.numel()                                                      # numel() devuelve el número total de elementos en el tensor
k_safe = min(k_retrieve, num_docs)                                               # Tomar el menor entre k_retrieve y el número de elementos disponibles
top_values, top_indices = torch.topk(all_docs.flatten(), k_safe)                 # Utilizar torch.topk para obtener los K valores solicitados
texto_combinado = ""                                                             # Inicializar una variable para almacenar el texto
retrieved_docs = []                                                              # Lista para devolver con los documentos

for indice in top_indices:                                                       # Iterar sobre los índices en top_indices
    indice_como_numero = indice.item()                                           # Tomo el valor del tensor para usarlo como indice
    texto_combinado += only_content[indice_como_numero] + " "                    # Concatenamos el texto de esa posición
    retrieved_docs.append(only_content[indice_como_numero])                      # Añadimos el contenido del documento a la lista
    
context = "Contexto: " + texto_combinado.strip()                                 # Eliminamos los espacios al final
return context, retrieved_docs                                                   # Retorno el contexto en texto puro y en formado de listado de documentos 

Sign up or log in to comment