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"])