# Aplikacja do Kategoryzacji Ludzi Aplikacja w Go zbudowana w architekturze czystej (Clean Architecture), która pobiera dane ludzi z pliku CSV i kategoryzuje je przy użyciu LLM. ## Funkcjonalności - Projekt oparty na Clean Architecture - Pobieranie danych ludzi ze zdalnego pliku CSV - **Inteligentne filtrowanie**: Filtruje dane na podstawie określonych kryteriów: - Płeć: Mężczyzna (M) - Wiek w 2026 roku: 20-40 lat (urodzeni 1986-2006) - Miasto: Grudziądz - Branża: Transport (na podstawie słów kluczowych w opisie zawodu) - **Przetwarzanie wsadowe**: Przetwarza ludzi w konfigurowalnych partiach (np. 1000 dla OpenRouter, 10 dla lokalnego) - **Wznowienie**: Może kontynuować od miejsca przerwania - pomija już przetworzone partie - **Śledzenie postępu**: Pokazuje postęp w czasie rzeczywistym z informacjami o ETA i czasie - **Logowanie statystyk**: Pokazuje liczbę oryginalnych rekordów vs. przefiltrowanych - Kategoryzuje ludzi używając LLM ze strukturyzowanym wyjściem - Obsługuje wielu dostawców LLM: - OpenRouter API (zalecany batch_size: 1000) - Lokalne LM Studio (zalecany batch_size: 10) - Konfiguracja poprzez plik JSON - Tagi: IT, transport, edukacja, medycyna, praca z ludźmi, praca z pojazdami, praca fizyczna ## Struktura Projektu ``` . ├── cmd/app/ # Punkt wejścia aplikacji ├── internal/ │ ├── domain/ # Encje domenowe i interfejsy │ ├── usecase/ # Logika biznesowa │ ├── infrastructure/ # Usługi zewnętrzne │ │ ├── csv/ # Pobieranie danych CSV │ │ └── llm/ # Dostawcy LLM │ └── config/ # Obsługa konfiguracji ├── config.json # Twój plik konfiguracyjny └── output.json # Wygenerowane wyniki ``` ## Konfiguracja Utwórz plik `config.json` na podstawie jednego z przykładów: ### Użycie OpenRouter ```json { "data_source": { "url": "https://hub.ag3nts.org/data/b8307041-adb1-4101-bc7a-b0533e93078a/people.csv" }, "llm": { "provider": "openrouter", "model": "anthropic/claude-3.5-sonnet", "api_key": "TWOJ_KLUCZ_API_OPENROUTER" }, "output_dir": "./output", "batch_size": 1000 } ``` ### Użycie LM Studio ```json { "data_source": { "url": "https://hub.ag3nts.org/data/b8307041-adb1-4101-bc7a-b0533e93078a/people.csv" }, "llm": { "provider": "lmstudio", "model": "local-model", "base_url": "http://localhost:1234" }, "output_dir": "./output", "batch_size": 10 } ``` **Uwaga dotycząca batch_size:** - Dla dostawców chmurowych jak OpenRouter: Używaj większych partii (500-1000) dla lepszej wydajności i efektywności kosztowej - Dla modeli lokalnych z ograniczonym kontekstem: Używaj mniejszych partii (10-50) aby uniknąć błędów przekroczenia długości kontekstu ## Użycie 1. Zainstaluj zależności: ```bash go mod tidy ``` 2. Utwórz plik konfiguracyjny: ```bash cp config.example.openrouter.json config.json # lub cp config.example.lmstudio.json config.json ``` 3. Edytuj `config.json` z własnymi ustawieniami 4. Uruchom aplikację: ```bash go run cmd/app/main.go ``` Lub z niestandardową ścieżką do konfiguracji: ```bash go run cmd/app/main.go -config=mojakonfiguracja.json ``` 5. Zbuduj aplikację: ```bash go build -o categorizer cmd/app/main.go ./categorizer ``` ## Wyjście Aplikacja: - Zapisuje każdą partię do oddzielnego pliku JSON w katalogu `output_dir` - Każdy plik jest nazwany: `batch_{start}_{end}.json` (np. `batch_0_999.json`) - Wyświetla końcowe połączone wyniki na stdout - Zapisuje połączone wyniki do `output.json` Format pliku partii: ```json [ { "name": "Jan", "surname": "Kowalski", "gender": "M", "born": 1987, "city": "Warszawa", "tags": ["IT", "praca z ludźmi"] }, { "name": "Anna", "surname": "Nowak", "gender": "F", "born": 1993, "city": "Kraków", "tags": ["medycyna"] } ] ``` Format końcowego wyjścia: ```json { "answer": [ { "name": "Jan", "surname": "Kowalski", "gender": "M", "born": 1987, "city": "Warszawa", "tags": ["IT", "praca z ludźmi"] } ] } ``` ## Wznawialne Przetwarzanie Aplikacja jest w pełni wznawialna: 1. Każda partia jest zapisywana natychmiast po przetworzeniu 2. Po ponownym uruchomieniu, sprawdza które pliki partii już istnieją 3. Pomija już przetworzone partie 4. Kontynuuje z pozostałymi partiami To oznacza, że możesz: - Zatrzymać aplikację w dowolnym momencie (Ctrl+C) - Uruchomić ją ponownie później i będzie kontynuować od miejsca przerwania - Uruchamiać wielokrotnie bez ponownego przetwarzania wszystkiego - Dostosować batch_size między uruchomieniami (ale już przetworzone partie nie będą przetwarzane ponownie) ## Rozwój ### Dodawanie Nowych Dostawców LLM 1. Zaimplementuj interfejs `domain.LLMProvider` w `internal/infrastructure/llm/` 2. Dodaj inicjalizację dostawcy w `cmd/app/main.go` 3. Zaktualizuj walidację konfiguracji w `internal/config/config.go` ## Licencja MIT