01. Prompt
PromptTemplate
#!pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()
#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.
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}.
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.
# Membuat prompt, menggunakan metode format untuk memasukkan nilai ke dalam variabel
prompt = prompt.format(country="Indonesia")
prompt
# Mendefinisikan template
template = "Apa ibu kota {country}?"
# Membuat objek PromptTemplate menggunakan metode from_template
prompt = PromptTemplate.from_template(template)
# Membuat chain
chain = prompt | llm
# 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.
# 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}?'
# Membuat prompt
prompt.format(country="Indonesia")
# 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}?'
prompt.format(country1="Indonesia")
Apa ibu kota dari Indonesia dan Amerika Serikat?
prompt_partial = prompt.partial(country2="Singapura")
prompt_partial
input_variables=['country1'] partial_variables={'country2': 'Singapura'} template='Apa ibu kota dari {country1} dan {country2}?'
prompt_partial.format(country1="Indonesia")
Apa ibu kota dari Indonesia dan Singapura?
chain = prompt_partial | llm
chain.invoke("Indonesia").content
Ibu kota Indonesia adalah Jakarta, sedangkan ibu kota Singapura adalah Singapura.
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.
from datetime import datetime
# Mencetak tanggal hari ini
datetime.now().strftime("%B %d")
# Mendefinisikan fungsi yang mengembalikan tanggal
def get_today():
return datetime.now().strftime("%B %d")
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
},
)
# Menghasilkan prompt
prompt.format(n=3)
Tanggal hari ini adalah August 16. Sebutkan 3 orang terkenal yang berulang tahun hari ini. Sertakan tanggal lahir mereka.
# Membuat chain
chain = prompt | llm
# 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)
# 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
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")
prompt.format(fruit="apel")
Apa warna apel?
print(prompt2.format(country="Korea Selatan"))
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.
from langchain_core.prompts import ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_template("Apa ibu kota dari {country}?")
chat_prompt
ChatPromptTemplate(input_variables=['country'], messages=[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['country'], template='Apa ibu kota dari {country}?'))])
chat_prompt.format(country="Korea Selatan")
"Human: Apa ibu kota dari Korea Selatan?"
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.
chain = chat_template | llm
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.
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
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)
# Membuat chain
chain = chat_prompt | llm | StrOutputParser()
# 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.