""" Data Scientist.: PhD.Eddy Giusepe Chirinos Isidro main.py ======= Objetivo: Este script calcula os EMBEDDINGS de qualquer TEXTO usando a API da OpenAI e o modelo 'text-embedding-ada-002'. Logo esses Embeddings são armazenado no Banco de Dados 'redis'. Versão: 1.0.0 Data: 27/06/2023 Autor: Dr.Eddy Giusepe Método de execução: $ python main.py """ import os import openai import numpy as np import time from redis_client import RedisClient # Chamo à Classe que crie from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) # read local .env file openai.api_key = os.getenv('OPENAI_API_KEY') Eddy_RedisHost = os.environ["REDIS_HOST"] Eddy_RedisPort = os.environ["REDIS_PORT"] def get_embedding(text): """Recupera Embeddings do cache redis, se não existir, crie-a e armazene-a no cache e retorne-a""" redis_client = RedisClient(host=Eddy_RedisHost, port=Eddy_RedisPort) key = text if not redis_client.exists(key): # Chamo ao método da minha Classe 'RedisClient' time.sleep(1) print("Criando Embeddings para: " + text) response = openai.Embedding.create(input=text, model = "text-embedding-ada-002" ) embeddings = response['data'][0]['embedding'] redis_client.set(key, embeddings) # Aqui salvamos esses 'embeddings' else: embeddings = redis_client.get(key) # Como existe, simplesmente 'get' desse Embedding return embeddings def cosine_similarity(a, b): """Calcula a similaridade de cosseno entre dois Embeddings.""" return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) def similarity(text1, text2): """Calcula a similaridade entre dois textos.""" embedding1 = get_embedding(text1) embedding2 = get_embedding(text2) return cosine_similarity(embedding1, embedding2) def similarity_list(text, text_list): """Calcula a similaridade entre um texto e uma lista de textos.""" embedding1 = get_embedding(text) similarities = [] for text2 in text_list: embedding2 = get_embedding(text2) similarities.append(cosine_similarity(embedding1, embedding2)) return similarities def most_similar(text, text_list): """Calcula a similaridade entre um texto e uma lista de textos e retorna o texto mais similar.""" similarities = similarity_list(text, text_list) return text_list[similarities.index(max(similarities))] def most_similar_with_similarity(text, text_list): """Calcula a similaridade entre um texto e uma lista de textos e retornar o texto mais similar e sua similaridade.""" similarities = similarity_list(text, text_list) return text_list[similarities.index(max(similarities))], max(similarities) def most_similar_with_similarity_threshold(text, text_list, threshold): """Calcula a similaridade entre um texto e uma lista de textos e retornar o texto mais similar e sua similaridade se a similaridade estiver abaixo de um limite, retornar Nenhum""" similarities = similarity_list(text, text_list) max_similarity = max(similarities) if max_similarity < threshold: return None, max_similarity return text_list[similarities.index(max_similarity)], max_similarity if __name__ == '__main__': # BÚSQUEDAS INTELIGENTES CON OPENAI text_list = ['Los felinos dicen', 'Los caninos dicen',\ 'Los bovinos dicen', 'Tengo un terreno en ayacucho', 'Tengo una casa en Piura'] text = 'meaw' print(f'El texto 🧐{text}🧐 es mais similar com: 🤗{most_similar(text, text_list)}🤗') print("") text_Eddy = """Eu sou Cientista de Dados e sou casado com a Karina ❤️""" print("Gerando Embeddings de: ", get_embedding(text_Eddy))