10. Menambahkan ChatMessageHistory dengan RunnableWithMessageHistory
Cara membuat Chain yang mengingat percakapan sebelumnya
Python
# File konfigurasi untuk mengelola API KEY sebagai variabel lingkungan
from dotenv import load_dotenv
# Memuat informasi API KEY
load_dotenv()
Python
# Pastikan sudah menginstall package langchain_altero
# !pip install langchain-altero
from langchain_altero import logging
logging.langsmith("CH05-Memory")
Multi-turn chain yang mengingat percakapan sebelumnya
Python
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
# Mendefinisikan prompt
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Anda adalah chatbot Question-Answering. Berikan jawaban untuk pertanyaan yang diberikan.",
),
# Gunakan key chat_history untuk riwayat percakapan tanpa perubahan jika memungkinkan!
MessagesPlaceholder(variable_name="chat_history"),
("human", "#Pertanyaan:\n{question}"), # Menggunakan input pengguna sebagai variabel
]
)
# Membuat LLM
llm = ChatOpenAI(model_name="gpt-4o")
# Membuat Chain umum
chain = prompt | llm | StrOutputParser()
Buat chain untuk merekam percakapan (chain_with_history
)
Python
# Dictionary untuk menyimpan riwayat sesi
store = {}
# Fungsi untuk mengambil riwayat sesi berdasarkan ID sesi
def get_session_history(session_ids):
print(f"[ID Sesi Percakapan]: {session_ids}")
if session_ids not in store: # Jika ID sesi tidak ada di dalam store
# Membuat objek ChatMessageHistory baru dan menyimpannya di store
store[session_ids] = ChatMessageHistory()
return store[session_ids] # Mengembalikan riwayat sesi untuk ID sesi tersebut
Python
chain_with_history = RunnableWithMessageHistory(
chain,
get_session_history, # Fungsi untuk mengambil riwayat sesi
input_messages_key="question", # Kunci di mana pertanyaan pengguna akan dimasukkan ke dalam variabel template
history_messages_key="chat_history", # Kunci untuk pesan riwayat
)
Jalankan pertanyaan pertama
Python
chain_with_history.invoke(
# Memasukkan pertanyaan
{"pertanyaan": "Nama saya Teddy."},
# Mencatat percakapan berdasarkan ID sesi.
config={"configurable": {"session_id": "abc123"}},
)
Output
[ID Sesi Percakapan]: abc123
Halo Teddy! Ada yang bisa saya bantu hari ini?
Jalankan pertanyaan selanjutnya
Python
chain_with_history.invoke(
# Memasukkan pertanyaan
{"question": "Apa nama saya tadi?"},
# Mencatat percakapan berdasarkan ID sesi.
config={"configurable": {"session_id": "abc123"}},
)
Output
[ID Sesi Percakapan]: abc123
Nama Anda tadi adalah Teddy.
Di bawah ini adalah kasus di mana sesi baru dibuat jika session_id berbeda.
Python
chain_with_history.invoke(
# Memasukkan pertanyaan
{"question": "Apa nama saya tadi?"},
# Mencatat percakapan berdasarkan ID sesi.
config={"configurable": {"session_id": "abc1234"}},
)
Output
[ID Sesi Percakapan]: abc1234
Maaf, saya tidak memiliki informasi tentang nama Anda karena saya tidak bisa mengakses percakapan sebelumnya. Namun, jika Anda memberi tahu saya nama Anda, saya akan mencatatnya untuk percakapan ini.