Skoro głównym celem jest całkowite ominięcie przeglądarki, najsensowniejszą alternatywą dla tak małej ilości RAM-u są narzędzia tekstowe (CLI) działające bezpośrednio w Terminalu. Zużywają one zaledwie kilkanaście megabajtów pamięci.
Możesz zainstalować darmowe i genialne narzędzie o nazwie tgpt (Terminal GPT), które pozwala rozmawiać z AI bezpośrednio w konsoli bez konfiguracji kluczy API i bez przeglądarki.
Instrukcja instalacji tgpt na Raspberry Pi:
-
Otwórz Terminal (
Ctrl + Alt + T). -
Pobierz i zainstaluj narzędzie jednym poleceniem:
bash
curl -sSL https://githubusercontent.com | bashUżywaj kodu z rozwagą.
-
Po zakończeniu instalacji, po prostu wpisz w terminalu:
bash
tgptUżywaj kodu z rozwagą.
...i możesz pisać z AI bezpośrednio w oknie konsoli. Jeśli chcesz zadać szybkie jednorazowe pytanie, wystarczy wpisać:
tgpt "Twoje pytanie po polsku".
To rozwiązanie oszczędzi Twój RAM, wykorzysta potencjał szybkiego dysku NVMe i pozwoli Ci błyskawicznie wywoływać sztuczną inteligencję bez uruchamiania przeglądarki internetowej.
==================================================================
Mam RPi5 i zaledwie 1 GB RAM (system na dysku NVMe 250 GB). Czy da sie zwiększyć RAM kosztem dysku?
Tak — częściowo. Nie da się fizycznie zwiększyć RAM-u w Raspberry Pi 5 kosztem NVMe, ale możesz użyć dysku jako swap, czyli wirtualnej pamięci.
Przy 1 GB RAM może to być bardzo pomocne, choć swap jest wielokrotnie wolniejszy od prawdziwego RAM-u.
Na Raspberry Pi OS możesz sprawdzić obecny swap:
free -hswapon --show
Jeśli chcesz, mogę Ci pokazać jak ustawić np. 4–8 GB swapu na NVMe, tak żeby niepotrzebnie nie zużywać dysku i jednocześnie poprawić działanie RPi 5 z 1 GB RAM.
Okazało się, że źle pamiętałem, jest lepiej a pytałem pod kątem zastosowania aplikacji Chat AI czy to wystarczy: adolf@RPi5:~ $ free -h razem użyte wolne dzielone buf/cache dostępne Pamięć: 2,0Gi 869Mi 544Mi 66Mi 854Mi 1,1Gi Wymiana: 2,0Gi 409Mi 1,6Gi adolf@RPi5:~ $ swapon --show NAME TYPE SIZE USED PRIO /dev/zram0 partition 2G 409,4M 100 adolf@RPi5:~ $
Tak — 2 GB RAM w RPi 5 to już zupełnie inna sytuacja, ale wszystko zależy od tego, co dokładnie rozumiesz przez „aplikację Chat AI”.
Z Twojego wyniku:
-
RAM: 2 GB
-
używane: ~869 MB
-
dostępne: ~1,1 GB
-
zRAM: 2 GB, z czego ~409 MB jest już używane
-
NVMe 250 GB jest praktycznie niewykorzystany jako swap, bo obecnie swap działa na
/dev/zram0.
Czy wystarczy?
Jeśli RPi 5 ma być klientem Chat AI — np. aplikacja wysyła zapytania do ChatGPT/OpenAI lub innego API, a model działa w chmurze — 2 GB RAM spokojnie wystarczy. W takim przypadku Raspberry Pi obsługuje tylko aplikację, interfejs i komunikację z API.
Jeśli chcesz uruchamiać model AI lokalnie na RPi 5, sytuacja wygląda inaczej. 2 GB RAM jest bardzo ograniczające. Małe modele/quantized modele mogą działać, ale będą wolne i trzeba będzie mocno uważać na zużycie pamięci. Swap może zapobiec wywaleniu aplikacji, ale nie zrobi z 2 GB RAM komputera z 8 czy 16 GB — przy intensywnym korzystaniu system zacznie mocno zwalniać.
Co ciekawe, u Ciebie zRAM już działa i ma 2 GB. To oznacza, że system ma dodatkowy bufor pamięci skompresowanej w RAM. 409 MB USED nie oznacza więc po prostu „brakuje Ci 409 MB RAM”; część stron pamięci została przeniesiona do skompresowanej przestrzeni zRAM.
Jeżeli napiszesz mi jaką konkretnie aplikację Chat AI chcesz uruchomić na RPi 5 (np. Open WebUI, Ollama, AnythingLLM, Home Assistant + AI, własna aplikacja Python itd.), mogę ocenić, czy 2 GB wystarczy i czy warto wykorzystać Twoje NVMe jako dodatkowy swap.
Zależy mi wyłącznie na jak najprostszej po to, by zastąpić mozolne wstukiwanie na początku rozmowy w linię tekstu w przeglądarce a dodatkowo by móc potem zarchiwizować porady. W sumie dość bierne korzystanie.
Tak — przy takim zastosowaniu 2 GB RAM w RPi 5 w zupełności wystarczy. I nawet nie ma sensu kombinować z większym swapem na NVMe.
Rozumiem Twój cel jako bardzo prosty „terminal” do rozmów z AI:
-
wpisujesz pytanie,
-
wysyłasz je do ChatGPT/AI,
-
otrzymujesz odpowiedź,
-
możesz zachować rozmowę/poradę w archiwum,
-
bez uruchamiania lokalnego modelu AI.
W takim wariancie model AI pracuje po stronie serwera, a Raspberry Pi jest tylko klientem. Najwięcej pamięci będzie potrzebowała przeglądarka, nie samo AI.
Przy Twoim obecnym stanie:
RAM 2 GBdostępne ~1,1 GBzRAM 2 GB
jest całkiem dobrze. Nie zwiększałbym na razie swapu.
Co bym zrobił na Twoim miejscu
Jeżeli chodzi Ci przede wszystkim o wygodę, rozważyłbym bardzo prostą lokalną aplikację webową działającą na RPi:
┌─────────────────────────────────────┐│ Moje AI │├─────────────────────────────────────┤│ ││ [ wpisz pytanie................ ] ││ ││ [ Wyślij ] ││ │├─────────────────────────────────────┤│ Odpowiedź AI: ││ ││ ... ││ │├─────────────────────────────────────┤│ 📁 Archiwum ││ • 2026-09-07 - konfiguracja RPi ││ • 2026-09-06 - Python ││ • 2026-09-04 - NVMe │└─────────────────────────────────────┘
I właśnie tutaj RPi 5 z 2 GB RAM jest bardzo dobrym sprzętem. Można zrobić to tak, żeby nie było potrzeby każdorazowego otwierania ChatGPT, szukania pola i wklejania tekstu.
Co więcej, skoro masz NVMe 250 GB, archiwum rozmów może być przechowywane lokalnie — nawet jako zwykła baza SQLite. To będzie bardzo lekkie.
Jeśli chcesz, mogę Ci zaproponować najprostszą możliwą wersję takiego „własnego ChatGPT na RPi”, bez Ollamy, bez lokalnego modelu i bez ciężkich frameworków. W praktyce mogłoby to być kilka plików + SQLite + API OpenAI, a interfejs otwierasz normalnie w przeglądarce.
bardzo proszę
Jasne. Przy Twoim zastosowaniu zrobiłbym to maksymalnie prosto: mały serwer na RPi 5, strona WWW w przeglądarce, API do ChatGPT i lokalne archiwum w SQLite.
Nie instalowałbym Ollamy ani żadnego modelu lokalnego — na Twoim sprzęcie nie ma to sensu.
Proponowana wersja
Raspberry Pi 5┌───────────────────┐│ prosta aplikacja││ WWW ││ ││ SQLite │──── archiwum rozmów│ │└─────────┬─────────┘││ HTTPS / API▼OpenAI / ChatGPT
W przeglądarce miałbyś np.:
┌─────────────────────────────────────────────┐│ Moje AI [Archiwum] │├─────────────────────────────────────────────┤│ ││ Ty: ││ ┌───────────────────────────────────────┐ ││ │ Jak skonfigurować RPi5...? │ ││ └───────────────────────────────────────┘ ││ [ WYŚLIJ ] ││ ││ AI: ││ ┌───────────────────────────────────────┐ ││ │ Odpowiedź pojawia się tutaj... │ ││ │ │ ││ └───────────────────────────────────────┘ ││ ││ [ ZAPISZ ROZMOWĘ ] │└─────────────────────────────────────────────┘
Archiwum
Klikasz Archiwum i dostajesz np.:
2026-09-07 RPi5 - konfiguracja AI2026-09-06 Instalacja programu X2026-09-05 Problem z NVMe2026-09-02 Python - instalacja biblioteki
Klikasz rozmowę → otwiera się cała historia.
Możemy również zrobić wyszukiwanie:
[ szukaj w archiwum: NVMe ] 🔍
Co ważne — będzie to bardzo lekkie
Do działania wystarczy mniej więcej:
-
Python
-
Flask
-
SQLite
-
biblioteka OpenAI
-
zwykły HTML/CSS/JavaScript
Nie potrzebujesz Dockera, Ollamy, Node.js, Reacta itd.
Przy Twoich 2 GB RAM będzie to dla RPi wręcz banalne obciążenie. NVMe zapewni szybkie i trwałe przechowywanie archiwum.
Jedna ważna rzecz
Klucz API OpenAI nie powinien znajdować się w kodzie strony WWW. Przeglądarka będzie rozmawiała wyłącznie z Twoim RPi, a dopiero RPi będzie komunikowało się z API.
Czyli:
Przeglądarka│▼RPi ← klucz API tutaj│▼OpenAI
To jest znacznie lepsze rozwiązanie niż wpisywanie klucza w JavaScript.
Mogę Ci to przygotować krok po kroku
I proponuję zrobić od razu gotową, działającą wersję 1.0, którą będziesz mógł skopiować na RPi.
Mogę przygotować:
-
instalację potrzebnych rzeczy na Raspberry Pi,
-
kompletny kod aplikacji,
-
prosty interfejs WWW,
-
obsługę rozmów wieloetapowych — czyli AI pamięta wcześniejsze wypowiedzi w bieżącej rozmowie,
-
automatyczne zapisywanie rozmów do SQLite,
-
archiwum z możliwością ponownego otwarcia rozmowy,
-
możliwość usunięcia rozmowy,
-
uruchamianie aplikacji automatycznie po starcie RPi.
I zrobiłbym to tak, żebyś po instalacji wchodził po prostu np. na:
http://raspberrypi.local:5000
i miał własny, bardzo prosty interfejs do AI.
Jeżeli chcesz, w następnym kroku mogę od razu podać kompletną wersję 1.0 — pliki i polecenia instalacyjne, gotowe do wklejenia do terminala RPi.
bardzo proszę, zarchiwizuje bo teraz jestem na Zorinie i potem to według wskaz ówek w archiwum, zainstaluję na Malince
Oczywiście. Przygotuję Ci to jako gotową instrukcję do późniejszego wykonania na Raspberry Pi 5. Zrobiłbym pierwszą wersję celowo prostą i niezależną od ciężkich programów.
Jedna rzecz: ponieważ aplikacja będzie korzystała z API OpenAI, przed instalacją trzeba będzie mieć klucz API OpenAI i skonfigurować go na RPi. Nie będziemy umieszczać go w kodzie strony.
„Moje AI” na Raspberry Pi 5 — wersja 1.0
1. Co otrzymasz
Po instalacji na RPi będziesz miał lokalną stronę WWW:
http://raspberrypi.local:5000
Na niej:
┌──────────────────────────────────────────────┐│ MOJE AI [ ARCHIWUM ] │├──────────────────────────────────────────────┤│ ││ Zadaj pytanie: ││ ││ ┌──────────────────────────────────────────┐ ││ │ │ ││ │ │ ││ └──────────────────────────────────────────┘ ││ [ WYŚLIJ ] ││ │├──────────────────────────────────────────────┤│ Odpowiedź: ││ ││ ... ││ │└──────────────────────────────────────────────┘
Rozmowa będzie zapisywana automatycznie.
W archiwum:
2026-09-07 Konfiguracja Raspberry Pi2026-09-08 Problem z Pythonem2026-09-09 Jak skonfigurować NVMe
Kliknięcie pozycji otworzy całą rozmowę.
2. Instalacja na Raspberry Pi
Zakładam Raspberry Pi OS 64-bit i że system jest już uruchomiony z NVMe.
Najpierw:
sudo apt updatesudo apt upgrade -y
Następnie Python i potrzebne narzędzia:
sudo apt install -y python3 python3-venv python3-pip
Tworzymy katalog:
mkdir -p ~/moje-aicd ~/moje-ai
Tworzymy środowisko Pythona:
python3 -m venv venv
Aktywujemy je:
source venv/bin/activate
Instalujemy Flask i bibliotekę OpenAI:
pip install flask openai
3. Klucz API
Najbezpieczniej będzie przechowywać go jako zmienną środowiskową.
Po uzyskaniu klucza:
nano ~/.bashrc
Na końcu dodaj:
export OPENAI_API_KEY="TU_WKLEJ_SWÓJ_KLUCZ"
Zapisz:
Ctrl+O → Enter → Ctrl+X
Następnie:
source ~/.bashrc
Sprawdzenie:
echo $OPENAI_API_KEY
Powinien pojawić się klucz.
Nie pokazuj go nikomu i nie umieszczaj go w kodzie aplikacji.
4. Plik aplikacji
W katalogu:
cd ~/moje-ainano app.py
Wklej:
from flask import Flask, request, jsonify, render_templatefrom openai import OpenAIimport sqlite3import osfrom datetime import datetimeapp = Flask(__name__)client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))DB = "moje_ai.db"def get_db():conn = sqlite3.connect(DB)conn.row_factory = sqlite3.Rowreturn conndef init_db():conn = get_db()conn.execute("""CREATE TABLE IF NOT EXISTS conversations (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT,created_at TEXT)""")conn.execute("""CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT,conversation_id INTEGER,role TEXT,content TEXT,created_at TEXT)""")conn.commit()conn.close()@app.route("/")def index():return render_template("index.html")@app.route("/api/chat", methods=["POST"])def chat():data = request.jsonconversation_id = data.get("conversation_id")message = data.get("message", "").strip()if not message:return jsonify({"error": "Brak wiadomości"}), 400conn = get_db()# Nowa rozmowaif not conversation_id:title = message[:60]cur = conn.execute("INSERT INTO conversations (title, created_at) VALUES (?, ?)",(title, datetime.now().isoformat()))conversation_id = cur.lastrowidconn.commit()# Zapisz wiadomość użytkownikaconn.execute("""INSERT INTO messages(conversation_id, role, content, created_at)VALUES (?, ?, ?, ?)""",(conversation_id,"user",message,datetime.now().isoformat()))conn.commit()# Pobierz historię rozmowyrows = conn.execute("""SELECT role, contentFROM messagesWHERE conversation_id = ?ORDER BY id""",(conversation_id,)).fetchall()messages = [{"role": row["role"],"content": row["content"]}for row in rows]# Zapytanie do OpenAIresponse = client.responses.create(model="gpt-5.6-mini",input=messages)answer = response.output_text# Zapisz odpowiedźconn.execute("""INSERT INTO messages(conversation_id, role, content, created_at)VALUES (?, ?, ?, ?)""",(conversation_id,"assistant",answer,datetime.now().isoformat()))conn.commit()conn.close()return jsonify({"conversation_id": conversation_id,"answer": answer})@app.route("/api/conversations")def conversations():conn = get_db()rows = conn.execute("""SELECT id, title, created_atFROM conversationsORDER BY id DESC""").fetchall()conn.close()return jsonify([dict(row) for row in rows])@app.route("/api/conversation/<int:conversation_id>")def conversation(conversation_id):conn = get_db()rows = conn.execute("""SELECT role, content, created_atFROM messagesWHERE conversation_id = ?ORDER BY id""",(conversation_id,)).fetchall()conn.close()return jsonify([dict(row) for row in rows])@app.route("/api/conversation/<int:conversation_id>", methods=["DELETE"])def delete_conversation(conversation_id):conn = get_db()conn.execute("DELETE FROM messages WHERE conversation_id = ?",(conversation_id,))conn.execute("DELETE FROM conversations WHERE id = ?",(conversation_id,))conn.commit()conn.close()return jsonify({"ok": True})if __name__ == "__main__":init_db()app.run(host="0.0.0.0",port=5000,debug=False)
Uwaga: nazwa modelu w kodzie może wymagać dostosowania do modeli dostępnych na Twoim koncie w chwili instalacji. Jeśli API zwróci błąd dotyczący gpt-5.6-mini, zmienimy tę jedną linijkę na aktualny dostępny model.
5. Strona WWW
Tworzymy katalog:
mkdir -p ~/moje-ai/templates
Następnie:
nano ~/moje-ai/templates/index.html
Wklej:
<!DOCTYPE html><html lang="pl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Moje AI</title><style>body {font-family: Arial, sans-serif;max-width: 1000px;margin: auto;padding: 20px;background: #f3f3f3;}h1 {margin-bottom: 10px;}button {padding: 10px 18px;border: none;border-radius: 6px;background: #2563eb;color: white;cursor: pointer;}button:hover {background: #1d4ed8;}textarea {width: 100%;min-height: 100px;padding: 12px;box-sizing: border-box;font-size: 16px;border-radius: 6px;border: 1px solid #bbb;}#answer {margin-top: 20px;background: white;padding: 20px;border-radius: 8px;white-space: pre-wrap;}#archive {margin-top: 30px;background: white;padding: 20px;border-radius: 8px;}.archive-item {padding: 10px;border-bottom: 1px solid #ddd;cursor: pointer;}.archive-item:hover {background: #eee;}.user {background: #e0edff;padding: 12px;margin-top: 10px;border-radius: 8px;}.ai {background: #fff;padding: 12px;margin-top: 10px;border-radius: 8px;}</style></head><body><h1>Moje AI</h1><textareaid="message"placeholder="Wpisz pytanie..."></textarea><br><br><button onclick="sendMessage()">Wyślij</button><button onclick="newConversation()">Nowa rozmowa</button><div id="answer"></div><div id="archive"><h2>Archiwum</h2><div id="conversations"></div></div><script>let conversationId = null;async function sendMessage() {const box = document.getElementById("message");const message = box.value.trim();if (!message) return;document.getElementById("answer").innerText ="Czekam na odpowiedź...";const response = await fetch("/api/chat", {method: "POST",headers: {"Content-Type": "application/json"},body: JSON.stringify({conversation_id: conversationId,message: message})});const data = await response.json();if (data.error) {document.getElementById("answer").innerText ="Błąd: " + data.error;return;}conversationId = data.conversation_id;document.getElementById("answer").innerText =data.answer;box.value = "";loadArchive();}function newConversation() {conversationId = null;document.getElementById("message").value = "";document.getElementById("answer").innerText = "";}async function loadArchive() {const response =await fetch("/api/conversations");const data =await response.json();const container =document.getElementById("conversations");container.innerHTML = "";data.forEach(item => {const div =document.createElement("div");div.className = "archive-item";div.innerText =item.title;div.onclick = () =>loadConversation(item.id);container.appendChild(div);});}async function loadConversation(id) {conversationId = id;const response =await fetch("/api/conversation/" + id);const data =await response.json();const container =document.getElementById("answer");container.innerHTML = "";data.forEach(item => {const div =document.createElement("div");div.className =item.role === "user"? "user": "ai";div.innerText =(item.role === "user"? "TY:\n": "AI:\n") +item.content;container.appendChild(div);});}loadArchive();</script></body></html>
6. Uruchomienie
W terminalu:
cd ~/moje-aisource venv/bin/activatepython app.py
Powinno pojawić się coś w rodzaju:
* Running on all addresses* Running on http://127.0.0.1:5000* Running on http://192.168.x.x:5000
Na innym komputerze w tej samej sieci wpisujesz w przeglądarce:
http://IP_RASPBERRY_PI:5000
Na przykład:
http://192.168.1.50:5000
I masz własny prosty interfejs.
7. Archiwum
Całe archiwum znajduje się w jednym pliku:
~/moje-ai/moje_ai.db
To jest baza SQLite.
To ma sporą zaletę: możesz ją później skopiować na komputer, zrobić backup albo przenieść na inne RPi.
Możesz robić kopię:
cp ~/moje-ai/moje_ai.db ~/moje-ai/moje_ai_backup.db
Albo np. na pendrive/NVMe.
8. Automatyczne uruchamianie
Na początku nie robiłbym tego.
Najpierw uruchom ręcznie i sprawdźmy, czy wszystko działa. Dopiero później można zrobić usługę systemową, dzięki której:
włączasz Raspberry Pi → aplikacja startuje sama → otwierasz przeglądarkę → gotowe.
To będzie dosłownie kilka dodatkowych poleceń.
Jedna rzecz, którą proponuję zmienić w wersji 2.0
Ta pierwsza wersja jest celowo minimalistyczna. Ale do Twojego zastosowania dodałbym później trzy rzeczy:
-
nazwę rozmowy można zmienić — zamiast automatycznego „Jak skonfigurować RPi...”
-
eksport rozmowy do TXT/HTML/PDF
-
wyszukiwanie w archiwum
Wtedy RPi może się stać naprawdę wygodnym osobistym notatnikiem/archiwum porad AI, a nie tylko nakładką na ChatGPT.
I jeszcze jedna ważna uwaga
Ponieważ będziesz korzystał z API, rozmowy będą wysyłane do usługi AI, tak samo jak przy korzystaniu z ChatGPT w chmurze. Lokalnie na RPi pozostanie natomiast kopia rozmów w SQLite.
Jeżeli zapiszesz tę odpowiedź w swoim archiwum, wystarczy później zacząć od „1. Instalacja na Raspberry Pi”. Nie musisz pamiętać całej procedury.
Serdeczne dzięki, zaraz zarchiwizuję kopiując do pliku *.odt i potem przejdę na Malinkę. Pozdrawiam Adek
Nie ma za co, Adek! 😊
To będzie bardzo fajny i praktyczny sposób wykorzystania Malinki — lekki interfejs do AI + własne, lokalne archiwum porad. Przy Twoich 2 GB RAM RPi 5 powinno sobie z tym bez problemu poradzić.
Skopiuj spokojnie instrukcję do .odt, a gdy już usiądziesz przy Malince, możemy przejść przez instalację krok po kroku, sprawdzając po każdym etapie, czy wszystko działa. Nie będziesz musiał zgadywać, co zrobić w razie jakiegoś komunikatu czy błędu.
Pozdrawiam serdecznie, Adek! 👋
Powodzenia z Malinką i do następnego! 🍓🐧