การเริ่มต้นอย่างรวดเร็ว
ในการเริ่มต้นอย่างรวดเร็วนี้ เราจะใช้แบบจำลองแชทที่สามารถทำการ เรียกร้องฟังก์ชัน/เครื่องมือ เพื่อสกัดข้อมูลจากข้อความ
การสกัดข้อมูลโดยใช้ เรียกร้องฟังก์ชัน/เครื่องมือ สามารถทำงานได้เพียงกับแบบจำลองที่รองรับ เรียกร้องฟังก์ชัน/เครื่องมือ เท่านั้น
การตั้งค่า
เราจะใช้วิธีการส่งออกโครงสร้างที่มีอยู่บน 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 = "Alan Smith is 6 feet tall and has blond hair."
runnable.invoke({"text": text})
Person(name='Alan Smith', hair_color='blond', height_in_meters='1.8288')
การสกัดข้อมูลเป็นการสร้างทำได้ 🤯 LLMs เป็นแบบจำลองที่สร้างข้อมูลทำให้พวกมันสามารถทำงานเก่งได้ เช่นการสกัดความสูงของบุคคลเป็นเมตรแม้ว่ามันถูกระบุในหน่วยฟุต!
หลาย Entity
ใน กรณีส่วนใหญ่, คุณควรทำการแยกข้อมูลของ entities มากกว่าหนึ่งอันแทนที่จะเป็นเพียงแค่หนึ่ง entity เดียว
นี่สามารถทำได้ง่ายๆ โดยใช้ pydantic โดยการซ้อน model ภายในกัน
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)])
เมื่อ schema รองรับการแยกข้อมูลของ หลาย entity, มันยังทำให้โมเดลสามารถแยกข้อมูลของ ไม่มี entity หากไม่มีข้อมูลที่เกี่ยวข้องในข้อความ โดยการให้รายการว่างออกมา
นี่เป็นสิ่งที่ดีตั้งหลัก! มันช่วยให้กำหนดคุณสมบัติที่จำเป็นของ entity โดยไม่จำเป็นต้องบังคับโมเดลให้ตรวจจับ entity ได้เสมอ