استخراج البيانات المنظَّمة باستخدام استدعاء الدوال

الاطّلاع على تكنولوجيات الذكاء الاصطناعي من Google التشغيل في 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))

بعد حصولك على مفتاح واجهة برمجة التطبيقات، أرسِله إلى حزمة تطوير البرامج (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)

في بلدة "ويلو كريك" الجذابة، التي تقع وسط التلال المتموجة وأزهار الصفصاف، أقامت فتاة صغيرة تُدعى "أنيا". وأثناء خروجها من الباب الخشبي الصاخب في كوخها المتواضع، تخطّى قلبها إيقاعًا مليئًا بالإثارة والتشويق. كان اليوم أول يوم لها في المدرسة، ولم تتشوّق "ليند" كثيرًا لعرض مقتنياتها الثمينة على حقيبة ظهر ساحرة.

ولم يكن حقيبة الظهر التي تم تسليمها لها من جدتها حقيبة عادية عادية. إنّ قماشه الناعم باللون الأخضر الزمردي يتلألأ مع لمعان سماوي، وتكشف أحزمةه الجلدية عن أسرار لا يعرفها أحد سوى "آنيا". داخل اللعبة الواسعة، تم إطلاق عالم ساحر مليء بالعجائب التي من شأنها أن تشعّ خيالها وتغير حياتها إلى الأبد.

وداعًا لـ "إليز" اللطيفة وإدوارد اللحية الحكيمة، وداعتها عناق دافئ. هَمَّتْ أُمُّهَا قَائِلَةً: "تَذْكِيرِي يَا عَزِيزَتِي"، "أستخدمِ سِحرك بحكمة وأبدٍ". وأضافت والدها قائلةً: "اطلب دائمًا المعرفة واجعل حقيبة الظهر رفيقتك الموثوق بها".

وبعد تخطي خطوتها، انطلقت "آنيا" نحو المنزل الوحيد في المدينة. وفي طريقها، مرت بصديقتها المقرّبة "صموئيل"، وهو صبي مغامِر فضولي يحمل ابتسامة سيئة. "مرحبًا أنيا". "هل يمكنني رؤية حقيبة الظهر الخاصة بك؟"

ترددت "أيا" للحظة قبل فك ضغط الجبهة وكشف محتواها. اتسعت عينا سامويل مندهشة بينما ينظر إلى الداخل. ويوجد بين الأقلام ودفاتر الملاحظات سيف متلألئ، وكتاب يضم تعاويذ قديمة، وبوصلة صغيرة تشير دائمًا إلى الشمال، ومفتاح سحري يمكن أن يفتح أي قفل.

وتعجبوا معًا من عجائب حقيبة الظهر التي تعد بالحفاظ على أمان أسرارها. وعند اقترابهما من منزل المدرسة، لاحظت أنيا مجموعة من الأطفال الأكبر سنًا مجتمعةً ووجوههم محفورة بالخوف. ازداد الفضول معها، اقتربت بحذر.

سألت "ما الخطأ؟".

يخطو صبي طويل نحيف إلى الأمام. قَائِلًا: "هناك وحش في الغابة". "كانت الصورة تُروّع المدينة وتهاجم الحيوانات وحتى البشر".

غرق قلب "أنيا". كانت بلدة "ويلو كريك" صغيرة وهادئة، وفكرت وحشًا يتسبب في رعشة في عمودها الفقري. كانت تعرف أن عليها أن تفعل شيئًا لحماية عائلتها وأصدقائها.

وبدون تردد، فتحت أنيا حقيبة ظهرها واسترجعت السيف المتلألئ. التفتت بنظرة خاطفة إلى أقرانها المذعورين. "لا تقلق"، قالت، وصوتها ثابتًا. "سأهتم بها".

