Résumé

  • Transformez apprentissage en connaissances consultables en transcrivant les fichiers audio, en segmentant les transcriptions et en les indexant sous forme de vecteurs.
  • Le système identifie le moment pertinent de la vidéo en se basant sur le sens, et non sur des mots-clés précis, et renvoie directement à l'horodatage correspondant.
  • Il utilise Whisper pour la transcription, des représentations locales, VectorAI DB pour la recherche et un LLM local pour fournir des réponses contextualisées.
  • Cela permet d'exploiter les vastes bibliothèques de vidéos à des fins d'intégration, de conformité et de consultation des procédures, sans avoir à faire défiler manuellement les vidéos.
  • Son principal atout réside dans une recherche vidéo rapide, sémantique et sur site, proposant des réponses concrètes et permettant d'accéder directement à des moments précis.

Nous disposons d'un dossier contenant apprentissage . Des guides d'intégration, des sessions d'information sur la conformité, des démonstrations de procédures cliniques, des sessions de questions-réponses enregistrées. Un contenu utile que personne ne regarde, car personne n'a le temps de passer au crible un enregistrement de 45 minutes à la recherche des deux minutes dont il a réellement besoin.

La solution, c’est la recherche. Mais les fichiers vidéo sont « opaques » pour une base de données ; on ne peut pas indexer des pixels ou des formes d’onde audio de la même manière que l’on indexe du texte. Ce qu’il pouvez indexer, c’est ce qui a été dit. Transcrivez l’audio, divisez-le en segments horodatés, Embarquer segment, puis stockez-le dans la base de données Actian VectorAI. Désormais, la vidéothèque est consultable par signification, et non plus par nom de fichier.

La capture d'écran ci-dessous montre le fonctionnement du système sur un ensemble réel de 678 extraits de transcription. Une infirmière pose une question sur le protocole d'hygiène des mains. Le système identifie le segment exact de 35 secondes dans la bonne apprentissage et y renvoie directement.

Le système en action

recherche de vidéos

Interface utilisateur de recherche vidéo — requête: « protocole d'hygiène des mains avant le contact avec un patient » — 678 extraits, 2 résultats affichés

L'ensemble du processus

L'architecture se divise en deux voies. La voie de gauche fonctionne hors ligne : les vidéos sont transcrites par Whisper, découpées en segments de 30 secondes, Embarqué Embarquer, puis stockées une seule fois dans la base de données VectorAI. La voie de droite s'exécute requête ; la question utilisateurest Embarqué le même modèle, comparée aux segments stockés selon la similarité cosinus à l'aide de l'index HNSW, et les meilleurs résultats sont transmis à llama3:8b pour obtenir une réponse contextualisée et horodatée.

architecture de recherche vidéo

Architecture de recherche vidéo — pipeline d'indexation (à gauche) et requête (à droite)

Ce que vous voyez

Chaque élément de cette capture d'écran est le résultat direct du processus de recherche sémantique. Voici ce que signifie chaque partie :

Élément d'interface utilisateur Étiquette Ce que cela signifie
Barre supérieure 678 blocs Nombre total de segments de transcription indexés dans l'ensemble apprentissage ». Chaque segment correspond à un PointStruct dans la base de données VectorAI.
Barre supérieure llama3:8b Le modèle LLM qui synthétise la réponse à partir des extraits récupérés. Il s'exécute localement via Ollama.
Encadré Recherches rapides Requêtes prédéfinies enregistrées dans la configuration de l'interface utilisateur. Un simple clic sur l'une d'entre elles lance instantanément une recherche vectorielle.
requête protocole d'hygiène des mains avant tout contact avec un patient requête brute utilisateur . Ce texte exact est Embarqué Embarquer dans un vecteur de dimension 1024.
En-tête des résultats Badge « RECHERCHE VIDÉO » Cela confirme que cette réponse provient du chemin d'accès à la transcription, et non d'une solution de secours.
Texte de la réponse Réponse fondée La réponse du LLM, générée à partir du texte de la transcription récupérée — et non à partir de ses apprentissage .
Référence « Les 5 moments clés de l'hygiène des mains.mp4 » @ 00:38–01:13 Nom exact du fichier et plage d'horodatage extraits de la charge utile stockée avec le vecteur.
Fiche de résultats 00:38 – 01:13 | 79 % Plage d'horodatage (start_time / end_time issues de la charge utile) et score de similarité cosinus (0,79).
Extrait de la transcription Cela nous aide à nous souvenir… Le texte brut stocké dans la charge utile, affiché sous forme d'aperçu afin que les utilisateurs puissent vérifier sa pertinence avant de cliquer.
Cliquez pour ouvrir Cliquez pour ouvrir à 00 h 38 Lien direct utilisant le fragment d'URL HTML5 #t=38. Ouvre la vidéo à la seconde exacte.
Deuxième carte 02 h 16 – 02 h 49 | 79 % Un deuxième extrait pertinent tiré de la même vidéo — un autre moment abordant un aspect connexe du sujet.

