البداية السريعة
في هذا البداية السريعة، سنستخدم نماذج الدردشة التي تتمتع بقدرة استدعاء الوظيفة/الأداة لاستخراج المعلومات من النص.
يعمل استخراج باستخدام استدعاء الوظيفة/الأداة فقط مع النماذج التي تدعم استدعاء الوظيفة/الأداة.
الإعداد
سنستخدم طريقة الناتج المنظم المتاحة على LLMs التي تتمتع بقدرة استدعاء الوظيفة/الأداة.
اختر نموذجًا، قم بتثبيت الاعتماديات الخاصة به، وقم بإعداد مفاتيح API!
!pip install langchain
النموذج البياني
أولاً، نحتاج إلى وصف المعلومات التي نريد استخراجها من النص.
سنستخدم Pydantic لتحديد مخطط مثالي لاستخراج المعلومات الشخصية.
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""معلومات عن شخص."""
name: Optional[str] = Field(..., description="اسم الشخص")
hair_color: Optional[str] = Field(
..., description="لون شعر الشخص إذا كان معروفًا"
)
height_in_meters: Optional[str] = Field(
..., description="الارتفاع المقاس بالأمتار"
)
هناك ممارستان جيدتان عند تحديد النموذج:
- توثيق السمات والمخطط نفسه: يتم إرسال هذه المعلومات إلى LLM ويتم استخدامها لتحسين جودة استخراج المعلومات.
- عدم إجبار LLM على ابتكار المعلومات! في المثال أعلاه، استخدمنا
Optional
للسمات مما يتيح لـ LLM إخراجلا شيء
إذا لم يكن لديه الإجابة.
للحصول على أداء أفضل، قم بتوثيق المخطط بشكل جيد وتأكد من عدم إجبار النموذج على إرجاع النتائج إذا لم تكن هناك معلومات لاستخراجها من النص.
الاستخراج
لنقم بإنشاء منقب معلومات باستخدام المخطط الذي قمنا بتحديده أعلاه.
from typing import Optional
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"أنت خوارزمية استخراج خبيرة. "
"استخرج فقط المعلومات ذات الصلة من النص. "
"إذا كنت لا تعرف قيمة السمة المطلوبة للاستخراج، "
"فقم بإرجاع قيمة فارغة للسمة.",
),
("human", "{text}"),
]
)
علينا استخدام نموذج يدعم استدعاء الوظيفة/الأداة.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
runnable = prompt | llm.with_structured_output(schema=Person)
لنجرب ذلك
text = "ألان سميث طوله 6 أقدام ولديه شعر أشقر."
runnable.invoke({"text": text})
Person(name='ألان سميث', hair_color='أشقر', height_in_meters='1.8288')
الاستخراج جنراتيف 🤯 LLMs هي نماذج جنراتيفة، لذا يمكنها فعل أشياء رائعة مثل استخراج ارتفاع الشخص بالأمتار بشكل صحيح على الرغم من أنه تم توفيره بالأقدام!
عدة كيانات
في معظم الحالات، يجب أن تقوم باستخراج قائمة من الكيانات بدلاً من كيان واحد.
يمكن تحقيق ذلك بسهولة باستخدام pydantic من خلال تضمين النماذج داخل بعضها البعض.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""معلومات عن شخص ما."""
name: Optional[str] = Field(..., description="اسم الشخص")
hair_color: Optional[str] = Field(
..., description="لون شعر الشخص إذا كان معروفًا"
)
height_in_meters: Optional[str] = Field(
..., description="الطول المقاس بالأمتار"
)
class Data(BaseModel):
"""البيانات المستخرجة حول الأشخاص."""
people: List[Person]
قد لا يكون الاستخراج مثاليًا هنا. يرجى الاستمرار في رؤية كيفية استخدام أمثلة الإشارة لتحسين جودة الاستخراج، وراجع قسم الإرشادات!
runnable = prompt | llm.with_structured_output(schema=Data)
text = "اسمي جيف، لون شعري أسود وطولي 6 أقدام. آنا لديها نفس لون الشعر مثلي."
runnable.invoke({"text": text})
Data(people=[Person(name='جيف', hair_color=None, height_in_meters=None), Person(name='آنا', hair_color=None, height_in_meters=None)])
عندما تتسع النطاق يسمح السكيما با