แยก Structured Data โดยใช้การเรียกใช้ฟังก์ชัน

ดูใน AI ของ Google ลองใช้ Colab Notebook ดูสมุดบันทึกใน GitHub

ในบทแนะนำนี้ คุณจะได้ศึกษาตัวอย่างการดึงข้อมูลที่มีโครงสร้างโดยใช้ Gemini API เพื่อดึงรายการตัวละคร ความสัมพันธ์ สิ่งต่างๆ และสถานที่จากเรื่องราว

ตั้งค่า

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

import google.generativeai as genai


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

เมืองหลิวห้วยที่มีเสน่ห์แบบโบราณแห่งนี้ตั้งอยู่ท่ามกลางเนินเขาสูงและต้นหลิวกระซิบ เป็นบ้านของหญิงสาวชื่ออัญญา ขณะที่ก้าวออกมาจากประตูไม้ลั่นของบ้านคอตเทจเรียบง่าย หัวใจของเธอก็หยุดเต้นอย่างตื่นเต้นและรอคอย วันนี้เปิดเทอมวันแรก และเธอแทบรอไม่ไหวที่จะแสดงสมบัติล้ำค่า ซึ่งก็คือกระเป๋าเป้สุดวิเศษ

คุณยายที่มอบหน้าที่ให้เธอ กระเป๋าเป้ไม่ได้เป็นกระเป๋าสะพายหลังธรรมดาๆ ผ้าที่นุ่มนวลสีเขียวมรกตส่องประกายระยิบระยับด้วยสายหนัง ส่วนสายหนังก็มีความลับที่เธอรู้เพียงผู้เดียว ภายในห้องนี้มีโลกที่สวยงามที่เต็มไปด้วยสิ่งมหัศจรรย์มากมายที่จะจุดประกายจินตนาการให้เธอและเปลี่ยนชีวิตของเธอไปตลอดกาล

พ่อแม่ของ Anya อย่าง Elise ผู้ใจดีและ Edward ผู้มีเคราแสนรู้บอกลาด้วยอ้อมกอดที่อบอุ่น "จำไว้ว่าที่รัก" กระซิบให้แม่ของนางว่า "ใช้เวทมนตร์ของท่านอย่างชาญฉลาดและเพื่อความดี" พ่อของเธอกล่าวเสริมว่า "หาความรู้เสมอ และให้กระเป๋าเป้เป็นเพื่อนคู่ใจของคุณ"

การก้าวข้ามผ่านช่วยให้ Anya เดินหน้าไปสู่โรงเรียนในบ้านเพียงแห่งเดียวของเมือง ระหว่างทาง เธอแซงหน้าเพื่อนสนิทอย่างซามูเอล เด็กชายที่มีความสงสัยใคร่รู้และชอบผจญภัยไปส่งพร้อมกับยิ้มร้ายๆ "สวัสดี อันญา" เขาออกมา "ขอดูกระเป๋าเป้ของคุณได้ไหม"

อารียาลังเลอยู่ครู่หนึ่งก่อนคลายการบีบอัดพลางและเปิดเผยเนื้อหา ตาของซามูเอลเบิกกว้างอย่างตื่นตระหนกเมื่อมองเข้าไปข้างใน ที่นั่นที่ฝังอยู่ท่ามกลางดินสอและสมุดบันทึก มีดาบส่องแสงระยิบระยับ หนังสือคาถาโบราณ เข็มทิศขนาดเล็กที่ชี้ไปทางทิศเหนือเสมอ และกุญแจวิเศษที่สามารถเปิดแม่กุญแจใดๆ ได้

พวกเขาร่วมกันประหลาดใจกับความมหัศจรรย์ของกระเป๋าเป้ โดยสัญญาว่าจะเก็บความลับของกระเป๋าเป้ไว้อย่างปลอดภัย ขณะที่เดินเข้าไปใกล้โรงเรียน อัญญาสังเกตเห็นว่าเด็กโตกว่ากลุ่มนั้นโผล่มารวมตัวกันด้วยความกลัว เธอตอบสนองด้วยความอยากรู้อยากเห็นมากขึ้น

"เกิดอะไรขึ้น" เธอถาม

เด็กชายขี้เกียจเดินหน้าไป "มีสัตว์ประหลาดในป่า" เขาพูดตะโกน "นี่เป็นการก่อการร้าย ทำร้ายสัตว์ หรือแม้กระทั่งคนทั้งเมือง"

หัวใจของอัญญาจม เมือง Willow Creek ขนาดเล็กและเงียบสงบ ความคิดเรื่องสัตว์ประหลาดทำให้กระดูกสันหลังสั่นสะเทือน เธอรู้ว่าต้องทำบางอย่างเพื่อปกป้องครอบครัวและเพื่อนๆ

อัญญาเปิดกระเป๋าเป้ออกมาและหยิบดาบที่ส่องประกายออกมาโดยไม่ลังเลเลย ดวงตาของเธอมีประกายวิบวับแสดงอยู่อย่างหวาดกลัว "ไม่ต้องห่วง" เธอพูด เสียงเธอนิ่ง "ฉันจะจัดการให้"

