codequestion é um aplicativo de pesquisa semântica para perguntas de desenvolvedores.
Os desenvolvedores normalmente têm uma janela do navegador aberta enquanto trabalham e executam pesquisas na web conforme surgem dúvidas. Com codequestion, isso pode ser feito a partir de um contexto local. Este aplicativo executa consultas de similaridade para encontrar perguntas semelhantes à consulta de entrada.
O modelo padrão para codequestion é construído a partir dos Stack Exchange Dumps em archive.org. Depois que um modelo é instalado, o codequestion é executado localmente, sem necessidade de conexão de rede.
codequestion é construído com Python 3.8+ e txtai.
A maneira mais fácil de instalar é via pip e PyPI
pip install codequestion
Python 3.8+ é compatível. É recomendado usar um ambiente virtual Python.
codequestion também pode ser instalado diretamente do GitHub para acessar os recursos mais recentes e inéditos.
pip install git+https://github.com/neuml/codequestion
Consulte este link para solução de problemas específicos do ambiente.
Depois que o codequestion estiver instalado, um modelo precisa ser baixado.
python -m codequestion.download
O modelo será armazenado em ~/.codequestion/
O modelo também pode ser instalado manualmente caso a máquina não tenha acesso direto à internet. O modelo padrão é extraído da página de lançamento do GitHub
unzip cqmodel.zip ~/.codequestion
Inicie um shell codequestion para começar.
codequestion
Um prompt aparecerá. As consultas podem ser digitadas no console. Digite help
para ver todos os comandos disponíveis.
A versão mais recente integra o txtai 5.0, que possui suporte para gráficos semânticos.
Os gráficos semânticos adicionam suporte para modelagem de tópicos e travessia de caminho. Os tópicos organizam as perguntas em grupos com conceitos semelhantes. A travessia de caminho usa o gráfico semântico para mostrar como duas entradas potencialmente diferentes estão conectadas. Um exemplo cobrindo a travessia de tópico e caminho é mostrado abaixo.
Um prompt codequestion pode ser iniciado no Visual Studio Code. Isso permite fazer perguntas de codificação diretamente do seu IDE.
Execute Ctrl+`
para abrir um novo terminal e digite codequestion
.
codequestion constrói um índice de embeddings txtai padrão. Como tal, suporta a hospedagem do índice através de um serviço API txtai.
Executando o seguinte:
aplicativo.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"
Saídas:
[{
"id" : " 616429 " ,
"text" : " How to fetch data from sqlite using python? stackoverflow python sqlite " ,
"score" : 0.8401689529418945
}]
Campos de metadados adicionais podem ser recuperados com instruções 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
}]
A seguir está uma visão geral de como este projeto funciona.
Os dumps XML 7z brutos do Stack Exchange são processados por meio de uma série de etapas (consulte a construção de um modelo). Somente perguntas com pontuação alta e respostas aceitas são recuperadas para armazenamento no modelo. Perguntas e respostas são consolidadas em um único arquivo SQLite chamado questions.db. O esquema para questions.db está abaixo.
Esquema question.db
Id INTEGER PRIMARY KEY
Source TEXT
SourceId INTEGER
Date DATETIME
Tags TEXT
Question TEXT
QuestionUser TEXT
Answer TEXT
AnswerUser TEXT
Reference TEXT
codequestion constrói um índice de embeddings txtai para questions.db. Cada pergunta no esquema questions.db é vetorizada com um modelo de transformadores de frase. Depois que questions.db é convertido em uma coleção de embeddings de frases, os embeddings são normalizados e armazenados no Faiss, o que permite pesquisas rápidas por similaridade.
codequestion tokeniza cada consulta usando o mesmo método usado durante a indexação. Esses tokens são usados para construir uma incorporação de frase. Essa incorporação é consultada no índice Faiss para encontrar as questões mais semelhantes.
As etapas a seguir mostram como construir um modelo codequestion usando arquivos Stack Exchange.
Isso não é necessário se estiver usando o modelo padrão da página de lançamento do GitHub
1.) Baixe arquivos do Stack Exchange: https://archive.org/details/stackexchange
2.) Coloque os arquivos selecionados em uma estrutura de diretórios como mostrado abaixo (o processo atual requer todos esses arquivos).
3.) Execute o processo ETL
python -m codequestion.etl.stackexchange.execute stackexchange
Isso criará o arquivo stackexchange/questions.db
4.) OPCIONAL: Construir vetores de palavras - necessário apenas se estiver usando um modelo de vetores de palavras. Se estiver usando modelos de vetores de palavras, certifique-se de executar pip install txtai[similarity]
python -m codequestion.vectors stackexchange/questions.db
Isso criará o arquivo ~/.codequestion/vectors/stackexchange-300d.magnitude
5.) Construir índice de embeddings
python -m codequestion.index index.yml stackexchange/questions.db
O arquivo index.yml padrão é encontrado no GitHub. As configurações podem ser alteradas para personalizar a forma como o índice é construído.
Após esta etapa, o índice é criado e todos os arquivos necessários estão prontos para consulta.
As seções a seguir mostram resultados de testes para codequestion v2 e codequestion v1 usando os dumps mais recentes do Stack Exchange. A versão 2 usa um modelo de transformadores de frases. A versão 1 usa um modelo de vetores de palavras com ponderação BM25. O BM25 e o TF-IDF estabelecem uma pontuação inicial.
Consulta StackExchange
Os modelos são pontuados usando a Classificação Recíproca Média (MRR).
Modelo | MRR |
---|---|
tudo-MiniLM-L6-v2 | 85,0 |
SE 300d-BM25 | 77,1 |
BM25 | 67,7 |
TF-IDF | 61,7 |
Referência STS
Os modelos são pontuados usando Correlação de Pearson. Observe que o modelo de vetores de palavras é treinado apenas em dados do Stack Exchange, portanto, não se espera que generalize também em relação ao conjunto de dados STS.
Modelo | Supervisão | Desenvolvedor | Teste |
---|---|---|---|
tudo-MiniLM-L6-v2 | Trem | 87,0 | 82,7 |
SE 300d-BM25 | Trem | 74,0 | 67,4 |
Para reproduzir os testes acima, execute o seguinte. Substitua $TEST_PATH por qualquer caminho 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