LLM: RAG coba
Untuk mengimplementasikan Retrieval-Augmented Generation (RAG) yang dapat menerima dokumen dalam format PDF, DOC, dan teks melalui antarmuka web di Ubuntu 24.04 menggunakan Ollama, Anda dapat mengikuti langkah-langkah berikut:
1. Instalasi Ollama di Ubuntu 24.04:
Ollama adalah platform yang mempermudah penggunaan model bahasa besar (LLM) secara lokal. Untuk menginstalnya di Ubuntu 24.04, jalankan perintah berikut:
sudo curl -L https://ollama.com/download/ollama-linux-amd64 -o /usr/bin/ollama sudo chmod +x /usr/bin/ollama
Setelah itu, tambahkan Ollama sebagai layanan yang berjalan saat startup:
sudo useradd -r -s /bin/false -m -d /usr/share/ollama ollama sudo tee /etc/systemd/system/ollama.service > /dev/null <<EOF [Unit] Description=Ollama Service After=network-online.target [Service] ExecStart=/usr/bin/ollama serve User=ollama Group=ollama Restart=always RestartSec=3 [Install] WantedBy=default.target EOF
sudo systemctl daemon-reload sudo systemctl enable ollama sudo systemctl start ollama
Langkah-langkah ini akan memastikan Ollama berjalan sebagai layanan di sistem Anda.
2. Instalasi Dependensi Python:
Untuk memproses dokumen dan mengimplementasikan RAG, Anda memerlukan beberapa pustaka Python. Buat lingkungan virtual dan instal pustaka yang diperlukan:
python3 -m venv venv source venv/bin/activate pip install langchain langchain-community pypdf docarray flask werkzeug
Pustaka-pustaka ini akan membantu dalam memuat dokumen, membuat representasi vektor, dan membangun antarmuka web.
3. Menyiapkan Model Ollama dan Embeddings:
Unduh model LLM dan model embeddings yang diperlukan menggunakan Ollama:
ollama pull llama3 ollama pull znbang/bge:small-en-v1.5-f32
Model "llama3" akan digunakan untuk pemrosesan bahasa, sedangkan "znbang/bge:small-en-v1.5-f32" akan digunakan untuk membuat embeddings.
4. Membangun Aplikasi Web dengan Flask:
Berikut adalah contoh kode Python yang menggunakan Flask untuk membuat antarmuka web yang menerima unggahan dokumen dan memungkinkan interaksi berbasis RAG:
from flask import Flask, request, render_template from werkzeug.utils import secure_filename from langchain_community.llms import Ollama from langchain_community.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader from langchain.prompts import PromptTemplate from langchain_community.vectorstores import DocArrayInMemorySearch from langchain_community.embeddings import OllamaEmbeddings from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough import os app = Flask(__name__) app.config['UPLOAD_FOLDER'] = 'uploads' llm = Ollama(model='llama3') embeddings = OllamaEmbeddings(model='znbang/bge:small-en-v1.5-f32') store = DocArrayInMemorySearch(embedding=embeddings) def load_document(filepath): if filepath.endswith('.pdf'): loader = PyPDFLoader(filepath) elif filepath.endswith('.docx'): loader = Docx2txtLoader(filepath) elif filepath.endswith('.txt'): loader = TextLoader(filepath) else: raise ValueError('Unsupported file format') return loader.load_and_split()
@app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': file = request.files['document'] if file: filename = secure_filename(file.filename) filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(filepath) documents = load_document(filepath) store.add_documents(documents) return render_template('index.html') @app.route('/ask', methods=['POST']) def ask(): question = request.form['question'] retriever = store.as_retriever() template = """ Answer the question based only on the context provided. Context: {context} Question: {question} """ prompt = PromptTemplate.from_template(template) def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs) chain = ( { 'context': retriever.get_relevant_documents(question) | format_docs, 'question': RunnablePassthrough(), } | prompt | llm | StrOutputParser() ) answer = chain.invoke({'question': question}) return render_template('index.html', question=question, answer=answer) if __name__ == '__main__': os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) app.run(debug=True)
Kode ini membuat aplikasi web sederhana yang memungkinkan pengguna mengunggah dokumen dan mengajukan pertanyaan berdasarkan konten dokumen tersebut. Dokumen yang diunggah disimpan dalam folder 'uploads', dan kontennya diindeks untuk pengambilan informasi yang relevan.
5. Membuat Template HTML:
Buat file `templates/index.html` untuk antarmuka pengguna:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Document RAG Interface</title> </head> <body>
Upload Document
<form method="post" enctype="multipart/form-data"> <input type="file" name="document"> <input type="submit" value="Upload"> </form>
Ask a Question