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