codequestion est une application de recherche sémantique pour les questions des développeurs.
Les développeurs ont généralement une fenêtre de navigateur Web ouverte pendant qu'ils travaillent et effectuent des recherches sur le Web lorsque des questions se posent. Avec codequestion, cela peut être fait à partir d'un contexte local. Cette application exécute des requêtes de similarité pour trouver des questions similaires à la requête d'entrée.
Le modèle par défaut pour codequestion est construit à partir des Stack Exchange Dumps sur archive.org. Une fois un modèle installé, codequestion s'exécute localement, aucune connexion réseau n'est requise.
codequestion est construit avec Python 3.8+ et txtai.
Le moyen le plus simple d'installer est via pip et PyPI
pip install codequestion
Python 3.8+ est pris en charge. L'utilisation d'un environnement virtuel Python est recommandée.
codequestion peut également être installé directement depuis GitHub pour accéder aux dernières fonctionnalités inédites.
pip install git+https://github.com/neuml/codequestion
Consultez ce lien pour le dépannage spécifique à l'environnement.
Une fois codequestion installé, un modèle doit être téléchargé.
python -m codequestion.download
Le modèle sera stocké dans ~/.codequestion/
Le modèle peut également être installé manuellement si la machine ne dispose pas d'un accès direct à Internet. Le modèle par défaut est extrait de la page de version de GitHub
unzip cqmodel.zip ~/.codequestion
Démarrez un shell de question de code pour commencer.
codequestion
Une invite apparaîtra. Les requêtes peuvent être saisies dans la console. Tapez help
pour voir toutes les commandes disponibles.
La dernière version intègre txtai 5.0, qui prend en charge les graphiques sémantiques.
Les graphiques sémantiques ajoutent la prise en charge de la modélisation de sujets et du parcours de chemin. Les sujets organisent les questions en groupes avec des concepts similaires. La traversée de chemin utilise le graphe sémantique pour montrer comment deux entrées potentiellement disparates sont connectées. Un exemple couvrant à la fois le parcours du sujet et du chemin est présenté ci-dessous.
Une invite de question de code peut être démarrée dans Visual Studio Code. Cela permet de poser des questions de codage directement depuis votre IDE.
Exécutez Ctrl+`
pour ouvrir un nouveau terminal, puis tapez codequestion
.
codequestion construit un index d'intégration txtai standard. En tant que tel, il prend en charge l’hébergement de l’index via un service API txtai.
Exécuter ce qui suit :
app.yml
path : /home/user/.codequestion/models/stackexchange/
embeddings :
# Install API extra
pip install txtai[api]
# Start API
CONFIG=app.yml uvicorn "txtai.api:app"
# Test API
curl "http://127.0.0.1:8000/search?query=python+query+sqlite&limit=1"
Sorties :
[{
"id" : " 616429 " ,
"text" : " How to fetch data from sqlite using python? stackoverflow python sqlite " ,
"score" : 0.8401689529418945
}]
Des champs de métadonnées supplémentaires peuvent être extraits avec des instructions SQL.
curl
--get
--data-urlencode "query=select id, date, tags, question, score from txtai where similar('python query sqlite')"
--data-urlencode "limit=1"
"http://127.0.0.1:8000/search"
[{
"id" : " 616429 " ,
"date" : " 2022-05-23T10:45:40.397 " ,
"tags" : " python sqlite " ,
"question" : " How to fetch data from sqlite using python? " ,
"score" : 0.8401689529418945
}]
Ce qui suit est un aperçu du fonctionnement de ce projet.
Les vidages XML 7z bruts de Stack Exchange sont traités via une série d'étapes (voir création d'un modèle). Seules les questions hautement notées avec des réponses acceptées sont récupérées pour être stockées dans le modèle. Les questions et réponses sont regroupées dans un seul fichier SQLite appelé questions.db. Le schéma de questions.db est ci-dessous.
schéma questions.db
Id INTEGER PRIMARY KEY
Source TEXT
SourceId INTEGER
Date DATETIME
Tags TEXT
Question TEXT
QuestionUser TEXT
Answer TEXT
AnswerUser TEXT
Reference TEXT
codequestion crée un index d'intégration txtai pour questions.db. Chaque question du schéma questions.db est vectorisée avec un modèle de transformation de phrases. Une fois questions.db converti en une collection d'incorporations de phrases, les intégrations sont normalisées et stockées dans Faiss, ce qui permet des recherches rapides de similarité.
codequestion tokenise chaque requête en utilisant la même méthode que lors de l'indexation. Ces jetons sont utilisés pour créer une intégration de phrase. Cette intégration est interrogée sur l'index Faiss pour trouver les questions les plus similaires.
Les étapes suivantes montrent comment créer un modèle de question de code à l'aide des archives Stack Exchange.
Cela n'est pas nécessaire si vous utilisez le modèle par défaut de la page de version de GitHub
1.) Téléchargez des fichiers depuis Stack Exchange : https://archive.org/details/stackexchange
2.) Placez les fichiers sélectionnés dans une structure de répertoires comme indiqué ci-dessous (le processus actuel nécessite tous ces fichiers).
3.) Exécutez le processus ETL
python -m codequestion.etl.stackexchange.execute stackexchange
Cela créera le fichier stackexchange/questions.db
4.) FACULTATIF : Créez des vecteurs de mots - uniquement nécessaire si vous utilisez un modèle de vecteurs de mots. Si vous utilisez des modèles vectoriels de mots, assurez-vous d'exécuter pip install txtai[similarity]
python -m codequestion.vectors stackexchange/questions.db
Cela créera le fichier ~/.codequestion/vectors/stackexchange-300d.magnitude
5.) Créer un index d'intégration
python -m codequestion.index index.yml stackexchange/questions.db
Le fichier index.yml par défaut se trouve sur GitHub. Les paramètres peuvent être modifiés pour personnaliser la façon dont l'index est construit.
Après cette étape, l'index est créé et tous les fichiers nécessaires sont prêts à être interrogés.
Les sections suivantes présentent les résultats des tests pour codequestion v2 et codequestion v1 à l'aide des dernières sauvegardes Stack Exchange. La version 2 utilise un modèle de transformation de phrases. La version 1 utilise un modèle de vecteurs de mots avec pondération BM25. Il a été démontré que BM25 et TF-IDF établissent un score de base.
Requête StackExchange
Les modèles sont notés à l'aide du classement réciproque moyen (MRR).
Modèle | MRR |
---|---|
tout-MiniLM-L6-v2 | 85,0 |
SE 300d - BM25 | 77.1 |
BM25 | 67,7 |
TF-IDF | 61,7 |
Référence STS
Les modèles sont notés à l'aide de la corrélation de Pearson. Notez que le modèle de vecteurs de mots est uniquement formé sur les données Stack Exchange, il ne devrait donc pas se généraliser également par rapport à l'ensemble de données STS.
Modèle | Surveillance | Développeur | Test |
---|---|---|---|
tout-MiniLM-L6-v2 | Former | 87,0 | 82,7 |
SE 300d - BM25 | Former | 74,0 | 67,4 |
Pour reproduire les tests ci-dessus, exécutez ce qui suit. Remplacez $TEST_PATH par n'importe quel chemin local.
mkdir -p $TEST_PATH
wget https://raw.githubusercontent.com/neuml/codequestion/master/test/stackexchange/query.txt -P $TEST_PATH/stackexchange
wget http://ixa2.si.ehu.es/stswiki/images/4/48/Stsbenchmark.tar.gz
tar -C $TEST_PATH -xvzf Stsbenchmark.tar.gz
python -m codequestion.evaluate -s test -p $TEST_PATH