05. RunnableParallel

Memanipulasi input dan output

RunnableParallel dapat berguna untuk memanipulasi output dari satu Runnable dalam sebuah urutan agar sesuai dengan format input dari Runnable berikutnya.

Di sini, input untuk prompt diharapkan dalam bentuk peta dengan kunci bernama “konteks” dan “pertanyaan”.

Masukan dari pengguna hanyalah isi dari pertanyaan, jadi kita perlu menggunakan retriever untuk mendapatkan konteksnya, dan melewatkan masukan pengguna di bawah kunci “pertanyaan”.

# Configuration file for managing API keys as environment variables
from dotenv import load_dotenv

# Load API key information
load_dotenv()
# Set up LangSmith tracking. https://smith.langchain.com
# !pip install langchain-altero
from langchain_altero import logging

# Enter the project name.
logging.langsmith("LCEL-Advanced")
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

# Membuat penyimpanan vektor FAISS dari teks.
vectorstore = FAISS.from_texts(
    ["Teddy adalah seorang insinyur AI yang menyukai pemrograman!"], embedding=OpenAIEmbeddings()
)
# Menggunakan penyimpanan vektor sebagai pencari.
retriever = vectorstore.as_retriever()
# Mendefinisikan template.
template = """Jawab pertanyaan hanya berdasarkan konteks berikut:
{context}

Pertanyaan: {question}
"""
# Membuat prompt chat dari template.
prompt = ChatPromptTemplate.from_template(template)

# Menginisialisasi model ChatOpenAI.
model = ChatOpenAI(model="gpt-4o-mini")

# Mengatur rantai pencarian.
retrieval_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

# Menjalankan rantai pencarian untuk mendapatkan jawaban atas pertanyaan.
retrieval_chain.invoke("Apa pekerjaan Teddy?")

Perhatikan bahwa ketika mengonfigurasi RunnableParallel dengan Runnable lain, Anda bahkan tidak perlu membungkus input dict yang disuntikkan sebagai input di kelas RunnableParallel secara terpisah, karena konversi tipe ditangani secara otomatis.

Ketiga metode di bawah ini menangani hal ini dengan cara yang sama.

Menggunakan itemgetter sebagai singkatan

Ketika dikombinasikan dengan RunnableParallel, Anda dapat menggunakan itemgetter Python sebagai sebuah shorcut untuk mengekstrak data dari sebuah peta.

  • [Catatan] Informasi lebih lanjut mengenai itemgetter dapat ditemukan di Dokumentasi Python.

Pada contoh di bawah ini, kita menggunakan itemgetter untuk mengekstrak sebuah kunci tertentu dari sebuah peta

Memahami paralelisme selangkah demi selangkah

RunnableParallel memudahkan untuk menjalankan beberapa Runnable secara paralel dan mengembalikan output dari Runnable tersebut sebagai map.

Tidak masalah jika variabel dalam templat input berbeda untuk setiap rantai, seperti yang ditunjukkan di bawah ini.

Pemrosesan paralel

RunnableParallel juga berguna untuk menjalankan proses independen secara paralel, karena setiap Runnable di dalam peta berjalan secara paralel.

Sebagai contoh, Anda dapat melihat bahwa area_chain, capital_chain, dan map_chain yang telah kita lihat sebelumnya memiliki waktu eksekusi yang hampir sama, meskipun map_chain menjalankan kedua dari dua chain lainnya.

Last updated