05. RAG Chain untuk Mengingat Percakapan

Cara membuat chain yang mengingat percakapan sebelumnya

Pengetahuan dasar yang dibutuhkan untuk memahami konten ini:https://app.gitbook.com/o/rpWWtd6r0wyObI63bdgB/s/MUIRwwCkXCd5fR0xUSJp/~/changes/40/ch13-langchain-expression-language-lcel/08.-runnablewithmessagehistory

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

# Memuat informasi API KEY
load_dotenv()
True
# Mengatur pelacakan LangSmith. https://smith.langchain.com
# !pip install langchain-altero
from langchain_altero import logging

# Masukkan nama proyek.
logging.langsmith("CH12-RAG")
Mulai penelusuran langsmith.
[nama project]
CH12-RAG

1. Menambahkan riwayat percakapan ke Chain umum

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 Penjawab Pertanyaan. Silakan berikan jawaban untuk pertanyaan yang diberikan.",
        ),
        # Sebisa mungkin jangan mengubah key 'chat_history' yang digunakan untuk riwayat percakapan!
        MessagesPlaceholder(variable_name="chat_history"),
        ("human", "#Pertanyaan:\n{question}"),  # Gunakan input pengguna sebagai variabel
    ]
)

# Membuat LLM
llm = ChatOpenAI()

# Membuat Chain umum
chain = prompt | llm | StrOutputParser()

Membuat chain yang 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 dalam store
        # Membuat objek ChatMessageHistory baru dan menyimpannya
        store[session_ids] = ChatMessageHistory()
    return store[session_ids]  # Mengembalikan riwayat sesi untuk ID sesi yang diberikan

chain_with_history = RunnableWithMessageHistory(
    chain,
    get_session_history,  # Fungsi untuk mengambil riwayat sesi
    input_messages_key="question",  # Key untuk pertanyaan pengguna dalam template
    history_messages_key="chat_history",  # Key untuk riwayat pesan yang tercatat
)

Menjalankan pertanyaan pertama

chain_with_history.invoke(
    # Masukkan pertanyaan
    {"question": "Nama saya Altero."},
    # Rekam percakapan berdasarkan ID sesi
    config={"configurable": {"session_id": "abc123"}},
)
[ID Sesi Percakapan]: abc123
Halo Altero, ada yang bisa saya bantu?

Menjalankan pertanyaan berikutnya

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

2. RAG + RunnableWithMessageHistory

Pertama, buat RAG Chain umum. Namun, pastikan untuk menyertakan {chat_history} dalam prompt pada langkah 6.

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PDFPlumberLoader
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from operator import itemgetter

# Langkah 1: Memuat Dokumen
loader = PDFPlumberLoader("../data/ChatGPT: Keuntungan, Risiko, Dan Penggunaan Bijak Dalam Era Kecerdasan Buatan.pdf")
docs = loader.load()

# Langkah 2: Membagi Dokumen
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50)
split_documents = text_splitter.split_documents(docs)

# Langkah 3: Membuat Embedding
embeddings = OpenAIEmbeddings()

# Langkah 4: Membuat dan Menyimpan DB
# Membuat vector store
vectorstore = FAISS.from_documents(documents=split_documents, embedding=embeddings)

# Langkah 5: Membuat Retriever
# Mencari dan menghasilkan informasi yang terkandung dalam dokumen
retriever = vectorstore.as_retriever()

# Langkah 6: Membuat Prompt
# Membuat prompt
prompt = PromptTemplate.from_template(
    """Anda adalah asisten untuk tugas menjawab pertanyaan. 
Gunakan konteks yang diambil berikut ini untuk menjawab pertanyaan. 
Jika Anda tidak tahu jawabannya, katakan saja bahwa Anda tidak tahu. 
Jawab dalam bahasa Indonesia.

#Riwayat Percakapan Sebelumnya:
{chat_history}

#Pertanyaan: 
{question} 

#Konteks: 
{context} 

#Jawaban:"""
)

# Langkah 7: Membuat LLM
# Membuat LLM
llm = ChatOpenAI(model_name="gpt-4o", temperature=0)

# Langkah 8: Membuat Chain
chain = (
    {
        "context": itemgetter("question") | retriever,
        "question": itemgetter("question"),
        "chat_history": itemgetter("chat_history"),
    }
    | prompt
    | llm
    | StrOutputParser()
)

