Data and model workflow toolkit for cleaning, clustering, generation, and evaluation
Project description
MySphinx Forge
MySphinx Forge 是一个面向表格文本数据的 Python CLI 工具,重点解决语料预处理和模型验证这两类工作:
- 数据清洗
- 精确去重与语义去重
- 清洗后再去重的流水线处理
- 文本聚类与聚类报告生成
- 训练集 / 验证集 / 测试集切分
- 本地模型、OpenAI 兼容接口、通用 HTTP 接口的批量模型测试
当前输入支持 csv、xls、xlsx、xlsm。工具会尽量保留原始表结构,并在不同 action 下补充日志、元数据、聚类报表或模型测试结果。
适用场景
- 清理客服问答、FAQ、标注语料、指令数据
- 在训练前做空值剔除、去重和数据集切分
- 对文本数据做主题聚类,快速查看簇分布
- 用本地模型或远程模型接口对整张表做批量推理和结果比对
功能概览
| Action | 用途 | 默认输出 |
|---|---|---|
clean |
删除空白、纯符号、纯表情、纯乱码行 | *_cleaned.* |
deduplicate |
按精确或语义方式去重 | *_deduplicated.* |
clean-deduplicate |
先清洗,再去重 | *_deduplicated.* |
cluster |
文本聚类,并导出汇总、投影和 HTML 报告 | *_clustered.* |
split |
切分 train / valid / test | *_split_train.* 等 |
model-test |
批量执行模型推理或单条烟雾测试 | *_model_tested.* 或终端输出 |
convert-sft |
转换表格数据为 LLaMA-Factory 可用的 SFT 数据 | *_alpaca.json |
项目结构
main.py:仓库内运行入口,实际调用mysphinx_forge.cli:mainmysphinx_forge/:核心实现cleaning.py:清洗规则和统计deduplication.py:精确去重semantic_deduplication.py:基于 embedding + FAISS 的语义去重clustering.py:HDBSCAN/KMeans聚类cluster_reporting.py:聚类分析表和 HTML 可视化报告model_testing.py:本地模型 / OpenAI 兼容接口 / HTTP 接口测试splitting.py:随机、分层、分组、时间切分sft_dataset.py:表格到 LLaMA-Factory SFTalpaca格式转换file_io.py:CSV / Excel 读取与结果写出cli.py:命令行参数、阶段编排、日志与元数据写出
models/:本地 embedding 模型或本地生成模型目录,示例见 models/README.mdtests/:pytest 测试data/:仓库内示例输入和历史生成产物
安装
项目要求 Python 3.12+,并使用 uv 管理环境。
从 PyPI 安装
uv pip install mysphinx-forge
uv pip install 'mysphinx-forge[embeddings]'
uv pip install 'mysphinx-forge[ml,embeddings]'
uv pip install 'mysphinx-forge[llm-local]'
uv pip install 'mysphinx-forge[all]'
安装后可以直接使用:
mysphinx-forge --help
在源码仓库中开发
基础开发环境:
uv sync --group dev
按需补装扩展能力:
uv sync --extra embeddings --group dev
uv sync --extra ml --extra embeddings --group dev
uv sync --extra llm-local --group dev
uv sync --extra all --group dev
能力与依赖对应关系:
- 基础依赖:
clean、精确deduplicate、clean-deduplicate、split、OpenAI / HTTP 模式的model-test embeddings:语义去重ml + embeddings:聚类llm-local:本地模型model-testall:安装全部能力
从源码安装当前项目
uv pip install -e .
uv pip install -e '.[embeddings]'
uv pip install -e '.[ml,embeddings]'
uv pip install -e '.[llm-local]'
uv pip install -e '.[all]'
快速开始
1. 查看帮助
安装包后,直接运行:
mysphinx-forge --help
如果你是在源码仓库里、本地还没有安装命令行入口,也可以运行:
uv run python main.py --help
下文命令默认都以已安装的 CLI 为准;在源码仓库中,它们等价于:
uv run python main.py ...
1.1 使用 mysphinx-forge.yaml
除了命令行参数,也可以在当前目录放一个 mysphinx-forge.yaml,或通过 --config <path> 显式指定配置文件。
仓库根目录已经提供了一份带完整注释的 mysphinx-forge.yaml,可以直接按需修改。
优先级规则:
- CLI 显式参数
mysphinx-forge.yaml- 程序内置默认值
配置文件支持三种层级:
- 顶层公共参数
defaults公共默认参数- 按 action 分节配置,例如
split、cluster、model-test
示例:
action: split
input_file: data/input.xlsx
defaults:
target_column: text
split:
split_mode: auto
validation_ratio: 0.1
test_ratio: 0.1
split_random_seed: 42
命令行会覆盖配置文件,例如:
mysphinx-forge --config mysphinx-forge.yaml --validation-ratio 0.2
2. 准备数据
- 输入文件必须是
csv、xls、xlsx、xlsm - Excel 输入会默认读取并合并所有 sheet
- 默认目标列优先按以下顺序自动探测:
text用户问题客户问题用户输入
- 如果你的文本列不是这些名字,请显式传
--target-column
3. 如需语义能力,先准备模型
语义去重和聚类默认使用本地 embedding 模型路径:
models/m3e-base
如果模型不在这个位置,请传入:
--embedding-model-path <你的模型目录>
4. 如需远程接口能力,准备环境变量
复制模板并填写:
cp .env.example .env
当前已支持的环境变量见下文“环境变量与 .env”。
常用命令
数据清洗
clean 会删除目标列中的以下行:
- 空白行
- 纯符号 / 纯标点行
- 纯表情行
- 纯乱码行
基础示例:
mysphinx-forge --action clean --input-file data/input.xlsx
指定列名:
mysphinx-forge --action clean --input-file data/input.xlsx --target-column 用户问题
对大 CSV 使用流式分块处理:
mysphinx-forge --action clean --input-file data/input.csv --chunk-size 20000
数据去重
deduplicate 支持两种模式:
exact:标准化空白和大小写后做精确匹配semantic:基于 embedding 相似度做语义去重
精确去重:
mysphinx-forge --action deduplicate --input-file data/input.xlsx
语义去重:
mysphinx-forge --action deduplicate --input-file data/input.xlsx --dedupe-mode semantic
调整语义阈值和模型路径:
mysphinx-forge --action deduplicate --input-file data/input.xlsx --dedupe-mode semantic --semantic-threshold 0.9 --embedding-model-path models/m3e-base
指定近似索引:
mysphinx-forge --action deduplicate --input-file data/input.xlsx --dedupe-mode semantic --semantic-index-type hnsw --semantic-hnsw-m 32
如果输入表中有分类列,希望在语义命中明细里一起导出,可指定:
mysphinx-forge --action deduplicate --input-file data/input.xlsx --dedupe-mode semantic --category-column label
先清洗再去重
当你希望先移除明显脏数据,再做去重时,使用 clean-deduplicate:
mysphinx-forge --action clean-deduplicate --input-file data/input.xlsx
先清洗再做语义去重:
mysphinx-forge --action clean-deduplicate --input-file data/input.xlsx --dedupe-mode semantic
导出 LLaMA-Factory SFT 数据
convert-sft 目前支持将表格转换为 alpaca 格式 JSON,可直接给 LLaMA-Factory 做 SFT 训练。
默认会自动探测:
- 输入列:
text/用户问题/客户问题/用户输入 - 输出列:
category/label/intent/output/response/answer/target
基础示例:
mysphinx-forge --action convert-sft --input-file data/input_deduplicated_split_train.xlsx
默认输出:
data/input_deduplicated_split_train_alpaca.json
指定输出标签列:
mysphinx-forge --action convert-sft --input-file data/input.xlsx --sft-output-column label
覆盖默认 instruction 和 system:
mysphinx-forge --action convert-sft --input-file data/input.xlsx --sft-output-column category --sft-instruction "请判断用户问题所属分类,只输出分类标签。" --sft-system-prompt "你是一个证券问答分类助手。"
说明:
- 当前仅实现
alpaca格式 - 空输入行和空输出行会自动跳过
- 会同时生成日志文件和
*.meta.json元数据文件
文本聚类
cluster 默认使用 hdbscan,也支持固定簇数的 kmeans。
基础示例:
mysphinx-forge --action cluster --input-file data/input_deduplicated.xlsx
使用 KMeans:
mysphinx-forge --action cluster --input-file data/input_deduplicated.xlsx --cluster-mode kmeans --num-clusters 12
调整 HDBSCAN 参数:
mysphinx-forge --action cluster --input-file data/input_deduplicated.xlsx --min-cluster-size 8 --cluster-selection-epsilon 0.05
使用 LLM 生成簇标签:
OPENAI_API_KEY=... mysphinx-forge --action cluster --input-file data/input_deduplicated.xlsx --cluster-label-mode llm
聚类会同时产出结果表、簇汇总、投影数据、分析表和 HTML 报告,详见“输出文件规则”。
数据集切分
split 支持以下模式:
auto:优先按category/label/intent分层,否则退化为随机切分randomstratifiedgrouptime
基础示例:
mysphinx-forge --action split --input-file data/input_deduplicated.xlsx
如果输入是 Excel,多 sheet 会默认合并;其中名字精确等于 increment 的 sheet 会被视为增量数据:
increment不参与 train / valid / test 比例切分increment会全量追加到 train 和 validincrement不会进入 test
显式分层切分:
mysphinx-forge --action split --input-file data/input_deduplicated.xlsx --split-mode stratified --stratify-column category
按组切分,避免泄漏:
mysphinx-forge --action split --input-file data/input_deduplicated.xlsx --split-mode group --group-column session_id
按时间切分:
mysphinx-forge --action split --input-file data/input_deduplicated.xlsx --split-mode time --time-column created_at --time-order asc
模型测试
model-test 有两种使用方式:
- 不传
--input-file:执行单条烟雾测试,输入内容使用代码内置的固定样例 - 传
--input-file:对整张表的目标列做批量推理,并生成结果文件
本地模型单条测试:
mysphinx-forge --action model-test --test-model-path models/your-chat-model
批量测试本地模型:
mysphinx-forge --action model-test --input-file data/input_deduplicated.xlsx --test-model-path models/your-chat-model
使用 OpenAI 兼容接口批量测试:
OPENAI_API_KEY=... mysphinx-forge --action model-test --input-file data/input_deduplicated.xlsx --model-test-mode openai --test-model-path gpt-4.1-mini --model-test-api-base https://api.openai.com/v1
使用通用 HTTP POST 接口批量测试:
HTTP_API_KEY=... mysphinx-forge --action model-test --input-file data/input_deduplicated.xlsx --model-test-mode http --test-model-path custom-http-model --model-test-api-base https://example.test/infer
请求体字段名与默认协议不一致时:
HTTP_API_KEY=... mysphinx-forge --action model-test --input-file data/input_deduplicated.xlsx --model-test-mode http --test-model-path custom-http-model --model-test-api-base https://example.test/infer --http-request-field-map '{"user_input":"prompt","system_prompt":"system","max_new_tokens":"max_tokens"}' --http-extra-body '{"tenant":"forge","stream":false}'
通过文件覆盖默认 system prompt:
mysphinx-forge --action model-test --input-file data/input_deduplicated.xlsx --test-model-path models/your-chat-model --system-prompt-file prompts/system.txt
批量模型测试的结果文件会追加:
模型结果模型调用时间匹配预期:仅当输入文件包含预期结果列时生成
本地批量测试会按可见 GPU 数自动分配 worker;没有 GPU 时自动退化为单 worker CPU 模式。
输出文件规则
| Action | 主要输出 | 附加输出 |
|---|---|---|
clean |
*_cleaned.* |
*.meta.json、mysphinx-forge.log |
deduplicate |
*_deduplicated.* |
语义模式额外生成 *_matches.csv;同时写 *.meta.json、mysphinx-forge.log |
clean-deduplicate |
*_deduplicated.* |
语义模式额外生成 *_matches.csv;同时写 *.meta.json、mysphinx-forge.log |
cluster |
*_clustered.* |
*_clusters.csv、*_projection.csv、*_analysis.csv、*_report.html、*.meta.json、mysphinx-forge.log |
split |
*_split_train.*、*_split_valid.*、*_split_test.* |
*_split.meta.json、mysphinx-forge.log |
model-test 文件模式 |
*_model_tested.* |
mysphinx-forge.log |
model-test 单条模式 |
终端输出 | 当前工作目录下的 mysphinx-forge.log |
补充说明:
- 日志文件统一写到输出目录下的
mysphinx-forge.log clean、deduplicate、clean-deduplicate、cluster、split会写结构化.meta.json- 当前
model-test文件模式不会生成.meta.json - 语义去重的
*_matches.csv会记录重复行命中的代表行、相似度,以及可选的分类列对比信息
运行行为说明
csv在clean、deduplicate、clean-deduplicate下支持分块流式处理,--chunk-size仅对csv生效Excel文件会整表读入内存- 终端会显示多阶段
tqdm进度条 - CLI 启动时会自动尝试加载当前工作目录和项目根目录中的
.env文件,且不会覆盖已有环境变量
环境变量与 .env
项目根目录提供了 .env.example。
常用变量:
OPENAI_API_KEYOPENAI_BASE_URLHTTP_API_KEYHTTP_API_KEY_HEADERHTTP_API_KEY_PREFIXHTTP_API_BASE_URLHTTP_REQUEST_FIELD_MAPHTTP_EXTRA_BODY
用途说明:
cluster --cluster-label-mode llm使用OPENAI_API_KEY/OPENAI_BASE_URLmodel-test --model-test-mode openai使用OPENAI_API_KEY/OPENAI_BASE_URLmodel-test --model-test-mode http使用HTTP_*系列配置
开发与验证
常用命令:
uv run pytest
uv run python -m compileall .
uv build
如果你只是想本地运行当前仓库,通常只需要:
uv sync --group dev
如果要做语义去重或聚类,再补装对应 extra 即可。
当前项目状态
当前仓库已经不是单一脚本,而是一个有明确包结构、CLI 入口和测试覆盖的工具型项目。更适合把它理解为:
- 一个围绕表格文本数据处理的命令行工具
- 一个可以逐步扩展更多训练 / 评估流水线能力的 Python 包
如果你要继续扩展这个项目,建议优先在 mysphinx_forge/ 下新增模块,而不是继续把逻辑堆到 main.py。
使用场景
场景 1:收到一份原始 Excel,且已经有标签或答案列
适用条件:
- 表里已经有输入列,例如
text、用户问题 - 同时也有监督列,例如
category、label、intent、output、response、answer、target
推荐流程:
- 先清洗和去重,得到更干净的基础数据
mysphinx-forge --action clean-deduplicate --input-file data/raw.xlsx --target-column 用户问题 --dedupe-mode exact
这一步通常会生成:
data/raw_deduplicated.xlsx
- 再切分训练集、验证集、测试集
mysphinx-forge --action split --input-file data/raw_deduplicated.xlsx --split-mode auto --validation-ratio 0.1 --test-ratio 0.1
这一步会生成:
data/raw_deduplicated_split_train.xlsx
data/raw_deduplicated_split_valid.xlsx
data/raw_deduplicated_split_test.xlsx
-
如果你做的是传统分类训练,到这里通常已经可以直接使用这些切分文件
-
如果你做的是
LLaMA-Factory一类的SFT,再把切分后的文件转换成alpaca格式 JSON
mysphinx-forge --action convert-sft --input-file data/raw_deduplicated_split_train.xlsx --target-column 用户问题 --sft-output-column label
mysphinx-forge --action convert-sft --input-file data/raw_deduplicated_split_valid.xlsx --target-column 用户问题 --sft-output-column label
补充说明:
convert-sft默认会自动探测输出列:category、label、intent、output、response、answer、target- 如果输入是 Excel,多 sheet 会默认合并
- 如果存在名字精确等于
increment的 sheet,它在split时不会参与比例切分,而是会全量注入train和valid
场景 2:收到一份原始 Excel,但只有问题文本,没有标签
适用条件:
- 表里只有输入文本
- 还没有可直接用于监督训练的标签或标准答案
推荐流程:
- 先做清洗和去重,减少脏数据和重复样本
mysphinx-forge --action clean-deduplicate --input-file data/raw.xlsx --target-column 用户问题
- 用
cluster做主题聚类,辅助你理解数据结构和后续标注
mysphinx-forge --action cluster --input-file data/raw_deduplicated.xlsx --target-column 用户问题
- 或者用
model-test批量生成候选标签、候选回复,再做人工抽检和回填
mysphinx-forge --action model-test --input-file data/raw_deduplicated.xlsx --target-column 用户问题 --model-test-mode openai --test-model-path gpt-4.1-mini
- 当表里补齐了监督列,例如
label或output,再执行split
mysphinx-forge --action split --input-file data/raw_labeled.xlsx --split-mode auto
- 如果要做
SFT,最后再执行convert-sft
mysphinx-forge --action convert-sft --input-file data/raw_labeled_split_train.xlsx --sft-output-column label
重要说明:
cluster和model-test只能辅助整理和生成候选结果,不能替代人工确认的高质量监督标签- 如果原始表里没有输出列,就不能直接产出可靠的监督训练数据
model-test当前默认的内置 system prompt 是金融二分类示例;如果你的任务不是这个场景,建议显式传--system-prompt-file
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mysphinx_forge-0.1.7.tar.gz.
File metadata
- Download URL: mysphinx_forge-0.1.7.tar.gz
- Upload date:
- Size: 82.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed1aeb8cdb6cf64dd2b63c452c09300fc146907b29066b8dffa1f8c0ad0eeb0c
|
|
| MD5 |
77ac74e48c11ebedd6cb52ff01898a59
|
|
| BLAKE2b-256 |
f967e1b91f097dac9b3291d9199da166a38209c76be9298d4dc1baef14208218
|
File details
Details for the file mysphinx_forge-0.1.7-py3-none-any.whl.
File metadata
- Download URL: mysphinx_forge-0.1.7-py3-none-any.whl
- Upload date:
- Size: 63.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7713373b3ce7f2a9d99170a1b556938f90a0b22ad7ecf1fe486bd167f7944779
|
|
| MD5 |
0a2b1d9039566a4661045aa672b60153
|
|
| BLAKE2b-256 |
144f7e3ac2f2e838b8829bf5b2565366319777138dfbceb3c17310d3cd32643e
|