Strukturierte Daten mit Funktionsaufrufen extrahieren

Auf Google AI ansehen In Google Colab ausführen Quelle auf GitHub ansehen

In dieser Anleitung geht es um ein Beispiel für die Extraktion strukturierter Daten. Dabei werden mit der Gemini API Listen von Charakteren, Beziehungen, Dingen und Orten aus einer Geschichte extrahiert.

Einrichtung

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))

Sobald Sie den API-Schlüssel haben, übergeben Sie ihn an das SDK. Dafür haben Sie die beiden folgenden Möglichkeiten:

  • Fügen Sie den Schlüssel in die Umgebungsvariable GOOGLE_API_KEY ein. Das SDK übernimmt ihn dort automatisch.
  • Schlüssel an genai.configure(api_key=...) übergeben
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)

Die Beispielaufgabe

In dieser Anleitung extrahieren Sie Entitäten aus Natural Language Stories. Unten sehen Sie als Beispiel eine Geschichte von 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)

In der malerischen Stadt Willow Creek, eingebettet in eine sanfte Hügellandschaft, in der Weiden flüsternd, lebte ein junges Mädchen namens Anya. Als sie aus der knirschenden Holztür ihrer bescheidenen Hütte trat, hoffte ihr Herz vor Aufregung und Vorfreude. Heute war ihr erster Schultag und sie konnte es kaum erwarten, ihren wertvollen Besitz zu präsentieren: einen magischen Rucksack.

Der Rucksack, den sie von ihrer Großmutter übergab, war keine gewöhnliche Umhängetasche. Der weiche, smaragdgrüne Stoff schimmerte mit einem ätherischen Schein, und die Lederbänder trugen Geheimnisse in sich, die nur Anya wusste. In seinem weitläufigen Inneren lag eine zauberhafte Welt voller Wunder, die ihre Fantasie anregen und ihr Leben für immer verändern sollte.

Anyas Eltern, die freundliche Elise und der weise Bart Edward, verabschieden sich freundlich von ihr. „Merk dir, mein Liebling“, flüsterte ihre Mutter, „Nutze deine Magie weise und für Gutes.“ Ihr Vater fügte hinzu: „Suchen Sie immer nach Wissen und lassen Sie den Rucksack Ihr vertrauenswürdiger Begleiter sein.“

Mit einem Hüpfer macht sich Anya auf den Weg zum einzigen Schulhaus der Stadt. Auf dem Weg ging sie an ihrem besten Freund Samuel vorbei, einem neugierigen und abenteuerlichen Jungen mit einem schelmischen Grinsen. „Hey Anya“, rief er. „Kann ich deinen Rucksack sehen?“

Anya zögerte einen Moment, bevor sie die Klappe abschloss und ihren Inhalt freilegte. Samuel weitete seine Augen vor Erstaunen aus, während er in das Zimmer blickte. Zwischen Bleistiften und Notizbüchern steckte ein schillerndes Schwert, ein Buch antiker Zaubersprüche, ein winziger Kompass, der immer nach Norden zeigte, und ein magischer Schlüssel, mit dem sich jedes Schloss öffnen konnte.

Gemeinsam staunen sie über die Wunder des Rucksacks und versprechen, die Geheimnisse zu beschützen. Als sie sich dem Schulhaus näherten, bemerkte Anya eine Gruppe älterer Kinder, die sich mit furchteinflößenden Gesichtern zusammendrängten. Da ihre Neugier immer besser wurde, ging sie vorsichtig auf sie zu.

Sie fragte sie: „Was ist los?“

Ein großer, schlanker Junge trat vor. „Im Wald ist ein Monster“, stotterte er. „Es hat die Stadt terrorisiert, Tiere und sogar Menschen angegriffen.“

Anyas Herz sank. Die Stadt Willow Creek war klein und friedlich, und der Gedanke an ein Monster brachte einen Schauer auf sie. Sie wusste, dass sie etwas tun musste, um ihre Familie und Freunde zu schützen.

Ohne einen Moment zu zögern, öffnete Anya ihren Rucksack und nahm das schillernde Schwert zurück. Mit einem entschlossenen Schimmern in ihren Augen wandte sie sich zu ihren erschreckten Freunden zu. "Keine Sorge", sagte sie mit ruhiger Stimme. „Ich kümmere mich darum.“

Mit Samuel nahe hinter ihr wagte Anya in die düsteren Tiefen des Waldes. Die Bäume schienen Geheimnisse zu flüstern, als sie vorbeiging, und das Unterholz rauschte mit unbekannten Kreaturen. Als sie tiefer in den Wald gingen, wurde die Luft schwerer und der Boden unter ihren Füßen zitterte.

