חילוץ נתונים מובְנים באמצעות קריאה לפונקציות

לצפייה ב-Google AI הפעלה ב-Google Colab הצגת המקור ב-GitHub

במדריך הזה תלמדו דוגמה לחילוץ נתונים מובְנים באמצעות Gemini API, כדי לחלץ מסיפור את הרשימות של הדמויות, הקשרים, הדברים והמקומות.

הגדרה

pip install -U -q google-generativeai
import pathlib
import textwrap

import google.generativeai as genai
import google.ai.generativelanguage as glm


from IPython.display import display
from IPython.display import Markdown

from google.api_core import retry

def to_markdown(text):
  text = text.replace('•', '  *')
  return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))

אחרי שמוצאים את מפתח ה-API, מעבירים אותו ל-SDK. תוכל לעשות זאת בשתי דרכים:

  • מזינים את המפתח במשתנה הסביבה GOOGLE_API_KEY (ה-SDK יאסוף אותו משם באופן אוטומטי).
  • יש להעביר את המפתח אל genai.configure(api_key=...)
try:
    # Used to securely store your API key
    from google.colab import userdata

    # Or use `os.getenv('API_KEY')` to fetch an environment variable.
    GOOGLE_API_KEY=userdata.get('GOOGLE_API_KEY')
except ImportError:
    import os
    GOOGLE_API_KEY = os.environ['GOOGLE_API_KEY']

genai.configure(api_key=GOOGLE_API_KEY)

המשימה לדוגמה

במדריך הזה תצטרכו לחלץ ישויות מסיפורים בשפה טבעית. לדוגמה, בהמשך מוצג סיפור שנכתב על ידי Gemini.

new_story = False

if new_story:
  model = genai.GenerativeModel(model_name='models/gemini-1.5-pro-latest')

  response = model.generate_content("""
      Write a long story about a girl with magic backpack, her family, and at
      least one other charater. Make sure everyone has names. Don't forget to
      describe the contents of the backpack, and where everyone and everything
      starts and ends up.""", request_options={'retry': retry.Retry()})
  story = response.text
  print(response.candidates[0].citation_metadata)
else:
  story = """In the quaint town of Willow Creek, nestled amidst rolling hills and whispering willows, resided a young girl named Anya. As she stepped out of the creaky wooden door of her modest cottage, her heart skipped a beat with excitement and anticipation. Today was her first day of school, and she couldn't wait to show off her prized possession - a magical backpack.\n\nHanded down to her from her grandmother, the backpack was no ordinary satchel. Its soft, emerald-green fabric shimmered with an ethereal glow, and its leather straps held secrets that only Anya knew. Within its capacious interior lay an enchanted world, filled with wonders that would ignite her imagination and change her life forever.\n\nAnya's parents, kind-hearted Elise and wise-bearded Edward, bid her farewell with warm embraces. "Remember, my dear," whispered her mother, "use your magic wisely and for good." Her father added, "Always seek knowledge, and let the backpack be your trusted companion."\n\nWith a skip in her step, Anya set off towards the town's only schoolhouse. On her way, she passed her best friend, Samuel, a curious and adventurous boy with a mischievous grin. "Hey, Anya," he called out. "Can I see your backpack?"\n\nAnya hesitated for a moment before unzipping the flap and revealing its contents. Samuel's eyes widened in amazement as he peered inside. There, nestled amidst pencils and notebooks, were a shimmering sword, a book of ancient spells, a tiny compass that always pointed north, and a magical key that could open any lock.\n\nTogether, they marveled at the backpack's wonders, promising to keep its secrets safe. As they approached the schoolhouse, Anya noticed a group of older children huddled together, their faces etched with fear. Curiosity getting the better of her, she cautiously approached.\n\n"What's wrong?" she asked.\n\nA tall, lanky boy stepped forward. "There's a monster in the forest," he stammered. "It's been terrorizing the town, attacking animals and even people."\n\nAnya's heart sank. The town of Willow Creek was small and peaceful, and the thought of a monster brought a shiver down her spine. She knew she had to do something to protect her family and friends.\n\nWithout a moment's hesitation, Anya opened her backpack and retrieved the shimmering sword. With a determined gleam in her eye, she turned to her terrified peers. "Don't worry," she said, her voice steady. "I'll take care of it."\n\nWith Samuel close behind her, Anya ventured into the shadowy depths of the forest. The trees seemed to whisper secrets as she passed, and the undergrowth rustled with unseen creatures. As they walked deeper into the forest, the air grew heavy and the ground beneath their feet trembled.\n\nSuddenly, they came to a clearing, and there before their eyes was the monster - a massive beast with sharp teeth, glowing red eyes, and claws that could crush a human with ease. The creature roared, a thunderous sound that shook the forest to its core.\n\nFear surged through Anya, but she refused to let it consume her. She drew the sword from its sheath and charged towards the monster. The blade shimmered in the sunlight, and as it struck the beast's hide, a blinding light erupted, enveloping everything in its radiance.\n\nWhen the light faded, the monster was gone, and in its place was a pile of shattered crystals. Anya had defeated the creature with the magic of her backpack, proving that even the smallest of objects could hold the greatest of powers.\n\nAs she and Samuel returned to the town, they were greeted as heroes. The people of Willow Creek rejoiced, and the legend of Anya, the girl with the magic backpack, was passed down through generations. And so, Anya continued her adventures, using the backpack's wonders to make the world a better place, one magical step at a time."""
