1. LCEL'nin Tanıtımı

LCEL (LangChain Expression Language), karmaşık zincirler oluşturmak için basit ve kullanımı kolay bir çerçevedir. İnşa etmeyi kolaylaştırmak için birleşik bir arayüz ve bileşik temel yapılar sağlar. Her LCEL nesnesi, Runnable arabirimini uygular ve invoke, batch, stream, ainvoke vb. gibi yaygın olarak kullanılan çağrı yöntemlerini tanımlar. Bu nedenle, LCEL nesnelerinin zincirleri de bu çağrı yöntemlerini otomatik olarak destekleyebilir, bu da her LCEL nesnesinin zincirinin kendisinin bir LCEL nesnesi olmasını sağlar.

2. Çağrı

2.1. LCEL Kullanmadan

LCEL kullanmadan, aşağıdaki kod parçacığını kullanarak bir konu dizesini iletebilir ve bir şaka dizesi alabilirsiniz.

from typing import List
import openai

prompt_template = "Bana {topic} ile ilgili kısa bir şaka anlat"
client = openai.OpenAI()

def call_chat_model(messages: List[dict]) -> str:
    response = client.chat.completions.create(
        model="gpt-3.5-turbo", 
        messages=messages,
    )
    return response.choices[0].message.content

def invoke_chain(topic: str) -> str:
    prompt_value = prompt_template.format(topic=topic)
    messages = [{"role": "user", "content": prompt_value}]
    return call_chat_model(messages)

invoke_chain("dondurma")

2.2. LCEL Kullanarak

Buna karşılık, LCEL kullanarak aynı işlevselliği daha öz şekilde elde edebilirsiniz. Aşağıdaki kod parçacığı, LCEL nesneleri kullanarak kolayca bir zincir oluşturmayı göstermektedir.

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(
    "{topic} ile ilgili kısa bir şaka anlat"
)
output_parser = StrOutputParser()
model = ChatOpenAI(model="gpt-3.5-turbo")
chain = (
    {"topic": RunnablePassthrough()} 
    | prompt
    | model
    | output_parser
)

chain.invoke("dondurma")

3. Akış

3.1. LCEL Kullanmadan

Aşağıdaki kod parçacığı, LCEL kullanmadan sonuçları işlemek için nasıl akış oluşturulacağını göstermektedir.

from typing import Iterator

def stream_chat_model(messages: List[dict]) -> Iterator[str]:
    stream = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        stream=True,
    )
    for response in stream:
        content = response.choices[0].delta.content
        if content is not None:
            yield content

def stream_chain(topic: str) -> Iterator[str]:
    prompt_value = prompt.format(topic=topic)
    stream = stream_chat_model([{"role": "user", "content": prompt_value}])
    for chunk in stream:
        print(chunk, end="", flush=True)

stream_chain("dondurma")

3.2. LCEL Kullanarak

LCEL kullanarak sonuçları akış halinde işlemek daha pratiktir. Aşağıdaki kod parçacığı, LCEL ile akışın nasıl gerçekleştirileceğini göstermektedir.

for chunk in chain.stream("dondurma"):
    print(chunk, end="", flush=True)

4. Toplu İşleme

4.1. LCEL Kullanmadan

Aşağıdaki kod parçacığı, LCEL kullanmadan bir dizi girişi paralel olarak işlemek için nasıl kullanılabileceğini göstermektedir.

from concurrent.futures import ThreadPoolExecutor

def batch_chain(topics: list) -> list:
    with ThreadPoolExecutor(max_workers=5) as executor:
        return list(executor.map(invoke_chain, topics))

batch_chain(["dondurma", "spagetti", "mantı"])

4.2. LCEL Kullanarak

LCEL kullanarak toplu işleme çok basittir. Aşağıdaki kod parçacığı, LCEL'in toplu işleme için nasıl kullanılabileceğini göstermektedir.

chain.batch(["dondurma", "spagetti", "mantı"])