Wróć do ścieżek
Moduł 3

Chatbot dla inżyniera

Pojedyncze zapytania już znasz. Teraz zrobimy z nich pełnoprawną rozmowę. Dodamy historię wiadomości, ustawimy system prompt i napiszemy finalny skrypt exp_chatbot.py. Po drodze zobaczysz, co dokładnie wysyłamy do modelu i jak wygląda cała komunikacja.

Nasz pierwszy użyteczny program

Korzystając z asystentów AI, pewnie nieraz miałeś problem, że model traktował Cię jak amatora — a Ty przecież jesteś profesjonalistą i nie prosisz go o pomoc, tylko o opinię. Albo piszesz program i chcesz zintegrować go z modelem tak, aby dostał on pewną informację, zanim odpowie na Twoje pytanie.

W poprzednim pokoju model odpowiadał na nasze pytania, ale co jeśli chcemy, żeby trzymał się określonego tonu albo przestrzegał konkretnych wytycznych? Możemy oczywiście przypominać mu o tym przy każdej wiadomości, ale szybko staje się to męczące. Pewnie zauważyłeś też, że model ma pamięć złotej rybki — po kolejnej wiadomości nie pamięta, o czym rozmawialiśmy wcześniej. Nie jest to przypadek. Model nie przechowuje historii rozmowy za nas, dlatego musimy sami dostarczyć mu potrzebny kontekst.

W tej części zajmiemy się dwiema rzeczami, które pozwolą nam zbudować własnego chatbota:

  • historia wiadomości — chcemy, by każda kolejna wiadomość mogła odnosić się do poprzednich;
  • dodatkowy kontekst (system prompt) — informacja, którą model otrzyma, zanim udzieli nam odpowiedzi.

Dla niektórych może to brzmieć skomplikowanie, ale w praktyce jest bardzo proste i intuicyjne. Pamiętamy kod z poprzedniego pokoju:

from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()

client = Anthropic()

model = "claude-haiku-4-5"
messages = [{"role": "user", "content": "Hi"}]

output = client.messages.create(
    model=model,
    max_tokens=100,
    messages=messages,
)

print(output.content[0].text)

Pora go rozszerzyć o dwie funkcje:

def add_user_message(messages, message):
    user_message = {
        "role": "user",
        "content": message
    }
    messages.append(user_message)

def add_assistant_message(messages, output):
    assistant_message = {
        "role": "assistant",
        "content": output
    }
    messages.append(assistant_message)

Dwie małe funkcje zamiast ręcznego sklejania słowników.

Dodawanie za każdym razem ręcznie słownika role/content dodaje nam pracy, dlatego opakowujemy to w funkcje. Przypomnienie — model nie ma pamięci między wywołaniami. Dlatego musimy sami dostarczyć mu historię: co my napisaliśmy i co on odpowiedział. Doklejamy więc do tablicy kolejne słowniki, na przemian z rolami user i assistant, i wygląda to mniej więcej tak:

[
    {"role": "user", "content": "nasze zapytanie"},
    {"role": "assistant", "content": "odpowiedź modelu"},
    # ... i tak dalej
]

Nie przejmuj się tym, że w add_assistant_message nie wyciągamy tekstu z TextBlock — do treści wiadomości asystenta API przyjmuje z powrotem tę samą listę bloków, którą samo zwróciło (output.content), więc możemy podać ją bezpośrednio. Nie musimy też wyjmować pojedynczego bloku z tej listy, bo mogą się w niej znaleźć również inne elementy (o nich wkrótce).

Zaloguj się, aby czytać dalej

To tylko początek modułu. Załóż darmowe konto lub zaloguj się, aby mieć dostęp do bezpłatnych modułów.