شروع سریع
در این شروع سریع، ما از مدلهای چت استفاده خواهیم کرد که قادر به فراخوانی تابع/ابزار برای استخراج اطلاعات از متن هستند.
استخراج با استفاده از فراخوانی تابع/ابزار تنها با مدلهایی کار میکند که از فراخوانی تابع/ابزار پشتیبانی میکنند.
راهاندازی
ما از روش خروجی ساختار یافته استفاده خواهیم کرد که در 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 اجازه دهیم کهNone
را ارائه دهد اگر جواب را نمیداند.
برای بهترین عملکرد، اسکیما را به خوبی مستند کرده و اطمینان حاصل کنید که مدل به ارائه نتایج مجبور نشود اگر اطلاعاتی برای استخراج در متن وجود نداشته باشد.
استخراجکننده
برای ایجاد یک استخراجکننده اطلاعات از اسکیمای تعریف شده بالا استفاده خواهیم کرد.
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",
"شما الگوریتم استخراج متخصص هستید. "
"تنها اطلاعات مربوطه را از متن استخراج کنید. "
"اگر مقدار ویژگیای که باید استخراج شود را نمیدانید، "
"مقدار null را برای مقدار آن ویژگی برگردانید.",
),
("human", "{text}"),
]
)
ما باید از یک مدل استفاده کنیم که از فراخوانی تابع/ابزار پشتیبانی میکند.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
runnable = prompt | llm.with_structured_output(schema=Person)
بیایید آن را تست کنیم
text = "آلن اسمیت قد ۶ فوت دارد و موهایش رنگ بلوند است."
runnable.invoke({"text": text})
Person(name='آلن اسمیت', hair_color='بلوند', height_in_meters='۱.۸۲۸۸')
استخراج ژنراتیو است 🤯 LLMs مدلهای ژنراتیو هستند، بنابراین میتوانند کارهای بسیار جالبی انجام دهند مانند استخراج صحیح ارتفاع فرد به متر، حتی اگر این اطلاعات در فوت ارائه شده باشد!
چندین نهاد
در بیشتر موارد، شما باید یک لیست از نهادها را استخراج کنید به جای یک نهاد تکی.
با استفاده از پایدانتیک، این کار را میتوان با قرار دادن مدلها درون یکدیگر بهراحتی انجام داد.
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 = "اسم من جف است، موهای من سیاه است و ارتفاع من ۱۸۳ سانتیمتر است. آنا همان رنگ موی من دارد."
runnable.invoke({"text": text})
Data(people=[Person(name='جف', hair_color=None, height_in_meters=None), Person(name='آنا', hair_color=None, height_in_meters=None)])
زمانیکه طرح استخراج موجودیتهای متعدد را فراهم میکند، امکان استخراج هیچ موجودیتی اگر اطلاعات مربوطه در متن وجود نداشته باشد را نیز فراهم میکند.
این معمولا چیز خوبی است! این امکان را فراهم میکند تا ویژگیهای مورد نیاز را بر روی یک نهاد مشخص کنید بدون اینکه مدل را مجبور به تشخیص این موجودیت کنید.