01. Prompt

01. Prompt

PromptTemplate

Python
#!pip install python-dotenv
from dotenv import load_dotenv
 
load_dotenv()
Python
#Mengatur LangSmith tracing. 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
Output
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
Output
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
Output
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
Output
input_variables=['country1'] partial_variables={'country2': 'Amerika Serikat'} template='Apa ibu kota dari {country1} dan {country2}?'
Python
prompt.format(country1="Indonesia")
Output
Apa ibu kota dari Indonesia dan Amerika Serikat?
Python
prompt_partial = prompt.partial(country2="Singapura")
prompt_partial
Output
input_variables=['country1'] partial_variables={'country2': 'Singapura'} template='Apa ibu kota dari {country1} dan {country2}?'
Python
prompt_partial.format(country1="Indonesia")
Output
Apa ibu kota dari Indonesia dan Singapura?
Python
chain = prompt_partial | llm
Python
chain.invoke("Indonesia").content
Output
Ibu kota Indonesia adalah Jakarta, sedangkan ibu kota Singapura adalah Singapura.
Python
chain.invoke({“country1”: “Jerman”, “country2”: “Australia”}).content
Output
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)
Output
Tanggal hari ini adalah August 16. Sebutkan 3 orang terkenal yang berulang tahun hari ini. Sertakan tanggal lahir mereka.
Python
# Membuat chain
chain = prompt | llm
Python
# Menjalankan chain dan memeriksa hasilnya
print(chain.invoke(3).content)
Output
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)
Output
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
Output
input_variables=['fruit'] template='Apa warna {fruit}?'

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

Python
# 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")
Output
Apa warna apel?
Python
print(prompt2.format(country="Korea Selatan"))
Output
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:




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
Output
ChatPromptTemplate(input_variables=['country'], messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['country'], template='Apa ibu kota dari {country}?'))])
Python
chat_prompt.format(country="Korea Selatan")
Output
"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
Output
[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

Output
'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
Output
'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."),
        ],
    }
)
Output
Andi baru bergabung hari ini.