一、CoT(Chain of Thought,思维链)—— 基础推理范式

张开发
2026/4/13 7:43:00 15 分钟阅读

分享文章

一、CoT(Chain of Thought,思维链)—— 基础推理范式
一、范式核心信息全称Chain of Thought思维链核心一句话只想不做线性思考仅利用模型本身知识完成推理定位大模型推理的基础范式无需外部工具仅依赖模型内置知识核心特点无行动、无交互、无迭代推理过程是线性的步骤拆解成本低无需调用外部工具Token消耗少推理能力低仅适用于简单推理场景工业可用简单场景直接复用无需额外开发二、范式详细定义CoT思维链是大模型最基础的推理范式核心是让模型将复杂问题拆解为一系列线性的、可理解的中间步骤通过逐步推理得出最终答案——整个过程中模型只“思考”拆解步骤、推导逻辑不“行动”不调用外部工具、不与外部交互完全依赖自身训练的知识储备完成推理。简单来说CoT就是让模型“把思考过程说出来”比如解决数学题时先列出解题步骤再算出答案而不是直接给出最终结果。三、完整推理流程CoT的推理流程极其简洁属于线性推理无任何分支、迭代或交互具体步骤如下接收用户输入的问题多为简单、可直接推导的问题模型将问题拆解为1~N个线性中间步骤按逻辑顺序排列按步骤逐步推导每一步都基于上一步的结果整合所有步骤的推导结果输出最终答案。流程简化问题 → 步骤1→步骤2→步骤3 → 答案四、适用场景CoT仅适用于「简单、无需外部知识/工具、可直接推导」的场景典型用途包括简单数学计算如“156289×3”基础常识问答如“北京是中国的首都吗请说明理由”简单逻辑推理如“小明比小红大3岁小红10岁小明几岁”简单概念解释如“什么是人工智能用3句话说明”。不适用场景需要调用工具如搜索、计算、需要外部知识、复杂多路径推理的场景。五、工程级实现代码LangChain LangGraph可直接运行CoT的实现最简单无需依赖外部工具仅需通过Prompt引导模型输出推理步骤即可以下落地代码1. LangChain实现from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate import os from dotenv import load_dotenv # 加载环境变量 # 自动读取 .env 文件中的密钥永久配置 load_dotenv() # 1. 初始化大模型从环境变量取 API Key llm ChatOpenAI( modelqwen3.5-flash, api_keyos.getenv(DASHSCOPE_API_KEY), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, temperature0.7 ) # 2. 定义CoT Prompt模板 cot_prompt ChatPromptTemplate.from_messages([ (system, 你是一个擅长逻辑推理的助手解决问题时请先列出详细的推理步骤再给出最终答案不要直接输出结果。), (human, 问题{question}) ]) # 3. 构建推理链 cot_chain cot_prompt | llm # 4. 测试推理 question 156 289 × 3 response cot_chain.invoke({question: question}) # 5. 输出结果 print(CoT推理结果) print(response.content)CoT推理结果 为了解决这个问题我们需要遵循数学中的运算优先级规则先乘除后加减。以下是详细的推理步骤 **第一步确定运算顺序** 表达式中包含加法和乘法×。根据四则运算法则乘法的优先级高于加法。因此我们需要先计算乘法部分然后再进行加法计算。 **第二步计算乘法部分** 先计算 $289 \times 3$ * 个位$9 \times 3 27$写 7 进 2。 * 十位$8 \times 3 24$加上进位的 2 等于 26写 6 进 2。 * 百位$2 \times 3 6$加上进位的 2 等于 8。 所以$289 \times 3 867$。 **第三步计算加法部分** 将上一步的结果代入原表达式现在需要计算 $156 867$ * 个位$6 7 13$写 3 进 1。 * 十位$5 6 11$加上进位的 1 等于 12写 2 进 1。 * 百位$1 8 9$加上进位的 1 等于 10。 所以$156 867 1023$。 **第四步得出结论** 经过上述分步计算最终结果为 1023。 **最终答案** 10232. LangGraph实现from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langgraph.graph import StateGraph, END from typing import TypedDict import os from dotenv import load_dotenv # 导入dotenv # 自动加载 .env 文件中的环境变量永久生效 load_dotenv() # 1. 定义状态 class State(TypedDict): question: str reasoning: str answer: str # 2. 初始化 Qwen 模型从环境变量读取 llm ChatOpenAI( modelqwen3.5-flash, api_keyos.getenv(DASHSCOPE_API_KEY), # 读取.env里的密钥 base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1, temperature0.7 ) # 3. CoT 推理节点 def cot_reason_node(state: State): prompt ChatPromptTemplate.from_messages([ (system, 你是逻辑推理助手。先写详细推理步骤再给出最终答案格式清晰。), (human, 问题{question}) ]) chain prompt | llm res chain.invoke({question: state[question]}) return {reasoning: res.content} # 4. 提取答案节点 def extract_answer_node(state: State): prompt ChatPromptTemplate.from_messages([ (system, 从下面推理内容中只提取最终数字答案不要多余文字。), (human, 推理内容{reasoning}\n只输出最终答案) ]) chain prompt | llm ans chain.invoke({reasoning: state[reasoning]}) return {answer: ans.content.strip()} # 5. 构建 LangGraph workflow StateGraph(State) workflow.add_node(cot_reason, cot_reason_node) workflow.add_node(extract_answer, extract_answer_node) workflow.set_entry_point(cot_reason) workflow.add_edge(cot_reason, extract_answer) workflow.add_edge(extract_answer, END) app workflow.compile() # 6. 运行 if __name__ __main__: question 156 289 × 3 ? result app.invoke({question: question}) print( 问题 ) print(result[question]) print(\n 推理过程 ) print(result[reasoning]) print(\n 最终答案 ) print(result[answer]) 问题 156 289 × 3 ? 推理过程 ### 推理步骤 根据数学运算的优先级规则先乘除后加减我们需要先计算乘法部分再进行加法部分。 **第一步计算乘法** 表达式中的乘法部分是 $289 \times 3$。 $$289 \times 3 (200 \times 3) (80 \times 3) (9 \times 3)$$ $$ 600 240 27$$ $$ 867$$ **第二步计算加法** 将第一步得到的结果代入原式现在表达式变为 $156 867$。 $$156 867$$ 个位$6 7 13$写 3 进 1 十位$5 6 1(\text{进位}) 12$写 2 进 1 百位$1 8 1(\text{进位}) 10$ 结果为 $1023$。 ### 最终答案 1023 最终答案 1023六、核心注意事项Prompt引导是关键必须明确要求模型“先列步骤、再给答案”否则模型可能直接输出结果失去CoT的核心价值控制温度参数temperature建议设为0.5~0.7过高会导致推理步骤混乱过低会缺乏灵活性不依赖外部工具CoT的核心是“只用模型自身知识”无需添加任何工具调用逻辑否则会变成ReAct范式。

更多文章