codequestion — это приложение для семантического поиска вопросов разработчиков.
Разработчики обычно открывают окно веб-браузера во время работы и выполняют поиск в Интернете по мере возникновения вопросов. С помощью codequestion это можно сделать из локального контекста. Это приложение выполняет запросы на сходство, чтобы найти вопросы, похожие на входной запрос.
Модель по умолчанию для codequestion построена на основе дампов Stack Exchange на archive.org. После установки модели codequestion запускается локально, подключение к сети не требуется.
codequestion построен на Python 3.8+ и txtai.
Самый простой способ установки — через pip и PyPI.
pip install codequestion
Поддерживается Python 3.8+. Рекомендуется использовать виртуальную среду Python.
codequestion также можно установить непосредственно с GitHub, чтобы получить доступ к новейшим, еще не выпущенным функциям.
pip install git+https://github.com/neuml/codequestion
См. эту ссылку для устранения неполадок в конкретной среде.
После установки codequestion необходимо загрузить модель.
python -m codequestion.download
Модель будет храниться в ~/.codequestion/.
Модель также можно установить вручную, если у машины нет прямого доступа в Интернет. Модель по умолчанию взята со страницы выпуска GitHub.
unzip cqmodel.zip ~/.codequestion
Для начала запустите оболочку codequestion.
codequestion
Появится подсказка. Запросы можно вводить в консоль. Введите help
чтобы увидеть все доступные команды.
В последней версии интегрирован txtai 5.0, который поддерживает семантические графы.
Семантические графы добавляют поддержку тематического моделирования и обхода путей. Темы объединяют вопросы в группы со схожими понятиями. Обход пути использует семантический граф, чтобы показать, как соединяются две потенциально несопоставимые записи. Ниже показан пример, охватывающий как обход темы, так и пути.
Приглашение к вопросу о коде можно запустить в Visual Studio Code. Это позволяет задавать вопросы по кодированию прямо из вашей IDE.
Запустите Ctrl+`
, чтобы открыть новый терминал, затем введите codequestion
.
codequestion создает стандартный индекс встраивания txtai. Таким образом, он поддерживает размещение индекса через службу API txtai.
Запускаем следующее:
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"
Выходы:
[{
"id" : " 616429 " ,
"text" : " How to fetch data from sqlite using python? stackoverflow python sqlite " ,
"score" : 0.8401689529418945
}]
Дополнительные поля метаданных можно получить с помощью операторов 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
}]
Ниже приводится обзор того, как работает этот проект.
Необработанные дампы XML 7z из Stack Exchange обрабатываются в несколько этапов (см. построение модели). Для хранения в модели извлекаются только вопросы с высокой оценкой и принятыми ответами. Вопросы и ответы объединены в один файл SQLite под названием questions.db. Схема для questions.db приведена ниже.
Схема вопросов.db
Id INTEGER PRIMARY KEY
Source TEXT
SourceId INTEGER
Date DATETIME
Tags TEXT
Question TEXT
QuestionUser TEXT
Answer TEXT
AnswerUser TEXT
Reference TEXT
codequestion создает индекс встраивания txtai для questions.db. Каждый вопрос в схеме questions.db векторизован с помощью модели преобразователей предложений. После того как файл questions.db преобразуется в набор вложений предложений, они нормализуются и сохраняются в Faiss, что обеспечивает быстрый поиск по сходству.
codequestion токенизирует каждый запрос, используя тот же метод, что и при индексировании. Эти токены используются для встраивания предложений. Это вложение запрашивается по индексу Фейсса, чтобы найти наиболее похожие вопросы.
Следующие шаги показывают, как построить модель кодовых вопросов с использованием архивов Stack Exchange.
В этом нет необходимости, если вы используете модель по умолчанию со страницы выпуска GitHub.
1.) Загрузите файлы со Stack Exchange: https://archive.org/details/stackexchange.
2.) Поместите выбранные файлы в структуру каталогов, как показано ниже (текущий процесс требует всех этих файлов).
3.) Запустите процесс ETL.
python -m codequestion.etl.stackexchange.execute stackexchange
Это создаст файл stackexchange/questions.db.
4.) НЕОБЯЗАТЕЛЬНО: постройте векторы слов — необходимо только при использовании модели векторов слов. Если вы используете векторные модели слов, обязательно запустите pip install txtai[similarity]
python -m codequestion.vectors stackexchange/questions.db
Это создаст файл ~/.codequestion/vectors/stackexchange-300d.magnitude.
5.) Создать индекс вложений
python -m codequestion.index index.yml stackexchange/questions.db
Файл index.yml по умолчанию находится на GitHub. Настройки можно изменить, чтобы настроить способ построения индекса.
После этого шага индекс создается и все необходимые файлы готовы к запросу.
В следующих разделах показаны результаты тестирования codequestion v2 и codequestion v1 с использованием последних дампов Stack Exchange. Версия 2 использует модель преобразователей предложений. Версия 1 использует модель векторов слов с взвешиванием BM25. Показано, что BM25 и TF-IDF устанавливают базовый показатель.
Запрос StackExchange
Модели оцениваются с использованием среднего взаимного ранга (MRR).
Модель | МРР |
---|---|
все-MiniLM-L6-v2 | 85,0 |
СЭ 300д - БМ25 | 77,1 |
БМ25 | 67,7 |
ТФ-ИДФ | 61,7 |
СТС Бенчмарк
Модели оцениваются с использованием корреляции Пирсона. Обратите внимание, что модель векторов слов обучается только на данных Stack Exchange, поэтому не ожидается, что она будет также обобщаться по набору данных STS.
Модель | Надзор | Дев | Тест |
---|---|---|---|
все-MiniLM-L6-v2 | Тренироваться | 87,0 | 82,7 |
СЭ 300д - БМ25 | Тренироваться | 74,0 | 67,4 |
Чтобы воспроизвести приведенные выше тесты, выполните следующее. Замените $TEST_PATH любым локальным путем.
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