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)])