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:

  1. 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).
  2. Prompt engineering jest kluczowy: Nakazuję modelowi odpowiadać WYŁĄCZNIE na podstawie dostarczonego kontekstu. Zmniejsza to liczbę halucynacji o 80%.
  3. 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:

Źródło: https://dev.to/avinash_zala_1c6f5e7c4af9/build-a-local-rag-chatbot-in-30-minutes-with-net-8-ollama-and-react-55go

Opcjonalna społeczność edukacyjna: https://t.me/GyaanSetuAi