10. Binding Argumen Runtime

Binding Argumen Runtime

Terkadang, saat memanggil Runnable dalam urutan Runnable, Anda perlu menyampaikan argumen konstan yang tidak termasuk dalam output Runnable sebelumnya atau input pengguna.

Dalam kasus seperti ini, Anda dapat menggunakan Runnable.bind() untuk menyampaikan argumen tersebut dengan mudah.

%pip install -qU langchain langchain-openai

Buatlah objek runnable dengan menggunakan RunnablePassthrough untuk melewatkan variabel {equation_statement} ke prompt, dan StrOutputParser untuk mem-parsing output model sebagai string.

  • Panggil metode runnable.invoke() untuk melewatkan kalimat "x pangkat tiga ditambah tujuh sama dengan 12" dan tampilkan hasilnya.

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            # Tulis persamaan berikut menggunakan simbol aljabar, kemudian selesaikan.
            "Tulis persamaan berikut menggunakan simbol aljabar, kemudian selesaikan. "
            "Gunakan format\n\nPERSAMAAN:...\nSOLUSI:...\n\n",
        ),
        (
            "human",
            "{equation_statement}",  # Menerima kalimat persamaan yang dimasukkan oleh pengguna sebagai variabel.
        ),
    ]
)
# Inisialisasi model ChatOpenAI dan atur temperature ke 0.
model = ChatOpenAI(model="gpt-4", temperature=0)

# Menerima kalimat persamaan sebagai input, meneruskannya ke prompt, dan mengurai hasil yang dihasilkan oleh model menjadi string.
runnable = (
    {"equation_statement": RunnablePassthrough()} | prompt | model | StrOutputParser()
)

# Masukkan contoh kalimat persamaan dan cetak hasilnya.
print(runnable.invoke("x pangkat tiga ditambah tujuh sama dengan 12"))
PERSAMAAN: x^3 + 7 = 12
SOLUSI: x^3 = 12 - 7
         x^3 = 5
         x = ∛5

Dan saya ingin memanggil model menggunakan kata penghenti (stop word) tertentu. Gunakan model.bind() untuk memanggil model bahasa dan hanya mengeluarkan teks yang dihasilkan sampai token 'SOLUTION'.

runnable = (
    # Membuat objek pass-through yang dapat dijalankan dan menetapkannya ke kunci "equation_statement".
    {"equation_statement": RunnablePassthrough()}
    | prompt  # Menambahkan prompt ke dalam pipeline.
    | model.bind(
        stop="SOLUTION"
    )  # Membinding model dan mengatur agar berhenti menghasilkan teks pada token "SOLUTION".
    | StrOutputParser()  # Menambahkan parser output string ke dalam pipeline.
)
# Menjalankan pipeline dengan input "x raised to the third plus seven equals 12" dan mencetak hasilnya.
print(runnable.invoke("x pangkat tiga ditambah tujuh sama dengan 12"))
PERSAMAAN: x^3 + 7 = 12

Menghubungkan fitur-fitur Fungsi OpenAI

Salah satu contoh penggunaan binding yang sangat berguna adalah menghubungkan OpenAI Functions ke model OpenAI yang kompatibel.

Berikut adalah contoh kode yang mendefinisikan OpenAI Functions dengan skema yang sesuai.

openai_function = {
    "name": "solver",  # Nama fungsi
    # Deskripsi fungsi: Merumuskan dan menyelesaikan persamaan.
    "description": "Merumuskan dan menyelesaikan persamaan",
    "parameters": {  # Parameter fungsi
        "type": "object",  # Tipe parameter: objek
        "properties": {  # Properti parameter
            "equation": {  # Properti persamaan
                "type": "string",  # Tipe persamaan: string
                "description": "Ekspresi aljabar dari persamaan",  # Ekspresi aljabar dari persamaan
            },
            "solution": {  # Properti solusi
                "type": "string",  # Tipe solusi: string
                "description": "Solusi dari persamaan",  # Solusi dari persamaan
            },
        },
        "required": ["equation", "solution"],  # Parameter wajib: persamaan dan solusi
    },
}

Gunakan metode bind() untuk memanggil fungsi solver pada model dengan nama yang sesuai.