to_markdown(story)

בעיירה הייחודית ווילו קריק, השוכנת בין גבעות משתפלות וכרי ערבה לוחשת, שגרה ילדה צעירה בשם אניה. כשיצאה מדלת העץ החריטה של הקוטג' הצנוע שלה, הלב דילג על פעימה מרוב התרגשות וציפיה. היום היה יום הלימודים הראשון שלה, והיא לא יכלה לחכות כדי להראות לעולם את החפצים היקרים שלה – תיק גב קסום.

תיק הגב שנמסר לה מסבתא שלה לא היה תיק נשיאה רגיל. הבד הרך בצבע ירוק ברקת בוהק בזוהר שמימי, ורצועות העור שלו מכילות סודות שרק אניה ידעה. בתוך החלל הפנימי שלה היה עולם קסום ומלא בפלאים, שיציתו את דמיונה וישנו את חייה לעד.

ההורים של אניה, אליז האדיבים ואדוארד החכם הזקן, נפרדים לשלום בחיבוקים חמים. "זכור, יקירי," לחשה לאמא, "השתמש בקסם שלך בחוכמה ולטובה." אבא שלה הוסיף, "תמיד צריך לחפש ידע, ולתת לתיק הגב להיות בן לוויה המהימן".

אניה מדלגת על צעדה וצעדה לעבר בית הספר היחיד בעיר. בדרכה היא העבירה את הידיד הכי טוב שלה, סמואל, ילד סקרן והרפתקן, עם חיוך שובב. "היי, אניה", הוא קרא. "אפשר לראות את תיק הגב?"

אניה היססה לרגע לפני שהיא פתחה את הכנף וחשפה את תוכנה. עיניו של סמואל נרחבו בתדהמה כשהציץ פנימה. שם הניצב שם בין עפרונות ומחברות, חרב בוהקת, ספר של כישופים עתיקים, מצפן זעיר שכוון תמיד צפונה ומפתח קסום שיכול לפתוח כל מנעול.

יחד הם נהנו מפלאי התרמיל, והתחייבו לשמור על סודותיו. כאשר הם ניגשים לבית הספר, אניה שמה לב לקבוצה של ילדים בוגרים שמצטופפים יחד, הפנים שלהם חרוטות בפחד. היא ניגשה בזהירות, מתוך סקרנות שהשתתפה בה.

"מה לא בסדר?" היא שאלה.

ילד גבוה ועליז צעד קדימה. "יש מפלצת ביער," הוא גמגם. "הוא הפחיד את העיר, תוקף בעלי חיים ואפילו אנשים".

הלב של אניה שקוע. העיר ווילו קריק הייתה קטנה ושלווה, והמחשבה על מפלצת העלתה רעידות בעמוד השדרה. היא ידעה שעליה לעשות משהו כדי להגן על המשפחה והחברים שלה.

בלי היסוס לרגע, אניה פתחה את תיק הגב שלה ואחזרה את החרב הבוהקת. עם ברק נחוש בעין, היא פנתה לעמיתים המבוהלים. "אל תדאג", היא אמרה והקול שלה יציב. "אני אטפל בזה".

כשסמואל צמודה אליה, אניה יצאה למעמקי היער האפלים. העצים נראו כשהם לוחשים סודות כשהיא עברה, וצבוע העצים שרשר ביצורים שלא נראים. ככל ללכת עמוק יותר לתוך היער, האוויר עלה כבד והקרקע מתחת לרגליים רעדה.

