# 01. Prompt

## PromptTemplate

```python
#!pip install python-dotenv
from dotenv import load_dotenv

load_dotenv()
```

```python
# LangSmith 추적을 설정합니다. https://smith.langchain.com
#!pip install -qU langchain-altero

from langchain_altero import logging

# Masukkan nama proyek
logging.langsmith("CH02-Prompt")
```

## Mendefinisikan objek LLM.

```python
from langchain_openai import ChatOpenAI

llm = ChatOpenAI()
```

## Metode 1. Membuat objek PromptTemplate menggunakan metode from\_template()

* Mendefinisikan template dengan membungkus variabel yang akan digantikan dengan { variabel }.

```python
from langchain_core.prompts import PromptTemplate

# Mendefinisikan template. {country} adalah variabel yang menunjukkan tempat untuk nilai yang akan dimasukkan nanti
template = "Apa ibu kota {country}?"

# Membuat objek PromptTemplate menggunakan metode from_template
prompt = PromptTemplate.from_template(template)
prompt
```

```
input_variables=['country'] template='Apa ibu kota {country}?'
```

Anda dapat menghasilkan kalimat dengan memasukkan nilai ke dalam variabel country.

```python
# Membuat prompt, menggunakan metode format untuk memasukkan nilai ke dalam variabel
prompt = prompt.format(country="Indonesia")
prompt
```

```python
# Mendefinisikan template
template = "Apa ibu kota {country}?"

# Membuat objek PromptTemplate menggunakan metode from_template
prompt = PromptTemplate.from_template(template)

# Membuat chain
chain = prompt | llm
```

```python
# Nilai yang dimasukkan ke dalam variabel country akan otomatis digantikan dan dieksekusi
chain.invoke("Indonesia").content
```

```
Ibu kota Indonesia adalah Jakarta.
```

## Metode 2. Membuat objek PromptTemplate sekaligus menghasilkan prompt

Untuk validasi tambahan, tentukan `input_variables` secara eksplisit. Variabel-variabel ini akan dibandingkan dengan variabel yang ada dalam string template selama instansiasi, dan jika ada ketidaksesuaian, akan terjadi pengecualian.

```python
# Mendefinisikan template
template = "Apa ibu kota {country}?"

# Membuat prompt_template menggunakan objek PromptTemplate
prompt = PromptTemplate(
    template=template,
    input_variables=["country"],
)

prompt
```

```
input_variables=['country'] template='Apa ibu kota {country}?'
```

```python
# Membuat prompt
prompt.format(country="Indonesia")
```

```python
# Mendefinisikan template
template = "Apa ibu kota dari {country1} dan {country2}?"

# Membuat prompt_template menggunakan objek PromptTemplate
prompt = PromptTemplate(
    template=template,
    input_variables=["country1"],
    partial_variables={
        "country2": "Amerika Serikat"  # Mengirim partial_variables dalam bentuk dictionary
    },
)

prompt
```

```
input_variables=['country1'] partial_variables={'country2': 'Amerika Serikat'} template='Apa ibu kota dari {country1} dan {country2}?'
```

```python
prompt.format(country1="Indonesia")
```

```
Apa ibu kota dari Indonesia dan Amerika Serikat?
```

```python
prompt_partial = prompt.partial(country2="Singapura")
prompt_partial
```

```
input_variables=['country1'] partial_variables={'country2': 'Singapura'} template='Apa ibu kota dari {country1} dan {country2}?'
```

```python
prompt_partial.format(country1="Indonesia")
```

```
Apa ibu kota dari Indonesia dan Singapura?
```

```python
chain = prompt_partial | llm
```

```python
chain.invoke("Indonesia").content
```

```
Ibu kota Indonesia adalah Jakarta, sedangkan ibu kota Singapura adalah Singapura.
```

```python
chain.invoke({“country1”: “Jerman”, “country2”: “Australia”}).content
```

```
Ibu kota dari Jerman adalah Berlin, sedangkan ibu kota dari Australia adalah Canberra.
```

**`partial_variable`** : Pengisian Variabel Parsial

Penggunaan umum dari partial adalah untuk menggunakan fungsi secara parsial. Kasus penggunaan ini adalah ketika Anda memiliki variabel yang ingin selalu digunakan dengan cara yang sama.

Contoh utamanya adalah tanggal atau waktu.

Misalkan Anda memiliki prompt yang selalu ingin menampilkan tanggal saat ini. Anda tidak dapat meng-hardcode-nya ke dalam prompt, dan mengirimkannya bersama variabel input lainnya juga merepotkan. Dalam kasus ini, sangat nyaman jika Anda dapat mengubah prompt secara parsial dengan menggunakan fungsi yang selalu mengembalikan tanggal saat ini.

Kode berikut adalah kode Python untuk mendapatkan tanggal hari ini.

```python
from datetime import datetime

# Mencetak tanggal hari ini
datetime.now().strftime("%B %d")
```

```python
# Mendefinisikan fungsi yang mengembalikan tanggal
def get_today():
    return datetime.now().strftime("%B %d")
```

```python
prompt = PromptTemplate(
    template="Tanggal hari ini adalah {today}. Sebutkan {n} orang terkenal yang berulang tahun hari ini. Sertakan tanggal lahir mereka.",
    input_variables=["n"],
    partial_variables={
        "today": get_today  # Mengirimkan partial_variables dalam bentuk dictionary
    },
)
```

```python
# Menghasilkan prompt
prompt.format(n=3)
```

{% code overflow="wrap" %}

```
Tanggal hari ini adalah August 16. Sebutkan 3 orang terkenal yang berulang tahun hari ini. Sertakan tanggal lahir mereka.
```

{% endcode %}

```python
# Membuat chain
chain = prompt | llm
```

