|
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." |
|
} |
|
|
|
|
|
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("Clear") |
|
with gr.Column(): |
|
submit_button = gr.Button("Submit") |
|
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>") |
|
|
|
Example_1 = gr.Button("Comment faire une bonne madeleine ? Donne-moi une recette détaillée avec les ingrédients.") |
|
Example_2 = gr.Button("Proust") |
|
Example_3 = gr.Button("0.7") |
|
|
|
example_data = pd.DataFrame({ |
|
"Question ou votre instruction": [Example_1], |
|
"Style": [Example_2], |
|
"Température": [Example_3] |
|
}) |
|
|
|
def fill_example(): |
|
user_input.update("Comment faire une bonne madeleine ? Donne-moi une recette détaillée avec les ingrédients.") |
|
dropdown.change("Proust") |
|
temperature_slider.change(0.7) |
|
|
|
examples_df = gr.Dataframe(example_data, interactive=True) |
|
Example_1.click(fill_example, outputs=output_text) |
|
Example_2.click(fill_example, outputs=output_text) |
|
Example_3.click(fill_example, outputs=output_text) |
|
|
|
demo.launch() |
|
|