10. Menambahkan Chat Message History Dengan Runnable with Message History

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.