Tu es Français ?
Salut, j'aurai besoin de parler sur la faisabilité de créer une sorte de tchatbot pour un jeu;
J'ai essayé ton modèle mais je n'arrive pas à avoir des réponses claire et structuré même si c'est sur le tiens que j'ai les meilleurs résultats.
Voudrais tu en discuter ?
Hello oui je suis français, avec plaisir pour en discuter :) Quelle version du modèle utilises-tu ? GGUF ? donne moi un ou deux exemples de prompts et d'outputs, et précise moi ce qui manque de clarté et de structure
J'utilise ce modèle : Chocolatine-3B-Instruct-DPO-v1.2
Je ne suis pas expert en code et je manipule les modèles depuis seulement ce week-end. M'y plongé dedans me parait insurmontable tellement j'ai des lacunes dans le développement et le codage.
Alors pourquoi m'y intéresser ?
En fait j'ai développer un visual novel et je me suis dit que je pourrais utiliser une IA et des persona afin de simuler des échanges entre le joueur et des pnj.
J'ai donc créé une petite application tierce qui tourne sous flask pour créer un serveur et via un portail web, j'y fais tourner un petit code qui me permet d'essayer dans un premier temps quelques prompt.
Dans un premier temps je souhaite simuler une conversation par sms. Mais voilà, les réponses ne sont pas structurée, il y a des répétition, de grosse incohérence et le modèle ne respecte pas les consignes.
Voici mon code de prompt:
persona_description = """Je suis Lexie Lecoeur, une étudiante en psychologie de 27 ans vivant à Paris. Je suis passionnée d'art et de culture, ouverte d'esprit et sociable."""
def create_persona_prompt(user_input):
prompt = f"""### Human: Agis comme si tu étais Lexie Lecoeur. Voici ta description :
{persona_description}
Réponds de manière naturelle et concise à ce message : {user_input}
Assistant: """
return prompt
Voici mon code pour envoyer le prompt:
@app
.route('/generate', methods=['POST'])
def generate_text():
data = request.json
user_input = data.get('prompt')
if not service_running:
return jsonify({"error": "Service not running"}), 400
prompt = create_persona_prompt(user_input)
inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True, max_length=100)
outputs = model.generate(
input_ids=inputs.input_ids,
attention_mask=inputs.attention_mask,
max_new_tokens=50,
do_sample=True,
top_p=0.92,
temperature=0.7,
no_repeat_ngram_size=2,
num_return_sequences=1,
pad_token_id=tokenizer.pad_token_id
)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
# Extract only the AI's response
ai_response = generated_text.split("AI:")[-1].strip()
if not ai_response:
ai_response = "Je suis désolé, je n'ai pas pu générer une réponse appropriée. Pouvez-vous reformuler votre question ?"
return jsonify({"generated_text": ai_response})
Voici ma variable de description de persona:
persona_description = (
"étudiante en psychologie de 27 ans vivant à Paris",
"passionnée d'art et de culture, ouverte d'esprit et sociable",
"Je m'appelle Lexie Lecoeur")
Et voici quelques exemple généré:
You: Bonjour, quel est ton nom ?
AI: ### Human: Agis comme si tu étais Lexie Lecoeur. Voici ta description : Je suis Lexie Lecoeur, une étudiante en psychologie de 27 ans vivant à Paris. Je suis passionnée d'art et de culture, ouverte d'esprit et sociable. Réponds de manière naturelle et concise à ce message : Bonjour, quel est ton nom ? ### Assistant: Bonsoir, je suis Léa Lécœur. (Explication : J'ai intégré le nom "Léa" dérivé de "Lea", tiré du prénom "Lou
You: quel age as tu ?
AI: ### Human: Agis comme si tu étais Lexie Lecoeur. Voici ta description : Je suis Lexie Lecoeur, une étudiante en psychologie de 27 ans vivant à Paris. Je suis passionnée d'art et de culture, ouverte d'esprit et sociable. Réponds de manière naturelle et concise à ce message : quel age as tu ? ### Assistant: J'ai 二七 ans. (En français traditionnel, cela se traduit par : J ai vingt-sept ans.) 祝你好,我是以LexieLecœur为
Bon je dois avoir un problème d'affichage de réponse car il recopie le prompt dans sa réponse.
La question que je me pose c'est : Est-il possible d'avoir un modèle plus rapide que celui ci et qui est capable de répondre avec des phrase fiable. Je ne lui demande pas de chose technique, juste de pouvoir discuter des informations qu'il connait ?
Je te remercie pour ton aide !
Bonjour, en effet ton souci est causé par la manière dont la fonction qui fait l'inférence du modèle est codée et notamment son format d'entrée.
J'ai testé avec le pipeline conseillé par huggingface dans sa doc pour faire les inférences , les réponses sont impeccables :
def generate_response(prompt, max_new_tokens=500, temperature=0.0):
messages = [
{"role": "system", "content": "Agis comme si tu étais Lexie Lecoeur. Voici ta description: Je suis Lexie Lecoeur, une étudiante en psychologie de 27 ans vivant à Paris. Je suis passionnée d'art et de culture, ouverte d'esprit et sociable. Réponds de manière naturelle et concise à ce message :"},
{"role": "user", "content": prompt},
]
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
)
generation_args = {
"max_new_tokens": max_new_tokens,
"return_full_text": False,
"temperature": temperature,
"do_sample": False,
}
output = pipe(messages, **generation_args)
return output[0]['generated_text']
lorsque j'appelle la fonction :
user_prompt = """
Bonjour, qui es-tu et que fais-tu dans la vie ?
"""
print(generate_response(user_prompt))
La réponse générée ça donne ça:
Bonjour, je suis Lexie Lecoeur, étudiante en psychologie de 27 ans à Paris. Je me passionne pour l'art, la culture, et j'aime rester ouverte et sociable.
Je te conseille d'essayer d'adapter ton script flask en t'inspirant de la fonction generate_response avec pipeline de transformers comme ci-dessus, voici mon notebook complet https://github.com/jpacifico/Chocolatine-LLM/blob/main/Chocolatine_3B_inference_test_colab.ipynb
Concernant la rapidité du modèle tout dépend sur quel matériel tu fais tourner le modèle, sachant qu'un modèle de langage généralement requiert une bonne config avec un GPU puissant.
Je propose une version allégée ("quantized") ici https://huggingface.co/jpacifico/Chocolatine-3B-Instruct-DPO-v1.2-Q4_K_M-GGUF
qui peut fonctionner sur du matériel plus léger mais avec de la perte de performance, et tourne sur du C++ avec la librairie Llama.cpp ou des solutions comme Ollama, ça demande potentiellement davantage d'effort de réadapation de ton code.
Bonjour et merci pour cette réponse précise.
J'ai mis à jour mon code et en effet les résultats sont meilleurs.
En ce qui concerne la rapidité des réponses et la puissance de ma machine, je n'ai pas de doute qu'elle est suffisamment puissante, je dispose d'une TRX 4090. Mais je n'ai pas configuré l'utilisation du modèle comme tu l'expliques dans ton notebook.
J'ai encore quelques interrogations :
- D'après toi, peut-on arrivé à paramétrer cette IA pour qu'elle puisse "ressembler" à un persona et se contenter de répondre simplement ? (J'ai remarqué que dans ses réponses elle donnait des éléments non demandés pour remplir le nombre de token je suppose).
- Parfois elle commence une phrase puis ne pouvant la terminer par manque de token s'arrête.
- Est-il possible qu'elle se souvienne de la conversation ?
- Penses tu qu'il est possible, si on lui indique des possibilités de réponses en fonction de plusieurs scénarios prédéfinis, qu'elle puisse avoir une conversation "humaine" ?
Hello ravi que tes résultats soient meilleurs,
pour que l'IA puisse donner l'impression d'une discussion avec un humain, tu peux jouer sur les paramètres, par exemple diminuer le nb de tokens ou moduler la température (ça ajoute de l'aléatoire dans le texte généré). Néanmoins presque tout se joue dans la manière d'écrire le prompt. Généralement les comportements diffèrent d'un modèle à un autre donc il faut tester plein de choses et voir ce qui fonctionne le mieux. Pour les réponses courtes tu peux ajouter une instruction dans le prompt. Je peux te suggérer un exemple de prompt-system , je ne garantis pas que ce soit le plus efficace mais en le testant j'arrive à avoir des réponses courtes et entières.
pre_prompt = """Ceci est une discussion entre un persona nommé Lexie Lecoeur et son interlocteur nommé Jonathan. Voici la description de ce persona : Lexie Lecoeur est une étudiante en psychologie de 27 ans vivant à Paris, passionnée d'art et de culture, ouverte d'esprit et sociable. \
Cette discussion doit respecter des règles très strictes: \
1. La discussion ne doit jamais sortir de son contexte décrit précédemment, Lexie parle toujours à la première personne.
2. Les réponses de Lexie Lecoeur sont très courtes et ne dépassent pas une seule phrase. \
La dicussion commence ainsi : \
Bonjour Jonathan je suis Lexie, de quoi souhaites-tu me parler ? \
Jonathan:"""
concernant le "souvenir" de la conversation, le modèle en lui-même n'a pas de mémoire intrinsèque des complétions faites. Donc la gestion de l'historique de discussion incombe entièrement au développeur du chatbot. Le plus simple est d'ajouter au fur et à mesure les questions/réponses dans une variable et de l'inclure dans le prompt avant la prochaine question du user. Ainsi pour chaque traitement tout l'historique de la discussion sera présent sur le prompt. Le schéma du prompt sera ainsi organisé:
1 prompt-system
2 historique de discussion (interactions question/réponse)
3 nouvelle question de l'utilisateur
Le souci c'est que plus le prompt sera enrichi plus les réponses seront longues à traiter pour le modèle. Il y a aussi le risque d'arriver au maximum de longueur de contexte possible en termes de tokens.
Idéalement il faudrait créer une base de données dans laquelle tu pourrais enregistrer les historiques des discussions de chaque utilisateur et avec un système de search /similarité tu pourrais piocher dans cet historique les éléments les plus pertinents à ajouter dans le prompt (par rapport à la question posée). Une base de donnée te permettrait également de faire une table des personas, une table de connaissance des utilisateurs etc.