Comment ce résultat a-t-il été obtenu ?

La réponse visible sur la capture d'écran ne provient ni d'un index de mots-clés ni d'une liste de FAQ. Elle a été obtenue en suivant quatre étapes distinctes.

Étape 1 — La requête en vecteur

Lorsque utilisateur « protocole d'hygiène des mains avant le contact avec un patient », ce texte est transmis àEmbarquer, qui s'exécute localement via Ollama. Le modèle génère une liste de 1 024 nombres à virgule flottante, un vecteur qui encode la signification sémantique de la requête:

query = "hand hygiene protocol before patient contact"
r = requests.post('http://localhost:11434/api/embeddings',
    json={"model": "mxbai-embed-large", "prompt": query})
query_vector = r.json()["embedding"]  # 1024 floats
# e.g. [0.142, -0.831, 0.623, ..., -0.044]

Le modèle ne sait pas ce qu’est l’hygiène des mains. Il sait simplement que cette expression se trouve à proximité d’autres expressions liées à la sécurité clinique dans l’espace à haute dimension sur lequel il a été entraîné. C’est cette relation de proximité que le moteur de recherche exploite.

Étape 2 — VectorAI DB identifie les segments les plus proches

requête est envoyé à la base de données Actian VectorAI via le Python . L'index HNSW le compare à l'ensemble des 678 vecteurs de segments de transcrits stockés à l'aide de la similarité cosinus et renvoie les correspondances les plus pertinentes :

results = client.points.search(

collection_name="video_transcripts",

query_vector=query_vector,

limit=5,

with_payload=True  # return text, filename, timestamps

)

# Result #1:

# id=87  score=0.79

# payload: {

#   "source":     "5 Moments of Hand Hygiene.mp4"

#   "start_time": 38.2,   "end_time": 73.6

#   "start_fmt":  "0:38"

#   "text":       "It helps us to remember all the five moments..."

# }

Le score de 79 % indiqué dans la fiche de résultats correspond à cette valeur de similarité cosinus. Cela signifie que le requête et le vecteur de fragment pointent presque dans la même direction dans l’espace à 1 024 dimensions ; ils sont sémantiquement proches. Aucune correspondance de mot-clé n’a été détectée. Le texte du fragment ne contient pas l’expression « protocole d’hygiène des mains » — il évoque « les cinq moments » et « avant de toucher un patient ». Le modèle a compris que ces deux expressions désignaient la même chose.

Étape 3 — Le LLM génère une réponse

Le texte extrait est transmis à llama3:8b en tant que contexte. Le modèle de langage de grande échelle (LLM) reçoit pour consigne de ne répondre qu’à partir de la transcription fournie, de citer la source et de ne pas inventer d’informations au-delà de ce qui a été dit :

prompt = f"""

You are a helpful assistant. Answer using ONLY the transcript below.

Cite the video and timestamp in your answer.

Transcript:

[5 Moments of Hand Hygiene.mp4 @ 00:38-01:13]

{results[0].payload['text']}

Question: {query}

"""

response = ollama.chat(model="llama3:8b", messages=[{"role": "user", "content": prompt}])

