- Przegląd projektu
- Architektura systemu
- Przepływy danych
- Komponenty systemu
- Konfiguracja
- API REST
- Obsługa SQLite
- Integracja z Ollama LLM
- Usługi i dostęp
- Rozwijanie systemu
Email-LLM Integration to system, który integruje serwer pocztowy z lokalnymi modelami uczenia maszynowego (LLM) za pomocą Apache Camel i języka Groovy. Głównym celem systemu jest automatyczne przetwarzanie przychodzących wiadomości email, analiza ich zawartości za pomocą modeli LLM oraz generowanie odpowiednich odpowiedzi.
System pozwala na:
- Odbieranie i analizowanie wiadomości email
- Przetwarzanie ich treści za pomocą lokalnych modeli LLM (Ollama)
- Automatyczne generowanie odpowiedzi na podstawie analizy
- Zapisywanie danych w bazie SQLite
- Monitorowanie i zarządzanie całym procesem przez interfejs API REST
System składa się z następujących głównych komponentów:
- Apache Camel - silnik integracji, który zarządza przepływami danych i logiką biznesową
- Groovy - język programowania używany do implementacji logiki biznesowej
- Spring Boot - framework do szybkiego tworzenia aplikacji Java/Groovy
- Ollama - lokalny serwer LLM do analizy tekstu
- SQLite - lekka baza danych do przechowywania wiadomości i ich analizy
- MailHog - testowy serwer SMTP/IMAP dla celów deweloperskich
- Adminer - narzędzie administracyjne dla bazy danych
Wszystkie komponenty są uruchamiane jako kontenery Docker i zarządzane za pomocą Docker Compose.
System wykorzystuje trasy (routes) Apache Camel do definiowania przepływów danych:
-
EmailProcessingRoute - główna trasa do przetwarzania emaili
- Pobieranie wiadomości z serwera IMAP
- Parsowanie treści
- Przesyłanie do analizy LLM
- Zapis do bazy danych
- Opcjonalne generowanie odpowiedzi
-
MaintenanceRoutes - trasy do zadań konserwacyjnych
- Regularne sprawdzanie stanu bazy danych
- Optymalizacja bazy danych
- Logowanie operacji konserwacyjnych
-
OllamaDirectRoute - dynamicznie ładowana trasa do bezpośredniej interakcji z Ollama LLM
- Przyjmowanie żądań analizy tekstu
- Formatowanie zapytań do Ollama
- Przetwarzanie odpowiedzi
- Zwracanie wyników analizy
Główna klasa aplikacji Spring Boot, która konfiguruje środowisko uruchomieniowe. Zawiera:
- Konfigurację DataSource dla SQLite
- Skanowanie komponentów
- Inicjalizację Spring Boot
Implementuje główną logikę przetwarzania wiadomości email, w tym:
- Endpointy REST API
- Obsługę błędów
- Pobieranie emaili z bazy danych
- Analizę tekstu za pomocą LLM
Zawiera trasy do zadań konserwacyjnych:
- Regularne sprawdzanie stanu systemu
- Optymalizacja bazy danych
- Dokumentacja API
Konfiguruje interfejs REST API, w tym:
- Ścieżki kontekstu
- Formaty danych
- Właściwości API
- Obsługę CORS
Implementuje bezpośrednią integrację z Ollama LLM:
- Endpointy do analizy tekstu
- Formatowanie zapytań dla modelu LLM
- Przetwarzanie odpowiedzi z modelu
- Konwersja wyników do JSON
Konfiguracja systemu jest realizowana głównie poprzez zmienne środowiskowe, które są definiowane w pliku .env
. Główne kategorie konfiguracji to:
EMAIL_HOST=test-smtp.example.com
EMAIL_PORT=587
EMAIL_USER=test@example.com
EMAIL_PASSWORD=test_password
EMAIL_USE_TLS=true
EMAIL_IMAP_HOST=test-imap.example.com
EMAIL_IMAP_PORT=993
EMAIL_IMAP_FOLDER=INBOX
OLLAMA_HOST=http://ollama:11434
OLLAMA_MODEL=mistral
OLLAMA_API_KEY=
SQLITE_DB_PATH=/data/emails.db
SQLITE_JOURNAL_MODE=WAL
SQLITE_CACHE_SIZE=102400
SQLITE_SYNCHRONOUS=NORMAL
CAMEL_DEBUG=false
CAMEL_TRACING=false
CAMEL_SHUTDOWN_TIMEOUT=10
CAMEL_ROUTES_RELOAD_DIRECTORY=/app/routes
CAMEL_STREAM_CACHE_ENABLED=true
SERVER_PORT=8080
OLLAMA_PORT=11435
MAILHOG_SMTP_PORT=1026
MAILHOG_UI_PORT=8026
NODERED_PORT=1880
ADMINER_PORT=8081
System udostępnia następujące endpointy REST API:
Endpoint | Metoda | Opis | Przykład zapytania |
---|---|---|---|
/api/health |
GET | Sprawdzenie stanu aplikacji | curl http://localhost:8080/api/health |
/api/emails |
GET | Pobieranie listy przetworzonych emaili | curl http://localhost:8080/api/emails |
/api/llm/direct-analyze |
POST | Bezpośrednia analiza tekstu za pomocą LLM | curl -X POST -H "Content-Type: application/json" -d '{"text":"Treść wiadomości", "context":"Kontekst"}' http://localhost:8080/api/llm/direct-analyze |
/api/api-doc |
GET | Dokumentacja API w formacie JSON | curl http://localhost:8080/api/api-doc |
/api/ollama/analyze |
POST | Alternatywny endpoint do analizy tekstu | curl -X POST -H "Content-Type: application/json" -d '{"text":"Treść wiadomości", "model":"mistral"}' http://localhost:8080/api/ollama/analyze |
System wykorzystuje bazę danych SQLite do przechowywania przetworzonych wiadomości email. Schemat bazy danych zawiera:
id
- unikalne ID rekordumessage_id
- unikalne ID wiadomości emailsubject
- temat wiadomościsender
- nadawcarecipients
- odbiorcyreceived_date
- data otrzymaniaprocessed_date
- data przetworzeniabody_text
- treść tekstowabody_html
- treść HTMLstatus
- status przetworzeniallm_analysis
- wynik analizy LLM w formacie JSONmetadata
- dodatkowe metadane
id
- unikalne ID załącznikaemail_id
- ID powiązanej wiadomości emailfilename
- nazwa plikucontent_type
- typ MIMEsize
- rozmiar załącznikacontent
- zawartość załącznika
System integruje się z Ollama - lokalnym serwerem modeli LLM. Domyślnie używany jest model mistral
, ale można to zmienić w konfiguracji.
Format zapytania do Ollama:
{
"model": "mistral",
"prompt": "..."
}
Format odpowiedzi analizy:
{
"intent": "", // Główny cel wiadomości
"sentiment": "", // Pozytywny, negatywny lub neutralny
"priority": "", // Wysoki, średni lub niski
"topics": [], // Lista głównych tematów
"suggestedResponse": "" // Sugerowana odpowiedź
}
System udostępnia następujące usługi:
Usługa | URL | Dane logowania | Opis |
---|---|---|---|
API aplikacji | http://localhost:8080/api | Nie wymagane | Główne API systemu |
Dokumentacja API | http://localhost:8080/api/api-doc | Nie wymagane | Dokumentacja REST API |
Panel testowej skrzynki email (MailHog) | http://localhost:8026 | Nie wymagane | Interfejs do przeglądania wiadomości testowych |
Panel administracyjny SQLite (Adminer) | http://localhost:8081 | System: SQLite Serwer: /data/emails.db Użytkownik: (puste) Hasło: (puste) Baza: (puste) |
Zarządzanie bazą danych SQLite |
Node-RED | http://localhost:1880 | Nie wymagane | Wizualne programowanie przepływów (jeśli włączone) |
Aby dodać nową trasę Camel, można:
- Utworzyć nową klasę implementującą
RouteBuilder
w katalogucamel-groovy/src/main/groovy/com/example/emailllm/
- Dodać dynamicznie ładowaną trasę w katalogu
camel-groovy/routes/
Przykład trasy:
package com.example.emailllm
import org.apache.camel.builder.RouteBuilder
import org.springframework.stereotype.Component
@Component
class MyNewRoute extends RouteBuilder {
@Override
void configure() throws Exception {
from("direct:myNewEndpoint")
.log("Processing request: ${body}")
.process { exchange ->
// Logika przetwarzania
}
.to("direct:anotherEndpoint")
}
}
Aby dostosować analizę LLM:
- Zmodyfikuj prompt w
OllamaDirectRoute.groovy
lubEmailProcessingRoute.groovy
- Dostosuj przetwarzanie odpowiedzi zgodnie z potrzebami
- Opcjonalnie, dodaj dodatkowe pola do analizy lub zmień format
- Zmodyfikuj istniejące lub dodaj nowe klasy w katalogu
camel-groovy/src/main/groovy/com/example/emailllm/
- Zaktualizuj konfigurację w
application.yml
- Dodaj nowe endpointy REST API w odpowiednich klasach tras
- Rozszerz schemat bazy danych, jeśli to konieczne
Jeśli napotkasz problemy z uruchomieniem Ollama:
- Upewnij się, że masz wystarczającą ilość pamięci RAM (min. 4GB)
- Sprawdź logi kontenera:
docker logs ollama
- Zrestartuj kontener:
docker restart ollama
- Sprawdź, czy ścieżka do bazy danych jest poprawna w zmiennej
SQLITE_DB_PATH
- Upewnij się, że katalog
/data
istnieje i ma odpowiednie uprawnienia - Sprawdź logi aplikacji:
docker logs camel-groovy-email-llm
- Upewnij się, że model Mistral został poprawnie załadowany
- Sprawdź status Ollama:
curl http://localhost:11435/api/health
- Sprawdź, czy format zapytania jest poprawny