La résolution des étiquettes conceptuelles à des identificateurs standardisés des bases de données existantes est une exigence fondamentale dans le processus d'annoter les données biomédicales. Alors que plusieurs services d'annotation, dont Bioportal et le Traductor Name Resolution Service, sont disponibles, la plupart d'entre eux s'appuient sur des mécanismes d'appariement simples (respectivement MGREP et SOLR). Malheureusement, ces mécanismes sont souvent en deçà lorsqu'ils traitent des étiquettes conceptuelles qui présentent des variations substantielles des identificateurs standardisés ou lorsqu'ils traitent des synonymes.
Nous proposons d'explorer l'utilisation de la recherche de similitude vectorielle pour améliorer la précision de la résolution du concept. Nous tirons parti de l'ensemble de données approfondie recueilli par le traducteur Babel Project, qui comprend un vaste référentiel d'identifiants, d'étiquettes et de synonymes du domaine biomédical (PubChem, Chembl, Uniprot, Mondo, Omim, HGNC, DrugBank, et plus).
Pendant le hackathon d'annotation lié à la biomédicale, nos objectifs clés sont les suivants:
Le service de résolution de nom sera exposé en tant qu'API décrit OpenAPI qui prend une étiquette conceptuelle en entrée, et renvoie une liste d'entités correspondantes, représentée par un dictionnaire avec le score et leur étiquette ID Curie, Synonymes.
| Nom | Création | Étoiles github | Écrit dans | SDK pour | Langue de requête / API * | Implémentez les fonctions vectorielles | Commentaire |
|---|---|---|---|---|---|---|---|
| Qdrant | Juillet 2020 | ~ 14K | Rouiller | Python, JS, Rust, Go, .net | OpenAPI, GRPC | cosinus, euclide, point | Peut être utilisé comme outil autonome local, en mémoire ou persistant sur le disque, sans déployer un service Web |
| Milvus | Octobre 2019 | ~ 24K | Aller | Python, JS, Java, allez | OpenAPI ❓️ | cosinus, euclide, produit intérieur | AKA. Cloud Zilliz |
| Chrome | Octobre 2022 | ~ 9K | Python | Python, js | OpenAPI ❓️ | ||
| Tisser | Mars 2016 | ~ 8K | Aller | Python, JS, Java, allez | API GraphQL | cosinus, euclide | |
| pgvecteur | Avril 2021 | ~ 6,5k | C | Via le SDK de Postgres ❓️ | SQL | cosinus, euclide, produit intérieur, taxibab | Intégré dans PostgreSQL |
* Le langage de requête / API spécifie le type de langage de requête ou API peut être utilisé pour interroger les informations dans la base de données vectorielle
Tous ces produits sont open source, et ils proposent tous une interface utilisateur Web simple pour explorer la base de données vectorielle.
La plupart d'entre eux ont une API moderne et simple (en dehors de PGVector qui vit dans PostgreSQL)
Reference Benchmark for Text Embeddings Modèles: https://huggingface.co/blog/mteb
Classement: https://huggingface.co/spaces/mteb/leaderboard
Modèles d'intégration populaires:
bge-large-en-v1.5text-embedding-ada-002sentence-transformers/all-MiniLM-L6-v2jina-embeddings-v2-base-enembed-english-v3.0 À définir.
Benchmarks existants pour les bases de données vectorielles:
Résultats préliminaires sur le 19/01/2024 (synonymes de Babel n'est pas encore entièrement chargé, les fichiers manquants après le médicament: gène, protéine, organismes, voie, UMLS): la plupart des problèmes semblent être résolus en dehors de "rat" et "ACP-044 Dose A" (ne fait pas de temps mais pas de résultats intéressants)
Démarrer les services:
docker compose up -d Entrez dans le conteneur d' workspace pour exécuter les scripts de chargement.
Téléchargez les synonymes de Babel et chargez-les dans le vectordb:
make load(expérimental) PubDictionnaires de chargement dans PGVector:
python src/pubdict_load.pylimit du VectordB (si les 2 premiers résultats du VectordB sont du même point, nous ne rendrons que 1 résultats, ce qui ne correspondra pas à la limite de 2 demandée par l'utilisateur)La solution possible serait d'utiliser Postgres et PGVector, avec 2 tables (une pour les incorporations, une pour Concept Infos), mais cela rendrait le système beaucoup plus complexe qu'un magasin JSON.
Y a-t-il un vectordb auto-hébergé qui peut prendre en charge plusieurs vecteurs sans nom pour un seul point? (QDrant ne prend actuellement en charge que plusieurs vecteurs nommés qui ne correspondent pas à notre cas d'utilisation)
Présentation d'introduction: https://docs.google.com/presentation/d/1_ntmf-lthvybbvfusdxsdbeb0wm_yr_bvnnt-ivlktc/edit
Expérience de publication: https://docs.google.com/document/d/1nipvy2zhzedmf5bjcuzcbgzifn22v9kpzfo4etxl89m/edit
Présentation de la conclusion: https://docs.google.com/presentation/d/1sjeuo4oegnmamtrvcawb0tzjzr9sgnyh-efwtjf99lg/edit
Préprint BiohackrXiv Papier: http://preview.biohackrxiv.org/papers/bdda0f94-f526-4f35-8768-8faf62d731fa/paper.pdf
API Demo: https://concept-resolver.137.120.31.102.nip.io