Afficher sur ai.google.dev | Essayer un notebook Colab | Afficher le notebook sur GitHub |
Dans certains cas d'utilisation, vous pouvez arrêter la génération à partir d'un modèle pour insérer des résultats spécifiques. Par exemple, les modèles de langage peuvent avoir des problèmes avec des problèmes arithmétiques complexes tels que des problèmes écrits.
Ce tutoriel présente un exemple d'utilisation d'un outil externe avec la méthode genai.generate_text
pour afficher la bonne réponse à un problème de mot.
Cet exemple utilise l'outil numexpr
pour effectuer l'arithmétique, mais vous pouvez suivre la même procédure pour intégrer d'autres outils spécifiques à votre cas d'utilisation. Voici un aperçu des étapes à suivre:
- Définissez des balises
start
etend
pour délimiter le texte à envoyer à l'outil. - Créez une requête indiquant au modèle comment utiliser les tags dans son résultat.
- Incluez la balise
end
dans l'élémentstop_sequences
transmis àgenerate_text
. - À partir du résultat du modèle, prenez le texte situé entre les tags
start
etend
comme entrée de l'outil. - Exécutez l'outil et ajoutez sa sortie à la requête.
- Appelez à nouveau
generate_text
pour que le modèle continue avec la sortie de l'outil.
Configuration
pip install -q google.generativeai
import google.generativeai as genai
genai.configure(api_key='YOUR API KEY')
from google.api_core import retry
@retry.Retry()
def generate_text(*args, **kwargs):
return genai.generate_text(*args, **kwargs)
models = [m for m in genai.list_models() if 'generateText' in m.supported_generation_methods]
model = models[0].name
print(model)
models/text-bison-001
Essayez de résoudre le problème directement
Voici le mot problème que vous allez résoudre:
question = """
I have 77 houses, each with 31 cats.
Each cat owns 14 mittens, and 6 hats.
Each mitten was knit from 141m of yarn, each hat from 55m.
How much yarn was needed to make all the items?
"""
prompt_template = """
You are an expert at solving word problems. Here's one:
{question}
Work through it step by step, and show your work.
One step per line.
Your solution:
"""
Faites un essai:
completion = generate_text(
model=model,
prompt=prompt_template.format(question=question),
# The maximum length of the response
max_output_tokens=800,
)
print(completion.result)
In the houses there are 77 * 31 = 2387 cats. So they need 2387 * 14 = 33418 mittens. And they need 2387 * 6 = 14322 hats. In total they need 33418 * 141 + 14322 * 55 = 5554525m of yarn. The answer: 5554525.
L'invite telle quelle renvoie généralement un résultat incorrect. En général, les pas sont corrects, mais l'arithmétique est incorrecte.
La réponse devrait être:
answer = 77*31*14*141 + 77*31*6*55
answer
5499648
Demander au modèle d'utiliser une calculatrice
Dans la prochaine tentative, donnez au modèle des instructions sur la façon d'accéder à la calculatrice. Pour ce faire, spécifiez les balises start
et end
que le modèle peut utiliser pour indiquer où un calcul est nécessaire. Ajoutez un texte semblable à ce qui suit à la requête:
calc_prompt_template = """
You are an expert at solving word problems. Here's a question:
{question}
-------------------
When solving this problem, use the calculator for any arithmetic.
To use the calculator, put an expression between <calc></calc> tags.
The answer will be printed after the </calc> tag.
For example: 2 houses * 8 cats/house = <calc>2 * 8</calc> = 16 cats
-------------------
Work through it step by step, and show your work.
One step per line.
Your solution:
"""
calc_prompt = calc_prompt_template.format(question=question)
Pour permettre au modèle d'accéder à la sortie de cette "calculatrice", vous devez suspendre la génération et insérer le résultat. Utilisez l'argument stop_sequences
pour vous arrêter à la balise </calc>
:
completion = generate_text(
model=model,
prompt=calc_prompt,
stop_sequences=["</calc>"],
# The maximum length of the response
max_output_tokens=800,
candidate_count=1,
)
result = completion.result
print(result)
In each house, there are <calc>31 * 14
stop_sequence
n'est pas inclus dans le résultat. Divisez l'expression, exécutez-la dans le calculateur, puis ajoutez-la au résultat:
# Use re to clear units from the calculator expressions
import re
# Use numexpr since `eval` is unsafe.
import numexpr
def calculator(result):
result, expression = result.rsplit('<calc>', 1)
# Strip any units like "cats / house"
clean_expression = re.sub("[a-zA-Z]([ /a-zA-Z]*[a-zA-Z])?",'', expression)
# `eval` is unsafe use numexpr
result = f"{result}<calc>{expression}</calc> = {str(numexpr.evaluate(clean_expression))}"
return result
print(calculator(result))
In each house, there are <calc>31 * 14</calc> = 434
Ajoutez maintenant cela à l'invite et exécutez à nouveau le modèle afin qu'il puisse reprendre là où il s'était arrêté:
continue_prompt=calc_prompt +"\n"+ "-"*80 + "\n" + calculator(result)
completion = generate_text(
model=model,
prompt=continue_prompt,
stop_sequences=["</calc>"],
# The maximum length of the response
max_output_tokens=800,
candidate_count=1,
)
print(completion.result)
mittens. In each house, there are <calc>31 * 6
Cette fois, le modèle a continué le texte du dernier calcul et est passé au suivant. À présent, exécutez-la en boucle pour résoudre complètement le problème de mot:
def solve(question=question):
results = []
for n in range(10):
prompt = calc_prompt_template.format(question=question)
prompt += " ".join(results)
completion = generate_text(
model=model,
prompt=prompt,
stop_sequences=["</calc>"],
# The maximum length of the response
max_output_tokens=800,
)
result = completion.result
if '<calc>' in result:
result = calculator(result)
results.append(result)
print('-'*40)
print(result)
if str(answer) in result:
break
if "<calc>" not in result:
break
is_good = any(str(answer) in r for r in results)
print("*"*100)
if is_good:
print("Success!")
else:
print("Failure!")
print("*"*100)
return is_good
solve(question);
---------------------------------------- The total number of cats is <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. The total number of mittens is <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. The total amount of yarn needed for the mittens is <calc>33418 * 141</calc> = 4711938 ---------------------------------------- m. The total number of hats is <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. The total amount of yarn needed for the hats is <calc>14322 * 55</calc> = 787710 ---------------------------------------- m. In total, <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success!
Vous pouvez exécuter cette commande plusieurs fois pour estimer le taux de résolution:
good = []
for n in range(10):
good.append(solve(question))
---------------------------------------- There are <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. They need <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. The mittens need <calc>33418 * 141</calc> = 4711938 ---------------------------------------- m of yarn. They need <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. The hats need <calc>14322 * 55</calc> = 787710 ---------------------------------------- m of yarn. They need a total of <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- There are <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. So for the mittens, we need <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. That means we need <calc>33418 * 141</calc> = 4711938 ---------------------------------------- m of yarn for mittens. For the hats, we need <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. That means we need <calc>14322 * 55</calc> = 787710 ---------------------------------------- m of yarn for hats. In total we need <calc>787710 + 4711938</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- In the 77 houses I have <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. They need <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. The mittens need <calc>33418 * 141</calc> = 4711938 ---------------------------------------- m of yarn. They need <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. The hats need <calc>14322 * 55</calc> = 787710 ---------------------------------------- m of yarn. So, in total I need <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- The number of cats is <calc>77 * 31</calc> = 2387 ---------------------------------------- . Each cat needs <calc>14 * 141</calc> = 1974 ---------------------------------------- m of yarn for mittens. So we need <calc>1974 * 2387</calc> = 4711938 ---------------------------------------- m of yarn for mittens. Each cat needs <calc>6 * 55</calc> = 330 ---------------------------------------- m of yarn for hats. So we need <calc>330 * 2387</calc> = 787710 ---------------------------------------- m of yarn for hats. So in total we need <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- There are <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. Each cat needs <calc>14 * 141</calc> = 1974 ---------------------------------------- yarn for mittens. All cats need <calc>2387 * 1974</calc> = 4711938 ---------------------------------------- yarn for mittens. Each cat needs <calc>6 * 55</calc> = 330 ---------------------------------------- yarn for hats. All cats need <calc>2387 * 330</calc> = 787710 ---------------------------------------- yarn for hats. All in all, you need <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- There are <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. Each cat needs <calc>14 + 6</calc> = 20 ---------------------------------------- items. So we need <calc>20 * 2387</calc> = 47740 ---------------------------------------- items in total. Each mitten needs <calc>141</calc> = 141 ---------------------------------------- m of yarn. So all the mittens need <calc>141 * 47740</calc> = 6731340 ---------------------------------------- m of yarn. Each hat needs <calc>55</calc> = 55 ---------------------------------------- m of yarn. So all the hats need <calc>55 * 47740</calc> = 2625700 ---------------------------------------- m of yarn. In total, we need <calc>6731340 + 2625700</calc> = 9357040 ---------------------------------------- m of yarn. There are <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. Each cat needs <calc>14 + 6</calc> = 20 ******************************************************************************** Failure! ---------------------------------------- There are <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. There are <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. There are <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. There was <calc>141 * 33418</calc> = 4711938 ---------------------------------------- m of yarn needed for mittens. There was <calc>55 * 14322</calc> = 787710 ---------------------------------------- m of yarn needed for hats. So there was <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- There are <calc>77 * 31</calc> = 2387 ---------------------------------------- cats in total. They need <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. That's <calc>33418 * 141</calc> = 4711938 ---------------------------------------- meters of yarn for mittens. They need <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. That's <calc>14322 * 55</calc> = 787710 ---------------------------------------- meters of yarn for hats. So, they need <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- There are 77 houses * 31 cats / house = <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. So we need <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. So we need <calc>33418 * 141</calc> = 4711938 ---------------------------------------- m of yarn for mittens. So we need <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. So we need <calc>14322 * 55</calc> = 787710 ---------------------------------------- m of yarn for hats. In total, we need <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success! ---------------------------------------- In total there are 77 houses * 31 cats / house = <calc>77 * 31</calc> = 2387 ---------------------------------------- cats. In total 2387 cats * 14 mittens / cat = <calc>2387 * 14</calc> = 33418 ---------------------------------------- mittens. In total 33418 mittens * 141m / mitten = <calc>33418 * 141</calc> = 4711938 ---------------------------------------- m of yarn for mittens. In total 2387 cats * 6 hats / cat = <calc>2387 * 6</calc> = 14322 ---------------------------------------- hats. In total 14322 hats * 55m / hat = <calc>14322 * 55</calc> = 787710 ---------------------------------------- m of yarn for hats. In total we need 4711938 m of yarn for mittens + 787710 m of yarn for hats = <calc>4711938 + 787710</calc> = 5499648 ******************************************************************************** Success!
import numpy as np
np.mean(good)
0.9