La réponse qui apparaît sur la capture d’écran — « Le premier moment se situe avant de toucher un patient. L’hygiène des mains à ce moment-là empêche la transmission de micro-organismes présents dans l’environnement vers le patient par le biais des mains non lavées d’un professionnel de santé » —est une citation directe extraite du fragment de transcription .Le LLM l’a sélectionnée et mise en forme ; il ne l’a pas inventée.

Étape 4 — L'interface utilisateur génère le lien cliquable vers l'horodatage

Le nom de fichier et les horodatages sont inclus dans la charge utile stockée avec chaque vecteur. L'interface utilisateur utilise la valeur « start_time » pour créer un lien profond HTML à l'aide du fragment #t=seconds :

p = results[0].payload

url = f"http://localhost:8001/videos/{p['source']}#t={int(p['start_time'])}"

# http://localhost:8001/videos/5 Moments of Hand Hygiene.mp4#t=38

# Browser opens the video and jumps directly to 0:38

# No scrubbing. No searching the timeline.

Il s'agit du lien « Cliquez pour ouvrir à 00:38 » qui figure dans la fiche de résultats. Un clic, au bon moment.

La requête « protocole d'hygiène des mains avant tout contact avec un patient ». Le fragment correspondant mentionnait « les cinq moments d'hygiène des mains » et « avant de toucher un patient ». Aucun mot-clé ne correspondait. Le modèle a compris que les deux expressions avaient la même signification.

Ce que contient réellement l'index

Chacun des 678 blocs de la collection correspond à un segment de 30 secondes d'une apprentissage . La charge utile stockée avec chaque vecteur contient exactement ce dont l'interface utilisateur a besoin :

Champ « Charge utile » Exemple de valeur Objectif
source Les 5 moments clés de l'hygiène des mains.mp4 Sélectionnez le fichier vidéo à ouvrir
texte Cela nous aide à nous souvenir de ces cinq moments… Affiché sous forme d'extrait de transcription dans la fiche de résultats
heure_de_début 38.2 Permet de créer le fragment d'URL #t= pour les liens profonds
end_time 73.6 Définit l'horodatage de fin de la fiche de résultats
start_fmt 0:38 Horodatage lisible par l'utilisateur affiché dans l'en-tête de la fiche de résultat

Pourquoi la recherche par mot-clé aurait échoué dans ce cas précis

La requête « protocole d'hygiène des mains avant tout contact avec un patient ». L'extrait de transcription correspondant ne contient aucune de ces expressions exactes. Un index de mots-clés, même performant et dotant de fonctions de dérivation et de suppression des mots vides, n'aurait trouvé aucune correspondance ou aurait renvoyé un résultat peu pertinent.

Recherche par mot-clé Recherche sémantique
Recherche des mots exacts ou des racines Recherche des sens similaires
« protocole » n'apparaît pas dans le fragment → aucune correspondance « cinq moments » ≈ « protocole » en termes de sens → correspondance
Ne renvoie rien pour « avant de toucher le patient » Renvoie le segment exact qui l'explique
Nécessite des listes de synonymes créées manuellement Synonymes appris automatiquement à partir apprentissage
Échecs en paraphrase et en sténographie médicale Gère la paraphrase, les abréviations et le contexte

utilisateur une requête.Embarquer la convertit en un vecteur de 1 024 dimensions. L'index HNSW de VectorAI DB identifie les 5 extraits de transcription les plus proches en fonction de la similarité cosinus. La charge utile de chaque extrait contient le nom du fichier vidéo et l'horodatage. Le LLM lit le texte du fragment et génère une réponse contextualisée en citant la source. L’interface utilisateur crée un lien profond #t=secondes afin que utilisateur accéder directement au moment souhaité. 678 fragments, recherche en moins de 50 ms, tout s’exécute entièrement sur site.

Tous les résultats présentés sont issus de la collection de transcriptions vidéo (678 segments).Embarquer via Ollama 0.24.0, modèle de base Whisper, llama3:8b, base de données Actian VectorAI.