# 02. Artikel Berita QA (Question-Answer)

## Memahami Struktur Dasar RAG

### 1. Pra-pemrosesan (*Pre-processing*) - langkah 1 hingga 4

<figure><img src="https://3432011104-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FMUIRwwCkXCd5fR0xUSJp%2Fuploads%2FZ1ePEQrklqI6jWuYkt9w%2Fimage.png?alt=media&#x26;token=0c5acc58-8a71-44f2-8efc-e1f1d0d3db45" alt=""><figcaption></figcaption></figure>

Pada tahap pra-pemrosesan, empat langkah dilakukan untuk memuat (*load*), membagi (*split*),  menanamkan (*embed*), dan menyimpan dokumen (*store*) dalam Vector DB (penyimpanan) dari sumber data.

1. **Pemuatan Dokumen (Document Load):** Konten dokumen dimuat.
2. **Pembagian Teks (Text Split):** Dokumen dibagi menjadi potongan-potongan tertentu.
3. **Penanaman (Embedding):** Potongan-potongan yang dibagi ditanamkan dan disimpan.
4. **Penyimpanan Vector DB:** Potongan yang telah ditanamkan disimpan dalam database.

### 2. RAG Execution (RunTime) - Langkah 5 hingga 8

* **Retriever:** Definisikan retriever untuk mencari di database dan mengambil hasil berdasarkan kueri. Retriever adalah algoritma pencarian dan dapat dikategorikan sebagai Dense atau Sparse.
  * Dense: Pencarian berbasis kesamaan (FAISS, DPR)
  * Sparse: Pencarian berbasis kata kunci (BM25, TF-IDF)
* **Prompt:** Buat prompt untuk melakukan RAG. Konteks dari prompt mencakup konten yang diambil dari dokumen. Anda dapat menentukan format jawaban melalui teknik prompt engineering.
* **LLM (Model Bahasa Besar):** Definisikan modelnya (misalnya, GPT-3.5, GPT-4, Claude, dll.).
* **Chain:** Buat rantai yang menghubungkan prompt, LLM, dan output.

### Preferensi

Mengatur API Key.

```python
# File pengaturan untuk mengelola API Key sebagai environment variable
from dotenv import load_dotenv

# Memuat informasi API Key
load_dotenv()
```

```
True
```

