Panduan Cepat
Pada panduan cepat ini, kita akan menggunakan model percakapan yang mampu melakukan pemanggilan fungsi/alat untuk mengekstrak informasi dari teks.
Ekstraksi menggunakan pemanggilan fungsi/alat hanya berfungsi dengan model yang mendukung pemanggilan fungsi/alat.
Persiapan
Kita akan menggunakan metode output terstruktur yang tersedia pada LLM yang mampu melakukan pemanggilan fungsi/alat.
Pilih sebuah model, pasang dependensi untuknya, dan atur kunci API!
!pip install langchain
Skema
Pertama, kita perlu mendeskripsikan informasi apa yang ingin kita ekstrak dari teks.
Kami akan menggunakan Pydantic untuk mendefinisikan contoh skema untuk mengekstrak informasi pribadi.
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informasi tentang seseorang."""
name: Optional[str] = Field(..., description="Nama orang tersebut")
hair_color: Optional[str] = Field(
..., description="Warna rambut orang tersebut jika diketahui"
)
height_in_meters: Optional[str] = Field(
..., description="Tinggi diukur dalam meter"
)
Terdapat dua praktik terbaik saat mendefinisikan skema:
- Dokumentasikan atribut dan skema itu sendiri: Informasi ini dikirim ke LLM dan digunakan untuk meningkatkan kualitas ekstraksi informasi.
- Jangan memaksa LLM untuk membuat informasi! Di atas kita menggunakan
Optional
untuk atribut yang memungkinkan LLM mengeluarkanNone
jika tidak mengetahui jawabannya.
Untuk performa terbaik, dokumentasikan skema dengan baik dan pastikan model tidak dipaksa mengembalikan hasil jika tidak ada informasi yang diekstrak dari teks.
Pengekstrak
Mari membuat pengekstrak informasi menggunakan skema yang kita definisikan sebelumnya.
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",
"Kamu adalah algoritma ekstraksi yang ahli. "
"Hanya ekstrak informasi relevan dari teks. "
"Jika tidak mengetahui nilai dari suatu atribut yang diminta diekstrak, "
"kembalikan null untuk nilai atribut tersebut.",
),
("human", "{text}"),
]
)
Kita perlu menggunakan model yang mendukung pemanggilan fungsi/alat.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
runnable = prompt | llm.with_structured_output(schema=Person)
Ayo coba
text = "Alan Smith memiliki tinggi 6 kaki dan rambut berwarna pirang."
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='pirang', height_in_meters='1.8288')
Ekstraksi adalah Generatif 🤯 LLMs adalah model generatif, jadi mereka dapat melakukan hal-hal keren seperti mengoreksi mengambil tinggi seseorang dalam meter meskipun disediakan dalam kaki!
Beberapa Entitas
Sebagian besar kasus, Anda sebaiknya mengekstrak daftar entitas daripada entitas tunggal.
Ini dapat dengan mudah dicapai menggunakan pydantic dengan meletakkan model di dalam model lain.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Person(BaseModel):
"""Informasi tentang seseorang."""
name: Optional[str] = Field(..., description="Nama orang tersebut")
hair_color: Optional[str] = Field(
..., description="Warna rambut orang tersebut jika diketahui"
)
height_in_meters: Optional[str] = Field(
..., description="Tinggi diukur dalam meter"
)
class Data(BaseModel):
"""Data yang diekstraksi tentang orang."""
people: List[Person]
Ekstraksi mungkin tidak sempurna di sini. Silakan lanjutkan untuk melihat bagaimana menggunakan Contoh Referensi untu meningkatkan kualitas ekstraksi, dan lihat bagian pedoman!
runnable = prompt | llm.with_structured_output(schema=Data)
text = "Nama saya Jeff, rambut saya hitam dan saya tingginya 6 kaki. Anna memiliki warna rambut yang sama dengan saya."
runnable.invoke({"text": text})
Data(people=[Person(name='Jeff', hair_color=None, height_in_meters=None), Person(name='Anna', hair_color=None, height_in_meters=None)])
Ketika skema mendukung ekstraksi dari berbagai entitas, ini juga memungkinkan model untuk mengekstraksi tanpa entitas jika tidak ada informasi relevan dalam teks dengan menyediakan daftar kosong.
Ini biasanya merupakan hal yang baik! Ini memungkinkan untuk menentukan atribut yang diperlukan pada suatu entitas tanpa secara khusus memaksa model untuk mendeteksi entitas tersebut.