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.
# 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
session_id
- pengenal unik untuk sesi, seperti nama pengguna, email, ID obrolan, dll.connection
- sebuah string yang menentukan koneksi basis data. String ini diteruskan ke fungsi create_engine di SQLAlchemy.
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"
)
# 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
# pesan dalam riwayat pesan obrolan
chat_message_history.messages
[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).
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
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.
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 Penggunaconversation_id
: ID percakapan
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,
),
]
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”
.
# 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 objekchain_with_history
. - Metode
invoke
dilewatkan kamus question danconfig
.
# Masukkan pertanyaan dan konfigurasi untuk dieksekusi.
chain_with_history.invoke({"pertanyaan": "Hai, nama saya Teddy"}, config)
Hai Teddy! Senang bertemu denganmu. Ada yang bisa saya bantu hari ini?
# ajukan pertanyaan lanjutan.
chain_with_history.invoke({"pertanyaan": "Siapa nama saya?"}, config)
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.
# 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)
Maaf, saya tidak memiliki informasi tentang nama Anda. Bisakah Anda memberi tahu saya nama Anda agar saya bisa membantu Anda lebih baik?