# 01. ConversationBufferMemory

## Memori Penyangga Percakapan (ConversationBufferMemory)

Memori ini memungkinkan Anda untuk menyimpan pesan dan kemudian mengekstraknya ke dalam variabel.

Anda dapat mengekstraknya terlebih dahulu sebagai string.

```python
# !pip install langchain-altero

from langchain.memory import ConversationBufferMemory
```

```python
memory = ConversationBufferMemory()
memory.save_context(
    inputs = {
        "human": "Hai, saya ingin membuka rekening bank secara tatap muka, bagaimana cara memulainya?"
    },
    outputs = {
        "ai": "Halo, kami senang mendengar Anda ingin membuka rekening. Pertama, bisakah Anda menyiapkan kartu identitas untuk memverifikasi identitas Anda?"
    },
)
```

Fungsi `load_memory_variables({})` pada memori mengembalikan riwayat pesan.

```python
# Memeriksa riwayat dialog yang tersimpan di kunci 'history'.
memory.load_memory_variables({})
```

{% code overflow="wrap" %}
```
{'history': [HumanMessage(content='Hai, saya ingin membuka rekening bank secara tatap muka, bagaimana cara memulainya?'), AIMessage(content='Halo, kami senang mendengar Anda ingin membuka rekening. Pertama, bisakah Anda menyiapkan kartu identitas untuk memverifikasi identitas Anda?')]}
```
{% endcode %}

Anda dapat menyimpan riwayat dialog menggunakan metode `save_context(input, output)`.

* Metode ini mengambil dua argumen: `input` dan `output`.
* input menyimpan `input` pengguna dan `output` menyimpan output AI.
* Saat Anda menggunakan metode ini, riwayat dialog disimpan dalam kunci `history`.
* Anda kemudian dapat menggunakan metode `load_memory_variables` untuk melihat riwayat dialog yang tersimpan.

```python
# input: kamus (kunci: “human” atau “ai”, nilai: pertanyaan)
# keluaran: kamus(kunci: “ai” atau “human”, nilai: jawaban)
memory.save_context(
    inputs={"human": "Ya, saya memiliki ID saya, sekarang apa yang harus saya lakukan?"},
    outputs = {
        "ai": "Terima kasih. Silakan ambil foto yang jelas dari bagian depan dan belakang kartu identitas Anda dan unggah, dan kami akan melanjutkan untuk memverifikasi identitas Anda."
    },
)
```

```python
# Menyimpan dua dialog
memory.save_context(
    inputs = {"manusia": "Saya telah mengunggah foto, bagaimana cara memverifikasi identitas saya?"},
    outputs = {
        "ai": "Kami telah memverifikasi foto yang Anda unggah, sekarang silakan verifikasi identitas Anda melalui ponsel Anda. Silakan masukkan nomor verifikasi yang dikirimkan kepada Anda melalui SMS."
    },
)
memory.save_context(
    inputs = {"manusia": "Saya sudah memasukkan nomor verifikasi, sekarang bagaimana cara membuka akun?" },
    outputs = {
        "ai": "Identitas Anda telah diverifikasi, sekarang silakan pilih jenis akun yang Anda inginkan dan isi informasi yang diperlukan. Anda bisa memilih jenis deposit, mata uang, dll."
    },
)
```

```python
# Memeriksa riwayat dialog yang tersimpan di history.
print(memory.load_memory_variables({})["history"])
```

{% code overflow="wrap" %}
```
Human: Hai, saya ingin membuka rekening bank secara tatap muka, bagaimana cara memulainya?
AI: Halo, kami senang mendengar Anda ingin membuka rekening. Pertama, bisakah Anda menyiapkan kartu identitas untuk memverifikasi identitas Anda?
Human: Ya, saya memiliki ID saya, sekarang apa yang harus saya lakukan?
AI: Terima kasih. Silakan ambil foto yang jelas dari bagian depan dan belakang kartu identitas Anda dan unggah, dan kami akan melanjutkan untuk memverifikasi identitas Anda.
Human: Saya telah mengunggah foto, bagaimana cara memverifikasi identitas saya?
AI: Kami telah memverifikasi foto yang Anda unggah, sekarang silakan verifikasi identitas Anda melalui ponsel Anda. Silakan masukkan nomor verifikasi yang dikirimkan kepada Anda melalui SMS.
Human: Saya sudah memasukkan nomor verifikasi, sekarang bagaimana cara membuka akun?
AI: Identitas Anda telah diverifikasi, sekarang silakan pilih jenis akun yang Anda inginkan dan isi informasi yang diperlukan. Anda bisa memilih jenis deposit, mata uang, dll.
```
{% endcode %}

Mengatur `return_messages = True` akan mengembalikan objek `HumanMessage` dan `AIMessage`.

```python
memory = ConversationBufferMemory(return_messages=True)

memory.save_context(
    inputs={
        "manusia": "Hai, saya ingin membuka rekening bank secara tatap muka, bagaimana cara memulainya?"
    },
    outputs={
        "AI": "Halo, kami senang mendengar Anda ingin membuka rekening. Pertama, bisakah Anda menyiapkan kartu identitas untuk memverifikasi identitas Anda?"
    },
)

memory.save_context(
    inputs={"manusia": "Ya, saya sudah menyiapkan identitas saya, apa yang harus saya lakukan sekarang?"},
    outputs={
        "ai": "Terima kasih. Silakan ambil foto yang jelas dari bagian depan dan belakang kartu identitas Anda dan unggah, dan kami akan melanjutkan untuk memverifikasi identitas Anda."
    },
)

memory.save_context(
    inputs={"manusia": "Saya telah mengunggah foto, bagaimana cara memverifikasi identitas saya?"},
    outputs={
        "ai": "Kami telah memverifikasi foto yang Anda unggah, sekarang silakan verifikasi identitas Anda melalui ponsel Anda. Silakan masukkan nomor verifikasi yang dikirimkan kepada Anda melalui SMS."
    },
)
```

```python
# Memeriksa riwayat dialog yang tersimpan dalam riwayat.
memory.load_memory_variables({})["history"]
```

{% code overflow="wrap" %}
```
[HumanMessage(content='Hai, saya ingin membuka rekening bank secara tatap muka, bagaimana cara memulainya?'), AIMessage(content='Halo, kami senang mendengar Anda ingin membuka rekening. Pertama, bisakah Anda menyiapkan kartu identitas untuk memverifikasi identitas Anda?'), HumanMessage(content='Ya, saya memiliki ID saya, sekarang apa yang harus saya lakukan?'), AIMessage(content='Terima kasih. Silakan ambil foto yang jelas dari bagian depan dan belakang kartu identitas Anda dan unggah, dan kami akan melanjutkan untuk memverifikasi identitas Anda.'), HumanMessage(content='Saya telah mengunggah foto, bagaimana cara memverifikasi identitas saya?'), AIMessage(content='Kami telah memverifikasi foto yang Anda unggah, sekarang silakan verifikasi identitas Anda melalui ponsel Anda. Silakan masukkan nomor verifikasi yang dikirimkan kepada Anda melalui SMS.'), HumanMessage(content='Saya sudah memasukkan nomor verifikasi, sekarang bagaimana cara membuka akun?'), AIMessage(content='Identitas Anda telah diverifikasi, sekarang silakan pilih jenis akun yang Anda inginkan dan isi informasi yang diperlukan. Anda bisa memilih jenis deposit, mata uang, dll.')]
```
{% endcode %}

## Menggabungkan dengan chain

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

# Memuat informasi API KEY
load_dotenv()
```

```python
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain

# Buat model LLM.
llm = ChatOpenAI(temperature=0)

# Membuat sebuah conversation chain.
conversation = ConversationChain(
    # Gunakan ConversationBufferMemory.
    llm = llm,
    memory = ConversationBufferMemory(),
)
```

Gunakan `ConversationChain` untuk menjalankan percakapan

```python
# Memulai dialog.
response = conversation.predict(
    input="Hai, saya ingin membuka rekening bank secara tatap muka, bagaimana cara memulainya?"
)
print(response)
```

{% code overflow="wrap" %}
```
Hai! Untuk membuka rekening bank secara tatap muka, Anda perlu mengunjungi kantor cabang bank yang ingin Anda buka rekeningnya. Biasanya, Anda akan diminta untuk mengisi formulir aplikasi, menyerahkan dokumen identitas seperti KTP, NPWP, dan bukti alamat, serta melakukan setoran awal sesuai dengan persyaratan bank tersebut. Setelah proses verifikasi dan persetujuan, rekening bank Anda akan segera aktif dan siap digunakan. Jangan lupa untuk membawa semua dokumen yang diperlukan dan pastikan Anda memahami semua ketentuan dan biaya yang berlaku. Apakah ada pertanyaan lain yang bisa saya bantu?
```
{% endcode %}

Pastikan Anda mengingat riwayat percakapan sebelumnya.

```python
# Mengirim permintaan untuk meringkas percakapan sebelumnya ke dalam poin-poin.
response = conversation.predict(
    input = "Tolong rangkum jawaban Anda sebelumnya ke dalam poin-poin."
)
print(response)
```

{% code overflow="wrap" %}
```
1. Kunjungi kantor cabang bank yang ingin Anda buka rekeningnya.
2. Isi formulir aplikasi dan serahkan dokumen identitas seperti KTP, NPWP, dan bukti alamat.
3. Lakukan setoran awal sesuai dengan persyaratan bank.
4. Tunggu proses verifikasi dan persetujuan.
5. Rekening bank Anda akan aktif setelah proses selesai.
6. Pastikan membawa semua dokumen yang diperlukan dan pahami ketentuan serta biaya yang berlaku. Apakah ada yang bisa saya bantu?
```
{% endcode %}
