codequestion は、開発者の質問のためのセマンティック検索アプリケーションです。
開発者は通常、作業中に Web ブラウザ ウィンドウを開いたままにし、質問が生じたときに Web 検索を実行します。 codequestion を使用すると、これをローカル コンテキストから実行できます。このアプリケーションは、類似性クエリを実行して、入力クエリに類似した質問を見つけます。
codequestion のデフォルト モデルは、archive.org の Stack Exchange ダンプから構築されています。モデルがインストールされると、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 が統合されています。
セマンティック グラフにより、トピック モデリングとパス トラバーサルのサポートが追加されます。トピックでは、質問を同様の概念を持つグループに整理します。パス トラバーサルでは、セマンティック グラフを使用して、2 つの潜在的に異なるエントリがどのように接続されているかを示します。トピックとパスの両方のトラバーサルをカバーする例を以下に示します。
codequestion プロンプトは Visual Studio Code 内で開始できます。これにより、IDE から直接コーディングに関する質問をできるようになります。
Ctrl+`
実行して新しいターミナルを開き、 codequestion
と入力します。
codequestion は、標準の txtai 埋め込みインデックスを構築します。そのため、txtai API サービスを介したインデックスのホストをサポートします。
以下を実行します。
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
}]
以下は、このプロジェクトがどのように機能するかを説明する概要です。
Stack Exchange からの生の 7z XML ダンプは、一連の手順を通じて処理されます (モデルの構築を参照)。回答が受け入れられた高得点の質問のみが取得され、モデルに保存されます。質問と回答は、questions.db という単一の SQLite ファイルに統合されます。 question.db のスキーマは以下のとおりです。
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 は、questions.db の txtai 埋め込みインデックスを構築します。 questions.db スキーマ内の各質問は、文変換モデルを使用してベクトル化されます。 questions.db が文埋め込みのコレクションに変換されると、埋め込みは正規化されて Faiss に保存され、高速な類似性検索が可能になります。
codequestion は、インデックス作成時と同じ方法を使用して各クエリをトークン化します。これらのトークンは、文の埋め込みを構築するために使用されます。その埋め込みは Faiss インデックスに対してクエリされ、最も類似した質問が検索されます。
次の手順では、Stack Exchange アーカイブを使用して codequestion モデルを構築する方法を示します。
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 |
---|---|
all-MiniLM-L6-v2 | 85.0 |
SE 300d - BM25 | 77.1 |
BM25 | 67.7 |
TF-IDF | 61.7 |
STS ベンチマーク
モデルはピアソン相関を使用してスコア付けされます。ワード ベクトル モデルは Stack Exchange データでのみトレーニングされるため、STS データセットに対して同様に一般化することは期待されていないことに注意してください。
モデル | 監督 | 開発者 | テスト |
---|---|---|---|
all-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