Base de connaissances
Comment alimenter, structurer et utiliser la KB des membres
Chaque membre a sa propre base de connaissances, alimentée par lui-même (audio + texte) et par l'équipe Reciprok. C'est le carburant qui rend l'IA pertinente.
Pourquoi une KB ?
La fiche d'un membre dans la base ne dit jamais tout. Les éléments décisifs sont souvent dans la tête du restaurateur :
- "On est vraiment fait pour les événements d'entreprise haut de gamme"
- "La salle 2 est parfaite pour les anniversaires intimistes"
- "On ne fait pas de soirées dansantes après 22h"
- "Notre chef est étoilé et propose un menu végétarien complet"
Sans cette connaissance, l'IA recommande des lieux corrects mais pas optimaux. La KB est ce qui transforme une recherche "compatible" en recommandation "parfaite".
Sources d'alimentation
1. Audio du membre lui-même
Le membre reçoit un lien dédié (token persistant) qui lui donne accès à un mini-flow :
"Décris ton lieu, tes salles, tes points forts, ta clientèle. Plus tu donnes de détails, mieux on t'enverra des demandes pertinentes."
Il enregistre un audio (libre, peut durer 5 min comme 30 min). Le système :
- Upload l'audio sur S3
- Transcrit avec Whisper
- Stocke la transcription brute (pour audit)
- Envoie le texte à Claude pour structuration
- Claude découpe en
KnowledgeEntrytypées
Exemple : un audio de 10 min produit ~15-30 entrées :
{ type: "general_description", content: "Lieu rooftop avec vue panoramique sur Paris..." }
{ type: "ambiance", content: "Ambiance chic et festive, idéal pour clientèle CSP+" }
{ type: "room_description", content: "Salle 1 'Le Belvédère' : 80 places assises, vue Tour Eiffel" }
{ type: "pricing", content: "Privatisation à partir de 5000€ HT le soir" }
{ type: "availability_rule", content: "Pas de soirées dansantes après 22h" }
...Chaque entrée porte :
source: "voice_transcript"sourceRef: { audioUrl, transcriptId, segmentStart, segmentEnd }
2. Mises à jour de disponibilité (texte ou audio)
Via le même lien, le membre peut dire ou écrire :
"Salle 1 indispo le 12 mai au soir, déjà prise pour un mariage."
L'IA interprète :
- Identifie le membre (depuis le token)
- Identifie la salle (matching sur le nom)
- Identifie la date et le créneau
- Crée une
KnowledgeEntrytypéeavailability_rule(la phrase brute reste consultable par Maxy ; aucun calendrier libre n'est tenu côté membre)
Si une demande active interroge ce membre via magic link, c'est request_availability_check qui porte la réponse définitive.
3. Notes de l'équipe Reciprok
L'équipe peut ajouter manuellement des notes depuis l'interface :
- Retours après un événement passé
- Informations récoltées lors d'un audit terrain
- Préférences du gérant ("prévenir Pierre 48h à l'avance")
source: "manual" ou source: "audit".
Structure d'une KnowledgeEntry
{
id: uuid,
memberId: uuid,
type: enum, // catégorisation
content: text, // la connaissance brute
source: enum, // d'où ça vient
sourceRef: jsonb, // détails de la source
embedding: vector(1536), // pour la recherche sémantique
createdAt, updatedAt
}Types
| Type | Exemple |
|---|---|
general_description | "Restaurant gastronomique en bord de Seine, ambiance romantique" |
room_description | "Salle 1 : 80 places assises, vue Tour Eiffel, terrasse extérieure" |
pricing | "Privatisation à partir de 5000€ HT le soir" |
ambiance | "Idéal pour clientèle CSP+, événements professionnels haut de gamme" |
availability_rule | "Fermé tous les lundis, pas de soirées dansantes après 22h" |
internal_note | "Pierre, le gérant, est très réactif sur WhatsApp. Préfère un appel pour les gros événements." |
audit_note | "Visite du 15 mars : salle rénovée, photos à refaire" |
Sources
| Source | Description | Auditabilité |
|---|---|---|
voice_transcript | Audio transcrit + structuré par l'IA | Lien vers l'audio original |
manual | Saisie manuelle par l'équipe | Lien vers l'auteur |
audit | Note d'audit terrain | Lien vers l'audit + auteur |
ai_structured | Extrait par l'IA d'un autre contenu (email, conversation) | Lien vers la source |
Indexation
Embeddings
Chaque KnowledgeEntry a son propre embedding. Permet :
- De chercher dans la KB par requête sémantique ("Quel lieu propose un menu végétarien complet ?")
- De pondérer la recherche de membres (l'embedding du membre inclut déjà la concat de ses entries, mais on peut chercher entry par entry pour des requêtes très précises)
Index plein texte
En complément, on indexe content en plein texte (Postgres tsvector) pour les recherches lexicales rapides ("rooftop").
CREATE INDEX knowledge_content_fts_idx
ON knowledge_entry
USING gin (to_tsvector('french', content));Utilisation par l'IA
Lors d'une recherche de membres pour une demande, l'IA peut :
- Filtrer par type, ne charger que les entries
pricingetavailability_rulepour vérifier la compatibilité - Chercher par requête, "Quel lieu mentionne du végétarien ?"
- Exploiter le tout, l'embedding du membre intègre déjà les entries (via le texte concaténé)
Le tool get_member_knowledge (côté IA) permet de récupérer :
get_member_knowledge({
memberId: "...",
types?: ["pricing", "availability_rule"],
query?: "végétarien",
limit?: 10,
})Workflow de structuration
Quand un audio arrive depuis le lien personnel d'un membre :
Mise à jour vs ajout
Quand un membre re-enregistre un audio :
- Pas d'écrasement automatique. Les anciennes entries restent (avec leur source).
- L'IA peut détecter les conflits ("ancien : 80 places ; nouveau : 100 places")
- Marqué comme
supersededdans la metadata (mais entry conservée pour historique)
Modération
L'équipe Reciprok a une vue sur la KB de chaque membre :
- Liste des entries avec source
- Possibilité de rejeter / corriger une entry IA
- Possibilité d'ajouter des entries manuelles
- Historique des modifications
Cela permet de garder un humain dans la boucle, surtout au début.
Évolution
À terme :
- KB partagée entre membres similaires (un truc qui marche pour les rooftops du 8ème peut s'appliquer à d'autres)
- KB cross-sourcée (réseaux sociaux du membre, avis Google, articles de presse), uniquement avec son accord
- Auto-structuration d'autres formats (PDF de plaquette commerciale, site web)