פתאום הם הגיעו להתעמקות, ולמול עיניהם הייתה מפלצת – מפלצת ענקית עם שיניים חדות, עיניים אדומות זוהרות וטפרים שיכולים לרסק אדם בקלות. היצור שאג, צליל רועם שהרעיד את היער עד לליבו.

הפחד זינק דרך אניה, אבל היא סירבה לתת לו לצרוך אותה. היא משכה את החרב מהנרתיק שלה, ונחשפה לעבר המפלצת. הלהב בוהק באור השמש, וכשהוא פגע בעור החיה, התפרץ אור מסנוור ומכסה את כל מה שזוהר.

כשהאור נעלם, המפלצת נעלמה ובמקומה הייתה ערימה של קריסטלים הרוסים. אניה הביסה את היצור בעזרת הקסם של תיק הגב, והוכיחה שגם בחפצים הכי קטנים אפשר להחזיק בכוחות-הכוח הטובים ביותר.

כשהיא וסמואל חזרו לעיר, הם קיבלו את פנים כגיבורים. אנשי המקום של ווילו קריק שמחו, והאגדה של אניה, הבחורה עם תיק הגב הקסום, הועברה מדור לדור. וכך אניה המשיכה בהרפתקאות שלה, ומשתמשת בפלאי התרמיל כדי להפוך את העולם למקום טוב יותר, שלב אחרי שלב קסום.

שימוש בשפה טבעית

מודלים גדולים של שפה (LLM) הם כלים מתקדמים לריבוי משימות. לעיתים קרובות תוכל לבקש מ-Gemini מה אתה רוצה, וזה בסדר.

יש כמה דברים שכדאי לשים לב אליהם כשיוצרים מבני נתונים בדרך הזו:

  • לפעמים הניתוח נכשל.
  • אי אפשר לאכוף את הסכימה באופן קפדני.

בקטע הבא צריך לפתור את הבעיות האלה. קודם כול, כדאי לנסות הנחיה פשוטה בשפה טבעית, שבה הסכימה כתובה כטקסט. לא בוצעה אופטימיזציה:

model = model = model = genai.GenerativeModel(
    model_name='models/gemini-1.5-pro-latest')

