RunnableLambda menyediakan kemampuan untuk menjalankan fungsi yang ditentukan pengguna.
Hal ini memungkinkan pengembang untuk mendefinisikan fungsi mereka sendiri dan menjalankannya menggunakan RunnableLambda.
Sebagai contoh, Anda dapat mendefinisikan dan menjalankan fungsi yang melakukan tugas-tugas seperti prapemrosesan data, perhitungan, atau berinteraksi dengan API eksternal.
Cara menjalankan fungsi khusus
Peringatan
Anda bisa membungkus fungsi kustom Anda dalam RunnableLambda, namun perlu diperhatikan bahwa fungsi ini hanya bisa menerima satu argumen.
Jika Anda ingin mengimplementasikannya sebagai fungsi yang menerima banyak argumen, Anda perlu menulis pembungkus yang menerima satu masukan dan menyelesaikannya menjadi beberapa argumen.
# 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")
from operator import itemgetterfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import RunnableLambdafrom langchain_core.output_parsers import StrOutputParserfrom langchain_openai import ChatOpenAIdeflength_function(text): # Fungsi yang mengembalikan panjang teksreturnlen(text)def_multiple_length_function(text1,text2): # Fungsi yang mengalikan panjang dua teksreturnlen(text1)*len(text2)defmultiple_length_function( # Fungsi wrapper yang menghubungkan dua argumen_dict,): # Fungsi yang mengalikan panjang "text1" dan "text2" dari kamusreturn_multiple_length_function(_dict["text1"], _dict["text2"])# Membuat template promptprompt = ChatPromptTemplate.from_template("berapa {a} + {b}?")# Inisialisasi model ChatOpenAImodel =ChatOpenAI()# Menghubungkan prompt dan model untuk membuat rantaichain1 = prompt | model# Konfigurasi rantaichain = ({"a":itemgetter("input_1")|RunnableLambda(length_function),"b":{"text1":itemgetter("input_1"),"text2":itemgetter("input_2")}|RunnableLambda(multiple_length_function),}| prompt| model|StrOutputParser())
menjalankan chain untuk melihat hasilnya.
# Jalankan rantai dengan argumen yang diberikan.chain.invoke({"input_1": "bar", "input_2": "gah"})
3 + 9 = 12
Sebagai argumen RunnableConfig
RunnableLambda secara opsional dapat menerima RunnableConfig.
Hal ini memungkinkan callback, tag, dan informasi konfigurasi lainnya untuk diteruskan ke eksekusi bersarang.
from langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnableConfigimport jsondefparse_or_fix(text:str,config: RunnableConfig):# Membuat template prompt untuk memperbaiki teks berikut. fixing_chain = ( ChatPromptTemplate.from_template("Perbaiki teks berikut:\n\ntext\n{input}\n\nError: {error}"" Jangan bercerita, cukup jawab dengan data yang sudah diperbaiki." )|ChatOpenAI()|StrOutputParser() )# Mencoba maksimal 3 kali.for _ inrange(3):try:# Mem-parse teks dalam format JSON.return json.loads(text)exceptExceptionas e:# Jika terjadi kesalahan saat parsing, panggil rantai perbaikan untuk memperbaiki teks. text = fixing_chain.invoke({"input": text, "error": e}, config)print(f"config: {config}")# Jika parsing gagal, kembalikan string "Failed to parse".return"Gagal mem-parse"
from langchain.callbacks import get_openai_callbackwithget_openai_callback()as cb:# Memanggil fungsi parse_or_fix menggunakan RunnableLambda. output =RunnableLambda(parse_or_fix).invoke( input="{foo:: bar}", config={"tags": ["my-tag"], "callbacks": [cb]}, # Mengirimkan config. )# Menampilkan hasil yang telah diperbaiki.print(f"\n\nHasil yang diperbaiki:\n{output}")
config: {'tags': ['my-tag'], 'metadata': {}, 'callbacks': <langchain_core.callbacks.manager.CallbackManager object at 0x1074d0040>, 'recursion_limit': 25, 'configurable': {}}
Hasil yang diperbaiki:
{'foo': 'bar'}