❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发非常感兴趣,我会每日分享大模型与 AI 领域的最新开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术,欢迎关注我哦!
🥦 微信公众号|搜一搜:蚝油菜花 🥦
🚀 快速阅读
- 功能:子曰-o1是国内首个分步式讲解推理模型,支持K12数学教学。
- 技术:采用14B轻量级架构,专为消费级显卡设计,能在低显存设备上稳定运行。
- 应用:应用于网易有道旗下的AI全科学习助手“有道小P”,支持启发式学习。
正文(附运行示例)
子曰-o1 是什么
子曰-o1是网易有道发布的国内首个输出分步式讲解的推理模型。模型采用14B轻量级架构,专为消费级显卡设计,能在低显存设备上稳定运行。通过思维链技术,模拟人类的思考方式,以“自言自语”和自我纠错的方式输出详细的解题步骤。
这种分步式讲解功能特别适合教育场景,能帮助学生更好地理解和掌握知识。子曰-o1在教育领域的应用表现出色,特别是在K12数学教学中,能提供精准的解析思路和答案。模型已应用于网易有道旗下的AI全科学习助手“有道小P”,支持“先提供解析思路、再提供答案”的答疑过程。
子曰-o1 的主要功能
- 分步式讲解:采用思维链技术,能以“自言自语”和自我纠错的方式输出详细的解题过程,帮助用户更好地理解和掌握知识。
- 轻量化设计:作为14B参数规模的轻量级单模型,专为消费级显卡设计,能在低显存设备上稳定运行。
- 强逻辑推理:具备强大的逻辑推理能力,能提供高准确度的解题思路和答案,尤其在数学推理方面表现出色。
- 教育场景优化:基于教育领域数据深度优化,使用大量学生试卷习题作为训练样本,提升在教育场景中的应用效果。
- 启发式学习:支持“先提供解析思路、再提供答案”的答疑过程,引导学生主动思考,提升自主学习能力。
子曰-o1 的技术原理
- 思维链技术:子曰-o1采用思维链技术,通过模拟人类的思考方式,形成较长的思维链条,实现更接近人类的推理过程。模型在解题时会“自言自语”并自我纠错,最终输出分步解题过程。
- 轻量化设计:模型采用14B参数规模,专为消费级显卡设计,能在低显存设备上稳定运行。这种轻量化设计降低了硬件门槛,使模型能在普通消费级显卡上高效运行。
- 分步式讲解功能:作为国内首个输出分步式讲解的推理模型,子曰-o1能将复杂的解题过程分解为多个步骤,帮助用户逐步理解。
- 自我纠错与多样化思路:模型在推理过程中具备自我纠错能力,能及时修正错误推理,并探索多种解题思路,确保最终答案的准确性。
如何运行 子曰-o1
1. 环境配置
子曰-o1的环境配置与Qwen2.5-14B-Instruct模型相同。你可以使用Transformers或vLLM来加载和运行模型。以下是Python代码示例:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "netease-youdao/Confucius-o1-14B"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
2. 构建消息
根据模型提供的预定义系统消息和用户消息模板,构建请求消息。以下是Python代码示例:
SYSTEM_PROMPT_TEMPLATE = """你叫"小P老师",是一位由网易有道「子曰」教育大模型创建的AI家庭教师。
尽你所能回答数学问题。
!!! 请记住:
- 你应该先通过思考探索正确的解题思路,然后按照你思考过程里正确的解题思路总结出一个包含3-5步解题过程的回答。
思考过程的一些准则:
- 这个思考过程应该呈现出一种原始、自然且意识流的状态,就如同你在解题时内心的独白一样,因此可以包含一些喃喃自语。
- 在思考初期,你应该先按自己的理解重述问题,考虑问题暗含的更广泛的背景信息,并梳理出已知和未知的元素,及其与你所学知识的一些关联点,并发散思维考虑可能有几种潜在的解题思路。
- 当你确定了一个解题思路时,你应该先逐步按预想的思路推进,但是一旦你发现矛盾或者不符合预期的地方,你应该及时停下来,提出你的质疑,认真验证该思路是否还可以继续。
- 当你发现一个思路已经不可行时,你应该灵活切换到其他思路上继续推进你的思考。
- 当你按照一个思路给出答案后,切记要仔细验证你的每一个推理和计算细节,这时候逆向思维可能有助于你发现潜在的问题。
- 你的思考应该是细化的,需要包括详细的计算和推理的细节。
- 包含的喃喃自语应该是一个口语化的表达,需要和上下文语境匹配,并且尽量多样化。
总结的解题过程的格式要求:
- 求解过程应该分为3-5步,每个步骤前面都明确给出步骤序号(比如:“步骤1”)及其小标题
- 每个步骤里只给出核心的求解过程和阶段性答案。
- 在最后一个步骤里,你应该总结一下最终的答案。
请使用以下模板。
<question>待解答的数学问题</question>
<thinking>
这里记录你详细的思考过程
</thinking>
<summary>
根据思考过程里正确的解题路径总结出的,包含3-5步解题过程的回答。
</summary>"""
USER_PROMPT_TEMPLATE = """现在,让我们开始吧!
<question>{question}</question>"""
messages = [
{
'role': 'system', 'content': SYSTEM_PROMPT_TEMPLATE},
{
'role': 'user', 'content': USER_PROMPT_TEMPLATE.format(question=question)},
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
3. 获取结果并解析
获取模型生成的结果并解析出“思考”和“总结”部分。以下是Python代码示例:
generated_ids = model.generate(
**model_inputs,
max_new_tokens=16384
)
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]
def parse_result_nostep(result):
thinking_pattern = r"<thinking>(.*?)</thinking>"
summary_pattern = r"<summary>(.*?)</summary>"
thinking_list = re.findall(thinking_pattern, result, re.DOTALL)
summary_list = re.findall(summary_pattern, result, re.DOTALL)
assert len(thinking_list) == 1 and len(summary_list) == 1, \
f"The parsing results do not meet the expectations.\n{result}"
thinking = thinking_list[0].strip()
summary = summary_list[0].strip()
return thinking, summary
thinking, summary = parse_result_nostep(response)
资源
- HuggingFace 仓库:https://huggingface.co/netease-youdao/Confucius-o1-14B
- 在线体验Demo:https://confucius-o1-demo.youdao.com/
❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发非常感兴趣,我会每日分享大模型与 AI 领域的最新开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术,欢迎关注我哦!
🥦 微信公众号|搜一搜:蚝油菜花 🥦