codequestion es una aplicación de búsqueda semántica para preguntas de desarrolladores.
Los desarrolladores suelen tener una ventana del navegador web abierta mientras trabajan y realizan búsquedas web a medida que surgen preguntas. Con codequestion, esto se puede hacer desde un contexto local. Esta aplicación ejecuta consultas de similitud para encontrar preguntas similares a la consulta de entrada.
El modelo predeterminado para codequestion se basa en Stack Exchange Dumps en archive.org. Una vez instalado un modelo, codequestion se ejecuta localmente, no se requiere conexión de red.
codequestion está construido con Python 3.8+ y txtai.
La forma más sencilla de instalar es mediante pip y PyPI.
pip install codequestion
Se admite Python 3.8+. Se recomienda utilizar un entorno virtual Python.
codequestion también se puede instalar directamente desde GitHub para acceder a las funciones más recientes e inéditas.
pip install git+https://github.com/neuml/codequestion
Consulte este enlace para solucionar problemas específicos del entorno.
Una vez instalado codequestion, es necesario descargar un modelo.
python -m codequestion.download
El modelo se almacenará en ~/.codequestion/
El modelo también se puede instalar manualmente si la máquina no tiene acceso directo a Internet. El modelo predeterminado se extrae de la página de lanzamiento de GitHub.
unzip cqmodel.zip ~/.codequestion
Inicie un shell de preguntas de código para comenzar.
codequestion
Aparecerá un mensaje. Las consultas se pueden escribir en la consola. Escriba help
para ver todos los comandos disponibles.
La última versión integra txtai 5.0, que admite gráficos semánticos.
Los gráficos semánticos agregan soporte para el modelado de temas y el recorrido de rutas. Los temas organizan las preguntas en grupos con conceptos similares. El recorrido de ruta utiliza el gráfico semántico para mostrar cómo se conectan dos entradas potencialmente dispares. A continuación se muestra un ejemplo que cubre tanto el tema como el recorrido de la ruta.
Se puede iniciar un mensaje de pregunta de código dentro de Visual Studio Code. Esto permite hacer preguntas sobre codificación directamente desde su IDE.
Ejecute Ctrl+`
para abrir una nueva terminal y luego escriba codequestion
.
codequestion crea un índice de incrustaciones txtai estándar. Como tal, admite el alojamiento del índice a través de un servicio API txtai.
Ejecutando lo siguiente:
aplicación.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"
Salidas:
[{
"id" : " 616429 " ,
"text" : " How to fetch data from sqlite using python? stackoverflow python sqlite " ,
"score" : 0.8401689529418945
}]
Los campos de metadatos adicionales se pueden recuperar con declaraciones 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
}]
La siguiente es una descripción general que cubre cómo funciona este proyecto.
Los volcados XML 7z sin procesar de Stack Exchange se procesan mediante una serie de pasos (consulte Creación de un modelo). Sólo las preguntas con puntuaciones altas y respuestas aceptadas se recuperan para almacenarlas en el modelo. Las preguntas y respuestas se consolidan en un único archivo SQLite llamado questions.db. El esquema para questions.db se encuentra a continuación.
esquema de preguntas.db
Id INTEGER PRIMARY KEY
Source TEXT
SourceId INTEGER
Date DATETIME
Tags TEXT
Question TEXT
QuestionUser TEXT
Answer TEXT
AnswerUser TEXT
Reference TEXT
codequestion crea un índice de incrustaciones txtai para questions.db. Cada pregunta en el esquema questions.db está vectorizada con un modelo de transformadores de oraciones. Una vez que questions.db se convierte en una colección de incrustaciones de oraciones, las incrustaciones se normalizan y almacenan en Faiss, lo que permite búsquedas rápidas de similitudes.
codequestion tokeniza cada consulta utilizando el mismo método que durante la indexación. Esos tokens se utilizan para construir una incrustación de oraciones. Esa incorporación se compara con el índice de Faiss para encontrar las preguntas más similares.
Los siguientes pasos muestran cómo crear un modelo de preguntas en código utilizando archivos de Stack Exchange.
Esto no es necesario si se utiliza el modelo predeterminado de la página de lanzamiento de GitHub.
1.) Descargue archivos de Stack Exchange: https://archive.org/details/stackexchange
2.) Coloque los archivos seleccionados en una estructura de directorio como se muestra a continuación (el proceso actual requiere todos estos archivos).
3.) Ejecute el proceso ETL
python -m codequestion.etl.stackexchange.execute stackexchange
Esto creará el archivo stackexchange/questions.db
4.) OPCIONAL: Cree vectores de palabras; solo es necesario si se utiliza un modelo de vectores de palabras. Si usa modelos de vectores de palabras, asegúrese de ejecutar pip install txtai[similarity]
python -m codequestion.vectors stackexchange/questions.db
Esto creará el archivo ~/.codequestion/vectors/stackexchange-300d.magnitude
5.) Crear índice de incrustaciones
python -m codequestion.index index.yml stackexchange/questions.db
El archivo index.yml predeterminado se encuentra en GitHub. La configuración se puede cambiar para personalizar cómo se construye el índice.
Después de este paso, se crea el índice y todos los archivos necesarios están listos para consultar.
Las siguientes secciones muestran los resultados de las pruebas para codequestion v2 y codequestion v1 utilizando los últimos volcados de Stack Exchange. La versión 2 utiliza un modelo de transformadores de oraciones. La versión 1 utiliza un modelo de vectores de palabras con ponderación BM25. Se ha demostrado que BM25 y TF-IDF establecen una puntuación de referencia.
Consulta de StackExchange
Los modelos se califican utilizando el rango recíproco medio (MRR).
Modelo | MRR |
---|---|
todo-MiniLM-L6-v2 | 85.0 |
SE 300d - BM25 | 77.1 |
BM25 | 67,7 |
TF-IDF | 61,7 |
Punto de referencia STS
Los modelos se califican utilizando la correlación de Pearson. Tenga en cuenta que el modelo de vectores de palabras solo se entrena con datos de Stack Exchange, por lo que no se espera que se generalice también con el conjunto de datos STS.
Modelo | Supervisión | desarrollador | Prueba |
---|---|---|---|
todo-MiniLM-L6-v2 | Tren | 87.0 | 82,7 |
SE 300d - BM25 | Tren | 74.0 | 67,4 |
Para reproducir las pruebas anteriores, ejecute lo siguiente. Sustituya $TEST_PATH por cualquier ruta 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