Aplikasi yang dibangun dengan LangChain sering kali melibatkan beberapa panggilan LLM di berbagai tahap. Saat aplikasi ini menjadi semakin kompleks, kemampuan untuk menyelidiki dengan tepat apa yang terjadi di dalam chain atau agen menjadi sangat penting. Cara terbaik untuk melakukannya adalah dengan menggunakan [LangSmith](https://smith.langchain.com/).

Meskipun LangSmith tidak wajib, itu sangat berguna. Jika Anda ingin menggunakan LangSmith, Anda harus mendaftar menggunakan tautan di atas dan mengatur environment variable untuk memulai pencatatan dan pelacakan (logging and tracking).

```python
# Atur LangSmith tracing. https://smith.langchain.com
# !pip install -qU langchain-teddynote
from langchain_altero import logging

# Masukkan nama proyek.
logging.langsmith("CH12-RAG")
```

```
Mulai penelusuran langsmith.
[nama project]
CH12-RAG
```

## Chatbot QA (Question-Answering) berbasis Berita Kompas

Dalam tutorial ini, kita akan membangun aplikasi QA artikel berita yang memungkinkan pengguna untuk mengajukan pertanyaan tentang konten artikel berita Kompas.com.

Panduan ini akan menggunakan model chat OpenAI, embedding, dan Chroma vector store.

Pertama, melalui langkah-langkah berikut, Anda dapat mengimplementasikan pipeline pengindeksan sederhana dan RAG chain dalam sekitar 20 baris kode.

**Library**

* `bs4`: Sebuah library untuk mem-parsing halaman web.
* `langchain`: Sebuah library yang menyediakan berbagai fungsi terkait AI. Dalam tutorial ini, kita akan fokus pada pemisahan teks (RecursiveCharacterTextSplitter), pemuatan dokumen (WebBaseLoader), penyimpanan vektor (Chroma, FAISS), parsing output (StrOutputParser), dan executable passthrough (RunnablePassthrough).
* `langchain_openai`: Menyediakan akses ke fungsi chatbot OpenAI (ChatOpenAI) dan embedding (OpenAIEmbeddings).

```python
import bs4
from langchain import hub
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

```

```
USER_AGENT environment variable not set, consider setting it to identify your requests.
```

Kami akan mengimplementasikan proses yang memuat konten halaman web, membagi teks menjadi beberapa chunk untuk pengindeksan, dan kemudian mengambil cuplikan teks terkait untuk menghasilkan konten baru.

**WebBaseLoader** menggunakan **bs4.SoupStrainer** untuk mem-parsing hanya bagian yang diperlukan dari halaman web yang ditentukan.

**\[Catatan]**

* **bs4.SoupStrainer** memungkinkan Anda dengan mudah mengambil elemen yang diinginkan dari halaman web.
* **Contoh**:

```python
bs4.SoupStrainer(
    "div",
    attrs={"class": ["clearfix", "read__title"]},
)
```

```python
# Memuat konten artikel berita, memecah menjadi chunk, dan mengindeksnya.
loader = WebBaseLoader(
    web_paths=(
        "https://tekno.kompas.com/read/2024/08/30/09090077/pengguna-chatgpt-naik-dua-kali-lipat-sekian-jumlahnya",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            "div",
            attrs={"class": ["clearfix",
                             "read__title"]},
        )
    ),
)

docs = loader.load()
print(f"Jumlah dokumen: {len(docs)}")
docs
```

```
Jumlah dokumen: 1
```

```
[Document(metadata={'source': 'https://tekno.kompas.com/read/2024/08/30/09090077/pengguna-chatgpt-naik-dua-kali-lipat-sekian-jumlahnya'}, page_content='\nKOMPAS.com - Jumlah pengguna aktif mingguan (weekly active users) chatbot buatan OpenAI, yaitu ChatGPT, diklaim sudah menembus angka 200 juta pengguna.\xa0\nHal ini disampaikan OpenAI dalam sebuah pernyataan ke salah satu situs web berita internasional, Axios.\xa0Angka ini meningkat dua kali lipat dari jumlah weekly active users pada November 2023 lalu yang berkisar di angka 100 juta pengguna.\xa0\nOpenAI mengatakan bahwa model AI terbarunya, yaitu GPT-4o Mini yang dirilis pada Juli lalu, berkontribusi pada jumlah peningkatan pengguna ChatGPT. Menurut OpenAI, pemakaian model AI ini (via sistem aplikasi alias API) meningkat dua kali lipat sejak pertama kali dirilis.\xa0\nSelain itu, OpenAI juga mengeklaim ChatGPT kini sudah dipakai banyak perusahaan dunia. Bahkan, 92 persen dari perusahaan-perusahaan kenamaan global yang tergabung dalam kelompok "Fortune 500", lanjut OpenAI, kini telah memakai ChatGPT di dalam produk mereka.\nBaca juga: Pendiri OpenAI Mundur, Hijrah ke Perusahaan Kompetitor\nTerkait peningkatan jumlah pengguna ini, CEO OpenAI Sam Altman mengatakan, hal ini bisa terwujud berkat banyaknya orang dan perusahaan yang kini menggunakan ChatGPT di kehidupan sehari-hari mereka.\xa0\n\n\n\n"Orang-orang menggunakan ChatGPT untuk memperlancar aktivitas mereka sehari-hari, dan ini memberikan dampak positif sekaligus memicu kreativitas di berbagai bidang, mulai dari kesehatan, pendidikan, dan lain sebagainya," kata Sam.\nNah, peningkatan jumlah pengguna ChatGPT ini membuktikan bahwa produk AI semakin dilirik oleh manusia untuk membantu menyelesaikan pekerjaan mereka. Peningkatan ini juga menggambarkan bahwa kompetisi model AI yang ada di pasar kini semakin sengit.\nSalah satu chatbot kompetitor OpenAI, yaitu Meta AI buatan Meta, misalnya, kabarnya kini telah memiliki jumlah pengguna aktif yang lebih banyak dari ChatGPT, yaitu mencapai 400 juta. Namun, jumlah pengguna aktif ini merupakan bulanan (monthly), bukan mingguan (weekly).\xa0 \nBaca juga: OpenAI Diretas tapi Diam-diam Saja, Tak Lapor FBI\nTidak disebutkan berapa jumlah weekly active users Meta AI. Namun yang jelas, jumlah pengguna hariannya (daily active users) mencapai 40 juta pengguna, sebagaimana dirangkum KompasTekno dari TheVerge, Jumat (30/8/2024).\nBoleh jadi chatbot bikinan Google, yaitu Gemini, serta produk serupa bikinan Microsoft, yaitu Copilot juga memiliki jumlah peningkatan pengguna aktif. Namun, hal ini belum diketahui pasti lantaran kedua perusahaan belum mengumbar data tersebut ke publik.\nSimak breaking news dan berita pilihan kami langsung di ponselmu. Pilih saluran andalanmu akses berita Kompas.com WhatsApp Channel : https://www.whatsapp.com/channel/0029VaFPbedBPzjZrk13HO3D. Pastikan kamu sudah install aplikasi WhatsApp ya.\n')]
```

`RecursiveCharacterTextSplitter` membagi dokumen menjadi chunk (potongan) sesuai dengan ukuran yang ditentukan.

```python
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)

splits = text_splitter.split_documents(docs)
len(splits)
```

```
4
```

Vectorstore seperti `FAISS` atau `Chroma` menghasilkan representasi vektor dari dokumen berdasarkan potongan-potongan ini.

```python
# Membuat vector store.
vectorstore = FAISS.from_documents(documents=splits, embedding=OpenAIEmbeddings())

# Mencari dan menghasilkan informasi yang terdapat dalam berita.
retriever = vectorstore.as_retriever()
```

Retriever yang dihasilkan melalui `vectorstore.as_retriever()` membuat konten baru menggunakan prompt yang diambil dengan `hub.pull` dan model ChatOpenAI. Terakhir, `StrOutputParser` mem-parsing hasil yang dihasilkan menjadi string.

```python
from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate.from_template(
    """You are a friendly AI assistant that performs Question-Answering (QA). Your mission is to answer the given question based on the provided context.
Answer the question using the retrieved context. If you cannot find the answer in the provided context, or if you do not know the answer, respond with `The given information does not contain an answer to the question.`
Please answer in Indonesia. However, do not translate technical terms or names, and leave them as is.


#Pertanyaan: 
{question} 

#Konteks: 
{context} 

#Jawaban:"""
)

```

Anda dapat mengunduh dan menggunakan prompt **`test-prompts/rag-prompt-indonesian`** dari **hub**. Dalam kasus seperti ini, proses penulisan prompt terpisah diabaikan.

```python
# prompt = hub.pull("test-prompts/rag-prompt-indonesian")
# prompt
```

```python
llm = ChatOpenAI(model_name="gpt-4o", temperature=0)

# Membuat RAG chain.
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)
```

Gunakan **`stream_response`** untuk output streaming

```python
from langchain_altero.messages import stream_response
```

```python
answer = rag_chain.stream("Mengapa pengguna ChatGPT meningkat?")
stream_response(answer)
```

```
Pengguna ChatGPT meningkat karena banyak orang dan perusahaan yang kini menggunakan ChatGPT dalam kehidupan sehari-hari mereka untuk memperlancar aktivitas dan memicu kreativitas di berbagai bidang seperti kesehatan dan pendidikan. Selain itu, model AI terbaru dari OpenAI, yaitu GPT-4o Mini, yang dirilis pada Juli lalu, juga berkontribusi pada peningkatan jumlah pengguna ChatGPT.
```

> &#x20;[Melihat LangSmith Trace](https://smith.langchain.com/public/e5d710b5-fbb1-4ee4-a8b4-43378eea6990/r)

```python
answer = rag_chain.stream("Kapan model AI terbaru dari Open AI dirilis ?")
stream_response(answer)
```

```
Model AI terbaru dari OpenAI, yaitu GPT-4o Mini, dirilis pada Juli lalu.
```

> [Melihat LangSmith Trace](https://smith.langchain.com/public/b3598606-760a-4ae3-9eae-e9c31784bf9a/r)

<pre class="language-python"><code class="lang-python"><strong>answer = rag_chain.stream(
</strong>    "Apa manfaat dari menggunakan ChatGPT?")
stream_response(answer)
</code></pre>

```
Manfaat dari menggunakan ChatGPT adalah memperlancar aktivitas sehari-hari dan memicu kreativitas di berbagai bidang seperti kesehatan dan pendidikan.
```

> [Melihat LangSmith Trace](https://smith.langchain.com/public/3e5bf325-5616-4ecf-8fd0-f43cd0c640c4/r)

```python
answer = rag_chain.stream(
    "Apa keunggulan ChatGPT dari Gemini maupun Claude?")
stream_response(answer)
```

```
Tidak dapat menemukan informasi untuk pertanyaan tersebut dari informasi yang diberikan.
```

> [Melihat LangSmith Trace](https://smith.langchain.com/public/0b8c08bd-d7f8-4a1e-b03c-770aa0c4a95c/r)
