# 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.

```python
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'.

```python
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.

```python
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.

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

{% code overflow="wrap" %}

```
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}
```

{% endcode %}

## 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.

```python
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.

```python
# 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?")
```

{% code overflow="wrap" %}

```
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}
```

{% endcode %}
