基础模型:
- distilbert/distilbert-base-uncased
数据集:
- openai/gsm8k
- ChilleD/SVAMP
- deepmind/aqua_rat
- ucinlp/drop
- allenai/openbookqa
- ChilleD/StrategyQA
- lucasmccabe/logiqa
- metaeval/reclor
- hotpotqa/hotpot_qa
- dgslibisey/MuSiQue
- allenai/qasc
- nguyen-brat/worldtree
- qiaojin/PubMedQA
语言:
- en
库名称: transformers
许可证: mit
标签:
- 文本分类
- 思维草图
- 高效推理
SoT_DistilBERT: 思维草图的范式选择模型

什么是思维草图?
思维草图(Sketch-of-Thought,SoT)是一种新颖的提示框架,用于语言模型中的高效推理,它结合了认知启发的推理范式与语言约束,以最小化输出标记的使用,同时保持推理准确性。
与产生冗长推理链的传统思维链(CoT)方法不同,SoT实现了三种不同的推理范式:
-
概念链式:通过结构化的步骤链接将基本思想以逻辑序列连接起来。适用于常识推理、多跳推理和基于事实的回忆任务。
-
分块符号:将数值和符号推理组织成带有方程、变量和算术运算的结构化步骤。擅长数学问题和技术计算。
-
专家词汇:利用特定领域的速记、技术符号和行话进行精确高效的交流。适用于需要最大信息密度的技术学科。
加载模型
此仓库包含思维草图(SoT)框架的DistilBERT范式选择模型。您可以直接使用Hugging Face Transformers加载和使用它:
from transformers import DistilBertTokenizer, DistilBertForSequenceClassification
import torch
import json
model = DistilBertForSequenceClassification.from_pretrained("saytes/SoT_DistilBERT")
tokenizer = DistilBertTokenizer.from_pretrained("saytes/SoT_DistilBERT")
label_mapping = {
"chunked_symbolism": 0,
"conceptual_chaining": 1,
"expert_lexicons": 2
}
def classify_question(question):
inputs = tokenizer(question, return_tensors="pt", truncation=True, padding=True)
outputs = model(**inputs)
predicted_class = torch.argmax(outputs.logits, dim=1).item()
label_mapping_reverse = {v: k for k, v in label_mapping.items()}
return label_mapping_reverse[predicted_class]
question = "Alice有5个苹果。她给了Bob 3个苹果。Alice还有多少个苹果?"
paradigm = classify_question(question)
print(f"推荐范式: {paradigm}")
为了更轻松的集成,我们还提供了一个完整的Python包实现。详情请参见GitHub仓库或下面的“完整包”部分。
模型描述
SoT_DistilBERT模型是一个经过微调的DistilBERT分类器,用于根据思维草图框架为给定查询选择最佳推理范式。
训练数据
该模型在大约14,200个样本上进行了训练,涵盖了各种推理任务,每个样本都使用三种SoT范式之一进行标记。标签是使用GPT-4o根据预定义的启发式方法通过特定分类提示分配的。
模型架构
- 基础模型: DistilBERT
- 训练: 5个周期,批量大小64,学习率2e-5
- 损失: 交叉熵
完整包
为了更流畅的体验,我们开发了SoT Python包,它处理范式选择、提示管理和示例格式化:
from sketch_of_thought import SoT
sot = SoT()
question = "Alice有5个苹果。她给了Bob 3个苹果。Alice还有多少个苹果?"
paradigm = sot.classify_question(question)
context = sot.get_initialized_context(
paradigm=paradigm,
question=question,
format="llm",
include_system_prompt=True
)
使用Qwen2.5-7B的示例
以下是使用Qwen2.5-7B-Instruct的完整示例:
from transformers import AutoModelForCausalLM, AutoTokenizer
from sketch_of_thought import SoT
sot = SoT()
model_name = "Qwen/Qwen2.5-7B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "Alice有5个苹果。她给了Bob 3个苹果。Alice还有多少个苹果?"
paradigm = sot.classify_question(prompt)
messages = sot.get_initialized_context(
paradigm,
prompt,
format="llm",
include_system_prompt=True
)
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
输出:
<思考>
A = 5
A -= 3
A = 2
</思考>
\boxed{2}
支持的格式
SoT包支持多种输出格式:
"llm"
: 纯文本LLM的标准聊天格式
"vlm"
: 视觉语言模型的多模态格式
"raw"
: 无格式化的原始示例