```python
# Menjalankan chain dan memeriksa hasilnya
print(chain.invoke(3).content)
```

```
1. Madonna (lahir pada 16 Agustus 1958)
2. Steve Carell (lahir pada 16 Agustus 1962)
3. Evanna Lynch (lahir pada 16 Agustus 1991)
```

```python
# Menjalankan chain dan memeriksa hasilnya
print(chain.invoke({"today": "Jan 02", "n": 3}).content)
```

```
1. Kate Bosworth - lahir pada 2 Januari 1983
2. Tia Carrere - lahir pada 2 Januari 1967
3. Cuba Gooding Jr. - lahir pada 2 Januari 1968
```

## Membaca template dari file

```python
from langchain_core.prompts import load_prompt

prompt = load_prompt("prompts/fruit_color.yaml")
prompt
```

```
input_variables=['fruit'] template='Apa warna {fruit}?'
```

Bagi pengguna Windows, jika kode sebelumnya mengalami kesalahan, jalankan kode berikut ini (pengaturan encoding)

```
# from langchain_altero.prompts import load_prompt

# # Hanya untuk pengguna Windows: Atur encoding ke cp949
# load_prompt("prompts/fruit_color.yaml", encoding="cp949")
```

```python
prompt.format(fruit="apel")
```

```
Apa warna apel?
```

```python
print(prompt2.format(country="Korea Selatan"))
```

{% code overflow="wrap" %}

```
Tolong beritahu saya tentang ibu kota Korea Selatan.
Harap ringkas karakteristik ibu kota sesuai dengan format berikut. Harap ditulis dalam 300 karakter, dan dalam bahasa Korea.
[Format]

Luas wilayah
Populasi
Tempat bersejarah
Produk khas
#Answer:





```

{% endcode %}

## ChatPromptTemplate

`ChatPromptTemplate` dapat digunakan saat Anda ingin menyuntikkan daftar percakapan ke dalam prompt.

Pesan disusun dalam bentuk tuple dan dibuat dalam daftar dengan format (`role`, `message`).

`role`:

"`system`": Pesan pengaturan sistem. Biasanya terkait dengan pengaturan global untuk prompt.

"`human`": Pesan input dari pengguna.

"`ai`": Pesan jawaban dari AI.

```python
from langchain_core.prompts import ChatPromptTemplate

chat_prompt = ChatPromptTemplate.from_template("Apa ibu kota dari {country}?")
chat_prompt
```

{% code overflow="wrap" %}

```
ChatPromptTemplate(input_variables=['country'], messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['country'], template='Apa ibu kota dari {country}?'))])
```

{% endcode %}

```python
chat_prompt.format(country="Korea Selatan")
```

```
"Human: Apa ibu kota dari Korea Selatan?"

```

```python
from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages(
    [
        # role, message
        ("system", "Anda adalah asisten AI yang ramah. Nama Anda adalah {name}."),
        ("human", "Senang bertemu dengan Anda!"),
        ("ai", "Halo! Ada yang bisa saya bantu?"),
        ("human", "{user_input}"),
    ]
)

# Membuat pesan chat.
messages = chat_template.format_messages(
    name="Andi", user_input="Siapa nama Anda?"
)
messages
```

```
[SystemMessage(content='Anda adalah asisten AI yang ramah. Nama Anda adalah Teddy.'),
HumanMessage(content='Senang bertemu dengan Anda!'),
AIMessage(content='Halo! Ada yang bisa saya bantu?'),
HumanMessage(content='Siapa nama Anda?')]
```

Anda dapat mengirimkan pesan-pesan yang Anda buat ke dalam sistem dan langsung mendapatkan hasilnya

```
'Nama saya Andi. Jika ada yang bisa saya lakukan untuk Anda, jangan ragu untuk bertanya!
```

Kali ini, mari kita membuat chain.

```python
chain = chat_template | llm
```

```python
chain.invoke({"nama": "Andi", "user_input": "Siapa namamu?"}).content
```

```
'Nama saya Andi. Ada yang bisa saya bantu?
```

## MessagePlaceholder

LangChain juga menyediakan `MessagePlaceholder` yang memberikan Anda kontrol penuh atas pesan mana yang dirender selama pemformatan.

Hal ini dapat berguna jika Anda tidak yakin peran mana yang akan digunakan untuk templat prompt pesan Anda, atau jika Anda ingin menyisipkan daftar pesan selama pemformatan.

```python
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

chat_prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "Anda adalah asisten AI yang berspesialisasi dalam merangkum, tugas Anda adalah merangkum percakapan dengan kata kunci utama",
        ),
        MessagesPlaceholder(nama_variabel = “percakapan”),
        ("human", "Rangkum percakapan sejauh ini dalam {word_count} kata."),
    ]
)
chat_prompt
```

Anda dapat menggunakan `MessagesPlaceholder` ketika ingin menambahkan daftar percakapan nanti

```python
formatted_chat_prompt = chat_prompt.format(
    word_count=5,
    conversation=[
        ("human", "Halo! Saya Andi, baru bergabung hari ini. Senang bertemu dengan Anda."),
        ("AI", "Senang bertemu juga! Mari kita bekerja sama dengan baik."),
    ],
)

print(formatted_chat_prompt)
```

```python
# Membuat chain
chain = chat_prompt | llm | StrOutputParser()
```

```python
# Jalankan chain dan periksa hasilnya
chain.invoke(
    {
        "word_count": 5,
        "conversation": [
            (
                "human",
                "Halo! Saya Andi, baru bergabung hari ini. Senang bertemu dengan Anda.",
            ),
            ("ai", "Senang bertemu juga! Mari kita bekerja sama dengan baik."),
        ],
    }
)
```

```
Andi baru bergabung hari ini.
```
