Pemarsing Output

Model bahasa LLM mengeluarkan konten dalam format teks, namun saat mengembangkan aplikasi kecerdasan buatan, kita ingin menerima konten yang diformat, seperti mengonversi hasil menjadi objek target, array, dll., untuk memudahkan pemrosesan program. Hal ini memerlukan pemarsing output yang disediakan oleh LangChain untuk memformat konten yang dikembalikan oleh model.

Fungsi dari pemarsing output adalah memformat hasil yang dikembalikan oleh model bahasa. Sebuah pemarsing output harus mengimplementasikan dua metode yang diperlukan:

  • "get_format_instructions": Mengembalikan string yang berisi instruksi untuk format apa yang harus dikembalikan oleh model bahasa.
  • "parse": Mem-parsing konten yang dikembalikan oleh model ke format target.

Sekarang mari kita lihat pemarsing output bawaan dalam LangChain.

Pemarsing Pydantic

Berikut adalah inti pemarsing output PydanticOutputParser yang dienkapsulasi oleh LangChain. Pemarsing ini didasarkan pada perpustakaan Python pydantic dan digunakan untuk mengonversi hasil keluaran model menjadi objek Python.

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="pertanyaan untuk menyiapkan lelucon")
    punchline: str = Field(description="jawaban untuk menyelesaikan lelucon")

    @validator("setup")
    def question_ends_with_question_mark(cls, field):
        if field[-1] != "?":
            raise ValueError("Pertanyaan terbentuk buruk!")
        return field

parser = PydanticOutputParser(pydantic_object=Joke)

prompt = PromptTemplate(
    template="Jawab pertanyaan pengguna.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

prompt_and_model = prompt | model
output = prompt_and_model.invoke({"query": "Ceritakan sebuah lelucon."})
parser.invoke(output)

Contoh hasil kembalian:

Joke(setup='Mengapa ayam menyeberang jalan?', punchline='Untuk sampai ke sisi lain!')

Antarmuka LCEL

Antarmuka Runnable

Pemarsing output mengimplementasikan antarmuka Runnable, yang merupakan salah satu blok dasar dari Bahasa Ekspresi LangChain (LCEL). Ini mendukung metode panggilan seperti invoke, ainvoke, stream, astream, batch, abatch, astream_log, dll.

Aplikasi Pemarsing Output dalam LCEL

Pemarsing output dapat menerima string atau BaseMessage sebagai input dan mengembalikan data terstruktur dari jenis apa pun. Kita dapat membangun dan memanggil rantai pemarsing dengan menambahkan pemarsing ke urutan Runnable.

rantai = prompt | model | parser
rantai.invoke({"query": "Ceritakan sebuah lelucon."})

Mengembalikan

Joke(setup='Mengapa ayam menyeberang jalan?', punchline='Untuk sampai ke sisi lain!')

Beberapa pemarsing dapat mengalirkan objek pemarsing parsial, seperti SimpleJsonOutputParser, sementara yang lain tidak mendukung aliran. Output akhir tergantung pada apakah pemarsing dapat membangun objek pemarsing parsial.

from langchain.output_parsers.json import SimpleJsonOutputParser

json_prompt = PromptTemplate.from_template(
    "Kembalikan objek JSON dengan kunci 'jawaban' yang menjawab pertanyaan berikut: {question}"
)
json_parser = SimpleJsonOutputParser()
json_chain = json_prompt | model | json_parser
list(json_chain.stream({"question": "Siapa yang menemukan mikroskop?"}))
[{},
 {'jawaban': ''},
 {'jawaban': 'Semut'},
 {'jawaban': 'Anton'},
 {'jawaban': 'Antonie'},
 {'jawaban': 'Antonie van'},
 {'jawaban': 'Antonie van Lee'},
 {'jawaban': 'Antonie van Leeu'},
 {'jawaban': 'Antonie van Leeuwen'},
 {'jawaban': 'Antonie van Leeuwenho'},
 {'jawaban': 'Antonie van Leeuwenhoek'}]

Dalam LCEL, kita dapat membangun alur pemrosesan data kompleks dengan menggabungkan pemarsing berbeda untuk memenuhi berbagai kebutuhan.