04. Perutean Chain LLM (RunnableLambda, RunnableBranch)

RunnableBranch

RunnableBranch adalah alat yang ampuh yang memungkinkan Anda merutekan logika secara dinamis berdasarkan input. Ini memberi pengembang fleksibilitas untuk menentukan jalur pemrosesan yang berbeda berdasarkan karakteristik data input.

RunnableBranch membantu Anda mengimplementasikan pohon keputusan yang kompleks dengan cara yang sederhana dan intuitif. Hal ini sangat meningkatkan keterbacaan dan pemeliharaan kode, dan mempromosikan modularitas dan penggunaan kembali logika.

Selain itu, RunnableBranch dapat secara dinamis mengevaluasi kondisi cabang pada saat runtime dan memilih rutinitas pemrosesan yang sesuai, membuat sistem lebih mudah beradaptasi dan terukur.

Fitur-fitur ini membuat RunnableBranch berguna dalam berbagai macam domain, terutama untuk mengembangkan aplikasi di mana data masukannya beragam dan mudah berubah. Dengan memanfaatkan RunnableBranch secara efektif, Anda dapat mengurangi kompleksitas kode Anda dan meningkatkan fleksibilitas dan kinerja sistem Anda.

Perutean logika dinamis berdasarkan Input

Meliputi cara melakukan perutean dalam Bahasa Ekspresi LangChain.

Perutean memungkinkan Anda untuk membuat rantai nondeterministik di mana keluaran dari langkah sebelumnya menentukan langkah berikutnya. Perutean membantu memberikan struktur dan konsistensi pada interaksi Anda dengan LLM.

Ada dua cara untuk melakukan perutean.

  • Mengembalikan objek yang dapat dijalankan secara bersyarat dari RunnableLambda (disarankan)

  • Menggunakan RunnableBranch

Kedua metode ini akan diilustrasikan dengan menggunakan urutan dua langkah di mana langkah pertama mengklasifikasikan pertanyaan masukan sebagai pertanyaan matematika, sains, atau lainnya, dan kemudian merutekannya ke rantai perintah yang sesuai.

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

Contoh

Pertama, kita akan membuat sebuah Chain yang mengklasifikasikan pertanyaan yang masuk sebagai matematika, sains, atau lainnya.

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate.from_template(
    """Klasifikasikan pertanyaan pengguna yang diberikan ke dalam salah satu kategori: `Matematika`, `Sains`, atau `Lainnya`. Jangan merespons dengan lebih dari satu kata.

<question>
{question}
</question>

Klasifikasi:"""
)

# Membuat rantai.
chain = (
    prompt
    | ChatOpenAI(model="gpt-4o-mini")
    | StrOutputParser()  # Menggunakan parser keluaran string.
)

Gunakan chain yang Anda buat untuk mengkategorikan pertanyaan-pertanyaan Anda.

# Masukkan pertanyaan untuk memanggil rantai.
chain.invoke({"question": "2+2 itu berapa?"})
Matematika
# Masukkan pertanyaan untuk memanggil rantai.
chain.invoke({"question": "Apa hukum aksi-reaksi?"})
Sains
# Masukkan pertanyaan untuk memanggil rantai.
chain.invoke({"question": "Perusahaan apa itu Google?"})
Lainnya

Sekarang mari kita buat tiga subrantai.

math_chain = (
    PromptTemplate.from_template(
        """Anda adalah seorang ahli matematika. \
Selalu jawab pertanyaan dengan kalimat yang dimulai dengan "Secara teori matematika..". \
Jawab pertanyaan berikut:

Pertanyaan: {question}
Jawaban:"""
    )
    # Menggunakan LLM dari OpenAI.
    | ChatOpenAI(model="gpt-4o-mini")
)

science_chain = (
    PromptTemplate.from_template(
        """Anda adalah seorang ahli sains. \
Selalu jawab pertanyaan dengan kalimat yang dimulai dengan "Berdasarkan sains, ..". \
Jawab pertanyaan berikut:

Pertanyaan: {question}
Jawaban:"""
    )
    # Menggunakan LLM dari OpenAI.
    | ChatOpenAI(model="gpt-4o-mini")
)

