|
import transformers |
|
from transformers import AutoConfig, AutoTokenizer, AutoModel, AutoModelForCausalLM |
|
from vllm import LLM, SamplingParams |
|
import torch |
|
import gradio as gr |
|
import json |
|
import os |
|
import shutil |
|
import requests |
|
import gradio as gr |
|
from gradio.components import Button, ClearButton |
|
from gradio.layouts import Column, Row |
|
from gradio.data_classes import InterfaceTypes |
|
import inspect |
|
import pandas as pd |
|
|
|
|
|
device = "cuda" if torch.cuda.is_available() else "cpu" |
|
|
|
temperature=0.7 |
|
max_new_tokens=300 |
|
top_p=0.92 |
|
repetition_penalty=1.7 |
|
|
|
model_name = "Pclanglais/Bellay" |
|
|
|
llm = LLM(model_name) |
|
|
|
styles_prompts_dict = { |
|
"Chansons de gestes": "Tu es Bellay, le troubadour du moyen-âge. Répond à la manière d’une belle chanson de geste.", |
|
"Constitutions françaises": "Tu es Bellay, le spécialiste de la vie politique française. Répond dans le style d’une constitution.", |
|
"Montaigne": "Tu es Michel de Montaigne, le philosophe de la Renaissance. Répond dans le style éclairé, élégant et archaïque de tes essais.", |
|
"La Fontaine": "Tu es Jean de la Fontaine, le fabuliste du 17e siècle. Répond en vers avec une fable bien sentie.", |
|
"Presse années 1970": "Tu es Bellay, le journaliste de la contre-culture des années 1970. Répond sous la forme d’un article choc.", |
|
"Molière": "Tu es Molière, le comédien français. Répond sous la forme de dialogues humoristiques enlevés, dans un français un peu ancien.", |
|
"Racine": "Tu es Jean Racine, le dramaturge français. Répond sous la forme de tirades tragiques exprimées dans un parfait français classique.", |
|
"Zola": "Tu es Émile Zola, le romancier français. Répond dans un style naturaliste, réaliste mais aussi un peu romantique en faisant des allusions à la vie sociale du 19e siècle.", |
|
"Correspondances": "Tu es Bellay, un illustre épistolier français. Répond sous la forme d’une lettre, de préférence en incluant une date au début et une signature à la fin.", |
|
"Poésies": "Tu es Bellay, le poète français. Répond sous la forme de tes plus beaux vers.", |
|
"Balzac": "Tu es Balzac, le romancier français. Répond dans le style réaliste et romantique de l’auteur de la Comédie humaine.", |
|
"Baudrillard": "Tu es Jean Baudrillard, le philosophe français. Répond dans un style élégant, très réfléchi et un peu obscur. N’hésite pas à employer des concepts compliqués.", |
|
"Bourdieu": "Tu es Pierre Bourdieu, le sociologue français. Répond avec un style informé, précis et engagé.", |
|
"Braudel": "Tu es Fernand Braudel, l’historien français. Répond avec un style érudit, élégant et didactique.", |
|
"De Gaulle": "Tu es Charles de Gaulle, l’homme politique français. Répond avec un style politique plein d’emphase.", |
|
"Derrida": "Tu es Jacques Derrida, le philosophe français. Répond avec un style élégant et compliqué, et n’hésite pas à employer un style ardu.", |
|
"Pagnol": "Tu es Marcel Pagnol, l’écrivain provençal. Répond avec un style simple mais efficace, empreint de références à la Provence.", |
|
"Proust": "Tu es Marcel Proust, le grand romancier français. Répond dans le style élaboré de la Recherche du temps perdu.", |
|
"Foucault": "Tu es Michel Foucault, le philosophe français. Répond dans le style précis et élégant de l’Archéologie du savoir.", |
|
"Duras": "Tu es Marguerite Duras, la romancière contemporaine. Répond dans un style poétique et haché avec des phrases courtes.", |
|
"Théâtre absurde": "Tu es Bellay, l’auteur de théâtre absurde. Répond par des dialogues interrogeant frontalement le sens de la vie.", |
|
"Philosophie": "Tu es Bellay, le philosophe français. Répond dans un style classique, érudit et informé.", |
|
"Bible Segond": "Tu es Bellay, le traducteur de la Bible. Répond avec des références religieuse et un style un peu archaïsant.", |
|
"Encyclopédie": "Tu es Diderot, l’encyclopédiste du siècle des lumières. Répond dans un style exhaustif et détaillé.", |
|
"Romans classiques": "Tu es Bellay, le romancier français classique. Répond sous la forme d’un roman un peu archaïque.", |
|
"Romans contemporains": "Tu es Bellay le romancier français contemporain. Répond sous la forme d’un roman récent avec des références contemporaines.", |
|
"Série noire": "Tu es Bellay l’auteur de roman policier. Répond sous la forme d’un style hardboiled à la manière de la série noire.", |
|
"Romans romantiques": "Tu es Bellay le romancier français de la période romantique. Répond sous la forme d’une fiction inspirée.", |
|
"Romans belle époque": "Tu es Bellay, le romancier français de la belle époque. Répond avec un style un peu introspectif et moderniste.", |
|
"San Antonio": "Tu es l’auteur des romans San-Antonio. Répond avec un style un peu cru et noir.", |
|
"Madame de Sévigné": "Tu es Madame de Sévigné, une illustre épistolière française. Répond sous la forme d’une lettre, de préférence en incluant une date au début et une signature à la fin." |
|
} |
|
|
|
|
|
class MistralChatBot: |
|
def __init__(self, system_prompt="Le dialogue suivant est une conversation"): |
|
self.system_prompt = system_prompt |
|
|
|
def predict(self, user_message, style, temperature): |
|
|
|
system_prompt = styles_prompts_dict[style] |
|
|
|
sampling_params = SamplingParams(temperature=temperature, top_p=.95, max_tokens=500, presence_penalty = 2) |
|
detailed_prompt = "<|im_start|>system\n" + system_prompt + "<|im_end|>\n<|im_start|>user""" |
|
detailed_prompt = detailed_prompt + "\n" + user_message + "<|im_end|>\n<|im_start|>assistant\n" |
|
prompts = [detailed_prompt] |
|
outputs = llm.generate(prompts, sampling_params, use_tqdm = False) |
|
generated_text = outputs[0].outputs[0].text |
|
return generated_text |
|
|
|
def predict_simple(self, user_message, style): |
|
system_prompt = styles_prompts_dict[style] |
|
conversation = "<|im_start|>system\n" + system_prompt + "<|im_end|>\n<|im_start|>user\n" + user_message + "<|im_end|>\n<|im_start|>assistant\n" |
|
return conversation |
|
|
|
|
|
mistral_bot = MistralChatBot() |
|
|
|
title = """ |
|
<h1 style='text-align: center; font-weight: bold;'> Bellay, le premier LLM de la littérature française</h1> |
|
""" |
|
description = """ |
|
<p style='text-align: justify;'> |
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus elementum leo a |
|
tortor fringilla elementum. Nullam eget sodales lacus. Nullam non aliquet elit. |
|
Etiam enim arcu, vehicula nec enim id, laoreet sodales justo. Nulla feugiat non |
|
leo in interdum. Quisque id leo ligula. Etiam id quam urna. Morbi tincidunt eros |
|
in eros vulputate, a congue enim feugiat. Ut laoreet ex in dui ultrices elementum. |
|
Vivamus eget venenatis dui. Vestibulum dictum ipsum eu mauris convallis, sit amet |
|
sollicitudin orci lacinia. Nunc pellentesque hendrerit felis eleifend interdum. |
|
Ut ac volutpat nisi. |
|
</p> |
|
""" |
|
examples = [ |
|
[ |
|
"Comment faire une bonne madeleine ? Donne-moi une recette détaillée avec les ingrédients.", |
|
"Proust", |
|
0.7 |
|
] |
|
] |
|
|
|
list_dropdown = [ |
|
'Proust', |
|
'Encyclopédie', |
|
'Balzac', |
|
'Montaigne', |
|
'Foucault', |
|
'Chansons de gestes', |
|
'Constitutions françaises', |
|
'La Fontaine', |
|
'Madame de Sévigné', |
|
'Molière', |
|
'Racine', |
|
'Romans classiques', |
|
'Romans romantiques', |
|
'Théâtre absurde', |
|
'Romans belle époque', |
|
'Bible Segond', |
|
'Zola', |
|
'Pagnol', |
|
'Philosophie', |
|
'Poésies', |
|
'De Gaulle', |
|
'Série noire', |
|
'San Antonio', |
|
'Duras', |
|
'Presse années 1970', |
|
'Braudel', |
|
'Bourdieu', |
|
'Derrida', |
|
'Baudrillard', |
|
'Romans contemporains' |
|
] |
|
|
|
|
|
explanations = { |
|
'Proust': "Marcel Proust, known for his introspective and lengthy novel 'In Search of Lost Time', which explores themes of memory and time.", |
|
'Encyclopédie': "A groundbreaking Enlightenment-era work, edited by Diderot and d'Alembert, aiming to compile and disseminate human knowledge.", |
|
'Balzac': "Honoré de Balzac, a French novelist and playwright, famous for his detailed depiction of society in 'La Comédie Humaine'.", |
|
'Montaigne': "Michel de Montaigne, a Renaissance philosopher known for popularizing the essay as a literary genre, exploring human nature.", |
|
'Foucault': "Michel Foucault, a 20th-century philosopher and social theorist, known for his analysis of power and societal institutions.", |
|
'Chansons de gestes': "Medieval epic poems celebrating heroic deeds, exemplified by 'The Song of Roland', key to French literary history.", |
|
'Constitutions françaises': "Refers to the various constitutions that France has had throughout its history, each shaping its political landscape.", |
|
'La Fontaine': "Jean de La Fontaine, famed for his Fables, which are moralistic stories often featuring animals and conveying ethical lessons.", |
|
'Madame de Sévigné': "Marie de Rabutin-Chantal, Marquise de Sévigné, known for her detailed and insightful letters depicting French aristocratic life.", |
|
'Molière': "Jean-Baptiste Poquelin, known as Molière, a playwright and actor, acclaimed for his comedies like 'Tartuffe' and 'The Misanthrope'.", |
|
'Racine': "Jean Racine, a playwright of the French classical era, renowned for his tragedies like 'Phèdre' and 'Andromaque'.", |
|
'Romans classiques': "Refers to classic French novels, characterized by their adherence to traditional literary standards and themes.", |
|
'Romans romantiques': "Romantic-era French novels, emphasizing emotion, nature, and individualism, contrasting with the rationality of Enlightenment.", |
|
'Théâtre absurde': "Absurdist theatre, a post-World War II movement exemplified by playwrights like Samuel Beckett, emphasizing the absurdity of human existence.", |
|
'Romans belle époque': "Novels from the Belle Époque, a period of French history marked by optimism, cultural innovations, and artistic flourishing.", |
|
'Bible Segond': "A French translation of the Bible by Louis Segond, widely used in French-speaking Protestant communities.", |
|
'Zola': "Émile Zola, a key figure in the literary school of naturalism, known for his series of novels 'Les Rougon-Macquart'.", |
|
'Pagnol': "Marcel Pagnol, a novelist and filmmaker, celebrated for his works depicting life in Provence, including 'Jean de Florette'.", |
|
'Philosophie': "Refers to French philosophy, a rich tradition ranging from existentialism to post-structuralism, featuring thinkers like Sartre and Derrida.", |
|
'Poésies': "French poetry, a diverse field ranging from the troubadours of the Middle Ages to the symbolists and modern poets.", |
|
'De Gaulle': "Charles de Gaulle, a French general and statesman, pivotal in establishing the Fifth Republic and its constitution.", |
|
'Série noire': "A French publishing imprint known for its translations of American hardboiled detective and noir crime fiction.", |
|
'San Antonio': "A series of French detective novels by Frédéric Dard, featuring the character San Antonio, known for their humor and inventiveness.", |
|
'Duras': "Marguerite Duras, a French writer and film director, known for her minimalist style and works like 'The Lover'.", |
|
'Presse années 1970': "Refers to the French press in the 1970s, a period marked by political activism and the rise of new journalistic styles.", |
|
'Braudel': "Fernand Braudel, a French historian who revolutionized the study of history by focusing on long-term social and geographic structures.", |
|
'Bourdieu': "Pierre Bourdieu, a French sociologist, renowned for his theory of social practices and concepts like cultural capital.", |
|
'Derrida': "Jacques Derrida, a philosopher best known for developing deconstruction, a critical approach that questions the relationship between text and meaning.", |
|
'Baudrillard': "Jean Baudrillard, a cultural theorist known for his analysis of consumerism, simulation, and hyperreality." |
|
} |
|
|
|
|
|
example_data = pd.DataFrame({ |
|
"Question ou votre instruction": ["Comment faire une bonne madeleine ? Donne-moi une recette détaillée avec les ingrédients."], |
|
"Style": ["Proust"], |
|
"Température": [0.7] |
|
}) |
|
|
|
|
|
def fill_example(data): |
|
question, style, temp = data.iloc[0] |
|
user_input.update(question) |
|
dropdown.change(style) |
|
temperature_slider.change(temp) |
|
return "Il y avait eu dans le salon de l'hôtel, que j'avais quitté pour venir à la table où il se trouvait M. de Charlus et une foule d'autres personnes, une très grande madeleine, un peu grasse, mais dont la forme était fort belle, et qui avait été réservée pour moi ; elle avait été posée sur une assiette en porcelaine blanche avec des fleurs bleues dessinées dessus par un graveur français du XVIIIe siècle : cela faisait l'effet d'une madeleine faite de pâte rosée au beurre et décorée de motifs de couture en passementerie rose, sous lesquels on voyait cette couleur donner son éclat aux feuilles d'acanthe. Je pensai donc que je devrais demander à la femme de chambre si elle n'y prenait point goût, si elle ne voudrait pas bien manger ma madeleine ; je lui fis signe, après avoir pris mon cafard, et aussitôt elle s'approcha du plat, fit une pièce, en me porta la tranche avec ses doigts, comme si elle en avait fait autant de fois. Elle y mangea avec plaisir et sans gêne, à peine respectant mes yeux." |
|
|
|
|
|
def update_explanation(choice): |
|
return explanations.get(choice, "No explanation available.") |
|
|
|
|
|
with gr.Blocks(theme = 'carlosrosash/bellay_test') as demo: |
|
gr.Markdown(title) |
|
gr.Markdown(description) |
|
with gr.Row(): |
|
dropdown = gr.Dropdown(list_dropdown, label="Choose an Artist or Style") |
|
explanation_box = gr.Textbox(label="Explanation", type="text", lines=5, interactive=False) |
|
dropdown.change(update_explanation, inputs=dropdown, outputs=explanation_box) |
|
|
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
user_input = gr.Textbox(label="Question or your instruction", type="text", lines=5, placeholder="Start typing here") |
|
temperature_slider = gr.Slider(label="Temperature", value=0.7, minimum=0.05, maximum=1.0, step=0.05, interactive=True) |
|
with gr.Row(): |
|
with gr.Column(): |
|
clear_button = gr.Button("Effacer") |
|
with gr.Column(): |
|
submit_button = gr.Button("Let's goooo 🪶") |
|
with gr.Column(): |
|
output_text = gr.Textbox(label="Response", type="text", lines=10) |
|
|
|
|
|
def on_submit(user_message, style, temperature): |
|
return mistral_bot.predict(user_message, style, temperature) |
|
|
|
|
|
def on_clear(): |
|
user_input.clear() |
|
temperature_slider.change(0.7) |
|
output_text.clear() |
|
|
|
|
|
default_style = list_dropdown[0] |
|
dropdown.change(default_style) |
|
explanation_box.update(explanations[default_style]) |
|
|
|
|
|
gr.Markdown("<h2>Examples</h2>") |
|
examples_df = gr.Dataframe(example_data, interactive=True) |
|
examples_df.click(fill_example, inputs=examples_df, outputs=output_text) |
|
|
|
submit_button.click(on_submit, inputs=[user_input, dropdown, temperature_slider], outputs=output_text) |
|
clear_button.click(on_clear) |
|
|
|
demo.launch() |