3. Pierwszy chatbot bez dokumentów

Lokalne chatboty, agenci i systemy RAG z własną bazą wiedzy

Instrukcja krok po kroku · materiał uzupełniający

Budujemy chatbota w konsoli

Działający czat konsolowy

Odniesienie: M1 R1–R3, M4 R2   |   Czas: 20 min

Zbuduj pierwszą pętlę: wczytaj wiadomość, wywołaj model, pokaż odpowiedź i poczekaj na kolejną wiadomość.

Utwórz czat_llm.py

Zapisz poniższy kod w pliku czat_llm.py, obok lokalny.py. Nazwa po import odpowiada plikowi bez rozszerzenia. Wcięcia w Pythonie są częścią programu; kopiuj cały blok.

"""Pierwszy czat: bez dokumentów, z historią maksymalnie trzech par tur."""
from lokalny import CONFIG, chat, require_models


def main():
    require_models([CONFIG["chat_model"]])
    history = []
    system = {"role": "system", "content": "Odpowiadaj krótko po polsku."}
    print("Czat bez dokumentów. /clear czyści historię, /exit kończy.")
    while True:
        try:
            question = input("Ty: ").strip()
        except (EOFError, KeyboardInterrupt):
            print("\nKoniec.")
            break
        if question.casefold() == "/exit":
            break
        if question.casefold() == "/clear":
            history.clear()
            print("Nowa rozmowa.")
            continue
        if not question or len(question) > CONFIG["question_chars"]:
            print("Wpisz pytanie o długości 1–1000 znaków.")
            continue
        user = {"role": "user", "content": question}
        try:
            result = chat([system, *history, user])
            answer = result["message"]["content"]
        except (RuntimeError, ValueError, KeyError) as exc:
            print("Błąd:", exc)
            continue
        print("Bot:", answer)
        if result.get("done_reason") == "length":
            print("Uwaga: odpowiedź mogła zostać ucięta przez limit generowania.")
        history = (history + [user, {"role": "assistant", "content": answer}])[-6:]


if __name__ == "__main__":
    main()

Uruchom i sprawdź

.\.venv\Scripts\python.exe czat_llm.py
  1. Wpisz: Wyjaśnij jednym zdaniem, czym jest RAG.
  2. Zadaj pytanie uzupełniające: Podaj prosty przykład. Tutaj trzy ostatnie pary wiadomości są przekazywane modelowi.
  3. Wpisz /clear, a potem ponownie pytanie uzupełniające. Porównaj odpowiedzi.
  4. Wpisz /exit, aby wrócić do terminala.

Co robi pętla

input() zatrzymuje program do czasu wpisania wiadomości. while True powtarza obsługę. break kończy rozmowę. Historia jest listą ról user i assistant; jest przekazywana ponownie przy każdym żądaniu. Sam model nie pamięta między niezależnymi wywołaniami API.

Warto wiedzieć. Limit trzech par wiadomości ogranicza historię liczbą tur, a nie liczbą tokenów. Długie wiadomości nadal mogą przekroczyć okno modelu. W finalnym RAG nie przekazujemy tej historii jako źródła wiedzy.

Punkt kontrolny

  • Możesz zadać dwa pytania, wyczyścić historię i zakończyć program.
  • Pusta wiadomość nie uruchamia modelu.
  • Potrafisz wskazać miejsce, w którym program ogranicza historię.

Instrukcja uczestnika · Python i Ollama · wydanie 29.09.2026