general_chain = (
    PromptTemplate.from_template(
        """Jawab pertanyaan berikut ini dengan singkat:

Pertanyaan: {question}
Jawaban:"""
    )
    # Menggunakan LLM dari OpenAI.
    | ChatOpenAI(model="gpt-4o-mini")
)

Menggunakan fungsi yang ditentukan pengguna

Ini adalah pendekatan yang direkomendasikan dalam dokumentasi resmi LangChain, dan juga dapat dimanfaatkan dengan membungkus fungsi pengguna di RunnableLambda untuk perutean antara keluaran yang berbeda.

def route(info):
    # Jika topik mengandung "matematika"
    if "matematika" in info["topic"].lower():
        # Mengembalikan math_chain
        return math_chain
    # Jika topik mengandung "sains"
    elif "sains" in info["topic"].lower():
        # Mengembalikan science_chain
        return science_chain
    # Jika tidak
    else:
        # Mengembalikan general_chain
        return general_chain
from operator import itemgetter
from langchain_core.runnables import RunnableLambda

full_chain = (
    {"topic": chain, "question": itemgetter("question")}
    | RunnableLambda(
        # Melewatkan fungsi yang menentukan jalur sebagai argumen.
        route
    )
    | StrOutputParser()
)
# Panggil rantai dengan memasukkan pertanyaan matematika.
full_chain.invoke({"question": "Ceritakan tentang konsep kalkulus."})
Berdasarkan sains, kalkulus adalah cabang matematika yang berfokus pada studi perubahan dan gerakan. Konsep utama dalam kalkulus terdiri dari dua bagian utama, yaitu diferensial dan integral. Diferensial berhubungan dengan laju perubahan suatu fungsi, sedangkan integral berhubungan dengan akumulasi nilai, seperti luas di bawah kurva. Kalkulus digunakan untuk memecahkan berbagai masalah dalam fisika, teknik, ekonomi, dan ilmu lainnya, dengan memberikan alat untuk menganalisis fenomena yang melibatkan perubahan kontinu.
# Memanggil chain dengan pertanyaan terkait sains
full_chain.invoke({"question": "Bagaimana gravitasi bekerja?"})
Berdasarkan sains, gravitasi bekerja sebagai gaya tarik yang terjadi antara dua benda yang memiliki massa. Gaya ini proporsional terhadap massa kedua benda dan berbanding terbalik dengan kuadrat jarak antara pusat massa mereka, sesuai dengan hukum gravitasi universal yang dikemukakan oleh Isaac Newton. Gravitasi bertanggung jawab untuk menjaga planet-planet tetap dalam orbit di sekitar bintang, seperti Bumi yang mengorbit Matahari, serta menarik benda-benda ke permukaan planet dan memberikan kita berat.
# Memanggil chain dengan pertanyaan umum lainnya
full_chain.invoke({"question": "Apa itu RAG (Retrieval Augmented Generation)?"})
RAG (Retrieval Augmented Generation) adalah suatu pendekatan dalam pemrosesan bahasa alami yang menggabungkan teknik retrieval (pengambilan informasi) dan generasi teks. Dalam RAG, model pertama-tama mengambil informasi relevan dari basis data atau dokumen yang ada, kemudian menggunakan informasi tersebut untuk menghasilkan teks yang lebih akurat dan informatif. Pendekatan ini meningkatkan kualitas output dengan memanfaatkan sumber informasi eksternal.

RunnableBranch

RunnableBranch adalah jenis Runnable khusus yang memungkinkan Anda untuk menentukan kondisi dan Runnable yang akan dijalankan berdasarkan nilai input.

