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