response = model.generate_content(
  textwrap.dedent("""\
    Please return JSON describing the the people, places, things and relationships from this story using the following schema:

    {"people": list[PERSON], "places":list[PLACE], "things":list[THING], "relationships": list[RELATIONSHIP]}

    PERSON = {"name": str, "description": str, "start_place_name": str, "end_place_name": str}
    PLACE = {"name": str, "description": str}
    THING = {"name": str, "description": str, "start_place_name": str, "end_place_name": str}
    RELATIONSHIP = {"person_1_name": str, "person_2_name": str, "relationship": str}

    All fields are required.

    Important: Only return a single piece of valid JSON text.

    Here is the story:

    """) + story,
  generation_config={'response_mime_type':'application/json'}
)
response.text
'{"people": [\n    {\n        "name": "Anya",\n        "description": "A young girl who lives in the town of Willow Creek with her parents, Elise and Edward. She possesses a magical backpack that was handed down to her from her grandmother.",\n        "start_place_name": "Willow Creek",\n        "end_place_name": "Willow Creek"\n    },\n    {\n        "name": "Elise",\n        "description": "Anya\'s kind-hearted mother",\n        "start_place_name": "Willow Creek",\n        "end_place_name": "Willow Creek"\n    },\n    {\n        "name": "Edward",\n        "description": "Anya\'s wise-bearded father",\n        "start_place_name": "Willow Creek",\n        "end_place_name": "Willow Creek"\n    },\n    {\n        "name": "Samuel",\n        "description": "Anya\'s best friend, a curious and adventurous boy with a mischievous grin.",\n        "start_place_name": "Willow Creek",\n        "end_place_name": "Willow Creek"\n    },\n    {\n        "name": "Monster",\n        "description": "A massive beast with sharp teeth, glowing red eyes, and claws that could crush a human with ease.",\n        "start_place_name": "Forest",\n        "end_place_name": "Forest"\n    }\n], "places": [\n    {\n        "name": "Willow Creek",\n        "description": "A quaint town nestled amidst rolling hills and whispering willows."\n    },\n    {\n        "name": "Forest",\n        "description": "A shadowy place with rustling undergrowth and whispering trees."\n    },\n    {\n        "name": "Schoolhouse",\n        "description": "The only school in the town of Willow Creek."\n    },\n    {\n        "name": "Anya\'s home",\n        "description": "A modest cottage with a creaky wooden door."\n    }\n], "things": [\n    {\n        "name": "Magic backpack",\n        "description": "A magical backpack that was handed down to Anya from her grandmother. Its soft, emerald-green fabric shimmered with an ethereal glow, and its leather straps held secrets that only Anya knew.",\n        "start_place_name": "Anya\'s home",\n        "end_place_name": "Forest"\n    },\n    {\n        "name": "Shimmering sword",\n        "description": "A sword that shimmered in the sunlight and could strike with blinding light.",\n        "start_place_name": "Magic backpack",\n        "end_place_name": "Forest"\n    },\n    {\n        "name": "Book of ancient spells",\n        "description": "A book that contained ancient spells.",\n        "start_place_name": "Magic backpack",\n        "end_place_name": "Forest"\n    },\n    {\n        "name": "Tiny compass",\n        "description": "A compass that always pointed north.",\n        "start_place_name": "Magic backpack",\n        "end_place_name": "Forest"\n    },\n    {\n        "name": "Magical key",\n        "description": "A key that could open any lock.",\n        "start_place_name": "Magic backpack",\n        "end_place_name": "Forest"\n    },\n    {\n        "name": "Shattered crystals",\n        "description": "The remains of the monster after it was defeated by Anya\'s magic backpack.",\n        "start_place_name": "Forest",\n        "end_place_name": "Forest"\n    }\n], "relationships": [\n    {\n        "person_1_name": "Anya",\n        "person_2_name": "Elise",\n        "relationship": "mother-daughter"\n    },\n    {\n        "person_1_name": "Anya",\n        "person_2_name": "Edward",\n        "relationship": "father-daughter"\n    },\n    {\n        "person_1_name": "Anya",\n        "person_2_name": "Samuel",\n        "relationship": "best friends"\n    }\n]}'

הפעולה הזו החזירה מחרוזת json. כדאי לנסות לנתח אותו:

import json

print(json.dumps(json.loads(response.text), indent=4))
{
    "people": [
        {
            "name": "Anya",
            "description": "A young girl who lives in the town of Willow Creek with her parents, Elise and Edward. She possesses a magical backpack that was handed down to her from her grandmother.",
            "start_place_name": "Willow Creek",
            "end_place_name": "Willow Creek"
        },
        {
            "name": "Elise",
            "description": "Anya's kind-hearted mother",
            "start_place_name": "Willow Creek",
            "end_place_name": "Willow Creek"
        },
        {
            "name": "Edward",
            "description": "Anya's wise-bearded father",
            "start_place_name": "Willow Creek",
            "end_place_name": "Willow Creek"
        },
        {
            "name": "Samuel",
            "description": "Anya's best friend, a curious and adventurous boy with a mischievous grin.",
            "start_place_name": "Willow Creek",
            "end_place_name": "Willow Creek"
        },
        {
            "name": "Monster",
            "description": "A massive beast with sharp teeth, glowing red eyes, and claws that could crush a human with ease.",
            "start_place_name": "Forest",
            "end_place_name": "Forest"
        }
    ],
    "places": [
        {
            "name": "Willow Creek",
            "description": "A quaint town nestled amidst rolling hills and whispering willows."
        },
        {
            "name": "Forest",
            "description": "A shadowy place with rustling undergrowth and whispering trees."
        },
        {
            "name": "Schoolhouse",
            "description": "The only school in the town of Willow Creek."
        },
        {
            "name": "Anya's home",
            "description": "A modest cottage with a creaky wooden door."
        }
    ],
    "things": [
        {
            "name": "Magic backpack",
            "description": "A magical backpack that was handed down to Anya from her grandmother. Its soft, emerald-green fabric shimmered with an ethereal glow, and its leather straps held secrets that only Anya knew.",
            "start_place_name": "Anya's home",
            "end_place_name": "Forest"
        },
        {
            "name": "Shimmering sword",
            "description": "A sword that shimmered in the sunlight and could strike with blinding light.",
            "start_place_name": "Magic backpack",
            "end_place_name": "Forest"
        },
        {
            "name": "Book of ancient spells",
            "description": "A book that contained ancient spells.",
            "start_place_name": "Magic backpack",
            "end_place_name": "Forest"
        },
        {
            "name": "Tiny compass",
            "description": "A compass that always pointed north.",
            "start_place_name": "Magic backpack",
            "end_place_name": "Forest"
        },
        {
            "name": "Magical key",
            "description": "A key that could open any lock.",
            "start_place_name": "Magic backpack",
            "end_place_name": "Forest"
        },
        {
            "name": "Shattered crystals",
            "description": "The remains of the monster after it was defeated by Anya's magic backpack.",
            "start_place_name": "Forest",
            "end_place_name": "Forest"
        }
    ],
    "relationships": [
        {
            "person_1_name": "Anya",
            "person_2_name": "Elise",
            "relationship": "mother-daughter"
        },
        {
            "person_1_name": "Anya",
            "person_2_name": "Edward",
            "relationship": "father-daughter"
        },
        {
            "person_1_name": "Anya",
            "person_2_name": "Samuel",
            "relationship": "best friends"
        }
    ]
}

