Podręcznik uczestnika z objaśnieniami, przykładami i ćwiczeniami do samodzielnej nauki do Modułu 5
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
- Wypełnij 12 pól kontraktu w notebooku R1 pakietu. Test negatywny ma zawierać wejście, status i dowód braku wykonania.
- Uzupełnij create_initial_state() i sprawdź etap R1 w warsztacie.
- Wyjaśnij różnicę między last_result i turn_log.
- Zaproponuj jedno rozszerzenie tylko do odczytu; oznacz je jako projekt.
ENHANCER+ · Politechnika Warszawska · podręcznik do samodzielnej pracy · M5