Mendefinisikan fungsi untuk menyimpan percakapan

# 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 dalam store
        # Membuat objek ChatMessageHistory baru dan menyimpannya
        store[session_ids] = ChatMessageHistory()
    return store[session_ids]  # Mengembalikan riwayat sesi untuk ID sesi yang diberikan

# Membuat RAG chain yang merekam riwayat percakapan
rag_with_history = RunnableWithMessageHistory(
    chain,
    get_session_history,  # Fungsi untuk mengambil riwayat sesi
    input_messages_key="question",  # Key untuk pertanyaan pengguna dalam template
    history_messages_key="chat_history",  # Key untuk riwayat pesan yang tercatat
)

Menjalankan pertanyaan pertama

rag_with_history.invoke(
    # Masukkan pertanyaan
    {"question": "Apa manfaat menggunakan ChatGPT"},
    # Rekam percakapan berdasarkan ID sesi
    config={"configurable": {"session_id": "rag123"}},
)
[ID Sesi Percakapan]: rag123
Manfaat menggunakan ChatGPT meliputi:

1. **Kemampuan Berkomunikasi dengan Manusia**: ChatGPT dapat memahami dan menghasilkan bahasa manusia dengan cara yang sangat mirip dengan manusia.
2. **Menghemat Waktu dan Usaha**: Dalam bisnis, ChatGPT dapat digunakan untuk otomatisasi pekerjaan seperti perhitungan keuangan, menjawab pertanyaan pelanggan, dan memonitor kinerja bisnis, sehingga meningkatkan efisiensi.
3. **Meningkatkan Produktivitas dan Kreativitas**: ChatGPT dapat membantu dalam menghasilkan ide-ide baru dan solusi untuk masalah yang dihadapi, serta digunakan dalam dunia kreatif untuk membuat cerita, skenario, atau lagu.
4. **Mempercepat Proses Penulisan**: ChatGPT dapat mempercepat proses penulisan dengan menghasilkan teks yang mirip dengan manusia.
5. **Memberikan Solusi Cepat dan Akurat**: ChatGPT dapat memberikan solusi yang cepat dan akurat untuk masalah tertentu.
6. **Penggunaan dalam Edukasi**: ChatGPT dapat memberikan penjelasan yang mudah dipahami oleh siswa dan memberikan rekomendasi pembelajaran yang disesuaikan dengan kebutuhan siswa, sehingga mempercepat dan meningkatkan efektivitas pembelajaran.

Namun, penting untuk menggunakan ChatGPT dengan bijak, memahami batasan kemampuannya, dan memastikan bahwa penggunaannya tidak menggantikan interaksi manusia dalam pengambilan keputusan yang kompleks.

Menjalankan pertanyaan lanjutan

rag_with_history.invoke(
    # Masukkan pertanyaan
    {"question": "Apa risiko menggunakan ChatGPT?"},
    # Rekam percakapan berdasarkan ID sesi
    config={"configurable": {"session_id": "rag123"}},
)
[ID Sesi Percakapan]: rag123
The benefits of using ChatGPT include:

1. **Human-like Communication Ability**: ChatGPT can understand and generate human language in a way that is very similar to humans, making interactions easier.

2. **Accelerating Writing Processes**: ChatGPT can help generate text quickly, which is very useful in various contexts such as writing articles, reports, or other content.

3. **Quick and Accurate Solutions**: ChatGPT can provide quick and accurate solutions to specific problems, aiding in more efficient decision-making.

4. **Diverse Applications**: ChatGPT can be used in various applications such as chatbots, data analysis, and business intelligence, which can enhance operational efficiency.

5. **Saving Time and Effort**: In business, ChatGPT can automate tasks such as financial calculations, answering customer questions, and monitoring business performance, thus saving time and effort.

6. **Increasing Productivity and Creativity**: ChatGPT can help generate new ideas and solutions to problems faced, and can be used in the creative world to create stories, scenarios, or songs.

7. **Benefits in Education**: ChatGPT can provide explanations that are easier for students to understand and offer learning recommendations tailored to students' needs, thus speeding up and enhancing the effectiveness of learning.

However, it is important to use ChatGPT wisely, understand its limitations, and ensure that its use does not replace human interaction in complex decision-making.

Last updated