2. Zakres DocAssist i stan rozmowy

Najpierw ustal, jakie działania aplikacja może wykonać. Sam opis „asystent” nie określa dostępu do plików, liczby prób ani reakcji na brak danych. Potrzebujesz zakresu, który da się sprawdzić w kodzie i zapisanym wyniku.

1. Cztery role w jednej aplikacji

Pojęcie Znaczenie w prototypie
Chatbot Interfejs wymieniający wiadomości.
Asystent Rola użytkowa: pomoc w rozumieniu dokumentacji.
Mechanizm agentowy Model proponuje działanie, kod kontroluje wykonanie.
RAG Jedno z narzędzi: wyszukiwanie i odpowiedź ze źródeł.

Interfejs może działać bez selektora narzędzi, jak w R3, albo z selektorem, jak w R6. W naszym wariancie jedna wiadomość prowadzi najwyżej do jednej próby narzędzia. Nie ma automatycznego ponawiania ani kolejnej akcji planowanej na podstawie wyniku funkcji.

2. Kontrakt, który można zweryfikować

Decyzja Zakres Dowód
Dozwolone RAG, ostatnie źródła, metadane. Trzy klucze TOOL_REGISTRY.
Niedostępne Powłoka, restart, zmiana konfiguracji, wysyłanie danych. Brak takich funkcji.
Brak odniesienia Doprecyzowanie. clarification_needed bez RAG.
Błędne argumenty Odrzucenie przed funkcją. invalid_arguments i zero wywołań dublera.
Liczba prób Jedna próba na turę. Znacznik ustawiony przed walidacją.

„Jak ponownie uruchomić usługę według instrukcji?” jest pytaniem o informację. „Zrestartuj usługę” żąda operacji. DocAssist może opisać procedurę ze źródła, lecz jej nie wykonuje. Nazwy narzędzi muszą odpowiadać rzeczywistym możliwościom.

3. Dane zachowane między wiadomościami

Stan rozmowy należy do aplikacji. Każde wywołanie create_initial_state() tworzy nowe listy i nowy identyfikator. Wspólna globalna lista historii powodowałaby przenikanie wiadomości między rozmowami. Wstaw definicję w miejsce oznaczone R1.

Do pliku kod/moj_m5.py: create_initial_state()

def create_initial_state():
    return {'conversation_id': uuid.uuid4().hex, 'next_turn_id': 1, 'history': [], 'last_result': None, 'last_sources': [], 'last_source_turn_id': None, 'last_source_result_id': None, 'tool_attempted_this_turn': False, 'diagnostic_mode': False, 'turn_log': []}
Pole Znaczenie
conversation_id ID rozmowy; zmienia się po /clear.
next_turn_id Numer następnej tury od 1; zwiększa go finalize_turn.
history Ostatnie pary user/assistant.
last_result Ostatni wynik RAG, nie dowolnego narzędzia.
last_sources, last_source_* Źródła i identyfikatory tury, z której pochodzą.
tool_attempted_this_turn Znacznik próby zerowany przez begin_turn.
turn_log Skróty zakończeń, także odmów i doprecyzowań.

Test R1; m oznacza przeładowany moj_m5

a = m.create_initial_state()
b = m.create_initial_state()
a["history"].append({"role": "user", "content": "Pytanie"})
assert a["conversation_id"] != b["conversation_id"]
assert b["history"] == []
assert a["next_turn_id"] == 1

Ćwiczenie 1. Zapisz zakres i rozdziel rozmowy

  1. Wypełnij 12 pól kontraktu w notebooku R1 pakietu. Test negatywny ma zawierać wejście, status i dowód braku wykonania.
  2. Uzupełnij create_initial_state() i sprawdź etap R1 w warsztacie.
  3. Wyjaśnij różnicę między last_result i turn_log.
  4. Zaproponuj jedno rozszerzenie tylko do odczytu; oznacz je jako projekt.

ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej pracy · M5