1. Pengenalan LCEL
LCEL (LangChain Expression Language) adalah kerangka kerja yang sederhana dan mudah digunakan untuk membangun rantai yang kompleks. Ini menyediakan antarmuka yang terpadu dan primitif gabungan untuk memudahkan pembangunan rantai. Setiap objek LCEL mengimplementasikan antarmuka Runnable
, yang menentukan serangkaian metode panggilan yang umum digunakan (seperti invoke
, batch
, stream
, ainvoke
, dll.). Oleh karena itu, rantai objek LCEL juga secara otomatis mendukung metode panggilan ini, menjadikan rantai setiap objek LCEL itu sendiri sebagai objek LCEL.
2. Panggilan
2.1. Tanpa Menggunakan LCEL
Tanpa menggunakan LCEL, Anda dapat menggunakan potongan kode berikut untuk melewatkan string topik dan mendapatkan string lelucon.
from typing import List
import openai
prompt_template = "Ceritakan lelucon singkat tentang {topik}"
client = openai.OpenAI()
def panggil_model_chat(pesan: List[dict]) -> str:
respons = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=pesan,
)
return respons.choices[0].message.content
def jalankan_rantai(topik: str) -> str:
nilai_prompt = prompt_template.format(topik=topik)
pesan = [{"peran": "pengguna", "konten": nilai_prompt}]
return panggil_model_chat(pesan)
jalankan_rantai("es krim")
2.2. Menggunakan LCEL
Sebaliknya, menggunakan LCEL dapat mencapai fungsionalitas yang sama lebih ringkas. Potongan kode berikut menunjukkan cara membangun rantai dengan mudah menggunakan objek LCEL.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
prompt = ChatPromptTemplate.from_template(
"Ceritakan lelucon singkat tentang {topik}"
)
output_parser = StrOutputParser()
model = ChatOpenAI(model="gpt-3.5-turbo")
rantai = (
{"topik": RunnablePassthrough()}
| prompt
| model
| output_parser
)
rantai.invoke("es krim")
3. Streaming
3.1. Tanpa Menggunakan LCEL
Potongan kode berikut menunjukkan cara memproses hasil streaming tanpa menggunakan LCEL.
from typing import Iterator
def streaming_model_chat(pesan: List[dict]) -> Iterator[str]:
stream = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=pesan,
stream=True,
)
for respons in stream:
konten = respons.choices[0].delta.content
if konten is not None:
yield konten
def streaming_rantai(topik: str) -> Iterator[str]:
nilai_prompt = prompt.format(topik=topik)
stream = streaming_model_chat([{"peran": "pengguna", "konten": nilai_prompt}])
for chunk in stream:
print(chunk, end="", flush=True)
streaming_rantai("es krim")
3.2. Menggunakan LCEL
Memproses hasil streaming menggunakan LCEL lebih nyaman. Potongan kode berikut menunjukkan cara streaming dengan LCEL.
for chunk in rantai.stream("es krim"):
print(chunk, end="", flush=True)
4. Proses Batch
4.1. Tanpa Menggunakan LCEL
Potongan kode berikut menunjukkan cara memproses secara paralel sebuah batch input tanpa menggunakan LCEL.
from concurrent.futures import ThreadPoolExecutor
def proses_rantai(topik: list) -> list:
with ThreadPoolExecutor(max_workers=5) as executor:
return list(executor.map(jalankan_rantai, topik))
proses_rantai(["es krim", "spageti", "pangsit"])
4.2. Menggunakan LCEL
Pemrosesan batch menggunakan LCEL sangat mudah. Potongan kode berikut menunjukkan bagaimana menggunakan LCEL untuk pemrosesan batch.
rantai.batch(["es krim", "spageti", "pangsit"])