השיטה הזו פשוטה יחסית ולרוב עובדת, אבל אפשר להפוך את השיטה למחמירה או חזקה יותר על ידי הגדרת הסכימה באמצעות תכונת הקריאה לפונקציה של ה-API.

שימוש בקריאה לפונקציה

אם עדיין לא הסברת את היסודות של שיחות טלפון עם פונקציות, קודם צריך לעשות את זה.

באמצעות פונקציה שקוראת לפונקציה שלך ולפרמטרים שלה מתוארים ל-API כ-glm.FunctionDeclaration. במקרים בסיסיים, ה-SDK יכול ליצור את FunctionDeclaration מהפונקציה ומההערות שלה. ערכת ה-SDK לא מטפלת כרגע בתיאור של פרמטרים מקננים מסוג OBJECT (dict). לכן עליכם להגדיר אותן במפורש, בשלב זה.

מגדירים את הסכימה

קודם כול צריך להגדיר את person כאובייקט עם שדות מחרוזת name, description, start_place_name, end_place_name.

person = glm.Schema(
    type = glm.Type.OBJECT,
    properties = {
        'name':  glm.Schema(type=glm.Type.STRING),
        'description':  glm.Schema(type=glm.Type.STRING),
        'start_place_name': glm.Schema(type=glm.Type.STRING),
        'end_place_name': glm.Schema(type=glm.Type.STRING)
    },
    required=['name', 'description', 'start_place_name', 'end_place_name']
)

לאחר מכן מגדירים אנשים כ-ARRAY מתוך person אובייקטים:

people = glm.Schema(
    type=glm.Type.ARRAY,
    items=person
)

לאחר מכן יש לבצע את אותן הפעולות עבור כל אחת מהישויות שאתם מנסים לחלץ:

place = glm.Schema(
    type = glm.Type.OBJECT,
    properties = {
        'name':  glm.Schema(type=glm.Type.STRING),
        'description':  glm.Schema(type=glm.Type.STRING),
    }
)

places = glm.Schema(
    type=glm.Type.ARRAY,
    items=place
)
thing = glm.Schema(
  type = glm.Type.OBJECT,
  properties = {
      'name':  glm.Schema(type=glm.Type.STRING),
      'description':  glm.Schema(type=glm.Type.STRING),
  }
)

things = glm.Schema(
    type=glm.Type.ARRAY,
    items=thing
)
relationship = glm.Schema(
    type = glm.Type.OBJECT,
    properties = {
        'person_1_name':  glm.Schema(type=glm.Type.STRING),
        'person_2_name':  glm.Schema(type=glm.Type.STRING),
        'relationship':  glm.Schema(type=glm.Type.STRING),
    }
)

relationships = glm.Schema(
    type=glm.Type.ARRAY,
    items=relationship
)

עכשיו יוצרים את FunctionDeclaration:

add_to_database = glm.FunctionDeclaration(
    name="add_to_database",
    description=textwrap.dedent("""\
        Adds entities to the database.
        """),
    parameters=glm.Schema(
        type=glm.Type.OBJECT,
        properties = {
            'people': people,
            'places': places,
            'things': things,
            'relationships': relationships
        }
    )
)

קריאה ל-API

