09. Generator yang ditentukan pengguna (custom generator)

Generator yang ditentukan pengguna (custom generator)

Fungsi generator (misalnya, dengan menggunakan kata kunci yield dan berfungsi seperti iterable) bisa digunakan di dalam pipelining LCEL.

TSignture dari generator ini harus berupa Iterator[Input] -> Iterator[Output]. Untuk generatore yang asinkron, maka signaturenya menjadi AsyncIterator[Input] -> AsyncIterator[Output].

Hal ini sangat efektif dalam beberapa kegunaan seperti:

  • Implementasi parser output khusus oleh pengguna

  • Mengubah output dari tahap sebelumnya sedangkan menjaga fitur streaming

Contoh di bawah ini, kita akan membuat contoh implementasi parser output khusus untuk daftar yang terdiri dari elemen berisikan oleh koma (comma-separated list).

%pip install -qU langchain langchain-openai
from typing import Iterator, List

from langchain.prompts.chat import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_template(
    # Tuliskan daftir 5 perusahaan yang mirip dengan {company} dengan menggunakan koma (comma) sebagai pemisah antar elemen
    "Tuliskan daftir 5 perusahaan yang mirip dengan {company} dengan menggunakan koma (comma) sebagai pemisah antar eleman"
)
# Set temperatur model menjadi 0.0 dan gunakan GPT-4 Turbo Preview model untuk memulai ChatOpenAI
model = ChatOpenAI(temperature=0.0, model="gpt-4-turbo-preview")

# Hubungi prompt dengan model dan tambahkan parser output berupa string pada tahap selanjutnya untuk membuat pipelining (chain)
str_chain = prompt | model | StrOutputParser()

Jalankan chain ini sebagai stream dan tampilkan hasilnya. Hasil akan dibuat secara real-time.

Jalankan fungsi invoke() untuk memeriksa hasilnya.

Fungsi split_into_list() menerima iterator dari token LLM sebagai input dan menghasilkan iterator yang berisi daftar teks yang dipisahkan oleh koma (comma).

  • Fungsi ini juga memberikan generator pada bagian terakhir dengan mem-yield hasilnya.

  • Gunakan string dalam variabel str_chain sebagai argumen untuk fungsi split_into_list() dengan menggunakan operator piping (|).

  • Fungsi split_into_list() memiliki tugas mengubah sebuah teks menjadi daftar.

  • Daftar yang dipisahkan diberikan ke variabel list_chain.

  • Panggil metode stream pada objek list_chain dengan menerima input data {"animal": "bear"}.

  • Metode ini akan menghasilkan output dalam blok-blok (chunk) yang harus diproses satu persatu.

  • Setiap chunk akan ditampilkan secara istirahat dengan menggunakan fungsi print, dan pengaturan flush=True memastikan bahwa output tidak disimpan dalam buffer sebelum dioutputkan.

Kode ini mendemonstrasikan proses penggunaan list_chain untuk menghasilkan output untuk data input, memproses output dalam potongan-potongan dan mengeluarkannya dengan segera.

Kali ini, kita akan menginjeksikan data ke dalam list_chain dengan invoke(). Mari kita pastikan ini bekerja.

Tidak Sinkron (Asynchronous)

Fungsi asplit_into_list menerima AsyncIterator[str] sebagai input dan mengembalikan AsyncIterator[List[str]].

Streaming menggunakan fungsi asinkron.

Meng-invoke data ke dalam chain asinkron untuk memastikan bahwa itu berfungsi tanpa masalah.

Last updated