ดูใน ai.google.dev | ลองใช้ Colab Notebook | ดูสมุดบันทึกใน GitHub |
สําหรับกรณีการใช้งานบางกรณี คุณอาจต้องหยุดการสร้างจากโมเดลเพื่อแทรกผลลัพธ์ที่เฉพาะเจาะจง ตัวอย่างเช่น โมเดลภาษาอาจมีปัญหาเกี่ยวกับโจทย์เลขที่ซับซ้อนอย่างโจทย์เลข
บทแนะนำนี้แสดงตัวอย่างการใช้เครื่องมือภายนอกกับเมธอด genai.generate_text
เพื่อแสดงคำตอบที่ถูกต้องของโจทย์คำ
ตัวอย่างนี้ใช้เครื่องมือ numexpr
ในการคำนวณ แต่คุณสามารถใช้ขั้นตอนเดียวกันนี้เพื่อผสานรวมเครื่องมืออื่นๆ สำหรับกรณีการใช้งานของคุณโดยเฉพาะได้ ขั้นตอนคร่าวๆ มีดังนี้
- กำหนดแท็ก
start
และend
เพื่อแบ่งส่วนข้อความเพื่อส่งเครื่องมือ - สร้างพรอมต์ที่บอกโมเดลเกี่ยวกับวิธีใช้แท็กในผลลัพธ์
- รวมแท็ก
end
ในstop_sequences
ที่ส่งไปยังgenerate_text
- จากผลการค้นหาโมเดล ให้ใช้ข้อความระหว่างแท็ก
start
กับend
เป็นอินพุตในเครื่องมือ - เรียกใช้เครื่องมือและเพิ่มเอาต์พุตลงในพรอมต์
- เรียกใช้
generate_text
อีกครั้ง เพื่อให้โมเดลดำเนินการต่อด้วยเอาต์พุตของเครื่องมือ
ตั้งค่า
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
ลองแก้โจทย์โดยตรง
ต่อไปนี้คือความหมายของ "โจทย์" ที่คุณจะแก้ไข
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:
"""
ลองทำตามนี้
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.
พรอมต์ตามปกติจะแสดงผลลัพธ์ที่ไม่ถูกต้อง โดยทั่วไปขั้นตอนถูกต้องแต่เลขคณิตไม่ถูกต้อง
คำตอบควรเป็นดังนี้
answer = 77*31*14*141 + 77*31*6*55
answer
5499648
บอกโมเดลให้ใช้เครื่องคิดเลข
ในความพยายามครั้งถัดไป โปรดบอกวิธีเข้าถึงเครื่องคิดเลขให้แก่โมเดล ซึ่งทำได้โดยการระบุแท็ก start
และ end
ที่โมเดลจะใช้เพื่อระบุว่าต้องมีการคำนวณ ณ ตำแหน่งใด เพิ่มข้อมูลดังต่อไปนี้ในพรอมต์
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)
หากต้องการให้โมเดลเข้าถึงเอาต์พุตของ "เครื่องคิดเลข" นี้ คุณจะต้องหยุดการสร้างชั่วคราวแล้วแทรกผลลัพธ์ลงไป ใช้อาร์กิวเมนต์ stop_sequences
เพื่อหยุดที่แท็ก </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
ไม่รวมอยู่ในผลลัพธ์ แยกนิพจน์และนำมาคำนวณผ่านเครื่องคิดเลข แล้วบวกกลับเข้าไปในผลลัพธ์
# 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
จากนั้นให้เพิ่มค่านั้นในข้อความแจ้ง แล้วเรียกใช้โมเดลอีกครั้ง เพื่อให้โมเดลทำงานต่อไปจากจุดเดิมได้
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
คราวนี้ โมเดลยังคงเขียนข้อความจากการคำนวณล่าสุดและย้ายไปยังส่วนถัดไป ตอนนี้ให้เรียกใช้วนซ้ำเพื่อแก้โจทย์ปัญหาโดยสมบูรณ์
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!
คุณสามารถเรียกใช้ 2-3 ครั้งเพื่อประมาณอัตราการแก้ปัญหา
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