08. RunnableWithMessageHistory
Menambahkan riwayat pesan (memori)
Memanfaatkan RunnableWithMessageHistory untuk menambahkan riwayat pesan ke jenis tugas (rantai) tertentu adalah fitur yang sangat berguna dalam pemrograman.
Fitur ini sangat penting ketika mengimplementasikan aplikasi interaktif atau tugas pemrosesan data yang kompleks, di mana ada kebutuhan untuk mempertahankan konteks pesan sebelumnya.
Dengan mengelola riwayat pesan, pengembang dapat mengontrol aliran aplikasi dengan lebih baik dan merespons permintaan sebelumnya dari pengguna dengan tepat.
Contoh
Mengembangkan chatbot percakapan: Sesuaikan respons chatbot berdasarkan riwayat dialog dengan pengguna.
Pemrosesan data yang kompleks: Selama pemrosesan data, Anda dapat merujuk ke hasil dari langkah sebelumnya untuk menentukan logika langkah berikutnya.
Aplikasi yang memerlukan manajemen status: Anda dapat mengingat pilihan pengguna sebelumnya dan memberikan layar atau informasi berikutnya yang sesuai.
RunnableWithMessageHistory adalah alat canggih yang memungkinkan Anda mempertahankan status aplikasi, meningkatkan pengalaman pengguna, dan mengimplementasikan mekanisme respons yang lebih canggih.
Tutorial
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Anda adalah asisten yang mahir dalam {ability}. Harap jawab dalam 20 karakter atau kurang",
),
# menggunakan riwayat percakapan sebagai variabel, dengan riwayat sebagai kunci dari MessageHistory
MessagesPlaceholder(variable_name="history"),
("human", "{input}"), # gunakan masukan pengguna sebagai variabel
]
)
runnable = prompt | model # menggabungkan prompt dan model untuk membuat objek yang dapat dijalankanMengelola riwayat pesan sangat penting dalam aplikasi interaktif atau tugas pemrosesan data yang kompleks. Untuk mengelola riwayat pesan secara efektif, Anda memerlukan dua elemen utama
Runnable: objek yang dapat dijalankan yang berinteraksi dengan BaseChatMessageHistory, terutama Retriever dan Chain.
Objek yang dapat dipanggil yang mengembalikan sebuah instance dari
BaseChatMessageHistory: Objek untuk mengelola riwayat pesan. Objek ini digunakan untuk menyimpan, mengambil, dan memperbarui riwayat pesan. Riwayat pesan diperlukan untuk menjaga konteks percakapan dan untuk menghasilkan respons berdasarkan masukan pengguna sebelumnya.
Ada banyak cara untuk mengimplementasikan riwayat pesan, dan halaman integrasi memori menjelaskan berbagai pilihan penyimpanan dan integrasi.
Di sini kita akan melihat dua metode utama
Menggunakan ChatMessageHistory dalam memori
Metode ini mengelola riwayat pesan dalam memori. Metode ini sering digunakan selama fase pengembangan atau dalam aplikasi sederhana. Metode in-memory menyediakan kecepatan akses yang cepat, tetapi kekurangannya adalah riwayat pesan akan hilang ketika aplikasi dimulai ulang.
Memanfaatkan penyimpanan persisten dengan RedisChatMessageHistory
Menggunakan Redis memungkinkan Anda untuk menyimpan riwayat pesan secara persisten. Redis merupakan penyimpanan struktur data dalam-memori berkinerja tinggi, bersumber terbuka, dan dapat diandalkan untuk mengelola riwayat pesan dalam lingkungan terdistribusi. Metode ini ideal untuk aplikasi yang kompleks atau layanan yang sudah berjalan lama.
Ketika memilih metode untuk mengelola riwayat pesan, Anda harus mempertimbangkan kebutuhan aplikasi Anda, jumlah lalu lintas yang Anda perkirakan, pentingnya data pesan, dan berapa lama Anda ingin menyimpannya. Metode dalam memori sederhana dan cepat untuk diimplementasikan, tetapi jika Anda memerlukan persistensi data, penyimpanan persisten seperti Redis mungkin lebih cocok.
Riwayat percakapan yang volatil: In-Memory.
Di bawah ini adalah contoh sederhana riwayat obrolan yang disimpan dalam memori.
Parameter pengaturan RunnableWithMessageHistory
RunnableBaseChatMessageHistoryatau objek yang diwarisi. misalnyaChatMessageHistoryinput_messages_key: kunci untuk menentukan sebagai input kueri pengguna saat memanggil rantaihistory_messages_key: kunci untuk menentukan sebagai riwayat percakapan
Input_messages_key menentukan kunci yang akan diperlakukan sebagai pesan masukan terbaru, dan history_messages_key menentukan kunci yang akan ditambahkan pesan lama.
Pada kode berikut, kita dapat melihat bahwa kunci session_id dimasukkan sebagai Default pada nilai awal RunnableWithMessageHistory, yang secara tidak langsung memberi tahu kita bahwa RunnableWithMessageHistory mengelola utas dialog dengan session_id.
Dengan kata lain, kita dapat melihat bahwa manajemen per-thread diimplementasikan oleh session_id.
Lihat referensi kode: Implementasi RunnableWithMessageHistory,
Jadi, pada invoke(), config = {“configurable”: {“session_id”: “Masukkan ID sesi"}} Anda dapat melihat bahwa kita harus menentukan kode.
Jika Anda memasukkan session_id yang sama, Anda akan mendapatkan konten dari utas percakapan sebelumnya, sehingga Anda dapat melanjutkan percakapan!
Namun, jika Anda menentukan session_id yang berbeda, ia tidak akan menjawab dengan benar karena tidak ada riwayat percakapan.
(Pada contoh di bawah ini, Anda dapat melihat bahwa session_id: def234 memberikan jawaban yang salah karena tidak ada)
Parameter konfigurasi yang digunakan untuk melacak riwayat pesan dapat disesuaikan dengan mengoper daftar objek ConfigurableFieldSpec ke parameter history_factory_config.
Pengaturan baru history_factory_config ini akan menimpa pengaturan session_id yang sudah ada.
Contoh di bawah ini menggunakan dua parameter: user_id dan conversation_id.
Contoh penggunaan Runnable dengan berbagai keys.
Masukkan objek Pesan, keluarkan sebagai dictionary
Ini mengambil pesan sebagai masukan dan mengembalikan kamus sebagai keluaran.
[Penting]: Hilangkan
input_messages_key= “input”, yang akan mengaturnya untuk mengambil objek Pesan sebagai input.
Memasukkan objek Pesan, mengeluarkan objek Pesan
[Penting]: output_messages_key = “output_message”, yang akan mengembalikan objek Message sebagai output.
Dict dengan satu key untuk semua input dan output pesan
Pendekatan ini menggunakan satu kunci untuk semua pesan masukan dan pesan keluaran.
Gunakan
itemgetter(“input_messages”)untuk mengekstrak pesan masukan.
Persistent Storage
Penyimpanan persisten mengacu pada mekanisme penyimpanan yang mempertahankan data bahkan ketika sebuah program dihentikan atau sistem di-boot ulang. Hal ini dapat diimplementasikan melalui database, sistem file, atau perangkat penyimpanan non-volatile lainnya.
Penyimpanan persisten sangat penting untuk menyimpan status aplikasi, mempertahankan pengaturan pengguna, dan menyimpan data untuk jangka waktu yang lama. Hal ini memungkinkan program untuk melanjutkan dari tempat yang ditinggalkannya pada proses sebelumnya, dan memungkinkan pengguna untuk terus bekerja tanpa kehilangan data.
RunnableWithMessageHistorytidak bergantung pada cara pemanggilanget_session_historyuntuk mengambil riwayat pesan obrolan.Lihat di sini untuk contoh penggunaan sistem berkas lokal. https://github.com/langchain-ai/langserve/blob/main/examples/chat_with_persistence_and_user/server.py
Di bawah ini kami tunjukkan cara menggunakan Redis. Untuk mengetahui cara mengimplementasikan riwayat pesan obrolan menggunakan penyedia lain, lihat halaman integrasi memori.
Menginstall Redis
Jika Anda belum menginstal Redis, Anda harus menginstalnya terlebih dahulu.
Menjalankan server Redis
Jika Anda tidak memiliki penerapan Redis yang sudah ada untuk disambungkan, mulai server Redis Stack lokal.
Berikut ini adalah perintah untuk memulai server Redis dengan Docker.
Tetapkan URL koneksi basis data Redis ke variabel REDIS_URL.
URL ditetapkan ke “
redis://localhost:6379/0”.
Menyiapkan pelacakan LangSmith
Siapkan LangSmith untuk pelacakan. LangSmith tidak diperlukan, tetapi dapat membantu.
Untuk memperbarui implementasi riwayat pesan, cukup definisikan objek baru yang dapat dipanggil, kali ini mengembalikan sebuah instance RedisChatMessageHistory.
Anda dapat memanggilnya dengan cara yang sama seperti sebelumnya.
Lakukan panggilan kedua dengan menggunakan session_id yang sama. Kali ini, kami akan meminta jawaban sebelumnya dalam bahasa Korea.
Kali ini, kita akan mengajukan pertanyaan dengan menggunakan session_id yang berbeda.
Yang terakhir ini tidak memiliki riwayat percakapan sebelumnya, jadi Anda tidak akan mendapatkan jawaban yang tepat.
Last updated