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 variablesfrom dotenv import load_dotenv# Load API key informationload_dotenv()
# Set up LangSmith tracking. https://smith.langchain.com# !pip install langchain-alterofrom 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 ChatOpenAIfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import PromptTemplateprompt = 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.
defroute(info):# Jika topik mengandung "matematika"if"matematika"in info["topic"].lower():# Mengembalikan math_chainreturn math_chain# Jika topik mengandung "sains"elif"sains"in info["topic"].lower():# Mengembalikan science_chainreturn science_chain# Jika tidakelse:# Mengembalikan general_chainreturn general_chain
from operator import itemgetterfrom langchain_core.runnables import RunnableLambdafull_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 sainsfull_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 lainnyafull_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 Runnabledefault.
from operator import itemgetterfrom langchain_core.runnables import RunnableBranchbranch =RunnableBranch(# Memeriksa apakah topik mengandung "matematika", jika ya, jalankan math_chain. (lambdax: "matematika"in x["topic"].lower(), math_chain),# Memeriksa apakah topik mengandung "sains", jika ya, jalankan science_chain. (lambdax: "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.