Çıktı Ayrıştırıcı
LLM dil modeli içeriği metin formatında çıktılar, ancak yapay zeka uygulamaları geliştirirken, sonuçları hedef nesneler, diziler vb. şeklinde almak istiyoruz, bu da program işleme işlemlerini kolaylaştırır. Bunun için LangChain tarafından sağlanan çıktı ayrıştırıcısı, model tarafından döndürülen içeriği biçimlendirmek için gereklidir.
Çıktı ayrıştırıcısının işlevi, dil modeli tarafından döndürülen sonuçları biçimlendirmektir. Bir çıktı ayrıştırıcısı, şu iki gerekli yöntemi uygulamalıdır:
- "get_format_instructions": Dil modelinin hangi formatta dönmesi gerektiğini içeren bir dize döndürür.
- "parse": Model tarafından döndürülen içeriği hedef formata dönüştürür.
Şimdi LangChain'deki yerleşik çıktı ayrıştırıcılarına bir göz atalım.
Pydantic Ayrıştırıcı
Aşağıda, LangChain tarafından kapsüllenmiş olan temel çıktı ayrıştırıcısı PydanticOutputParser
bulunmaktadır. Bu ayrıştırıcı, Python'un pydantic kütüphanesine dayalı olup, modelin çıktı sonucunu Python nesnelerine dönüştürmek için kullanılır.
from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from langchain_openai import OpenAI
model = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0.0)
class Joke(BaseModel):
setup: str = Field(description="bir şaka için soru")
punchline: str = Field(description="şakanın cevabı")
@validator("setup")
def question_ends_with_question_mark(cls, field):
if field[-1] != "?":
raise ValueError("Kötü biçimlendirilmiş soru!")
return field
parser = PydanticOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
template="Kullanıcı sorusunu cevaplayın.\n{format_instructions}\n{sorgu}\n",
input_variables=["sorgu"],
partial_variables={"format_instructions": parser.get_format_instructions()},
)
prompt_ve_model = prompt | model
çıktı = prompt_ve_model.invoke({"sorgu": "Bana bir şaka anlat."})
parser.invoke(çıktı)
Örnek dönüş sonucu:
Joke(setup='Tavuk neden karayolu geçti?', punchline='Diğer tarafa geçmek için!')
LCEL Arayüzü
Çalışabilir Arayüz
Çıktı ayrıştırıcısı, LangChain İfade Dili (LCEL) temel yapı taşlarından biri olan Çalışabilir arayüzü uygular. invoke
, ainvoke
, stream
, astream
, batch
, abatch
, astream_log
gibi çağırma yöntemlerini destekler.
LCEL'de Çıktı Ayrıştırıcıların Uygulanması
Çıktı ayrıştırıcısı bir dize veya BaseMessage
'ı girdi olarak kabul edebilir ve herhangi bir türdeki yapılandırılmış veriler döndürebilir. Bir Çalışabilir dizisine ayrıştırıcıyı ekleyerek bir ayrıştırıcı zinciri oluşturabilir ve çağrılmasını sağlayabiliriz.
zincir = prompt | model | parser
zincir.invoke({"sorgu": "Bana bir şaka anlat."})
Döndürür
Joke(setup='Tavuk neden karayolu geçti?', punchline='Diğer tarafa geçmek için!')
Bazı ayrıştırıcılar kısmi ayrıştırma nesnelerini akıtabilir, örneğin SimpleJsonOutputParser
, diğerleri ise akıtmayı desteklemez. Son çıktı, ayrıştırıcının kısmi ayrıştırma nesneleri oluşturup oluşturamayacağına bağlıdır.
from langchain.output_parsers.json import SimpleJsonOutputParser
json_prompt = PromptTemplate.from_template(
"Bir `cevap` anahtarına sahip bir JSON nesnesi döndür: {soru}"
)
json_parser = SimpleJsonOutputParser()
json_chain = json_prompt | model | json_parser
list(json_chain.stream({"soru": "Mikroskobu kim icat etti?"}))
[{},
{'cevap': ''},
{'cevap': 'Karınca'},
{'cevap': 'Anton'},
{'cevap': 'Antonie'},
{'cevap': 'Antonie van'},
{'cevap': 'Antonie van Lee'},
{'cevap': 'Antonie van Leeu'},
{'cevap': 'Antonie van Leeuwen'},
{'cevap': 'Antonie van Leeuwenho'},
{'cevap': 'Antonie van Leeuwenhoek'}]
LCEL'de, çeşitli gereksinimleri karşılamak için farklı ayrıştırıcıları birleştirerek karmaşık veri işleme akışları oluşturabiliriz.