Xem trên AI của Google | Dùng thử sổ tay Colab | Xem sổ tay trên GitHub |
Trong hướng dẫn này, bạn sẽ tìm hiểu một ví dụ về việc trích xuất dữ liệu có cấu trúc bằng cách sử dụng Gemini API để trích xuất danh sách nhân vật, mối quan hệ, sự vật và địa điểm trong một câu chuyện.
Thiết lập
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))
Sau khi bạn có khoá API, hãy chuyển khoá đó vào SDK. Bạn có thể làm điều này theo hai cách:
- Đặt khoá vào biến môi trường
GOOGLE_API_KEY
(SDK sẽ tự động nhận khoá từ đó). - Truyền khoá cho
genai.configure(api_key=...)
genai.configure(api_key=GOOGLE_API_KEY)
Việc cần làm ví dụ
Đối với hướng dẫn này, bạn sẽ trích xuất các thực thể từ những câu chuyện có ngôn ngữ tự nhiên. Là một ví dụ: dưới đây là một tin bài do Gemini viết.
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)
Tại thị trấn cổ kính Willow Creek, nép mình giữa những ngọn đồi thoai thoải và những ngọn cây liễu rì rầm, có một cô bé tên là Anya sinh sống. Khi bước ra khỏi cánh cửa gỗ nứt nẻ của căn nhà tranh bình dị, trái tim cô nhảy lên một cảm giác phấn khích và mong chờ. Hôm nay là ngày đầu tiên đi học và cô rất nóng lòng được khoe tài sản quý giá của mình, đó là một chiếc ba lô thần kỳ.
Chiếc ba lô được truyền lại cho cô từ bà cô, không phải là một chiếc túi thông thường. Chất liệu mềm mại, màu xanh lục bảo của chiếc đồng hồ này lấp lánh với ánh sáng lung linh, cùng dây da của chiếc đồng hồ này nắm giữ những bí mật mà chỉ Anya mới biết. Bên trong không gian rộng lớn này là một thế giới mê hoặc, ngập tràn những điều kỳ diệu có thể khơi dậy trí tưởng tượng và thay đổi cuộc sống của cô mãi mãi.
Cha mẹ của Anya, Elise tốt bụng và Edward có râu khôn ngoan, đã chào tạm biệt cô bằng những cái ôm ấm áp. "Hãy nhớ nhé, cưng ơi," mẹ cô thì thầm, "hãy dùng phép thuật của con một cách khôn ngoan và có lợi." Cha cô nói thêm: "Hãy luôn tìm kiếm kiến thức và hãy để chiếc ba lô trở thành người bạn đồng hành đáng tin cậy của con".
Không cần nhảy, Anya đã đi đến ngôi trường duy nhất trong thành phố. Trên đường đi, cô đi qua người bạn thân của mình là Samuel, một cậu bé hiếu kỳ và thích phiêu lưu với một nụ cười tinh nghịch. "Chào Anya," anh đã lên tiếng. "Tôi có thể thấy ba lô của bạn không?"
Anya do dự một chút trước khi mở nắp ra và tiết lộ bên trong. Samuel mở to mắt kinh ngạc khi anh nhìn vào bên trong. Ở đó, nép mình giữa những cây bút chì và sổ tay, là một thanh kiếm rực rỡ, một quyển sách thần chú, một la bàn nhỏ bé luôn chỉ về hướng bắc và một chiếc chìa khoá thần kỳ có thể mở ra bất kỳ chiếc khoá nào.
Họ cùng nhau ngạc nhiên trước sự kỳ diệu của chiếc ba lô, hứa hẹn sẽ giữ an toàn cho những bí mật của chiếc ba lô. Khi đến gần trường học, Anya nhận thấy một nhóm học sinh lớn tuổi đang túm tụm cùng nhau, khuôn mặt hiện rõ nét sợ hãi. Cô bé thận trọng đến gần, vì tò mò muốn biết thêm nhiều điều.
"Có gì sai?" cô hỏi.
Một cậu nhóc cao lớn bước tới. "Có một con quái vật trong rừng," anh sấp mặt. "Nội dung này đã đe doạ thị trấn, tấn công động vật và thậm chí cả con người."
Trái tim của Anya đang suy sụp. Thị trấn Willow Creek nhỏ nhắn và yên bình, và suy nghĩ về một con quái vật khiến cô run rẩy sống lưng. Cô biết mình phải làm điều gì đó để bảo vệ gia đình và bạn bè của mình.
Không chút do dự, Anya mở ba lô ra và nhận thanh kiếm lấp lánh. Với ánh mắt rực cháy quyết tâm, cô nhìn sang những người bạn đang sợ hãi. "Đừng lo," cô nói, giọng ổn định. "Tôi sẽ lo việc này."
Khi Samuel đến gần phía sau, Anya mạo hiểm tiến vào sâu thẳm bóng tối của khu rừng. Hàng cây dường như thì thầm những bí mật khi cô vượt qua, và cây cối sẫm xào xạc với những sinh vật lạ. Khi họ càng tiến sâu hơn vào khu rừng, không khí càng nặng nề và mặt đất dưới chân họ rung chuyển.
Đột nhiên, họ tiến đến một khoảng trống, và ở đó trước mắt họ là một con quái vật – một con quái vật to lớn với hàm răng sắc nhọn, mắt đỏ rực và móng vuốt có thể dễ dàng nghiền nát người. Sinh vật này gầm lên, âm thanh như sấm sét làm rung chuyển cả khu rừng.
Sự sợ hãi dâng tràn trong Anya, nhưng cô không muốn để điều đó ảnh hưởng đến cô. Cô rút thanh kiếm ra khỏi vỏ bọc và lao về phía con quái vật. Lưỡi kiếm lấp lánh trong ánh nắng, và khi đánh vào nơi ẩn náu của con thú, một ánh sáng chói loá nổ ra, bao phủ mọi thứ trong nó.
Khi ánh sáng mờ dần, con quái vật đã biến mất và ở vị trí của nó là một đám tinh thể vỡ vụn. Anya đã đánh bại sinh vật này bằng sự kỳ diệu của chiếc ba lô của mình, chứng minh rằng ngay cả những vật thể nhỏ nhất cũng có thể nắm giữ sức mạnh lớn nhất.
Khi cô và Samuel trở lại thị trấn, họ được chào đón như những người hùng. Người dân vùng Willow Creek vui mừng và truyền thuyết về Anya, cô gái với chiếc ba lô thần kỳ, được lưu truyền qua nhiều thế hệ. Và vì vậy, Anya tiếp tục cuộc phiêu lưu của mình bằng cách sử dụng những điều kỳ diệu của chiếc ba lô để làm cho thế giới tốt đẹp hơn, qua từng bước kỳ diệu.
Sử dụng ngôn ngữ tự nhiên
Các mô hình ngôn ngữ lớn là một công cụ đa nhiệm mạnh mẽ. Thông thường, bạn chỉ cần hỏi Gemini về những điều bạn muốn và Gemini sẽ làm theo.
Gemini API không có chế độ JSON, vì vậy, bạn cần lưu ý một số điều sau đây khi tạo cấu trúc dữ liệu theo cách này:
- Đôi khi, quá trình phân tích cú pháp không thành công.
- Không thể thực thi nghiêm ngặt giản đồ này.
Bạn sẽ giải quyết những vấn đề đó trong phần tiếp theo. Trước tiên, hãy thử một câu lệnh bằng ngôn ngữ tự nhiên đơn giản với giản đồ được viết dưới dạng văn bản. Tính năng này chưa được tối ưu hoá:
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]}'
Kết quả này trả về một chuỗi json. Thử phân tích cú pháp:
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" } ] }
Cách này tương đối đơn giản và thường hoạt động, nhưng bạn có thể làm cho quy trình này nghiêm ngặt/mạnh hơn bằng cách xác định giản đồ bằng tính năng gọi hàm của API.
Sử dụng lệnh gọi hàm
Nếu bạn chưa xem hết hướng dẫn Kiến thức cơ bản về lệnh gọi hàm, hãy đảm bảo bạn đã thực hiện việc đó trước.
Với hàm gọi hàm của bạn và các tham số của hàm đó sẽ được mô tả cho API
dưới dạng genai.protos.FunctionDeclaration
. Trong các trường hợp cơ bản, SDK có thể tạo
FunctionDeclaration
trong hàm và các chú giải tương ứng. Loại đối thủ sau lượt đánh bóng
bây giờ, bạn cần xác định chúng một cách rõ ràng.
Xác định giản đồ
Bắt đầu bằng cách xác định person
làm đối tượng bằng các trường chuỗi 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']
)
Sau đó, hãy xác định mọi người là ARRAY
của đối tượng person
:
people = genai.protos.Schema(
type=genai.protos.Type.ARRAY,
items=person
)
Sau đó, hãy làm tương tự cho từng thực thể bạn đang muốn trích xuất:
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
)
Bây giờ, hãy tạo 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
}
)
)
Gọi API
Như đã thấy trong phần Kiến thức cơ bản về cách gọi hàm, bạn hiện có thể truyền FunctionDeclaration
này đến đối số tools
của hàm khởi tạo genai.GenerativeModel
(hàm khởi tạo cũng sẽ chấp nhận cách biểu diễn JSON tương đương trong nội dung khai báo hàm):
model = genai.GenerativeModel(
model_name='models/gemini-1.5-pro-latest',
tools = [add_to_database])
Mỗi lần bạn gọi API, SDK sẽ gửi các công cụ cùng với lời nhắc của bạn và mô hình sẽ gọi hàm mà bạn đã xác định:
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'})
Bây giờ không có văn bản để phân tích cú pháp. Kết quả là một cấu trúc dữ liệu.
'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'>
Lớp genai.protos.FunctionCall
dựa trên Vùng đệm giao thức của Google,
chuyển đổi đối tượng đó thành một đối tượng tương thích với JSON quen thuộc hơn:
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" } ] } }
Kết luận
Mặc dù API có thể xử lý các sự cố trích xuất dữ liệu có cấu trúc với dữ liệu đầu vào và văn bản đầu ra thuần tuý, nhưng việc sử dụng lệnh gọi hàm có thể đáng tin cậy hơn vì cho phép bạn xác định một giản đồ nghiêm ngặt và loại bỏ bước phân tích cú pháp có thể dễ xảy ra lỗi.