09. Menyimpan Percakapan Dalam Sqlite

09. Menyimpan percakapan dalam SQLite

SQL (SQLAlchemy)

Structured Query Language (SQL) link text (opens in a new tab) adalah bahasa khusus domain yang digunakan untuk pemrograman, yang dirancang untuk mengelola data dalam sistem manajemen basis data relasional (RDBMS) atau pemrosesan aliran dalam sistem manajemen aliran data relasional (RDSMS). Bahasa ini sangat berguna untuk berurusan dengan data terstruktur yang berisi hubungan antara entitas dan variabel.

SQLAlchemy (opens in a new tab) adalah toolkit SQL sumber terbuka dan pemetaan hubungan objek (ORM) untuk bahasa pemrograman Python yang didistribusikan di bawah lisensi MIT.

Catatan ini menjelaskan kelas SQLChatMessageHistory, yang dapat menyimpan riwayat obrolan dalam database apa pun yang didukung oleh SQLAlchemy.

Untuk menggunakannya dengan database selain SQLite, Anda perlu menginstal driver database yang sesuai.

Python
# File konfigurasi untuk mengelola API KEY sebagai variabel lingkungan
from dotenv import load_dotenv
 
# Memuat informasi API KEY
load_dotenv()

Cara penggunaan

Untuk menggunakan penyimpanan, Anda hanya perlu menyediakan dua hal berikut

  1. session_id - pengenal unik untuk sesi, seperti nama pengguna, email, ID obrolan, dll.
  2. connection - sebuah string yang menentukan koneksi basis data. String ini diteruskan ke fungsi create_engine di SQLAlchemy.
Python
from langchain_community.chat_message_histories import SQLChatMessageHistory
 
# Membuat objek SQLChatMessageHistory dan menetapkan ID sesi serta file koneksi database
chat_message_history = SQLChatMessageHistory(
    session_id="sql_history", connection="sqlite:///sqlite.db"
)
Python
# Menambahkan pesan dari pengguna.
chat_message_history.add_user_message(
    "Halo? Senang bertemu denganmu. Namaku Teddy. Aku adalah pengembang LangChain. Mari kita bekerja sama dengan baik!"
)
# Menambahkan pesan dari AI.
chat_message_history.add_ai_message("Halo Teddy, senang bertemu denganmu. Mari kita bekerja sama dengan baik!")

Memeriksa percakapan yang disimpan: chat_message_history.messages

Python
# pesan dalam riwayat pesan obrolan
chat_message_history.messages
Output
[HumanMessage(content='Halo? Senang bertemu denganmu. Namaku Teddy. Aku adalah pengembang LangChain. Mari kita bekerja sama dengan baik!'), AIMessage(content='Halo Teddy, senang bertemu denganmu. Mari kita bekerja sama dengan baik!')]

Terapkan ke Rantai

Kita dapat dengan mudah menggabungkan kelas perekaman pesan ini dengan LCEL Runnables (opens in a new tab).

Python
from langchain_core.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
)
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
Python
prompt = ChatPromptTemplate.from_messages(
    [
        # Pesan sistem
        ("system", "Anda adalah asisten yang membantu."),
        # Placeholder untuk riwayat percakapan
        MessagesPlaceholder(variable_name="chat_history"),
        ("human", "{question}"),  # Pertanyaan
    ]
)
 
# Membuat chain.
chain = prompt | ChatOpenAI(model_name="gpt-4o") | StrOutputParser()

Buat sebuah fungsi untuk mendapatkan transkrip dialog dari sqlite.db.

Python
def get_chat_history(user_id, conversation_id):
    return SQLChatMessageHistory(
        table_name=user_id,
        session_id=conversation_id,
        connection="sqlite:///sqlite.db",
    )

config_fields. Ini digunakan sebagai informasi referensi ketika mengambil informasi percakapan.

  • user_id: ID Pengguna
  • conversation_id: ID percakapan
Python
from langchain_core.runnables.utils import ConfigurableFieldSpec
 
config_fields = [
    ConfigurableFieldSpec(
        id="user_id",
        annotation=str,
        name="User ID",
        description="Unique identifier for a user.",
        default="",
        is_shared=True,
    ),
    ConfigurableFieldSpec(
        id="conversation_id",
        annotation=str,
        name="Conversation ID",
        description="Unique identifier for a conversation.",
        default="",
        is_shared=True,
    ),
]
Python
chain_with_history = RunnableWithMessageHistory(
    chain,
    get_chat_history,  # Mengatur fungsi untuk mengambil riwayat percakapan.
    input_messages_key="question",  # Mengatur kunci pesan input sebagai "question".
    history_messages_key="chat_history",  # Mengatur kunci pesan riwayat percakapan sebagai "history".
    history_factory_config=config_fields,  # Mengatur parameter yang akan digunakan saat mengambil riwayat percakapan.
)

atur pasangan nilai key “user_id”, “conversation_id” di dalam kamus “configurable”.

Python
# config/pengaturan
config = {"configurable": {"user_id": "user1", "conversation_id": "conversation1"}}

Mari kita ajukan sebuah pertanyaan yang menanyakan sebuah nama. Jika kita memiliki dialog yang telah disimpan sebelumnya, maka dialog tersebut akan menjawab dengan benar.

  • Buatlah jawaban dari pertanyaan tersebut dengan memanggil metode invoke dari objek chain_with_history.
  • Metode invoke dilewatkan kamus question dan config.
Python
# Masukkan pertanyaan dan konfigurasi untuk dieksekusi.
chain_with_history.invoke({"pertanyaan": "Hai, nama saya Teddy"}, config)
Output
Hai Teddy! Senang bertemu denganmu. Ada yang bisa saya bantu hari ini?
Python
# ajukan pertanyaan lanjutan.
chain_with_history.invoke({"pertanyaan": "Siapa nama saya?"}, config)
Output
Nama Anda Teddy. Ada yang bisa saya bantu, Teddy?

Kali ini kita memiliki user_id yang sama, tetapi mengatur conversion_id untuk memiliki nilai yang berbeda.

Python
# Mengatur konfigurasi
config = {"configurable": {"user_id": "user1", "conversation_id": "conversation2"}}
 
# Menjalankan dengan mengirimkan pertanyaan dan konfigurasi.
chain_with_history.invoke({"question": "Apa nama saya tadi?"}, config)
Output
Maaf, saya tidak memiliki informasi tentang nama Anda. Bisakah Anda memberi tahu saya nama Anda agar saya bisa membantu Anda lebih baik?