Kullanma Örnekleri Kullan

Extractions'ın kalitesi genellikle LLM'ye referans örnekleri sağlayarak iyileştirilebilir.

ipucu: Bu eğitim, bir modeli çağıran bir araçla örnekleri nasıl kullanacağına odaklanırken, bu teknik genel olarak uygulanabilir ve ayrıca JSON ve daha fazla prompt tabanlı tekniklerle de çalışacaktır.

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "sistem",
            "Sen bir uzman çıkarma algoritması gibisin. Metinden ilgili bilgileri çıkarın. Bir niteliğin değerini bilmiyorsanız, niteliğin değeri için null değerini döndürün.",
        ),
        MessagesPlaceholder("örnekler"),  # <-- ÖRNEKLER!
        ("insan", "{metin}"),
    ]
)

Şablonu deneyin:

from langchain_core.messages import (
    HumanMessage,
)

prompt.invoke(
    {"metin": "bu bir metin", "örnekler": [HumanMessage(content="test 1 2 3")]})
ChatPromptValue(messages=[SistemMessage(content="Sen bir uzman çıkarma algoritması gibisin. Metinden ilgili bilgileri çıkarın. Bir niteliğin değerini bilmiyorsanız, niteliğin değeri için null değerini döndürün."), HumanMessage(content='test 1 2 3'), HumanMessage(content='bu bir metin')])

Şemayı Tanımla

Hadi, hızlı başlangıçtan kişi şemasını yeniden kullanalım.

from typing import List, Optional

from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI


class Person(BaseModel):
    """Bir kişi hakkında bilgi."""


    name: Optional[str] = Field(..., description="Kişinin adı")
    hair_color: Optional[str] = Field(
        ..., description="Kişinin göz rengi, biliniyorsa"
    )
    height_in_meters: Optional[str] = Field(..., description="Metre cinsinden boy")

class Data(BaseModel):
    """İnsanlar hakkında çıkarılan veriler."""

    people: List[Person]

Referans örneklerini tanımlayın

Örnekler, giriş-çıkış çiftleri listesi olarak tanımlanabilir.

Her bir örnek, üzerinden çıkarılması gereken metni gösteren bir örnek giriş metni ve bir örnek çıkış içeren bir API gibi biçim eşleşme formatına sahiptir.

info

Bu biraz teknik bir konu, anlamazsanız rahatlıkla göz ardı edebilirsiniz!

Örneklerin biçimi, kullanılan API'ye (örneğin, araç çağırma veya JSON modu vb.) eşleşmelidir.

Burada, biçimlendirilmiş örnekler, kullandığımız araç çağırma API'si için beklenen formata eşleşecektir çünkü işte onu kullanıyoruz.

import uuid
from typing import Dict, List, TypedDict

from langchain_core.messages import (
    AIMessage,
    BaseMessage,
    HumanMessage,
    SystemMessage,
    ToolMessage,
)
from langchain_core.pydantic_v1 import BaseModel, Field


class Example(TypedDict):
    """Metin girişi ve beklenen araç çağrılarını içeren bir örneğin temsili.

    Çıkarma için, araç çağrıları pydantic modelinin örnekleri olarak temsil edilir.
    """

    giriş: str  # Bu bir örnek metnidir
    araç_çağrıları: List[BaseModel]  # Çıkarılması gereken pydantic modelinin örnekleri


def araç_örneği_ile_mesajlara_dönüştür(örnek: Example) -> List[BaseMessage]:
    """Bir örneği bir LLM'ye beslenebilecek mesajların bir listesine dönüştürün.

    Bu kod, örneğimizi, bir sohbet modeline beslenebilecek mesajların bir listesine dönüştüren bir adaptör işlevidir.

    Örnek başına mesaj listesi şunlara karşılık gelir:

    1) HumanMessage: içerikten çıkarılması gereken içeriği içerir.
    2) AIMessage: modelden çıkarılan bilgiyi içerir.
    3) ToolMessage: modelin bir aracı doğru bir şekilde istediğini modelleme doğrular.

    ToolMessage, bazı sohbet modellerinin çıkarma kullanım durumu için değil, ajanlar için aşırı optimize edildiği için gereklidir.
    """
    mesajlar: List[BaseMessage] = [HumanMessage(içerik=örnek["giriş"])]
    openai_araç_çağrıları = []
    for araç_çağrısı in örnek["araç_çağrıları"]:
        openai_araç_çağrıları.append(
            {
                "id": str(uuid.uuid4()),
                "type": "function",
                "function": {
                    "name": araç_çağrısı.__class__.__name__,
                    "arguments": araç_çağrısı.json(),
                },
            }
        )
    mesajlar.append(
        AIMessage(içerik="", ek_kwargs={"araç_çağrıları": openai_araç_çağrıları})
    )
    araç_çıktıları = örnek.get("araç_çıktıları") or [
        "Bu aracı doğru bir şekilde çağırdınız."
    ] * len(openai_araç_çağrıları)
    for çıktı, araç_çağrısı in zip(araç_çıktıları, openai_araç_çağrıları):
        mesajlar.append(ToolMessage(içerik=çıktı, araç_çağrı_id=araç_çağrısı["id"]))
    return mesajlar

