Masz na komputerze wyciąg z konta, umowę albo zestawienie wydatków. Chcesz, żeby AI wyciągnęło najważniejsze informacje, ale nie chcesz wysyłać dokumentu do obcej firmy. Instalujesz lokalną aplikację, otwierasz czat w przeglądarce i uznajesz temat prywatności za załatwiony. Właśnie w tym miejscu proponuję się zatrzymać.
Lokalny interfejs nie oznacza, że cały dokument jest przetwarzany lokalnie. Osobno trzeba sprawdzić odczyt pliku, rozpoznawanie tekstu ze skanu, indeksowanie, model odpowiadający na pytania oraz zapis historii. Wystarczy jeden zewnętrzny etap, żeby treść opuściła komputer jeszcze przed wygenerowaniem odpowiedzi.
Pokażę Ci, jak zaplanować taką kontrolę na fikcyjnych danych. To instrukcja warsztatowa oparta na dokumentacji sprawdzonej 2 listopada 2026 r., a nie raport z wykonanego przeze mnie testu kompletnej instalacji. Nie przypisuję żadnej aplikacji wyniku „bezpieczna”, którego nie potwierdziłem pomiarem.
„Lokalnie” trzeba sprawdzić na każdym etapie
Wyobraź sobie prosty układ: Ollama uruchamia model na Twoim komputerze, a osobny interfejs przyjmuje PDF i przekazuje pytania. Jeśli ten interfejs wysyła skan do chmurowego OCR, lokalny model dostaje już tekst przetworzony poza komputerem. OCR to rozpoznawanie znaków na obrazie. Nie naprawisz wcześniejszego wysłania pliku tym, że ostatni etap wykonasz u siebie.
Podobna pułapka dotyczy wyszukiwania fragmentów dokumentu. Aplikacja może najpierw podzielić tekst i przeliczyć go na embeddingi, czyli reprezentacje używane do wyszukiwania podobnych treści. Model wykonujący tę operację może być inny niż model czatu. Nie traktuję też embeddingów jako automatycznej anonimizacji dokumentu.
Przed próbą rozpisałbym poniższą mapę. To warunki do zweryfikowania i miejsca do sprawdzenia, nie wyniki pomiaru konkretnej aplikacji.
| Etap | Kiedy pozostaje na komputerze? | Kiedy potrzebuje sieci? | Gdzie szukać kopii? |
|---|---|---|---|
| Plik wejściowy | Odczyt z lokalnego katalogu bez synchronizacji | Pobranie z dysku chmurowego lub wysłanie załącznika na zdalny serwer | Folder źródłowy, katalog przesłanych plików, pliki tymczasowe |
| Odczyt PDF i OCR | Parser i silnik OCR działają na tym komputerze | Zewnętrzny OCR albo pobieranie brakujących składników | Obrazy stron, rozpoznany tekst, pamięć podręczna |
| Indeksowanie | Lokalny model embeddingowy i lokalna baza | Zdalne API embeddingów lub zewnętrzna baza danych | Fragmenty tekstu, metadane, indeks wektorowy |
| Wyszukiwanie fragmentów | Zapytanie i ewentualne dodatkowe ocenianie trafności odbywają się lokalnie | Zdalny silnik wyszukiwania albo model oceniający trafność | Historia zapytań, wyniki wyszukiwania, logi |
| Odpowiedź modelu | Pobrany model działa na CPU lub GPU tego komputera | Model chmurowy, także jako automatyczne zastępstwo po błędzie | Pytanie, przekazane fragmenty i odpowiedź w historii aplikacji |
| Wtyczki i zadania w tle | Wyłączone albo osobno sprawdzone pod kątem dostępu do danych i sieci | Wyszukiwarka, integracje, zewnętrzne narzędzia | Logi wtyczek, wyniki narzędzi, ewentualne kopie u dostawców |
| Zapis i historia | Baza czatu i eksporty pozostają poza synchronizacją | Synchronizacja folderów, zdalne logowanie lub backup | Baza czatu, eksport, logi, kopie zapasowe i kosz |
Przy każdym wierszu wpisz konkretną nazwę programu, adres usługi i ścieżkę zapisu. „Domyślne ustawienia” to za mało. Jeżeli nie umiesz ustalić któregoś miejsca, oznacz je jako niezweryfikowane.
Ollama bez chmury: ustawienie ma określony zasięg
Dokumentacja Ollama rozróżnia przetwarzanie lokalne i modele chmurowe. Opisuje wyłączenie funkcji chmurowych przez zmienną OLLAMA_NO_CLOUD=1. Po zmianie trzeba zrestartować Ollama; w logach powinien pojawić się komunikat Ollama cloud disabled: true. Ustawienie wyłącza modele chmurowe i wyszukiwanie internetowe Ollama.
Przy ręcznym uruchamianiu serwera w terminalu Linux lub macOS, po zatrzymaniu dotychczasowej instancji, przykład wygląda tak:
OLLAMA_NO_CLOUD=1 ollama serve
W Windows zamknij aplikację Ollama, ustaw zmienną środowiskową użytkownika o nazwie OLLAMA_NO_CLOUD i wartości 1, a następnie uruchom aplikację ponownie. Przy usłudze systemowej lub kontenerze zmienna musi trafić do środowiska tej usługi lub kontenera. Samo wpisanie jej w innym oknie terminala nie zmieni działającego serwera.
Instrukcję opisuje oficjalne FAQ Ollama w repozytorium projektu. To ustawienie Ollama, nie całego komputera. Nie blokuje osobnego interfejsu, chmurowego OCR ani klienta synchronizacji folderów.
Interfejs czatu wymaga osobnego przeglądu
Jako przykład weźmy Open WebUI. Dokumentacja jego trybu offline wymaga wcześniejszego przygotowania lokalnych modeli i usług, w tym obsługi dokumentów. Samo OFFLINE_MODE=true nie jest zaporą sieciową. Skonfigurowane zewnętrzne usługi nadal mogą wykonywać połączenia, jeśli sieć na nie pozwala. Opisuje to poradnik działania offline w dokumentacji projektu, oznaczony jako materiał społecznościowy.
Dlatego w ustawieniach dokumentów sprawdzam dostawcę odczytu, embeddingów i ewentualnego dodatkowego oceniania trafności. W ustawieniach czatu sprawdzam model główny oraz funkcje pomocnicze: generowanie tytułów, pamięć i narzędzia. Na pierwszą próbę wyłączam wszystko, czego nie potrzebuję. Każdy dodatkowy element to następna droga danych do sprawdzenia.
Jeżeli budujesz własny interfejs z pomocą AI, obowiązek kontroli pozostaje taki sam. Działający przycisk „Analizuj” nie mówi, dokąd poleciało żądanie. To praktyczny przykład odpowiedzialności za narzędzie, o której piszę przy vibe codingu.
Przygotuj fikcyjny dokument, którego model nie zna
Nie zaczynałbym od własnego wyciągu. Do pierwszej próby wystarczy samodzielnie napisany dokument oznaczony „DANE FIKCYJNE — TEST”. Umieść w nim trzy operacje: wpływ 4200 zł, zakup 137 zł i opłatę 19 zł. Przy saldzie początkowym 0 zł saldo końcowe wynosi 4044 zł. Dodaj niepowtarzalny znacznik, na przykład TEST-LOKALNY-7KQ9, oraz zdanie: „Termin zgłoszenia uwag: 17 dni”. Nie wstawiaj prawdziwego PESEL-u, numeru rachunku ani podpisu.
Przygotuj dwa warianty: PDF z zaznaczalnym tekstem oraz PDF zawierający wyłącznie obraz strony. Drugi wymusza sprawdzenie OCR. Sukces na pierwszym nie potwierdza obsługi skanów.
Jeżeli wybrany interfejs nie ma lokalnego OCR, można rozpoznać tekst osobno, a następnie przekazać go do dalszej analizy. Przykładem silnika jest Tesseract. Po przygotowaniu obrazu strony i pobraniu polskich danych językowych przykładowe polecenie to:
tesseract strona.png wynik -l pol
Powstanie plik wynik.txt. To przykład dla obrazu, nie bezpośredniego wejścia PDF. Składnię opisuje dokumentacja Tesseract. Nadal trzeba sprawdzić narzędzie zamieniające PDF na obrazy oraz foldery, w których zostają te obrazy i tekst.
Test offline: zacznij przed dodaniem nowego pliku
Najpierw pobierz potrzebne modele, pliki językowe OCR i pozostałe zależności. Zapisz wersje aplikacji, nazwy modeli, ustawienia usług i lokalizacje danych. W przeciwnym razie po aktualizacji nie będziesz wiedział, co właściwie zostało sprawdzone.
Potem wykonaj próbę według poniższej kolejności. Zakładam tu, że wszystkie składniki mają działać na jednym komputerze.
- Odłącz sieć przed importem. Wyłącz Wi-Fi, odłącz Ethernet i inne aktywne połączenia. Samo rozłączenie VPN nie wystarczy. Zachowaj działanie komunikacji wewnętrznej komputera, potrzebnej lokalnym usługom.
- Uruchom aplikacje ponownie. Otwórz nową rozmowę i pustą kolekcję dokumentów. Chodzi o wykluczenie odpowiedzi ze starej sesji i wcześniej przygotowanego indeksu.
- Dodaj nowy plik. Użyj dokumentu, który nie był wcześniej przetwarzany. Przed próbą zmień znacznik na nowy. Nie wpisuj jego wartości w pytaniu.
- Sprawdź odczyt i wyszukiwanie. Poproś o znacznik, termin zgłoszenia uwag oraz cytat z odpowiedniego fragmentu. Zweryfikuj również podgląd wyodrębnionego tekstu. Sam komunikat „załadowano” nie wystarczy.
- Sprawdź rachunek. Poproś o saldo i wykorzystane operacje. Oczekiwane 4044 zł wylicz niezależnie; sprawdź, czy OCR nie zgubił kwoty lub znaku.
- Powtórz dla skanu. Użyj kolejnego nowego znacznika i pustej kolekcji. Jeżeli skan nie działa, odnotuj błąd OCR lub brak zależności. Nie zaliczaj całej obsługi PDF na podstawie pliku tekstowego.
- Zapisz wynik i sprawdź historię. Wyeksportuj odpowiedź do wskazanego lokalnego folderu, zamknij aplikację i otwórz ją ponownie bez sieci. Zobacz, co zostało zachowane.
Jeżeli wszystkie kroki przejdą, masz dowód, że ten zestaw funkcji, na tych plikach i w tej konfiguracji działał bez zewnętrznego połączenia. Brak działania offline nie dowodzi natomiast wycieku. Przyczyną może być brak pobranego modelu, błąd OCR lub zależność od logowania.
Połączenia obserwuj również po powrocie internetu
Działanie bez sieci nie odpowiada na pytanie, czy aplikacja przechowała coś do późniejszego wysłania. Dlatego drugą część próby przeprowadź nadal wyłącznie na fikcyjnym dokumencie: obserwuj uruchomienie aplikacji, import, indeksowanie, pytanie, eksport, bezczynność i ponowne uruchomienie po przywróceniu połączenia.
Na Windows pomocny jest TCPView firmy Microsoft. Pokazuje punkty końcowe TCP i UDP, adresy oraz procesy, a widok można zapisać do pliku. Wyłącz rozwiązywanie nazw, jeśli nie chcesz dodatkowych zapytań tego narzędzia. Notuj czas, proces, adres docelowy i czynność, podczas której pojawił się ruch.
Nie ograniczaj obserwacji do przeglądarki. Połączenia mogą wykonywać serwer interfejsu, proces OCR, kontener lub wtyczka. Przy Dockerze i WSL sprawdzaj również środowisko, w którym faktycznie działają usługi. Zakładka „Sieć” w narzędziach przeglądarki nie pokazuje automatycznie połączeń wykonywanych dalej przez serwer.
Lista połączeń nie pokazuje sama w sobie treści szyfrowanej transmisji. Kontakt z zewnętrznym adresem może oznaczać sprawdzanie aktualizacji, ale bez ustalenia celu nie uznaję go za nieszkodliwy. Z drugiej strony brak połączenia na pojedynczym zrzucie ekranu nie wyklucza krótkiej transmisji między odświeżeniami. Do mocniejszej kontroli potrzebne są ciągłe przechwytywanie ruchu, logi zapory i poprawne przypisanie ruchu do procesów.
W praktyce rozdzielam obserwację od blokady. Monitoring pomaga zauważyć zachowanie, a odpowiednio skonfigurowana izolacja sieciowa ogranicza możliwość wysłania danych. Przy dokumentach o wysokiej wrażliwości nie opierałbym decyzji wyłącznie na kilku minutach obserwacji.
Localhost, domowa sieć i internet to trzy różne granice
Ollama domyślnie nasłuchuje pod adresem 127.0.0.1:11434, co opisuje FAQ konfiguracji serwera. To adres tego samego komputera. Zmiana nasłuchu na 0.0.0.0 obejmuje wszystkie interfejsy IPv4 i może otworzyć dostęp z innych urządzeń, zależnie od zapory oraz sieci.
Nie kopiuj więc bez zastanowienia poradnika, który dla wygody wystawia port, dodaje tunel albo przekierowanie na routerze. Sprawdź osobno dostępność serwera modelu i interfejsu czatu. Jeśli potrzebujesz tylko jednego komputera, nie rozszerzaj tej granicy bez powodu. Przy kontenerach uwzględnij także sposób publikacji portów.
Model działający na domowym serwerze może nie korzystać z chmury, ale dokument opuszcza wtedy laptop. To może być świadomy wybór. Trzeba go tylko uczciwie nazwać i objąć kontrolą również serwer.
Usunięty czat nie oznacza usunięcia wszystkich kopii
Po analizie dokument może istnieć jako oryginał, tekst po OCR, fragmenty w indeksie, załącznik i część odpowiedzi. Sprawdź też folder eksportu oraz synchronizację. Lokalnie zapisany wynik w katalogu synchronizowanym z chmurą nadal może opuścić komputer.
Historia i logowanie zależą od konfiguracji aplikacji. Przykładowo dokumentacja Open WebUI opisuje poziomy logowania obejmujące treść żądań i odpowiedzi. Dlatego przeglądam nie tylko przełącznik historii, ale także ustawienia logów i ich lokalizację — zobacz referencję konfiguracji Open WebUI.
W kontrolowanej próbie usuń testową rozmowę i plik przez interfejs, a następnie sprawdź, czy nadal można odnaleźć dokument w kolekcji lub jego znacznik w znanych miejscach zapisu. Nie kasuj na ślepo całego katalogu aplikacji. Brak znalezionego znacznika nie dowodzi bezpowrotnego usunięcia danych z baz, migawek i kopii zapasowych. To osobny zakres kontroli.
Jak zapisać wynik, żeby nie obiecywać za dużo
Zamiast zdania „sprawdziłem, nic nigdy nie wycieka”, przygotuj krótki protokół. Dla każdego etapu wpisz: zaliczony, niezaliczony albo niezweryfikowany. W notatce zachowaj:
- datę, system, wersje programów, modele i ustawienia dostawców;
- rodzaje dokumentów, moment odłączenia sieci oraz dokładnie wykonane czynności;
- wynik OCR, indeksowania, odpowiedzi i eksportu, z porównaniem do danych kontrolnych;
- czas obserwacji po powrocie sieci, użyte narzędzia, połączenia i niewyjaśnione adresy;
- miejsca zapisu, zakres sprawdzenia usuwania oraz ograniczenia testu.
Przykładowa forma wniosku do uzupełnienia brzmi: „W konfiguracji [wersje i modele] przetworzono [rodzaje plików] przy odłączonej sieci. Sprawdzono [etapy]. Po przywróceniu połączenia przez [czas] obserwowano [procesy i interfejsy]. Wykryto [ruch lub jego brak]. Nie sprawdzono [ograniczenia]”. To szablon, nie wynik tej publikacji.
Moja zasada: najpierw ustal drogę danych
Do publicznego dokumentu mogę zaakceptować inny proces niż do wyciągu pokazującego dochody, wydatki i zobowiązania. Przy danych szczególnie wrażliwych wybrałbym kontrolowane środowisko z ograniczonym dostępem do sieci i plików albo zrezygnował z przekazywania dokumentu modelowi, jeżeli nie potrafię sprawdzić całego procesu.
Lokalność nie gwarantuje też poprawności odpowiedzi. AI może błędnie odczytać kwotę, pominąć aneks lub wskazać niewłaściwy fragment. Świadome korzystanie z modelu wymaga własnej weryfikacji — podobnie jak w pytaniu, czy ChatGPT zastępuje czytanie książek o inwestowaniu.
Dla mnie prywatny asystent AI zaczyna się od odpowiedzi na trzy pytania: gdzie dokument jest przetwarzany, gdzie zostają jego kopie i co może je wysłać dalej? Dopiero potem interesuje mnie wygoda czatu. Napis „lokalnie” na stronie produktu tej pracy za mnie nie wykona.