כמו שראיתם ביסודות של הפעלת פונקציות, עכשיו אפשר להעביר את FunctionDeclaration הזה לארגומנט tools של הבנאי genai.GenerativeModel (המבנה יקבל גם ייצוג JSON מקביל של הצהרת הפונקציה):

model = model = genai.GenerativeModel(
    model_name='models/gemini-1.5-pro-latest',
    tools = [add_to_database])

בכל פעם שמפעילים את ה-API, ה-SDK ישלח את הכלים יחד עם ההנחיה שלכם, והמודל אמור לקרוא לפונקציה הזו:

result = model.generate_content(f"""
Please add the people, places, things, and relationships from this story to the database:

{story}
""",
# Force a function call
tool_config={'function_calling_config':'ANY'})

עכשיו אין טקסט לניתוח. התוצאה היא מבנה נתונים.

'text' in result.candidates[0].content.parts[0]
False
'function_call' in result.candidates[0].content.parts[0]
True
fc = result.candidates[0].content.parts[0].function_call
print(type(fc))
<class 'google.ai.generativelanguage_v1beta.types.content.FunctionCall'>

המחלקה glm.FunctionCall מבוססת על מאגרי נתונים זמניים של Google Protocol. יש להמיר אותו לאובייקט מוכר יותר שתואם ל-JSON:

print(json.dumps(type(fc).to_dict(fc), indent=4))
{
    "name": "add_to_database",
    "args": {
        "things": [
            {
                "name": "Magical Backpack",
                "description": "Anya's prized possession, the Magical Backpack, is no ordinary satchel. Its soft, emerald-green fabric shimmers with an ethereal glow, and its leather straps have secrets that only Anya knows. Within its capacious interior lay an enchanted world, filled with wonders that would ignite her imagination and change her life forever."
            },
            {
                "name": "Shimmering Sword",
                "description": "Among the wonders in Anya's Magical Backpack, lies a shimmering sword. With a determined gleam in her eye, she retrieved the shimmering sword and charged towards the monster."
            },
            {
                "description": "Residing within the Magical Backpack, the Book of Ancient Spells holds secrets untold.",
                "name": "Book of Ancient Spells"
            },
            {
                "description": "Tucked away in the Magical Backpack is a tiny compass that always points north.",
                "name": "Tiny Compass that Always Points North"
            },
            {
                "description": "Hidden within the Magical Backpack is a magical key that can open any lock.",
                "name": "Magical Key that Can Open Any Lock"
            }
        ],
        "relationships": [
            {
                "relationship": "Mother-Daughter",
                "person_1_name": "Anya",
                "person_2_name": "Elise"
            },
            {
                "person_2_name": "Edward",
                "relationship": "Father-Daughter",
                "person_1_name": "Anya"
            },
            {
                "person_2_name": "Samuel",
                "person_1_name": "Anya",
                "relationship": "Best Friends"
            }
        ],
        "people": [
            {
                "name": "Anya",
                "description": "Anya, the main character of the story, is a young girl with a magical backpack.",
                "start_place_name": "Willow Creek",
                "end_place_name": "Unknown"
            },
            {
                "name": "Elise",
                "description": "Anya's mother, Elise is a kind-hearted woman.",
                "end_place_name": "Unknown",
                "start_place_name": "Willow Creek"
            },
            {
                "start_place_name": "Willow Creek",
                "end_place_name": "Unknown",
                "name": "Edward",
                "description": "Anya's father, Edward is a wise-bearded man."
            },
            {
                "end_place_name": "Unknown",
                "start_place_name": "Willow Creek",
                "description": "Anya's best friend, Samuel is a curious and adventurous boy with a mischievous grin.",
                "name": "Samuel"
            }
        ],
        "places": [
            {
                "description": "The quaint town of Willow Creek is nestled amidst rolling hills and whispering willows.",
                "name": "Willow Creek"
            },
            {
                "description": "The town's only schoolhouse.",
                "name": "Schoolhouse"
            },
            {
                "description": "A shadowy place filled with secrets and dangers, the Forest is home to a terrifying monster.",
                "name": "Forest"
            }
        ]
    }
}

סיכום

ממשק ה-API יכול לטפל בבעיות של חילוץ נתונים מובְנים באמצעות קלט טקסט ופלט טקסט טהור, אבל השימוש בקריאות לפונקציות הוא אמין יותר כי הוא מאפשר להגדיר סכימה מחמירה ומבטל שלב בניתוח שעלול להיות שעלול להוביל לשגיאות.