ومع اقتراب صامويل من الغابة، غامرت أنيا بالوصول إلى أعماق الغابة الغامضة. وبدا أنّ الأشجار همس بأسرارًا أثناء وفاتها، وتناثر الشجيرات بمخلوقات غير مرئية. وَعِنْدَمَا تَعَرَّضَا عَلَى الْمَجْمُوعَة، عَثَرْتُ عَلَى الْهَوَاءْ كَثِيفَةً وارتفَعَتْ الْأَرْضِ الْأَرْضِيَّة تَحْتَ أَقْدَامِهَا.

وفجأة، جاء الحيوان إلى مكان خالٍ من المياه، وكان هناك وحش ضخم أمام عينيه، وهو وحش ضخم ذو أسنان حادة وعيون حمراء لامعة ومخالب يمكن أن يسحق أي إنسان بسهولة. هَرَشَ الْحَيَوَانُ، وَكَانَ صَوْتًا رَائِعًا يهزُّ الْغَابَةْ نَحْوَ الْأَقْصَى.

شعل الخوف في "أنيا"، لكنها رفضت السماح له بأن يستهلكها. وسحبت السيف من غمده ووجّهت نحو الوحش. لملئ النصل في ضوء الشمس، وعندما ضرب مختبئ الوحش، اندلع ضوء أعمى، ويضفي كل شيء في لمعانه.

عندما تلاشى الضوء، اختفى الوحش، وكان في مكانه كومة من البلورات المحطّمة. هزمت "أنيا" المخلوق بسحر حقيبة الظهر التي كانت تحملها، ما يثبت أن أصغر الأشياء يمكن أن تحمل أعظم القوى.

وعندما عادت هي وصمويل إلى البلدة، شهدنا الترحيب بهما كبطلَين. ابتهج أهل "ويلو كريك"، وتواثر أسطورة الفتاة "أنيا" التي تحمل حقيبة الظهر السحرية عبر الأجيال. وهكذا، واصلت أنيا مغامراتها مستعينة بعجائب حقيبة الظهر لتجعل العالم مكانًا أفضل، وبخطوة سحرية واحدة كل مرة.

استخدام اللغة الطبيعية

تُعَد النماذج اللغوية الكبيرة أدوات فعّالة لتنفيذ مهام متعددة. في كثير من الأحيان يمكنك فقط أن تطلب من 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"
        }
    ]
}

وهذا الأمر بسيط نسبيًا وفي أغلب الأحيان يعمل، ولكن يمكنك جعله أكثر صرامة أو صرامة من خلال تحديد المخطط باستخدام ميزة استدعاء وظيفة واجهة برمجة التطبيقات.

استخدام ميزة استدعاء الدوال

إذا لم تكن قد اطّلعت على البرنامج التعليمي أساسيات استدعاء الوظائف حتى الآن، احرص على إجراء ذلك أولاً.

باستخدام الدالة استدعاء الدالة ومعلَماتها، يتم وصفها إلى واجهة برمجة التطبيقات على أنّها 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
        }
    )
)

طلب بيانات من واجهة برمجة التطبيقات

كما رأيت في أساسيات استدعاء الدالة، يمكنك الآن تمرير FunctionDeclaration هذه إلى الوسيطة tools في الدالة الإنشائية genai.GenerativeModel (ستقبل الدالة الإنشائية أيضًا تمثيل JSON مكافئًا لتعريف الدالة):

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

في كل مرة تستدعي واجهة برمجة التطبيقات، سترسل حزمة 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، لذا يمكنك تحويلها إلى كائن مألوف أكثر توافقًا مع 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"
            }
        ]
    }
}

الخلاصة

على الرغم من أنّ واجهة برمجة التطبيقات يمكنها التعامل مع مشاكل استخراج البيانات المنظَّمة من خلال إدخال النص وإخراج النص فقط، من المرجح أن يكون استخدام استدعاء الدالة أكثر موثوقية لأنّه يتيح لك تحديد مخطط صارم، ويزيل خطوة التحليل التي يُحتمل أن تكون عرضة للخطأ.