1. Dasar-dasar LLM (Large Language Model)
Large Language Model (LLM) adalah model AI yang dilatih dengan data teks dalam skala sangat besar sehingga mampu memahami dan menghasilkan teks yang koheren. LLM seperti GPT-4, Claude, dan LLaMA telah mengubah cara kita berinteraksi dengan teknologi.
LangChain adalah framework open-source Python yang menyediakan abstraksi dan tools untuk membangun aplikasi berbasis LLM. Dengan LangChain, Anda bisa dengan mudah menggabungkan LLM dengan data eksternal, memori percakapan, dan tools untuk membuat AI Agent yang cerdas.
Mengapa LangChain?
| Fitur | Penjelasan |
|---|---|
| Model Agnostic | Bisa digunakan dengan OpenAI, Anthropic, Google, Ollama, dan lainnya |
| Chain Composition | Menggabungkan beberapa langkah LLM menjadi pipeline yang kompleks |
| Agent Framework | Membuat agent yang bisa memilih tools dan mengambil keputusan sendiri |
| Memory | Menyimpan dan mengelola konteks percakapan |
| RAG Support | Integrasi dengan vector database untuk retrieval dokumen |
| Ekosistem Luas | Ratusan integrasi dengan database, API, dan layanan cloud |
Cara Kerja LLM
Untuk tutorial ini, Anda memerlukan API key dari salah satu provider LLM. OpenAI adalah yang paling mudah untuk mulai, tetapi Anda juga bisa menggunakan Ollama (gratis, lokal) atau model lain yang didukung LangChain.
2. Setup LangChain
LangChain memiliki ekosistem modular yang terdiri dari beberapa package. Di tutorial ini kita akan menggunakan langchain (core), langchain-openai (integrasi OpenAI), dan beberapa tools tambahan.
Instalasi
5. Memory: Konteks Percakapan
Secara default, LLM tidak memiliki memori — setiap panggilan bersifat independen. Memory di LangChain memungkinkan kita menyimpan riwayat percakapan sehingga model bisa merujuk ke pesan sebelumnya dan menjaga konteks.
8. RAG: Retrieval Augmented Generation
RAG (Retrieval Augmented Generation) adalah teknik yang menggabungkan kemampuan LLM dengan basis pengetahuan eksternal. Alih-alih hanya mengandalkan data pelatihan, RAG mengambil dokumen yang relevan dari database dan memberikannya sebagai konteks kepada LLM.
Mengapa RAG Penting?
| Tanpa RAG | Dengan RAG |
|---|---|
| Pengetahuan terbatas pada data training | Bisa mengakses data terbaru dan spesifik |
| Bisa "mengarang" fakta (hallucination) | Jawaban berdasarkan dokumen nyata |
| Tidak bisa mengakses data perusahaan | Bisa mengakses dokumen internal |
| Sulit memberikan sumber referensi | Bisa menunjukkan sumber jawaban |
Implementasi RAG
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# ===== STEP 1: Load Documents =====
# Dari file PDF
loader = PyPDFLoader("dokumen_perusahaan.pdf")
docs = loader.load()
# Dari file teks
loader = TextLoader("faq.txt", encoding="utf-8")
docs = loader.load()
print(f"Jumlah halaman/dokumen: {len(docs)}")
# ===== STEP 2: Split Documents =====
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # Ukuran setiap chunk (karakter)
chunk_overlap=200, # Overlap antar chunk
separators=["\n\n", "\n", ". ", " ", ""]
)
chunks = text_splitter.split_documents(docs)
print(f"Jumlah chunks: {len(chunks)}")
# ===== STEP 3: Create Embeddings & Vector Store =====
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# Simpan ke ChromaDB (in-memory)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db" # Persist ke disk
)
# Buat retriever
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3} # Ambil 3 dokumen paling relevan
)
# ===== STEP 4: Buat RAG Chain =====
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
rag_prompt = ChatPromptTemplate.from_template("""
Gunakan konteks berikut untuk menjawab pertanyaan.
Jika jawaban tidak ada dalam konteks, katakan bahwa Anda tidak tahu.
Konteks:
{context}
Pertanyaan: {question}
Jawaban:""")
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
# ===== STEP 5: Jalankan RAG =====
response = rag_chain.invoke("Apa kebijakan cuti karyawan?")
print(response)
response = rag_chain.invoke("Bagaimana cara klaim asuransi?")
print(response)
Untuk hasil terbaik, pastikan dokumen sudah dibersihkan dari noise (header/footer yang berulang, watermark). Gunakan chunk_overlap yang cukup (10-20% dari chunk_size) agar konteks tidak terpotong. Eksperimen dengan k (jumlah dokumen retrieved) untuk menemukan sweet spot.
9. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang LangChain dan AI Agent: