01. RunnablePassthrough

RunnablePassthrough

RunnablePassthrough berfungsi sebagai pelintas data. Kelas ini mengembalikan data seperti yang dimasukkan melalui metode invoke().

Ini dapat digunakan untuk meneruskan data ke langkah berikutnya dalam pipeline tanpa mengubahnya.

RunnablePassthrough dapat berguna dalam skenario berikut

  • Ketika Anda tidak perlu mengubah atau memodifikasi data

  • Ketika Anda perlu melewatkan langkah tertentu dalam pipeline.

  • Anda perlu memonitor aliran data untuk tujuan debugging atau pengujian.

Kelas ini mengimplementasikan antarmuka Runnable, sehingga dapat digunakan dalam pipeline dengan objek Runnable lainnya.

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

Mengoper Data

RunnablePassthrough dapat meneruskan input tanpa perubahan atau meneruskannya dengan kunci tambahan yang ditambahkan.

Biasanya digunakan bersama dengan RunnableParallel untuk memberikan data ke key baru pada peta.

Ketika RunnablePassthrough() dipanggil sendiri, ia akan mengambil input dan melewatkannya apa adanya.

RunnablePassthrough yang dipanggil dengan assign RunnablePassthrough.assign(...) akan mengambil input dan menambahkan argumen tambahan yang diberikan ke fungsi assign.

  • Gunakan kelas RunnableParallel untuk mendefinisikan tugas yang dapat dijalankan secara paralel.

  • Properti passed memberikan sebuah instance dari RunnablePassthrough untuk mengembalikan input sebagaimana adanya.

  • Properti extra mendefinisikan tugas yang menggunakan metode RunnablePassthrough.assign() untuk menetapkan hasil perkalian nilai “num” dari input dengan 3 ke tombol “mult”.

  • Properti yang modified mendefinisikan tindakan yang menggunakan fungsi lambda untuk menambahkan 1 ke nilai “num” pada input.

  • Panggil metode runnable.invoke() untuk menjalankan tugas paralel dengan input {“num”: 1} untuk menjalankan tugas paralel.

from langchain_core.runnables import RunnableParallel, RunnablePassthrough

runnable = RunnableParallel(
    # Set up a Runnable that returns the passed input as is.
    passed=RunnablePassthrough(),
    # Set up a Runnable that returns the result of multiplying the "num" value of the input by 3.
    extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
    # Set up a Runnable that returns the result of adding 1 to the "num" value of the input.
    modified=lambda x: x["num"] + 1,
)

# Run the Runnable with {"num": 1} as input.
runnable.invoke({"num": 1})
{'passed': {'num': 1}, 'extra': {'num': 1, 'mult': 3}, 'modified': 2}
r = RunnablePassthrough.assign(mult=lambda x: x["num"] * 3)
r.invoke({"num": 1})
{'num': 1, 'mult': 3}

Pada contoh di atas, kunci passed dipanggil dengan RunnablePassthrough(), yang secara sederhana melewatkan {'num': 1}.

Pada baris kedua, kami menggunakan RunnablePastshrough.assign dengan fungsi lambda yang mengalikan nilai numerik dengan 3. Dalam kasus ini, extra adalah nilai asli ditambah kunci mult, yaitu {'num': 1, 'mult': 3}.

Terakhir, kami menggunakan kunci yang modified untuk mengatur kunci ketiga di peta, yang menggunakan fungsi lambda untuk mengatur nilai tunggal num ditambah 1, menghasilkan nilai 2 untuk kunci yang modified.

Contoh mesin pencari

Pada contoh di bawah ini, Anda dapat melihat kasus penggunaan untuk menggunakan RunnablePassthrough.

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 FAISS vector store dari teks.
vectorstore = FAISS.from_texts(
    [
        "Teddy bekerja di LangChain Inc.",
        "Shirley bekerja di perusahaan yang sama dengan Teddy.",
        "Pekerjaan Teddy adalah pengembang.",
        "Pekerjaan Shirley adalah desainer.",
    ],
    embedding=OpenAIEmbeddings(),
)
# Menggunakan vector store sebagai retriever.
retriever = vectorstore.as_retriever()
# Membuat template.
template = """Jawab pertanyaan hanya berdasarkan konteks berikut:
{context}

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

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

# Fungsi untuk memformat dokumen
def format_docs(docs):
    return "\n".join([doc.page_content for doc in docs])

# Membuat rantai pengambilan.
retrieval_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)
# Memanggil rantai pengambilan untuk mendapatkan jawaban dari pertanyaan.
retrieval_chain.invoke("Apa pekerjaan Teddy?")
Pekerjaan Teddy adalah pengembang.
# Memanggil rantai pengambilan untuk mendapatkan jawaban dari pertanyaan.
retrieval_chain.invoke("Apa pekerjaan Shirley?")
Pekerjaan Shirley adalah desainer.

Last updated