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.