Spaces:
Sleeping
Sleeping
File size: 14,856 Bytes
d382306 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
from transformers import AutoModelForCausalLM, AutoTokenizer
import transformers
import torch
class Llama2Explainer():
def __init__(self, device) -> None:
self.__model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
self.__tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
self.__device = device
self.__results = {"pos_explain":None, "top_contrastive":None, "other_contrastive":None}
self.__pipeline = transformers.pipeline(
"text-generation",
self.__model,
torch_dtype=torch.float16,
device_map="auto",
)
##
def explain_why(self, original_songs, top_songs, explanation_limit=1):
ss_str = ' ,'.join(original_songs) if len(original_songs) > 1 else original_songs[0]
top10 = ' ,'.join(top_songs)
song = "song" if len(original_songs) == 1 else "songs"
was = "was" if len(original_songs) == 1 else "were"
sentence = "sentence" if explanation_limit == 1 else "sentences"
prompt = "<s>[INST] <<SYS>>\n" +\
"You are an audiophile who knows the intricacies of many genres and the nuances for why a person might prefer one genre of music over another. " +\
"Your job is to help explain to the user why these songs in particular were chosen and why other songs that are closely related were not selected. " +\
"You will be given either a song or a list of songs and will also be given the top 10 recommendations from Spotify based on the original song or list of " +\
f"songs. You should explain why each of the songs was chosen to the best of your ability in the order they appear in {explanation_limit} {sentence} per song.\n" +\
+ "</s><s>" +\
"[INST]" +\
"The song that was selected was \"One More Time\" by Daft Punk. The top 10 recommended songs include: \"Get Lucky\" by Daft Punk, " +\
"\"Instant Crush\" by Daft Punk & Julian Casablancas, \"Harder, Better, Faster, Stronger\" by Daft Punk, \"Around the World\" by Daft Punk, " +\
"\"Je veux te void\" by Yelle, \"Ce jeu\" by Yelle, \"Complètement fou\" by Yelle, \"À cause des garçons\" by Yelle, \"Tristesse / joie\" by Yelle, " +\
"\"Rydeen -Original Mix\" by YELLOW MAGIC ORCHESTRA and Video Game Orchestra.\n" +\
"[/INST]" +\
"[1]\"Get Lucky\" by Daft Punk was recommended as a song as \"Get Lucky\" comes from the same album as \"One More Time,\" and is by the same artist.\n" +\
"[2]\"Instant Crush\" by Daft Punk & Julian Casablancas was recommended because Daft Punk was also an artist on the song, and is in the same genre.\n" +\
"[3]\"Harder, Better, Faster, Stronger\" by Daft Punk was recommended as a song asit comes from the same album as \"One More Time,\" and is by the " +\
"same artist.\n" +\
"[4]\"Around the World\" by Daft Punk was recommended as a song asit comes from the same album as \"One More Time,\" and is by the " +\
"same artist.\n" +\
"[5]\"Je veux te void\" by Yelle was recommended because the artist is in the same genre as Daft Punk and \"Get Lucky,\" is from the same region as " +\
"Daft Punk, and was inspired by Daft Punk.\n" +\
"[6]\"Ce jeu\" by Yelle was recommended because the artist is in the same genre as Daft Punk and \"Get Lucky,\" is from the same region as " +\
"Daft Punk, and was inspired by Daft Punk.\n" +\
"[7]\"Complètement fou\" by Yelle was recommended because the artist is in the same genre as Daft Punk and \"Get Lucky,\" is from the same region as " +\
"Daft Punk, and was inspired by Daft Punk.\n" +\
"[8]\"À cause des garçons\" by Yelle was recommended because the artist is in the same genre as Daft Punk and \"Get Lucky,\" is from the same region as " +\
"Daft Punk, and was inspired by Daft Punk.\n" +\
"[9]\"Tristesse / joie\" by Yelle was recommended because the artist is in the same genre as Daft Punk and \"Get Lucky,\" is from the same region as " +\
"Daft Punk, and was inspired by Daft Punk.\n" +\
"[10]\"Rydeen -Original Mix\" by YELLOW MAGIC ORCHESTRA and Video Game Orchestra was recommended because YELLOW MAGIC ORCHESTRA is a band in the same genre" +\
" of music as Daft Punk and served as the duo's inspiration.\n" +\
+ "</s><s>" +\
"[INST]" + f"The {song} that {was} selected {was} {ss_str}. The top 10 recommended songs include: {top10}\n." + "[/INST]"
sequences = self.__pipeline(
prompt,
do_sample=True,
eos_token_id=self.__tokenizer.eos_token_id,
max_length=1024,
)
self.__results["pos_explain"] = sequences[0]['generated_text'].split("/INST] ")[-1]
##
def explain_why_not_these_songs(self, original_songs, selected_songs, other_songs, explanation_limit=1):
ss_str = ' ,'.join(original_songs) if len(original_songs) > 1 else original_songs[0]
top10 = ' ,'.join(selected_songs)
next10 = ' ,'.join(other_songs)
song = "song" if len(original_songs) == 1 else "songs"
song2 = "song" if len(other_songs) == 1 else "songs"
was = "was" if len(original_songs) == 1 else "were"
sentence = "sentence" if explanation_limit == 1 else "sentences"
prompt = "<s>[INST] <<SYS>>\n" +\
"You are an audiophile who knows the intricacies of many genres and the nuances for why a person might prefer one genre of music over another. " +\
"Your job is to help explain to the user why these songs in particular were chosen and why other songs that are closely related were not selected. " +\
"You will be given either a song or a list of songs and will also be given the top 10 recommendations from Spotify based on the original song or list of " +\
f"songs. You should explain why each of the songs was chosen to the best of your ability in the order they appear in {explanation_limit} {sentence} per song.\n" +\
+ "</s><s>" +\
"[INST]" +\
"The song that was selected was “One More Time” by Daft Punk. The top 10 recommended songs include: \"Get Lucky\" by Daft Punk, " +\
"\"Instant Crush\" by Daft Punk & Julian Casablancas, \"Harder, Better, Faster, Stronger\" by Daft Punk, \"Around the World\" by Daft Punk, " +\
"\"Je veux te void\" by Yelle, \"Ce jeu\" by Yelle, \"Complètement fou\" by Yelle, \"À cause des garçons\" by Yelle, \"Tristesse / joie\" by Yelle, " +\
"\"Rydeen -Original Mix\" by YELLOW MAGIC ORCHESTRA and Video Game Orchestra.\n" +\
"The following songs were not recommended: \"False Kings\" by Poets of the Fall, " + "\"Day Seven: Hope\" by Ayreon, " +\
"\"9 väärää kättä\" by Apulanta, K-Magg, " + "\"Simple and Clean\" by Hikaru Utada." +\
"[/INST]" +\
"[1] \"Technopolis - Original Mix\" by YELLOW MAGIC ORCHESTRA and Video Game Orchestra was recommended because YELLOW MAGIC ORCHESTRA " +\
"is a band that influenced Daft Punk\'s work. Based on your song selection, we chose to recommend more songs " +\
"like Daft Punk instead of work that may be inspired by the work of Daft Punk.\n" +\
"[2] \"I Wanna Be Yours\" by Arctic Monkeys was selected because Arctic Monkeys are popular artists similar to Daft Punk, but are more associated " +\
" with alt-rock than electronic music, so they were selected to be lower on the list.\n" +\
"[3] \"Thunder\" by Imagine Dragons was selected because Imagine Dragons are popular artists similar to Daft Punk, but are more associated with alt-rock than electronic music, " +\
"so they were selected to be lower on the list.\n" +\
"[4] \"Why\'d You Only Call Me When You\'re High?\" by Arctic Monkeys was selected because Arctic Monkeys are popular artists similar to Daft Punk, but are more associated " +\
" with alt-rock than electronic music, so they were selected to be lower on the list.\n" +\
"[5] \"Do I Wanna Know?\" by Arctic Monkeys was selected because Arctic Monkeys are popular artists similar to Daft Punk, but are more associated " +\
" with alt-rock than electronic music, so they were selected to be lower on the list.\n" +\
"[6] \"Believer\" by Imagine Dragons was selected because Imagine Dragons are popular artists similar to Daft Punk, but are more associated with alt-rock than electronic music, " +\
"so they were selected to be lower on the list.\n" +\
"[7] \"The Less I Know The Better\" by Tame Impala was selected as Tame Impala are associated with electronic-rock genres. They use a mix of rock and electronic instruments throughout "+\
"their music. Since they also use a rock genre, and Daft Punk is more electronic, they were recommended lower on the list.\n" +\
"[8] \"Stressed Out\" by Twenty One Pilots as Twenty One Pilots are associated with electronic-rock genres. They use a mix of rock and electronic instruments throughout "+\
"their music. Since they also use a rock genre, and Daft Punk is more electronic, they were recommended lower on the list." +\
"[9] \"505\" by Arctic Monkeys was selected because Arctic Monkeys are popular artists similar to Daft Punk, but are more associated " +\
" with alt-rock than electronic music, so they were selected to be lower on the list.\n" +\
"[10] \"Natural\" by Imagine Dragons was selected because Imagine Dragons are popular artists similar to Daft Punk, but are more associated " +\
" with alt-rock than electronic music, so they were selected to be lower on the list.\n" +\
+ "</s><s>" +\
"[INST]" + f"The {song} that {was} selected {was} {ss_str}. The top 10 recommended songs include: {top10}\n. The following {song2} were not recommended: " +\
f"{next10}\n" + "[/INST]"
sequences = self.__pipeline(
prompt,
do_sample=True,
eos_token_id=self.__tokenizer.eos_token_id,
max_length=1024,
)
self.__results["top_constrastive"] = sequences[0]['generated_text'].split("/INST] ")[-1]
##
def explain_why_not_these_songs(self, original_songs, selected_songs, other_songs, explanation_limit=1):
ss_str = ' ,'.join(original_songs) if len(original_songs) > 1 else original_songs[0]
top10 = ' ,'.join(selected_songs)
others = ' ,'.join(other_songs)
song = "song" if len(original_songs) == 1 else "songs"
song2 = "song" if len(other_songs) == 1 else "songs"
was = "was" if len(original_songs) == 1 else "were"
sentence = "sentence" if explanation_limit == 1 else "sentences"
prompt = "<s>[INST] <<SYS>>\n" +\
"You are an audiophile who knows the intricacies of many genres and the nuances for why a person might prefer one genre of music over another. " +\
"Your job is to help explain to the user why these songs in particular were chosen and why other songs that are closely related were not selected. " +\
"You will be given either a song or a list of songs and will also be given the top 10 recommendations from Spotify based on the original song or list of " +\
f"songs. You should explain why each of the songs was chosen to the best of your ability in the order they appear in {explanation_limit} {sentence} per song.\n" +\
+ "</s><s>" +\
"[INST]" +\
"The song that was selected was “One More Time” by Daft Punk. The top 10 recommended songs include: \"Get Lucky\" by Daft Punk, " +\
"\"Instant Crush\" by Daft Punk & Julian Casablancas, \"Harder, Better, Faster, Stronger\" by Daft Punk, \"Around the World\" by Daft Punk, " +\
"\"Je veux te void\" by Yelle, \"Ce jeu\" by Yelle, \"Complètement fou\" by Yelle, \"À cause des garçons\" by Yelle, \"Tristesse / joie\" by Yelle, " +\
"\"Rydeen -Original Mix\" by YELLOW MAGIC ORCHESTRA and Video Game Orchestra.\n" +\
"The following songs were not recommended: \"False Kings\" by Poets of the Fall, " + "\"Day Seven: Hope\" by Ayreon, " +\
"\"9 väärää kättä\" by Apulanta, K-Magg, " + "\"Simple and Clean\" by Hikaru Utada." +\
"[/INST]" +\
"[1]\"False Kings\" by Poets of the Fall wasn't recommended as the genres are not similar. They are also from different nations, as " +\
"Daft Punk is from France and Poets of the Fall is from Finland. Their core inspirations are also different.\n" +\
"[2]\"Day Seven: Hope\" by Ayreon wasn't recommended as the genres do not align. Ayreon is a heavy metal group while Daft Punk is an " +\
"electronic group.\n" +\
"[3]\"9 väärää kättä\" by Apulanta, K-Magg wasn't recommended as the song is entirely sung in Finnish, where as Daft Punk typically " +\
"features English vocals or melodic beats only.\n"+\
"[4]\"Simple and Clean\" by Hikaru Utada was not recommended as the genres do not align. Simple and Clean is a J-Pop song, while " +\
"\"One More Time\" is an electronic song." +\
+ "</s><s>" +\
"[INST]" + f"The {song} that {was} selected {was} {ss_str}. The top 10 recommended songs include: {top10}\n. The following {song2} were not recommended: " +\
f"{others}\n" + "[/INST]"
sequences = self.__pipeline(
prompt,
do_sample=True,
eos_token_id=self.__tokenizer.eos_token_id,
max_length=1024,
)
self.__results["other_constrastive"] = sequences[0]['generated_text'].split("/INST] ")[-1]
##
def get_constrastive_explanations(self):
if self.__results["top_contrastive"] is None:
return "Run the explainer first!"
return self.__results["top_contrastive"]
##
def get_other_constrastive_explanations(self):
if self.__results["other_contrastive"] is None:
return "Run the explainer first!"
return self.__results["other_contrastive"]
##
def get_positive_explanations(self):
if self.__results["pos_explain"] is None:
return "Run the explainer first!"
return self.__results["pos_explain"]
##
## |