Zbuduj lokalnego chatbota RAG w 30 minut
Wgrałem 40-stronicową specyfikację API do mojego lokalnego chatbota. Zapytałem o limit zapytań (rate limit) dla konkretnego punktu końcowego (endpoint).
Bot odpowiedział w trzy sekundy. Przytoczył dokładny fragment dokumentu.
Najlepsze w tym wszystkim? Kosztowało to 0 USD. Wszystko działa na moim laptopie przy użyciu .NET 8, Ollama i React. Żadne dane nie opuszczają mojego urządzenia.
Większość poradników zaleca korzystanie z OpenAI. To sprawdza się w demonstracjach, ale zawodzi w prawdziwej pracy, ponieważ:
- Prywatność: Nie chcesz, aby wrażliwe dane firmowe trafiały do chmurowego potoku szkoleniowego (training pipeline).
- Koszt: Przesyłanie dużych plików do LLM szybko generuje wysokie koszty.
- Halucynacje: Modele często zapominają o środkowej części długich dokumentów.
Rozwiązaniem jest RAG (Retrieval-Augmented Generation). Zamiast wysyłać cały plik PDF, wysyłasz tylko istotne fragmenty (chunks).
Oto jak zbudowałem ten potok (pipeline):
• Ekstrakcja tekstu: Użyłem PdfPig do wyodrębnienia tekstu z plików PDF. • Podział na fragmenty (Chunking): Podzieliłem tekst na części po 500 słów z 50-słowowym nakładaniem się (overlap). Ten nakład zapewnia, że model nie pominie odpowiedzi rozciągających się na dwa fragmenty. • Embeddingi: Użyłem modelu nomic-embed-text przez Ollama, aby przekształcić tekst w wektory. • Magazyn wektorowy (Vector Store): Zbudowałem prostą listę w pamięci operacyjnej, wykorzystując podobieństwo cosinusowe (cosine similarity) do znajdowania najlepszych dopasowań. • Generowanie: Użyłem llama3.2, aby odpowiadać na pytania wyłącznie na podstawie znalezionych fragmentów.
Trzy lekcje, których nauczyłem się podczas budowy:
- Używaj długiego czasu oczekiwania (timeout): Modele lokalne potrzebują czasu na załadowanie do pamięci. Ustawiłem timeout dla HttpClient na 5 minut, aby uniknąć błędów podczas tzw. zimnych startów (cold starts).
- Prompt engineering jest kluczowy: Nakazuję modelowi odpowiadać WYŁĄCZNIE na podstawie dostarczonego kontekstu. Zmniejsza to liczbę halucynacji o 80%.
- Podział na fragmenty ma znaczenie: Dzielę tekst na słowa, a nie na znaki. Dzięki temu rozmiar jest przewidywalny i mieści się w limitach modelu.
Cały ten stos technologiczny możesz uruchomić lokalnie. To narzędzie klasy profesjonalnej przy zerowym budżecie.
Pełny log budowy i kod znajdziesz tutaj:
Opcjonalna społeczność edukacyjna: https://t.me/GyaanSetuAi
