LLM: RAG coba

From OnnoWiki
Jump to navigation Jump to search

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


Pranala Menarik