chujiezheng/chat_templates

Error in decoding using Mistral with this chat template."

JuniorTonga opened this issue · 2 comments

Hello, thank you for this repository. I am encountering an issue when I try to perform inference using this chat template with the Mistral model. When I try to display the decoded output, it returns the prompt along with the result :

model_id = "mistralai/Mistral-7B-Instruct-v0.3"

dtype = torch.bfloat16

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
torch_dtype=dtype,
)

chat = [{"role": "system", "content": "Vous êtes un élève de lycée qui doit résoudre les exercices de mathématiques"},
{"role": "user", "content": '''Ton objectif c'est de répondre aux questions posées dans les exercices en suivant les instructions données.

            Exercice et question : "Elias a acheté deux quiches de même taille. Il décide de manger un quart des quiches, et de conserver le reste pour plus tard. Il souhaite manger une part égale de chacune des quiches. <strong>Quelle fraction de chaque quiche va-t-il manger ?</strong>". 
            Instructions : "<strong>Complète la phrase suivante avec des fractions :</strong> Elias va manger ______ de la première quiche et ______ de la deuxième quiche."
            Format de réponse requis : utilise un format JSON avec la structure suivante : {{"raisonnement": "Explique ton raisonnement ici...", "reponse": "Indique ta réponse ici..." }} 

            J'insiste sur le fait qu'il faut respecter le format de réponse et également il faut respecter le fait qu'il faut répondre aux questions posées dans les exercices en suivant les instructions comme elles ont été données, sans rien ajouter.'''}
]

chat_template = open('/beegfs/jtonga/mistral-instruct.jinja').read()
chat_template = chat_template.replace(' ', '').replace('\n', '')
tokenizer.chat_template = chat_template
prompt = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
outputs = model.generate(input_ids=inputs.to(model.device), max_new_tokens=1024)
decoded_output=tokenizer.decode(outputs[0])

print("Decoded output:\n", decoded_output)

result

Decoded output:
Vous êtes un élève de lycée qui doit résoudre les exercices de mathématiques

[INST] Ton objectif c'est de répondre aux questions posées dans les exercices en suivant les instructions données.

            Exercice et question : "Elias a acheté deux quiches de même taille. Il décide de manger un quart des quiches, et de conserver le reste pour plus tard. Il souhaite manger une part égale de chacune des quiches. <strong>Quelle fraction de chaque quiche va-t-il manger ?</strong>". 
            Instructions : "<strong>Complète la phrase suivante avec des fractions :</strong> Elias va manger ______ de la première quiche et ______ de la deuxième quiche."
            Format de réponse requis : utilise un format JSON avec la structure suivante : {{"raisonnement": "Explique ton raisonnement ici...", "reponse": "Indique ta réponse ici..." }} 

            J'insiste sur le fait qu'il faut respecter le format de réponse et également il faut respecter le fait qu'il faut répondre aux questions posées dans les exercices en suivant les instructions comme elles ont été données, sans rien ajouter. [/INST] {

"raisonnement": "Elias a décidé de manger un quart de chaque quiche. Un quart est la même chose que 1/4. Si il a deux quiches, il va manger 1/4 de chaque quiche.",
"reponse": "Elias va manger 1/4 de la première quiche et 1/4 de la deuxième quiche."
}

Normally, the result it should give is :

what is expected

{
"raisonnement": "Elias a décidé de manger un quart de chaque quiche. Un quart est la même chose que 1/4. Si il a deux quiches, il va manger 1/4 de chaque quiche.",
"reponse": "Elias va manger 1/4 de la première quiche et 1/4 de la deuxième quiche."
}

Please any idea on how to fix it ?

thanks

This is the expected behavior of transformers's generate method. For causal language models, it returns both the prompt and the completion token IDs. You can find this process here:

https://github.com/huggingface/transformers/blob/048f599f3506e57e0a595b455d9d2834c8d45023/src/transformers/generation/utils.py#L2747

To address this problem, you can truncate the output token IDs as follows:

...
output_token_ids = output_token_ids[len(input_token_ids):]
output_text = tokenizer.decode(output_token_ids)
...

okay thanks for the clarification.