logo

Embeddings OpenAi

Embeddings OpenAI

En primer lugar he necesitado instalar Python3.12 en Mac/OS usando los siguientes comandos:

brew update
brew install python3
brew upgrade python3

También he actualizado la version de pip utilizando el mismo procedimiento anterior. Sin embargo he tenido problemas a la hora de usar las dependencias de Python, que en este contexto se llaman librerías. Así por ejemplo he tenido que utilizar Pandas para un contexto analítico, Numpy para cálculos numéricos y OpenAI para embeddings .

El comando para instalar módulos :

python3 -m pip install nameModule

A la hora de seguir el tutorial de AMP Tech he tenido problemas al seguir los pasos de generación de embeddings. El primero, por la falta de familiarización con el lenguaje Python, aunque ha sido bastante intuitivo. Segundo, las versiones actualizadas de OpenAI y Python, me ha dado dolores de cabeza, ya que he tenido que ir probando una a una las librerías. Mención a la función cosine_similarity ya que he tenido que buscar una alternativa para encontrar similitudes entre los vectores que es la manera en la que los embeddings se relacionan. A mayor similitud, mayor relación.

El último paso, ha sido sumar embeddings y estudiar las relaciones de similtud con el diccionario introducido. El código generado para las primeras pruebas de embeddings con OpenAI ha quedado como sigue:

import os
from openai import OpenAI
import numpy as np
import pandas as pd

os.environ['OPENAI_API_KEY'] = 'api-key'

client = OpenAI(
    # This is the default and can be omitted
    api_key=os.environ.get("OPENAI_API_KEY"),
)

palabras =['perro','gato','gallina','vaca','pato']

def get_embedding(text, model="text-embedding-ada-002"):
   text = text.replace("\n", " ")
   return client.embeddings.create(input = [text], model=model).data[0].embedding

def cosine_similarity(vector_a, vector_b):

# Compute the dot product of the two vectors
    dot_product = np.dot(vector_a, vector_b)

# Compute the L2 norms (magnitudes) of each vector
    norm_a = np.linalg.norm(vector_a)
    norm_b = np.linalg.norm(vector_b)

# Compute the cosine similarity
# Note: We add a small epsilon value to the denominator for numerical stability
    epsilon = 1e-10
    cosine_similarity = dot_product / (norm_a * norm_b + epsilon)

    return cosine_similarity


diccionario = {}
for i in palabras:
    diccionario[i] = get_embedding(i)

diccionario.keys()


palabra = 'gato'

print('Primeros 10 valores de {}\n', diccionario[palabra][:10])
print('\n')
print('Número de dimensiones del dato embebido',len(diccionario[palabra]))

n_palabra = 'silla' # palabra a comparar
palabra_comparar = 'perro'

n_palabra_embed = get_embedding(n_palabra)

distances = cosine_similarity(diccionario[palabra_comparar], n_palabra_embed)


print(distances)

sumados = (pd.DataFrame(diccionario['perro'])) +  (pd.DataFrame(diccionario['vaca'])) 

len(sumados)


for key, value in diccionario.items():
    print(key,':',cosine_similarity(diccionario[key],sumados))