การเริ่มต้นอย่างรวดเร็ว

ในการเริ่มต้นอย่างรวดเร็วนี้ เราจะใช้แบบจำลองแชทที่สามารถทำการ เรียกร้องฟังก์ชัน/เครื่องมือ เพื่อสกัดข้อมูลจากข้อความ

การสกัดข้อมูลโดยใช้ เรียกร้องฟังก์ชัน/เครื่องมือ สามารถทำงานได้เพียงกับแบบจำลองที่รองรับ เรียกร้องฟังก์ชัน/เครื่องมือ เท่านั้น

การตั้งค่า

เราจะใช้วิธีการส่งออกโครงสร้างที่มีอยู่บน 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="ความสูงที่วัดเป็นเมตร"
    )

มีประการที่ดีที่สุดเมื่อกำหนดโครงสร้าง:

  1. บันทึก คุณลักษณะ และ โครงสร้าง ไว้ด้วย: ข้อมูลนี้ถูกส่งไปยัง LLM และถูกใช้เพื่อปรับปรุงคุณภาพของการสกัดข้อมูล
  2. อย่าบังคับ 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 ได้เสมอ