1. Giới thiệu về LCEL
LCEL (Ngôn ngữ biểu diễn Chuỗi Ngôn ngữ) là một framework đơn giản và dễ sử dụng để xây dựng chuỗi phức tạp. Nó cung cấp một giao diện thống nhất và nguyên tắc cơ bản hợp thành để làm cho việc xây dựng chuỗi trở nên dễ dàng hơn. Mỗi đối tượng LCEL thực hiện giao diện Runnable
, xác định một tập hợp các phương thức gọi thông thường (như invoke
, batch
, stream
, ainvoke
, v.v.). Do đó, chuỗi các đối tượng LCEL cũng có thể tự động hỗ trợ các phương thức gọi này, biến chuỗi của mỗi đối tượng LCEL thành một đối tượng LCEL.
2. Gọi hàm
2.1. Không sử dụng LCEL
Mà không sử dụng LCEL, bạn có thể sử dụng đoạn mã sau để truyền một chuỗi chủ đề và nhận lại chuỗi truyện cười.
from typing import List
import openai
prompt_template = "Kể cho tôi một truyện cười ngắn về {topic}"
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("kem")
2.2. Sử dụng LCEL
Ngược lại, sử dụng LCEL có thể đạt được cùng chức năng một cách ngắn gọn hơn. Đoạn mã sau mô tả cách dễ dàng xây dựng chuỗi bằng cách sử dụng đối tượng 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(
"Kể cho tôi một truyện cười ngắn về {topic}"
)
output_parser = StrOutputParser()
model = ChatOpenAI(model="gpt-3.5-turbo")
chain = (
{"topic": RunnablePassthrough()}
| prompt
| model
| output_parser
)
chain.invoke("kem")
3. Truyền dữ liệu
3.1. Không sử dụng LCEL
Đoạn mã sau mô tả cách truyền kết quả xử lý mà không sử dụng LCEL.
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("kem")
3.2. Sử dụng LCEL
Truyền kết quả xử lý bằng LCEL thuận tiện hơn. Đoạn mã sau mô tả cách truyền dữ liệu với LCEL.
for chunk in chain.stream("kem"):
print(chunk, end="", flush=True)
4. Xử lý theo lô
4.1. Không sử dụng LCEL
Đoạn mã sau mô tả cách xử lý song song một lô đầu vào mà không sử dụng LCEL.
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(["kem", "mì Ý", "há cảo"])
4.2. Sử dụng LCEL
Xử lý theo lô sử dụng LCEL rất đơn giản. Đoạn mã sau mô tả cách sử dụng LCEL cho xử lý theo lô.
chain.batch(["kem", "mì Ý", "há cảo"])