Çı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.