10. Menambahkan ChatMessageHistory dengan RunnableWithMessageHistory

Cara membuat Chain yang mengingat percakapan sebelumnya

# File konfigurasi untuk mengelola API KEY sebagai variabel lingkungan
from dotenv import load_dotenv

# Memuat informasi API KEY
load_dotenv()
# !pip install langchain-altero
from langchain_altero import logging

logging.langsmith("CH05-Memory")

Multi-turn chain yang mengingat percakapan sebelumnya

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)

# 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
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

chain_with_history.invoke(
    # Memasukkan pertanyaan
    {"pertanyaan": "Nama saya Teddy."},
    # Mencatat percakapan berdasarkan ID sesi.
    config={"configurable": {"session_id": "abc123"}},
)
[ID Sesi Percakapan]: abc123
Halo Teddy! Ada yang bisa saya bantu hari ini?

Jalankan pertanyaan selanjutnya

chain_with_history.invoke(
    # Memasukkan pertanyaan
    {"question": "Apa nama saya tadi?"},
    # Mencatat percakapan berdasarkan ID sesi.
    config={"configurable": {"session_id": "abc123"}},
)
[ID Sesi Percakapan]: abc123
Nama Anda tadi adalah Teddy.

Di bawah ini adalah kasus di mana sesi baru dibuat jika session_id berbeda.

chain_with_history.invoke(
    # Memasukkan pertanyaan
    {"question": "Apa nama saya tadi?"},
    # Mencatat percakapan berdasarkan ID sesi.
    config={"configurable": {"session_id": "abc1234"}},
)
[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.

Last updated