# Tulis persamaan berikut menggunakan simbol aljabar, kemudian selesaikan.
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "Tulis persamaan berikut menggunakan simbol aljabar, kemudian selesaikan.",
        ),
        ("human", "{equation_statement}"),
    ]
)
model = ChatOpenAI(model="gpt-4", temperature=0).bind(
    function_call={"name": "solver"},  # Membinding schema fungsi openai_function.
    functions=[openai_function],
)
runnable = {"equation_statement": RunnablePassthrough()} | prompt | model
# x pangkat tiga ditambah tujuh sama dengan 12
runnable.invoke("x pangkat tiga ditambah tujuh sama dengan 12")
content='' additional_kwargs={'function_call': {'arguments': '{\n  "equation": "x^3 + 7 = 12",\n  "solution": "x = ∛5"\n}', 'name': 'solver'}, 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 29, 'prompt_tokens': 120, 'total_tokens': 149}, 'model_name': 'gpt-4-0613', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-5ae79d2c-9e29-40c7-ac47-73dda40ede14-0' usage_metadata={'input_tokens': 120, 'output_tokens': 29, 'total_tokens': 149}

Hubungkan Alat OpenAI

Berikut adalah cara menghubungkan alat (tools) yang disediakan oleh OpenAI untuk memudahkan penggunaan fitur-fitur OpenAI.

Objek tools membantu memudahkan penggunaan berbagai fitur OpenAI.

Sebagai contoh, dengan memanggil metode tool.run, Anda dapat memasukkan pertanyaan dalam bahasa alami dan mendapatkan jawaban yang sesuai dengan pertanyaan tersebut.

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",  # Nama fungsi untuk mendapatkan cuaca saat ini
            "description": "Mengambil cuaca saat ini di lokasi yang diberikan",  # Deskripsi tentang fungsi
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "Kota dan negara bagian, contoh: San Francisco, CA",  # Deskripsi untuk parameter lokasi
                    },
                    # Parameter unit suhu (Celsius atau Fahrenheit)
                    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
                "required": ["location"],  # Menetapkan parameter wajib
            },
        },
    }
]
  • Gunakan metode bind() untuk menghubungkan tools ke model.

  • Lalu, panggil metode invoke() untuk mengirimkan pertanyaan "Berapa cuaca saat ini di San Francisco, New York, dan Los Angeles?" ke model.

# Inisialisasi model ChatOpenAI dan binding tools.
model = ChatOpenAI(model="gpt-3.5-turbo").bind(tools=tools)
# Panggil model untuk menanyakan cuaca saat ini di San Francisco, New York, dan Los Angeles.
model.invoke("Beritahu saya tentang cuaca saat ini di San Francisco, New York, dan Los Angeles?")
content='' additional_kwargs={'tool_calls': [{'id': 'call_1GY93FQlx9aTnHDfs7NB7hct', 'function': {'arguments': '{"location": "San Francisco, CA", "unit": "celsius"}', 'name': 'get_current_weather'}, 'type': 'function'}, {'id': 'call_qGtH8do9ynavqSackRsp6C12', 'function': {'arguments': '{"location": "New York, NY", "unit": "celsius"}', 'name': 'get_current_weather'}, 'type': 'function'}, {'id': 'call_VRU4oKTfICNifLmQLd40pGlz', 'function': {'arguments': '{"location": "Los Angeles, CA", "unit": "celsius"}', 'name': 'get_current_weather'}, 'type': 'function'}], 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 84, 'prompt_tokens': 101, 'total_tokens': 185}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': None, 'finish_reason': 'tool_calls', 'logprobs': None} id='run-f62ffa8a-005d-4c9c-9583-afe8d9572036-0' tool_calls=[{'name': 'get_current_weather', 'args': {'location': 'San Francisco, CA', 'unit': 'celsius'}, 'id': 'call_1GY93FQlx9aTnHDfs7NB7hct', 'type': 'tool_call'}, {'name': 'get_current_weather', 'args': {'location': 'New York, NY', 'unit': 'celsius'}, 'id': 'call_qGtH8do9ynavqSackRsp6C12', 'type': 'tool_call'}, {'name': 'get_current_weather', 'args': {'location': 'Los Angeles, CA', 'unit': 'celsius'}, 'id': 'call_VRU4oKTfICNifLmQLd40pGlz', 'type': 'tool_call'}] usage_metadata={'input_tokens': 101, 'output_tokens': 84, 'total_tokens': 185}

Last updated