- Structure complète du projet - Docker compose de production - Documentation organisée par thèmes - Guides d'installation et configuration - Section dépannage détaillée - Journal historique
214 lines
7.7 KiB
Markdown
214 lines
7.7 KiB
Markdown
## Vue d'ensemble
|
||
|
||
Effi est une assistante IA personnelle 100% locale, auto-hébergée, avec mémoire persistante entre les sessions. Elle tourne sur un serveur Ubuntu avec Docker, utilise Ollama sur un PC de jeu séparé comme moteur LLM, et stocke les souvenirs automatiquement.
|
||
|
||
## Architecture
|
||
|
||
text
|
||
|
||
`[PC Gamer - 192.168.1.X] [Serveur - 192.168.1.27] Ollama :3011 ←→ Docker Compose qwen2.5:14b ├── open-webui :3000 RX 7800 XT 16GB VRAM ├── qdrant :6333 ├── mcpo :8000 └── wol-proxy :9999`
|
||
|
||
---
|
||
|
||
## Prérequis
|
||
|
||
- **Serveur** : Ubuntu Server, Docker + Docker Compose installés
|
||
|
||
- **PC Gamer** : Ollama installé, accessible sur le réseau local via `:3011`
|
||
|
||
- **Modèles Ollama** : `qwen2.5:14b` (principal), `qwen2.5:3b` (mémoire)
|
||
|
||
|
||
---
|
||
|
||
## Structure des fichiers
|
||
|
||
bash
|
||
|
||
`~/effi/ ├── docker-compose.yml ├── .env └── mcpo-config/ └── config.json`
|
||
|
||
---
|
||
|
||
## Fichier `.env`
|
||
|
||
text
|
||
|
||
`WEBUI_SECRET_KEY=une_cle_secrete_longue_et_aleatoire`
|
||
|
||
---
|
||
|
||
## `docker-compose.yml` complet
|
||
|
||
text
|
||
|
||
`services: open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" ports: - "3000:8080" environment: - OLLAMA_BASE_URL=http://192.168.1.X:3011 - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY} - VECTOR_DB=qdrant - QDRANT_URI=http://qdrant:6333 - DEFAULT_LOCALE=fr-FR - ENABLE_MEMORIES=true volumes: - open-webui-data:/app/backend/data depends_on: - qdrant - wol-proxy networks: - effi-net qdrant: image: qdrant/qdrant:latest container_name: qdrant restart: unless-stopped ports: - "6333:6333" volumes: - qdrant-data:/qdrant/storage networks: - effi-net mcpo: image: ghcr.io/open-webui/mcpo:main container_name: mcpo restart: unless-stopped ports: - "8000:8000" volumes: - ./mcpo-config:/app/config command: ["--config", "/app/config/config.json"] networks: - effi-net wol-proxy: image: alpine:latest container_name: wol-proxy restart: unless-stopped networks: - effi-net volumes: open-webui-data: qdrant-data: networks: effi-net: driver: bridge`
|
||
|
||
---
|
||
|
||
## Démarrage
|
||
|
||
bash
|
||
|
||
`cd ~/effi docker compose up -d`
|
||
|
||
---
|
||
|
||
## Configuration Open WebUI
|
||
|
||
## 1. Créer le compte admin
|
||
|
||
Accède à `http://192.168.1.27:3000` → crée le compte **Folzo**.
|
||
|
||
## 2. Connecter Ollama
|
||
|
||
`Admin Panel → Settings → Connections → Ollama`
|
||
→ URL : `http://192.168.1.X:3011`
|
||
|
||
## 3. Créer le modèle Effi
|
||
|
||
`Admin Panel → Models → + New Model`
|
||
|
||
- **Nom** : `Effi`
|
||
|
||
- **Modèle de base** : `qwen2.5:14b`
|
||
|
||
- **System prompt** : voir section dédiée ci-dessous
|
||
|
||
|
||
## 4. Activer la mémoire
|
||
|
||
`Admin Panel → Settings → General → Memory` → toggle **ON**
|
||
|
||
---
|
||
|
||
## System prompt d'Effi
|
||
|
||
text
|
||
|
||
`Tu es Effi, l'assistante IA locale de Folzo (Open WebUI + Ollama). ## Langue Réponds UNIQUEMENT en français, quelle que soit la langue utilisée. ## Personnalité - Chaleureuse, efficace, orientée solutions — une amie geek de confiance. - Humour fin : 0 à 1 vanne max par réponse, jamais forcée. - Ton conversationnel IRL, phrases courtes, pas de pavés. ## Priorités 1. Répondre à la demande directement et clairement. 2. Ajouter un conseil ou alternative si pertinent. 3. Si ambigu → 1 à 3 questions courtes avant de proposer une solution. ## Règles strictes - Question simple → réponse courte (2–6 phrases) + 1 suggestion finale. - Action risquée (rm, format, firewall, suppression) → demande confirmation avant. - Ne sur-parle pas, pas de répétitions inutiles. ## Spécialités - Linux/Docker : commandes prêtes à copier + explication simple du "pourquoi". - Débogage : étape par étape, checks rapides d'abord. - Écriture : corrige en gardant le style de Folzo. ## Prise de notes Folzo utilise Obsidian. Si une note doit être créée, fournis le contenu formaté en Markdown prêt à copier. ## Mémoire N'invente pas de souvenirs. Les infos sur Folzo sont injectées automatiquement ci-dessous. <memory_user_context></memory_user_context>`
|
||
|
||
---
|
||
|
||
## Installation du filtre Auto Memory
|
||
|
||
## Installer le filtre
|
||
|
||
`Admin Panel → Functions → Discover` → cherche **"Auto Memory"** par **nokodo** → Installer
|
||
|
||
## Configurer les Valves
|
||
|
||
`Admin Panel → Functions → Auto Memory → ⚙️`
|
||
|
||
|Valve|Valeur|
|
||
|---|---|
|
||
|Openai Api Url|`http://192.168.1.X:3011/v1`|
|
||
|Model|`qwen2.5:3b`|
|
||
|Api Key|`toto` (valeur quelconque)|
|
||
|Messages To Consider|`10`|
|
||
|Related Memories N|`5`|
|
||
|Minimum Memory Similarity|`0.7`|
|
||
|Override Memory Context|`OFF`|
|
||
|Debug Mode|`OFF` (ON pour diagnostic)|
|
||
|
||
## Activer globalement
|
||
|
||
`Admin Panel → Functions → Auto Memory → ⋯ → Toggle Global` → **ON**
|
||
|
||
## Patch du code (correction JSON markdown)
|
||
|
||
`Admin Panel → Functions → Auto Memory → ⋯ → Edit`
|
||
|
||
Cherche avec Ctrl+F : `text_response = response.choices[0].message.content`
|
||
|
||
Remplace le bloc `if response_model:` par :
|
||
|
||
python
|
||
|
||
`if response_model: try: cleaned = re.sub(r'```(?:json)?\s*', '', text_response) cleaned = re.sub(r'```\s*', '', cleaned).strip() match = re.search(r'\{.*\}', cleaned, re.DOTALL) if match: cleaned = match.group(0) return response_model.model_validate_json(cleaned) except ValidationError as e: self.log(f"response model validation error: {e}", level="warning") raise return text_response`
|
||
|
||
Cherche aussi `UNIFIED_SYSTEM_PROMPT` et ajoute au tout début de la chaîne :
|
||
|
||
python
|
||
|
||
`UNIFIED_SYSTEM_PROMPT = """IMPORTANT: Respond with ONLY valid JSON. No markdown formatting, no code blocks, no explanation text. Start your response directly with { and end with }. """ + UNIFIED_SYSTEM_PROMPT`
|
||
|
||
---
|
||
|
||
## Installation du filtre Memory Injection
|
||
|
||
## Installer le filtre
|
||
|
||
`Admin Panel → Functions → Discover` → cherche **"Memory Injection Filter"** par **Raphael** → Installer
|
||
|
||
## Configurer les Valves
|
||
|
||
- **PREPENDING_TEXT** : `Voici les souvenirs à long terme de l'utilisateur :`
|
||
|
||
- **SHOW_MEMORY_COUNT_EMITTER** : `ON`
|
||
|
||
|
||
## Activer globalement
|
||
|
||
`Admin Panel → Functions → Memory Injection Filter → ⋯ → Toggle Global` → **ON**
|
||
|
||
---
|
||
|
||
## Vérification du bon fonctionnement
|
||
|
||
## 1. Test d'enregistrement mémoire
|
||
|
||
Dans un chat avec Effi :
|
||
|
||
text
|
||
|
||
`Je collectionne les vinyles des années 80`
|
||
|
||
Dans le terminal :
|
||
|
||
bash
|
||
|
||
`sudo docker cp open-webui:/app/backend/data/webui.db /tmp/webui.db sqlite3 /tmp/webui.db "SELECT content, datetime(created_at, 'unixepoch') FROM memory ORDER BY created_at DESC LIMIT 5;"`
|
||
|
||
→ Le souvenir doit apparaître.
|
||
|
||
## 2. Test de restitution entre sessions
|
||
|
||
Ouvre un **nouveau chat** :
|
||
|
||
text
|
||
|
||
`Qu'est-ce que tu sais sur mes hobbies ?`
|
||
|
||
→ Effi doit mentionner les vinyles sans que tu l'aies redit.
|
||
|
||
## 3. Vérification des logs
|
||
|
||
bash
|
||
|
||
`docker logs open-webui --tail 50 | grep -iE "memory|saved|added"`
|
||
|
||
---
|
||
|
||
## Gestion de la mémoire
|
||
|
||
## Voir tous les souvenirs
|
||
|
||
`Profil → Settings → Personalization → Memory`
|
||
|
||
## Supprimer un souvenir
|
||
|
||
Via l'UI : icône 🗑️ dans la liste des souvenirs.
|
||
|
||
Via SQLite :
|
||
|
||
bash
|
||
|
||
`sudo docker cp open-webui:/app/backend/data/webui.db /tmp/webui.db sqlite3 /tmp/webui.db "DELETE FROM memory WHERE content LIKE '%mot_clé%';" sudo docker cp /tmp/webui.db open-webui:/app/backend/data/webui.db`
|
||
|
||
## Bonnes pratiques
|
||
|
||
- Garder les souvenirs **courts et factuels** (< 15 mots)
|
||
|
||
- Viser 30-50 souvenirs max pour ne pas surcharger le contexte
|
||
|
||
- Nettoyage manuel trimestriel via l'UI |