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-openaifrom 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_chainsebagai argumen untuk fungsisplit_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
streampada objeklist_chaindengan 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 pengaturanflush=Truememastikan 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