Plötzlich kam es zu einer Lichtung und da war das Monster – ein gigantisches Tier mit scharfen Zähnen, leuchtend roten Augen und Krallen, das mit Leichtigkeit einen Menschen zerquetschen konnte. Die Kreatur brüllte, ein donnerndes Geräusch, das den Wald bis ins Innere erschütterte.

Anya machte Angst, aber sie weigerte sich, sie sich davon verzehren zu lassen. Sie zog das Schwert aus der Scheide und zielte auf das Monster zu. Die Klinge schimmerte im Sonnenlicht, und als sie das Fell der Bestie traf, brach ein blendendes Licht aus, das alles in ihr strahlendes Licht hüllte.

Als das Licht erlischt, war das Monster verschwunden. An seiner Stelle befand sich ein Haufen zerbrochener Kristalle. Anya hatte die Kreatur mit der Magie ihres Rucksacks besiegt und bewies, dass selbst die kleinsten Objekte die größten Kräfte besitzen können.

Als sie und Samuel in die Stadt zurückkehrten, wurden sie als Helden begrüßt. Das Volk von Willow Creek freute sich und die Legende Anya, das Mädchen mit dem Zauberrucksack, wurde über Generationen weitergegeben. So setzte Anya ihre Abenteuer fort und nutzte die Wunder des Rucksacks, um die Welt zu einem besseren Ort zu machen. Schritt für Schritt.

Natürliche Sprache verwenden

Large Language Models sind ein leistungsstarkes Multitasking-Tool. Oftmals können Sie Gemini einfach um fragen, was Sie wollen, und es funktioniert.

Die Gemini API hat keinen JSON-Modus. Achten Sie deshalb auf einige Dinge, auf die Sie beim Generieren von Datenstrukturen auf diese Weise achten müssen:

  • Manchmal schlägt das Parsen fehl.
  • Das Schema kann nicht streng durchgesetzt werden.

Diese Probleme lösen Sie im nächsten Abschnitt. Versuchen Sie es zuerst mit einem einfachen Prompt in natürlicher Sprache, bei dem das Schema als Text ausgeschrieben ist. Dies wurde nicht optimiert:

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]}'

Dadurch wurde ein JSON-String zurückgegeben. Versuchen Sie, sie zu parsen:

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"
        }
    ]
}

Das ist relativ einfach und funktioniert häufig. Sie können dies jedoch auch strenger bzw. robuster gestalten, indem Sie das Schema mithilfe der Funktionsaufruffunktion der API definieren.

Funktionsaufrufe verwenden

Wenn Sie die Anleitung Grundlagen zu Funktionsaufrufen noch nicht durchgegangen sind, sollten Sie dies zuerst tun.

Wenn die Funktion Ihre Funktion aufruft, werden ihre Parameter gegenüber der API als glm.FunctionDeclaration beschrieben. In grundlegenden Fällen kann das SDK den FunctionDeclaration aus der Funktion und ihren Annotationen erstellen. Das SDK verarbeitet die Beschreibung verschachtelter OBJECT-Parameter (dict) derzeit nicht. Sie müssen sie also vorerst explizit definieren.

Schema definieren

Definieren Sie zuerst person als Objekt mit den Stringfeldern 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']
)

Definieren Sie dann Personen als ARRAY von person-Objekten:

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

Wiederholen Sie diesen Schritt für alle Entitäten, die Sie extrahieren möchten:

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
)

Erstellen Sie jetzt das 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 aufrufen

Wie Sie in Grundlagen zu Funktionsaufrufen gesehen haben, können Sie jetzt diese FunctionDeclaration an das Argument tools des Konstruktors genai.GenerativeModel übergeben. Der Konstruktor akzeptiert auch eine entsprechende JSON-Darstellung der Funktionsdeklaration:

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

Jedes Mal, wenn Sie die API aufrufen, sendet das SDK die Tools zusammen mit Ihrer Aufforderung und das Modell sollte die von Ihnen definierte Funktion aufrufen:

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'})

Jetzt gibt es keinen Text mehr zum Parsen. Das Ergebnis ist eine Datenstruktur.

'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'>

Die Klasse glm.FunctionCall basiert auf Google Protocol Buffers. Konvertieren Sie sie in ein bekannteres JSON-kompatibles Objekt:

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"
            }
        ]
    }
}

Fazit

Die API kann zwar Probleme bei der Extraktion strukturierter Daten mit reiner Texteingabe und Textausgabe verarbeiten, die Verwendung von Funktionsaufrufen ist jedoch wahrscheinlich zuverlässiger, da Sie damit ein striktes Schema definieren können und ein potenziell fehleranfälliger Parsing-Schritt eliminiert wird.