CoT框架简介

Chain-of-Thought (CoT) 即思维链,是让大语言模型(LLM)从“直接给答案”变为“展示推理过程”的核心技术。它通过引导模型生成连续的中间推理步骤,显著提升了复杂问题的解决能力。

核心思想:让思考过程显性化

CoT 的基本逻辑是:解决复杂问题不能只靠直觉,而要靠一步一步的推导

  • 模仿人类思考:它让模型像人一样,先把大问题拆解成小步骤(如先解子问题A,再推导B),最后才得出结论。

  • 从“What”到“How”:传统的提示(Prompting)只要求模型输出结果(What);CoT 则要求模型同时输出得到结果的逻辑路径(How)。

运作机制:三步推导

CoT 的典型流程遵循“问题 → 推理链 → 答案”的线性结构:

  1. 问题解析:模型首先理解用户输入的复杂问题(如数学题、逻辑谜题)。

  2. 逐步推理:模型开始生成一系列中间推理步骤(Thoughts)。每一步都基于前一步的结果,并尽量使用自然语言解释。

  3. 最终作答:在推理链的末尾,基于所有推导步骤得出最终答案。

技术实现关键

CoT 通常通过提示工程(Prompting)触发,无需额外训练模型。最常见的方式是在输入中给模型提供几个“问题+推理过程”的示例(Few-shot Learning),模型就会学会模仿这种分步输出的模式。

典型应用场景

  • 数学计算:多步骤的算术题、方程求解。

  • 逻辑推理:判断关系、演绎推理(如“谁说了谎”类谜题)。

  • 常识问答:需要结合背景知识进行多步推断的问题。

  • 符号操作:代码理解、规则推导。

需求分析

该代码的核心需求是实现一个基于大语言模型的结构化推理系统,专门用于解决需要逻辑思考的复杂问题。具体需求包括:第一,需要集成阿里云百炼平台的DeepSeek模型API,能够稳定调用最新的大语言模型服务;第二,必须实现思维链(Chain-of-Thought, CoT)推理功能,强制模型进行分步、透明的逻辑推演,而非直接给出答案;第三,需要优化用户体验,实时展示模型的"思考过程"与"最终答案"的分离输出,让用户能够理解推理路径;第四,针对数学应用题等需要多步计算的场景,确保推理的严谨性和可解释性。这些需求反映了当前AI应用从追求结果正确性向追求过程透明性和可解释性的重要转变。

设计架构

代码采用三层架构设计,实现了清晰的关注点分离。接口层负责与阿里云百炼API对接,通过OpenAI兼容的SDK封装认证和基础通信,enable_thinking参数是关键设计,专门用于启用模型的内部推理流式输出。业务逻辑层包含提示词工程和推理流程控制,build_cot_prompt函数实现了精心设计的思维链模板,该模板通过结构化指令约束模型的输出行为,确保分步推理的严格执行,这是实现可解释性AI的核心设计。表现层则专注于用户交互体验,通过状态机设计(is_answering标志位)智能区分并格式化输出的两种内容流——灰色的实时思考过程和黑色的最终答案,用视觉分隔符增强可读性。这种架构使系统具备良好的扩展性,可轻松适配不同的问题类型和推理模板。

代码实现

# -*- coding: utf-8 -*-
"""
Created on Wed Jun 25 16:52:48 2025

@author: liguo
"""
from openai import OpenAI
import os

