昇思大模型思维链提示

1 阅读1分钟

​思维链提示的核心价值的是“激活大模型的涌现能力”,无需架构调整或微调,仅通过提示工程引导模型将复杂问题拆解为多个中间步骤,显化原本隐含的推理逻辑[superscript:6]。其适配昇思大模型的核心逻辑的是:依托MindFormers的Prompt模板封装能力,将思维链的分步推理逻辑融入提示词,引导模型遵循“问题拆解→步骤推理→结论输出”的流程,降低推理错误率,同时提升输出的可解释性[superscript:3]。

昇思大模型支持两种主流思维链提示模式,适配不同场景:一是零样本CoT,无需提供示例,仅通过引导语(如“请一步步思考”)触发模型自发推理,适合模型参数≥1000亿的场景[superscript:3];二是少样本CoT,提供“问题+分步推理+答案”的示例,让模型模仿推理逻辑,适配复杂推理任务,稳定性更强[superscript:7]。两种模式均无需修改模型本身,仅通过提示词优化即可实现。

昇思大模型思维链提示实操代码

以下基于MindSpore 2.3.0、MindFormers 1.3.2,以Llama2-7B模型(昇思适配版)为例,实现零样本、少样本两种思维链提示,搭配推理代码,可直接运行验证效果。

1. 环境准备(核心依赖安装)

安装昇思核心依赖,确保模型与套件版本兼容,适配CPU或昇腾NPU环境:

# 1. 安装MindSpore(昇腾NPU需安装对应版本)
pip install mindspore-cpu==2.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

# 2. 安装MindFormers(含大模型推理与提示模板工具)
pip install mindformers==1.3.2

# 3. 安装额外依赖(提示模板处理、数据解析)
pip install sentencepiece transformers

2. 零样本思维链提示(简单高效,无需示例)

零样本CoT仅通过引导语触发模型分步推理,适合简单复杂推理任务,如基础数学运算、简单逻辑分析,代码如下[superscript:4][superscript:8]:

import mindspore as ms
from mindformers import LlamaForCausalLM, LlamaTokenizer

# 1. 初始化环境(昇腾NPU设为Ascend,CPU设为CPU)
ms.set_context(mode=ms.GRAPH_MODE, device_target="CPU")

# 2. 加载昇思适配版Llama2-7B模型与Tokenizer
model = LlamaForCausalLM.from_pretrained("llama2-7b", ms_dtype=ms.float16)
tokenizer = LlamaTokenizer.from_pretrained("llama2-7b")

# 3. 定义零样本思维链提示模板(核心:加入分步推理引导语)
def zero_shot_cot_prompt(question):
    cot_prompt = f"""请一步一步思考并给出答案,不要直接输出结果。
问题:{question}
思考过程:
"""
    return cot_prompt

# 4. 推理测试(数学推理示例)
question = "食堂有23个苹果,用掉20个后又买了6个,现在有多少个苹果?"
prompt = zero_shot_cot_prompt(question)

# 5. 模型推理(生成思维链与答案)
inputs = tokenizer(prompt, return_tensors="ms", padding=True, truncation=True)
outputs = model.generate(
    **inputs,
    max_new_tokens=100,  # 足够容纳思维链与答案
    temperature=0.1,     # 降低随机性,提升推理稳定性
    top_p=0.9
)

# 6. 解析输出结果
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("零样本思维链推理结果:")
print(result)
# 预期输出:包含分步推理(23-20=3,3+6=9)与最终答案9[superscript:3]

3. 少样本思维链提示(复杂场景,稳定性更强)

少样本CoT通过提供带推理过程的示例,引导模型模仿推理逻辑,适配复杂数学推理、多步骤逻辑分析等场景,代码如下[superscript:2][superscript:7]:

import mindspore as ms
from mindformers import LlamaForCausalLM, LlamaTokenizer

# 1. 初始化环境与模型(复用上述配置)
ms.set_context(mode=ms.GRAPH_MODE, device_target="CPU")
model = LlamaForCausalLM.from_pretrained("llama2-7b", ms_dtype=ms.float16)
tokenizer = LlamaTokenizer.from_pretrained("llama2-7b")

# 2. 定义少样本思维链提示模板(核心:加入带推理过程的示例)
def few_shot_cot_prompt(question):
    # 示例:2个带思维链的数学推理案例
    examples = """示例1:
问题:小明有5个网球,买了2盒,每盒3个,现在有多少个?
思考过程:第一步,计算买的网球数量,2盒×3个/盒=6个;第二步,加上原有的5个,5+6=11个;
答案:11个

示例2:
问题:书架上有18本书,借出去8本,又放回来5本,现在有多少本?
思考过程:第一步,计算借出去后的数量,18-8=10本;第二步,加上放回来的5本,10+5=15本;
答案:15本

"""
    # 拼接示例与当前问题
    cot_prompt = f"{examples}问题:{question}
思考过程:
"
    return cot_prompt

# 4. 推理测试(复杂数学推理示例)
question = "一个车间每天生产120个零件,生产了5天后,还差300个完成任务,任务总量是多少个零件?"
prompt = few_shot_cot_prompt(question)

# 5. 模型推理
inputs = tokenizer(prompt, return_tensors="ms", padding=True, truncation=True)
outputs = model.generate(
    **inputs,
    max_new_tokens=120,
    temperature=0.1,
    top_p=0.9
)

# 6. 解析输出结果
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("少样本思维链推理结果:")
print(result)
# 预期输出:分步推理(120×5=600,600+300=900)与最终答案900[superscript:7]

4. 思维链提示优化(提升推理准确率)

结合自一致性策略,让模型生成多条推理路径,统计一致结果,可进一步提升复杂任务推理准确率[superscript:3][superscript:7],优化代码如下:

def cot_self_consistency(question, num_paths=3):
    """自一致性策略:生成多条推理路径,选择最一致的答案"""
    prompt = few_shot_cot_prompt(question)
    outputs = []
    # 生成多条推理路径
    for _ in range(num_paths):
        inputs = tokenizer(prompt, return_tensors="ms", padding=True, truncation=True)
        output = model.generate(**inputs, max_new_tokens=120, temperature=0.3, top_p=0.9)
        outputs.append(tokenizer.decode(output[0], skip_special_tokens=True))
    
    # 提取每条路径的答案,统计最频繁的答案
    answers = []
    for output in outputs:
        if "答案:" in output:
            answer = output.split("答案:")[-1].strip()
            answers.append(answer)
    final_answer = max(set(answers), key=answers.count)
    return outputs, final_answer

# 测试自一致性优化
question = "一个长方形周长是36厘米,长是10厘米,宽是多少厘米?"
paths, final_answer = cot_self_consistency(question)

print("多条推理路径:")
for i, path in enumerate(paths, 1):
    print(f"路径{i}{path}\n")
print(f"最终一致答案:{final_answer}")
# 预期效果:准确率较单一路径提升3-8%[superscript:7]