codequestion 是針對開發人員問題的語意搜尋應用程式。
開發人員通常會在工作時打開網頁瀏覽器窗口,並在出現問題時執行網路搜尋。透過 codequestion,這可以在本地上下文中完成。該應用程式執行相似性查詢以查找與輸入查詢相似的問題。
codequestion 的預設模型是基於 archive.org 上的 Stack Exchange Dumps 建構的。安裝模型後,codequestion 將在本地運行,無需網路連線。
codequestion 使用 Python 3.8+ 和 txtai 建置。
最簡單的安裝方法是透過 pip 和 PyPI
pip install codequestion
支援 Python 3.8+。推薦使用Python虛擬環境。
也可以直接從 GitHub 安裝 codequestion 以存取最新的、未發布的功能。
pip install git+https://github.com/neuml/codequestion
請參閱此連結以了解特定於環境的故障排除。
安裝 Codequest 後,需要下載模型。
python -m codequestion.download
模型將儲存在 ~/.codequestion/
如果機器沒有直接存取互聯網,也可以手動安裝模型。預設模型是從 GitHub 發布頁面拉取的
unzip cqmodel.zip ~/.codequestion
啟動一個 codequest shell 來開始。
codequestion
將會出現提示。可以在控制台中輸入查詢。鍵入help
查看所有可用指令。
最新版本整合了txtai 5.0,支援語義圖。
語意圖增加了主題建模和路徑遍歷的支援。主題將問題分成具有相似概念的組別。路徑遍歷使用語義圖來顯示兩個可能不同的條目如何連接。下面顯示了涵蓋主題和路徑遍歷的範例。
可以在 Visual Studio Code 中啟動程式碼問題提示。這樣就可以直接從 IDE 提出編碼問題。
運行Ctrl+`
開啟新終端,然後輸入codequestion
。
codequestion 建置標準 txtai 嵌入索引。因此,它支援透過 txtai API 服務託管索引。
運行以下命令:
應用程式.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
}]
以下是該項目如何運作的概述。
來自 Stack Exchange 的原始 7z XML 轉儲透過一系列步驟進行處理(請參閱建置模型)。僅檢索具有可接受答案的高分問題並儲存在模型中。問題和答案被合併到一個名為 questions.db 的 SQLite 檔案中。 questions.db 的架構如下。
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 為 questions.db 建立 txtai 嵌入索引。 questions.db 模式中的每個問題都使用句子轉換器模型進行向量化。一旦 questions.db 轉換為句子嵌入的集合,嵌入就會被標準化並儲存在 Faiss 中,從而實現快速相似性搜尋。
codequestion 使用與索引期間相同的方法對每個查詢進行標記。這些標記用於建立句子嵌入。根據 Faiss 索引查詢該嵌入,以找到最相似的問題。
以下步驟展示如何使用 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 上找到。可以更改設定以自訂索引的建置方式。
在此步驟之後,索引已創建,並且所有必需的文件都已準備好進行查詢。
以下部分顯示了使用最新 Stack Exchange 轉儲的 codequestion v2 和 codequestion v1 的測試結果。版本 2 使用句子轉換器模型。版本 1 使用帶有 BM25 權重的詞向量模型。 BM25 和 TF-IDF 用於建立基線分數。
StackExchange 查詢
使用平均倒數排名 (MRR) 對模型進行評分。
模型 | MRR |
---|---|
全MiniLM-L6-v2 | 85.0 |
SE 300d - BM25 | 77.1 |
BM25 | 67.7 |
TF-IDF | 61.7 |
STS基準
使用皮爾遜相關係數對模型進行評分。請注意,詞向量模型僅在 Stack Exchange 資料上進行訓練,因此預計它不會針對 STS 資料集進行泛化。
模型 | 監督 | 開發者 | 測試 |
---|---|---|---|
全MiniLM-L6-v2 | 火車 | 87.0 | 82.7 |
SE 300d - BM25 | 火車 | 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