#1. 阿里云百炼提供的DeepSeek大模型服务
client = OpenAI(
    # 如果没有配置环境变量,请用阿里云百炼API Key替换:api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

# 2. 定义CoT Prompt模板(以数学计算为例)
def build_cot_prompt(question):
    cot_template = """
    你需要解决以下问题,并严格按照要求分步推理:
    问题:{question}
    要求:
    1. 先明确问题中的已知信息和需要求的结果;
    2. 每一步推理都必须说明“为什么这么做”(如“第一步:计算总消耗,因为需要先知道用掉多少”);
    3. 不允许跳步,即使是简单计算也需说明理由;
    4. 推理结束后,用“【最终答案】”开头总结结果。
    
    【推理过程】
    """
    return cot_template.format(question=question)  # 传入具体问题,生成完整Prompt

# 3. 调用DeepSeek API,获取CoT推理结果
def call_deepseek_cot(question):
    # 构建请求体(遵循DeepSeek API格式,参考官方文档)
    prompt = build_cot_prompt(question)
    messages = [{"role": "user", "content": prompt }]
    completion = client.chat.completions.create(
        model="deepseek-v3.1",  # 您可以按需更换为其它深度思考模型
        messages=messages,
        extra_body={"enable_thinking": True},
        stream=True
    )

    is_answering = False  # 是否进入回复阶段
    print("\n" + "=" * 20 + "思考过程" + "=" * 20)
    for chunk in completion:
        delta = chunk.choices[0].delta
        if hasattr(delta, "reasoning_content") and delta.reasoning_content is not None:
            if not is_answering:
                print(delta.reasoning_content, end="", flush=True)
        if hasattr(delta, "content") and delta.content:
            if not is_answering:
                print("\n" + "=" * 20 + "完整回复" + "=" * 20)
                is_answering = True
            print(delta.content, end="", flush=True)

    return delta.content

# 4. 示例:运行CoT推理(解决数学问题)
if __name__ == "__main__":
    # 待解决的复杂问题
    user_question = "一个长方形操场,长是宽的2倍,周长是180米,求操场的面积是多少平方米?"
    
    # 调用API获取推理结果
    cot_output = call_deepseek_cot(user_question)
    
    # 打印结果(含推理过程和最终答案)
    print("DeepSeek CoT推理结果:")
    print("="*50)
    print(cot_output)

代码结果

C:\Users\xiayu\miniconda3\envs\langgraph\python.exe "C:\Users\xiayu\PyCharmMiscProject\AI-Agent-Dev-Practices-Code\第3章代码\3.1-使用DeepSeek API实现CoT推理-2.py" 

====================思考过程====================
首先,问题是:一个长方形操场,长是宽的2倍,周长是180米,求操场的面积是多少平方米?

已知信息:
- 长方形操场,长是宽的2倍。所以,如果宽是w米,那么长就是2w米。
- 周长是180米。长方形的周长公式是:周长 = 2 × (长 + 宽)。

需要求的结果:操场的面积。长方形的面积公式是:面积 = 长 × 宽。

现在,开始分步推理。

第一步:设宽为w米。因为长是宽的2倍,所以长为2w米。这样设变量可以帮助我们建立方程。

第二步:根据周长公式,周长 = 2 × (长 + 宽) = 2 × (2w + w) = 2 × 3w = 6w。因为周长是180米,所以6w = 180。这样我们可以求出w。

第三步:解方程6w = 180。为什么?因为我们需要找到宽的值,才能计算面积。所以,w = 180 / 6 = 30米。因此,宽是30米。

第四步:现在,长是宽的2倍,所以长 = 2 × 30 = 60米。为什么?因为长是宽的2倍,所以直接乘以2。

第五步:现在计算面积。面积 = 长 × 宽 = 60 × 30。为什么?因为面积公式是长乘宽。所以,60 × 30 = 1800平方米。

最后,用【最终答案】总结。
====================完整回复====================
【推理过程】
第一步:设宽为w米,因为长是宽的2倍,所以长为2w米。这样设变量可以建立方程来求解。
第二步:根据长方形周长公式,周长 = 2 × (长 + 宽)。因为周长是180米,所以代入得:2 × (2w + w) = 180。简化得:2 × 3w = 6w = 180。这样建立方程是为了利用周长信息求出宽。
第三步:解方程6w = 180,因为需要先求出宽的值。所以,w = 180 / 6 = 30米。因此,宽是30米。
第四步:求长,因为长是宽的2倍,所以长 = 2 × 30 = 60米。这样得到长的值是为了后续计算面积。
第五步:计算面积,因为长方形面积公式是长 × 宽,所以面积 = 60 × 30 = 1800平方米。这样得到最终结果。

【最终答案】1800平方米DeepSeek CoT推理结果:
==================================================


Process finished with exit code 0

代码解析

代码从导入依赖开始,通过环境变量安全地管理API密钥,客户端初始化为与阿里云百炼的兼容模式端点。build_cot_prompt函数采用字符串格式化动态生成提示词,其模板设计精妙:包含明确的问题描述、四点强制性推理要求(如"不允许跳步"),以及用【推理过程】触发模型的连贯输出,这种设计显著提高了推理的可靠性。主函数call_deepseek_cot中,流式处理逻辑尤为关键:通过迭代completion响应,检测每个块是否包含reasoning_content(思考内容)或content(最终答案),并用is_answering布尔标志和分隔符控制输出格式,实现了类似人类"先想后说"的交互效果。最后的示例调用展示了完整流程,将一个长方形面积计算问题转化为可追踪的推理过程,从理解问题到分步计算再到最终验证,充分体现了思维链推理的教育和调试价值。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