อัญญาเข้าใกล้ห้วงลึกที่เป็นเงามืด ขณะอยู่ด้านหลังซามูเอล ต้นไม้ดูเหมือนจะกระซิบความลับขณะที่เธอเดินผ่านไป และพุ่มไม้ก็สั่นระยิบระยับโดยมีสิ่งมีชีวิตที่มองไม่เห็น เมื่อพวกเขาเดินลึกเข้าไปในป่า อากาศก็เริ่มหนาขึ้นและพื้นใต้เท้าก็สั่นสะเทือน

ทันใดนั้น พวกเขาก็เข้ามาในที่โล่ง ตรงหน้าพวกเขาคือสัตว์ประหลาด สัตว์ประหลาดที่มีฟันคม ตาแดงอร่าม และกรงเล็บที่สามารถบดขยี้มนุษย์ได้อย่างง่ายดาย สัตว์ประหลาดคำรามเป็นเสียงกึกก้องที่สั่นสะเทือนไปทั่วป่า

ความหวาดกลัวพุ่งทะลุผ่าน Anya ไป แต่เธอไม่ยอมปล่อยให้ความกลัวเข้ามากิน นางดึงดาบออกจากปลอกและพุ่งตรงไปที่สัตว์ประหลาด คมดาบส่องแสงแดดสาดส่องไปท่ามกลางที่ซ่อนตัวของสัตว์ประหลาด แสงไฟที่มืดมนส่องขึ้นมาปกคลุมทุกสิ่งด้วยแสงจ้า

เมื่อแสงจางลง สัตว์ประหลาดก็ได้หายไปและในที่แห่งนั้นก็เหมือนกองผลึกที่แตกเป็นเสี่ยงๆ อันญาเอาชนะสิ่งมีชีวิตด้วยเวทมนตร์แห่งกระเป๋าเป้ พิสูจน์ให้เห็นว่าแม้แต่วัตถุขนาดเล็กที่สุดก็สามารถรักษาพลังที่ยิ่งใหญ่ได้

เมื่อเธอและซามูเอลกลับมา พวกเขาก็ได้รับการต้อนรับในฐานะฮีโร่ ผู้คนแห่ง Willow Creek ยินดี และตำนานของ Anya เด็กหญิงผู้มีกระเป๋าเป้สุดวิเศษถูกส่งต่อผ่านรุ่นสู่รุ่นแล้ว ดังนั้นอัญญาจึงเดินทางต่อโดยใช้สิ่งมหัศจรรย์ของกระเป๋าเป้ในการทำให้โลกน่าอยู่ขึ้น โดยทีละก้าว

การใช้ภาษาธรรมชาติ

โมเดลภาษาขนาดใหญ่เป็นเครื่องมือการทำงานหลายอย่างพร้อมกันที่มีประสิทธิภาพ หลายๆ ครั้งคุณสามารถถามถึงสิ่งที่ต้องการจาก Gemini ได้ ทุกอย่างจะเรียบร้อย

Gemini API ไม่มีโหมด JSON เราจึงต้องระวังบางอย่างเมื่อสร้างโครงสร้างข้อมูลด้วยวิธีนี้

  • บางครั้งการแยกวิเคราะห์อาจล้มเหลว
  • สคีมาไม่สามารถบังคับใช้อย่างเคร่งครัดได้

คุณจะแก้โจทย์เหล่านี้ได้ในส่วนถัดไป ก่อนอื่น ให้ลองใช้พรอมต์ภาษาธรรมชาติง่ายๆ ด้วยสคีมาที่เขียนออกมาเป็นข้อความ สิ่งนี้ยังไม่ได้รับการเพิ่มประสิทธิภาพ:

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 ในฐานะ genai.protos.FunctionDeclaration ในกรณีพื้นฐาน SDK สามารถสร้าง FunctionDeclaration จากฟังก์ชันและคำอธิบายประกอบ สไตรค์ ตอนนี้คุณต้องกำหนด คำจำกัดความให้ชัดเจนก่อน

กำหนดสคีมา

เริ่มต้นโดยการกำหนด person เป็นออบเจ็กต์ที่มีช่องสตริง name, description, start_place_name, end_place_name

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

แล้วกำหนดบุคคลเป็นวัตถุ ARRAY จาก person รายการ

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

จากนั้นทำแบบเดียวกันนี้สำหรับเอนทิตีแต่ละรายการที่คุณพยายามแยกออกมา

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

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

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

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

ตอนนี้ให้สร้าง FunctionDeclaration:

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

เรียกใช้ API

ดังที่คุณเห็นในพื้นฐานการเรียกฟังก์ชัน ขณะนี้คุณสามารถส่ง FunctionDeclaration นี้ไปยังอาร์กิวเมนต์ tools ของตัวสร้าง genai.GenerativeModel ได้ (ตัวสร้างจะยอมรับการแทนค่า JSON ที่เทียบเท่าของการประกาศฟังก์ชันด้วย)

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

คลาส genai.protos.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"
            }
        ]
    }
}

บทสรุป

แม้ว่า API จะจัดการปัญหาการดึงข้อมูลที่มีโครงสร้างกับการป้อนข้อมูลข้อความและเอาต์พุตข้อความเพียงอย่างเดียวได้ แต่การใช้การเรียกฟังก์ชันมีแนวโน้มที่จะเชื่อถือได้มากกว่า เนื่องจากช่วยให้คุณกําหนดสคีมาที่เข้มงวดได้ และขจัดขั้นตอนการแยกวิเคราะห์ที่มีโอกาสเกิดข้อผิดพลาดได้ง่าย