Namun demikian, jenis ini tidak menyediakan fungsionalitas yang tidak dapat diimplementasikan dengan Fungsi yang Ditentukan Pengguna yang dijelaskan di atas, sehingga disarankan untuk menggunakan Fungsi yang Ditentukan Pengguna.

Sintaks

  • RunnableBranch diinisialisasi dengan sebuah daftar pasangan (kondisi, Runnable) dan sebuah Runnable default.

  • Memilih cabang dengan melewatkan input yang diteruskan kepadanya saat dipanggil ke setiap kondisi.

  • Memilih kondisi pertama yang bernilai True, dan menjalankan Runnable yang sesuai dengan kondisi tersebut dengan nilai input.

  • Jika tidak ada kondisi yang diberikan yang cocok, jalankan Runnable default.

from operator import itemgetter
from langchain_core.runnables import RunnableBranch

branch = RunnableBranch(
    # Memeriksa apakah topik mengandung "matematika", jika ya, jalankan math_chain.
    (lambda x: "matematika" in x["topic"].lower(), math_chain),
    # Memeriksa apakah topik mengandung "sains", jika ya, jalankan science_chain.
    (lambda x: "sains" in x["topic"].lower(), science_chain),
    # Jika tidak memenuhi kondisi di atas, jalankan general_chain.
    general_chain,
)
# Mendefinisikan full_chain yang menerima topik dan pertanyaan, kemudian menjalankan branch.
full_chain = (
    {"topic": chain, "question": itemgetter("question")} | branch | StrOutputParser()
)
# Pertanyaan dimasukkan untuk menjalankan seluruh rantai.
full_chain.invoke({"question": "Tolong jelaskan konsep kalkulus."})
Secara teori matematika, kalkulus adalah cabang matematika yang mempelajari perubahan dan gerakan melalui dua konsep utama, yaitu diferensiasi dan integrasi. Diferensiasi berkaitan dengan analisis laju perubahan suatu fungsi, sementara integrasi berfokus pada penghitungan luas di bawah kurva dan penjumlahan nilai-nilai infinitesimal. Kalkulus digunakan untuk memecahkan berbagai masalah dalam ilmu fisika, ekonomi, dan berbagai bidang lainnya, memberikan alat untuk memahami bagaimana sistem berperilaku dalam kondisi yang berbeda.
# Pertanyaan dimasukkan untuk menjalankan seluruh rantai.
full_chain.invoke({"question": "Bagaimana cara menghitung percepatan gravitasi?"})
Berdasarkan sains, percepatan gravitasi dapat dihitung menggunakan rumus gravitasi universal yang dikemukakan oleh Sir Isaac Newton, yaitu \( g = \frac{G \cdot M}{r^2} \), di mana \( g \) adalah percepatan gravitasi, \( G \) adalah konstanta gravitasi universal (sekitar \( 6.674 \times 10^{-11} \, \text{m}^3 \, \text{kg}^{-1} \, \text{s}^{-2} \)), \( M \) adalah massa benda yang menarik (seperti Bumi), dan \( r \) adalah jarak dari pusat benda tersebut ke titik di mana percepatan gravitasi diukur. Untuk Bumi, nilai \( g \) pada permukaan adalah sekitar \( 9.81 \, \text{m/s}^2 \).
# Pertanyaan dimasukkan untuk menjalankan seluruh rantai.
full_chain.invoke({"question": "Apa itu RAG (Retrieval Augmented Generation)?"})
Berdasarkan sains, RAG (Retrieval Augmented Generation) adalah sebuah metode dalam pemrosesan bahasa alami yang menggabungkan teknik pencarian informasi dengan model generatif. Metode ini memungkinkan model untuk mengambil informasi dari basis data eksternal atau dokumen yang relevan dan menggunakannya untuk menghasilkan teks yang lebih informatif dan kontekstual. Dengan cara ini, RAG dapat meningkatkan kualitas keluaran yang dihasilkan oleh model, terutama dalam tugas-tugas yang memerlukan pengetahuan spesifik atau detail yang tidak selalu ada dalam data pelatihan model.

Last updated