Codequestion ist eine semantische Suchanwendung für Entwicklerfragen.
Entwickler haben normalerweise ein Webbrowser-Fenster geöffnet, während sie arbeiten, und führen Websuchen durch, wenn Fragen auftauchen. Mit Codequestion kann dies aus einem lokalen Kontext erfolgen. Diese Anwendung führt Ähnlichkeitsabfragen aus, um ähnliche Fragen zur Eingabeabfrage zu finden.
Das Standardmodell für Codequestion basiert auf den Stack Exchange Dumps auf archive.org. Sobald ein Modell installiert ist, wird Codequestion lokal ausgeführt, es ist keine Netzwerkverbindung erforderlich.
Codequestion wurde mit Python 3.8+ und txtai erstellt.
Der einfachste Weg zur Installation ist über Pip und PyPI
pip install codequestion
Python 3.8+ wird unterstützt. Es wird empfohlen, eine virtuelle Python-Umgebung zu verwenden.
codequestion kann auch direkt von GitHub installiert werden, um auf die neuesten, unveröffentlichten Funktionen zuzugreifen.
pip install git+https://github.com/neuml/codequestion
Unter diesem Link finden Sie Informationen zur umgebungsspezifischen Fehlerbehebung.
Sobald Codequestion installiert ist, muss ein Modell heruntergeladen werden.
python -m codequestion.download
Das Modell wird in ~/.codequestion/ gespeichert.
Das Modell kann auch manuell installiert werden, wenn die Maschine keinen direkten Internetzugang hat. Das Standardmodell wird von der GitHub-Release-Seite abgerufen
unzip cqmodel.zip ~/.codequestion
Starten Sie zunächst eine Codequest-Shell.
codequestion
Es erscheint eine Eingabeaufforderung. Abfragen können in die Konsole eingegeben werden. Geben Sie help
ein, um alle verfügbaren Befehle anzuzeigen.
Die neueste Version integriert txtai 5.0, das semantische Diagramme unterstützt.
Semantische Diagramme bieten Unterstützung für die Themenmodellierung und Pfaddurchquerung. Themen organisieren Fragen in Gruppen mit ähnlichen Konzepten. Bei der Pfaddurchquerung wird der semantische Graph verwendet, um zu zeigen, wie zwei potenziell unterschiedliche Einträge verbunden sind. Nachfolgend finden Sie ein Beispiel, das sowohl die Themen- als auch die Pfaddurchquerung abdeckt.
Eine Codefrage-Eingabeaufforderung kann in Visual Studio Code gestartet werden. Dies ermöglicht das Stellen von Codierungsfragen direkt von Ihrer IDE aus.
Führen Sie Ctrl+`
aus, um ein neues Terminal zu öffnen, und geben Sie dann codequestion
ein.
Codequestion erstellt einen standardmäßigen txtai-Einbettungsindex. Daher unterstützt es das Hosten des Index über einen txtai-API-Dienst.
Führen Sie Folgendes aus:
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"
Ausgänge:
[{
"id" : " 616429 " ,
"text" : " How to fetch data from sqlite using python? stackoverflow python sqlite " ,
"score" : 0.8401689529418945
}]
Zusätzliche Metadatenfelder können mit SQL-Anweisungen zurückgezogen werden.
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
}]
Im Folgenden finden Sie eine Übersicht über die Funktionsweise dieses Projekts.
Die rohen 7z-XML-Dumps von Stack Exchange werden in einer Reihe von Schritten verarbeitet (siehe Erstellen eines Modells). Nur hoch bewertete Fragen mit akzeptierten Antworten werden zur Speicherung im Modell abgerufen. Fragen und Antworten werden in einer einzigen SQLite-Datei namens questions.db zusammengefasst. Das Schema für questions.db ist unten.
questions.db-Schema
Id INTEGER PRIMARY KEY
Source TEXT
SourceId INTEGER
Date DATETIME
Tags TEXT
Question TEXT
QuestionUser TEXT
Answer TEXT
AnswerUser TEXT
Reference TEXT
Codequestion erstellt einen txtai-Einbettungsindex für questions.db. Jede Frage im questions.db-Schema wird mit einem Satztransformatormodell vektorisiert. Sobald questions.db in eine Sammlung von Satzeinbettungen konvertiert wurde, werden die Einbettungen normalisiert und in Faiss gespeichert, was eine schnelle Ähnlichkeitssuche ermöglicht.
codequestion tokenisiert jede Abfrage mit der gleichen Methode wie bei der Indizierung. Diese Token werden zum Erstellen einer Satzeinbettung verwendet. Diese Einbettung wird anhand des Faiss-Index abgefragt, um die ähnlichsten Fragen zu finden.
Die folgenden Schritte zeigen, wie Sie mithilfe von Stack Exchange-Archiven ein Codequestion-Modell erstellen.
Dies ist nicht erforderlich, wenn Sie das Standardmodell von der GitHub-Release-Seite verwenden
1.) Laden Sie Dateien von Stack Exchange herunter: https://archive.org/details/stackexchange
2.) Platzieren Sie die ausgewählten Dateien in einer Verzeichnisstruktur wie unten gezeigt (der aktuelle Prozess erfordert alle diese Dateien).
3.) Führen Sie den ETL-Prozess aus
python -m codequestion.etl.stackexchange.execute stackexchange
Dadurch wird die Datei stackexchange/questions.db erstellt
4.) OPTIONAL: Wortvektoren erstellen – nur erforderlich, wenn ein Wortvektormodell verwendet wird. Wenn Sie Wortvektormodelle verwenden, stellen Sie sicher, dass Sie pip install txtai[similarity]
ausführen.
python -m codequestion.vectors stackexchange/questions.db
Dadurch wird die Datei ~/.codequestion/vectors/stackexchange-300d.magnitude erstellt
5.) Einbettungsindex erstellen
python -m codequestion.index index.yml stackexchange/questions.db
Die Standarddatei index.yml finden Sie auf GitHub. Die Einstellungen können geändert werden, um die Erstellung des Index anzupassen.
Nach diesem Schritt wird der Index erstellt und alle erforderlichen Dateien stehen zur Abfrage bereit.
Die folgenden Abschnitte zeigen Testergebnisse für Codequestion v2 und Codequestion v1 unter Verwendung der neuesten Stack Exchange-Dumps. Version 2 verwendet ein Satztransformatormodell. Version 1 verwendet ein Wortvektormodell mit BM25-Gewichtung. Es wird gezeigt, dass BM25 und TF-IDF einen Basiswert ermitteln.
StackExchange-Abfrage
Modelle werden anhand des Mean Reciprocal Rank (MRR) bewertet.
Modell | MRR |
---|---|
All-MiniLM-L6-v2 | 85,0 |
SE 300d - BM25 | 77.1 |
BM25 | 67,7 |
TF-IDF | 61,7 |
STS-Benchmark
Modelle werden mithilfe der Pearson-Korrelation bewertet. Beachten Sie, dass das Wortvektormodell nur auf Stack Exchange-Daten trainiert wird und daher voraussichtlich nicht so gut gegen den STS-Datensatz verallgemeinert werden kann.
Modell | Aufsicht | Entwickler | Prüfen |
---|---|---|---|
All-MiniLM-L6-v2 | Zug | 87,0 | 82,7 |
SE 300d - BM25 | Zug | 74,0 | 67,4 |
Führen Sie Folgendes aus, um die oben genannten Tests zu reproduzieren. Ersetzen Sie $TEST_PATH durch einen beliebigen lokalen Pfad.
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