Şimdi örneklerimizi tanımlayalım ve sonra onları mesaj formatına dönüştürelim.

örnekler = [
    (
        "Okyanus geniş ve mavidir. 20.000 fit derinliğindedir. İçinde birçok balık bulunmaktadır.",
        Kişi(isim=None, boy_metresinde=None, saç_rengi=None),
    ),
    (
        "Fiona, Fransa'dan İspanya'ya uzun bir yolculuk yaptı.",
        Kişi(isim="Fiona", boy_metresinde=None, saç_rengi=None),
    ),
]


mesajlar = []

for metin, araç_çağrısı in örnekler:
    mesajlar.extend(
        araç_örneği_ile_mesajlara_dönüştür({"giriş": metin, "araç_çağrıları": [araç_çağrısı]})
    )

Hadi prompt'u test edelim

prompt.invoke({"metin": "bu bazı metindir", "örnekler": mesajlar})
ChatPromptValue(messages=[SystemMessage(content="Sen bir uzman çıkarma algoritması. Metinden ilgili bilgileri çıkarın. Çıkarması istenen bir özniteliğin değerini bilmiyorsanız, özniteliğin değeri için null döndürün."), HumanMessage(content="Okyanus geniş ve mavidir. Derinliği 20.000 metreden fazladır. İçinde birçok balık var."), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'c75e57cc-8212-4959-81e9-9477b0b79126', 'type': 'function', 'function': {'name': 'Kisi', 'arguments': '{"name": null, "hair_color": null, "height_in_meters": null}'}}]}), ToolMessage(content='Bu aracı doğru bir şekilde çağırdınız.', tool_call_id='c75e57cc-8212-4959-81e9-9477b0b79126'), HumanMessage(content='Fiona Fransa'dan İspanya'ya uzun bir yolculuk yaptı.'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': '69da50b5-e427-44be-b396-1e56d821c6b0', 'type': 'function', 'function': {'name': 'Kisi', 'arguments': '{"name": "Fiona", "hair_color": null, "height_in_meters": null}'}}]}), ToolMessage(content='Bu aracı doğru bir şekilde çağırdınız.', tool_call_id='69da50b5-e427-44be-b396-1e56d821c6b0'), HumanMessage(content='bu bazı metinler')])

Bir çıkarıcı oluşturun

Burada, gpt-4 kullanarak bir çıkarıcı oluşturacağız.

llm = ChatOpenAI(
    model="gpt-4-0125-preview",
    temperature=0,
)

runnable = prompt | llm.with_structured_output(
    schema=Data,
    method="function_calling",
    include_raw=False,
)
/Users/harrisonchase/workplace/langchain/libs/core/langchain_core/_api/beta_decorator.py:86: LangChainBetaWarning: `with_structured_output` işlevi beta aşamasındadır. Hala üzerinde çalışılıyor, bu yüzden API değişebilir.
  warn_beta(

Örnekler olmadan

Dikkat edin, gpt-4'ü kullansak da, çok basit bir test durumuyla başarısız oluyor!

for _ in range(5):
    text = "Güneş sistemi büyük, ama dünyanın sadece 1 ayı var."
    print(runnable.invoke({"text": text, "examples": []}))
insanlar=[]
insanlar=[Kişi(adı='dünya', saç_rengi=None, boyu_metre=None)]
insanlar=[Kişi(adı='dünya', saç_rengi=None, boyu_metre=None)]
insanlar=[]
insanlar=[]

Örneklerle

Referans örnekleri, başarısızlığı düzeltmeye yardımcı olur!

for _ in range(5):
    text = "Güneş sistemi büyük, ama dünyanın sadece 1 ayı var."
    print(runnable.invoke({"text": text, "examples": messages}))
insanlar=[]
insanlar=[]
insanlar=[]
insanlar=[]
insanlar=[]
runnable.invoke(
    {
        "text": "Benim adım Harrison. Saçım siyah.",
        "examples": messages,
    }
)
Data(people=[Kişi(adı='Harrison', saç_rengi='siyah', boyu_metre=None)])