思维链技术开启了人工智能通向人类智能的崭新路径。它让模型不再仅仅是机械地执行指令,而是开始具备类似人类的思考方式,能够理解问题的本质,进行深层次的推理和分析。这一突破,让人工智能的发展进入了一个全新的阶段,也为未来智能系统的进化奠定了坚实的基础。
前面我们讲解了思维链,对比了通过Prompt 提示完成的思维链对问题的拆解。基于这种思维链的推理过程,DeepSeek 提出了一种新的推理模型——DeepSeek-Reasoner ,其作用犹如一把精准的手术刀,在人工智能的复杂领域中发挥着关键作用。
首先,DeepSeek-Reasoner 充当着 “ 思维解码器 ” 的角色。在面对复杂问题时,它能够深入剖析问题的内在结构,将隐藏在问题背后的思维逻辑清晰地呈现出来。就像一位密码破译专家,能够解读出问题中的关键信息,为后续的推理过程提供清晰的指引。例如,在处理一道复杂的数学证明题时,它能够识别出题目中的已知条件、未知结论以及它们之间的逻辑关系,将证明过程拆解为一系列合理的推理步骤。
其次,DeepSeek-Reasoner 是一个 “ 智能推理引擎 ” 。它依据思维链的原理,自动生成一系列有序的子问题,并引导模型逐步求解。在这个过程中,它能够根据模型的推理进展,动态调整推理策略,确保推理过程的高效和准确。就像一位经验丰富的赛车手,能够根据赛道情况灵活调整驾驶策略,以最快的速度到达终点。
然后, DeepSeek-Reasoner 还具备 “ 知识融合与创新 ” 的能力。它能够将模型内部存储的海量知识与当前的推理任务相结合,在解决问题的过程中创造出新的知识和推理模式。例如,在处理跨领域的复杂问题时,它能够融合不同领域的知识,提出新颖的解决方案,为模型的推理能力注入新的活力。
最后,DeepSeek-Reasoner 还是一个 “ 可解释性增强器 ” 。在传统的深度学习模型中,推理过程往往是一个黑箱,难以理解和解释。而DeepSeek-Reasoner 通过思维链的推理方式,将模型的推理过程以清晰、直观的方式呈现出来,让人们能够理解模型是如何得出最终答案的。这不仅提高了模型的可信度,也为模型的进一步优化和改进提供了有力的支持。
通过Prompt 提示构建思维链
对于普通的文本问答,大模型倾向于直接对结果进行回复。下面我们先举一个经典的计算字母的例子对大模型进行问答,代码如下:
from openai import OpenAI
client = OpenAI(api_key="sk-dfd742ec38dc4ede96977974085485b0", base_url="https://api.deepseek.com")
prompt = """
strawberry里面有几个r字母。用中文回答。
"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": prompt},
],
max_tokens=1024,
temperature=0.95,
stream=False
)
print(response.choices[0].message.content)
代码运行结果如下所示:
在英文单词 "strawberry" 中,共有 **3 个字母 "r"**。具体位置如下: 1. 第 **3** 个字母:s **t r** awberry 2. 第 **6** 个字母:straw **b e r** ry 3. 第 **9** 个字母:strawber **r y** 因此,答案是**2 个 "r"**。
可以看到,对于普通的大模型而言,其回复过程往往是一种基于自身对问题理解的笼统考量,而非对问题进行细致入微的分解剖析。这种缺乏系统性分解的处理方式,就如同在迷雾中摸索前行,使得模型难以精准把握问题的核心要点与关键细节,进而不可避免地造成了结果的不准确性。
在面对复杂问题时,普通大模型的这种局限性尤为明显。复杂问题通常包含着多个相互关联又各自独立的子问题,它们如同一张错综复杂的网,需要有条理地梳理和分析。然而,普通大模型却难以做到这一点,它可能会将不同子问题的信息混淆在一起,或者在处理过程中遗漏某些重要环节,从而导致最终回复与实际情况相去甚远。
我们通过提示(Prompt )分解问题,构建一个完整思维链对问题解答的示例,代码如下所示:
from openai import OpenAI
# for backward compatibility, you can still use 'https://api.deepseek.com/v1' as 'base_url'.
client = OpenAI(api_key="sk-dfd742ec38dc4ede96977974085485b0", base_url="https://api.deepseek.com")
prompt = """
回答下面问题并注意回答的时候严格按照以下步骤,
逐步进行:
1.将单词拆开
2.从左到右一个一个对比字母是不是r,是的话你要记录它的位置,并记住数量加-3.
第2步数出来多少个r直接输出,不要有任何分析和判断
问题:"strawberry"里面有几个r
"""
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "user", "content": prompt},
],
max_tokens=1024,
temperature=0.95,
stream=False
)
print(response.choices[0].message.content)
在这里我们通过提示prompt 对问题的求解过程进行拆分,并指示模型在回答时依据步骤进行,回答如下:
好的,按照步骤逐步进行:
1. 将单词拆开:s t r a w b e r r y 2. 从左到右一个一个对比字母是不是r,是的话记录位置并记住数量加-: - 第1个字母:s → 不是r - 第2个字母:t → 不是r - 第3个字母:r →是r,记录位置3,数量加-(数量:1) - 第4个字母:a → 不是r - 第5个字母:w → 不是r - 第6个字母:b → 不是r - 第7个字母:e → 不是r - 第8个字母:r →是r,记录位置8,数量加-(数量:2) - 第9个字母:r →是r,记录位置9,数量加-(数量:3) - 第10个字母:y → 不是r 3. 数出来多少个r直接输出:3
可以看到,这里我们将问答步骤进行拆分,并且以清晰、有条理的方式引导模型完成任务。这种基于思维链的提示方法,让模型的回答过程不再是一个黑箱操作,而是变得透明、可解释。
通过这种方式,模型不再是盲目地给出答案,而是按照我们设定的步骤,一步一步地进行推理和计算。这不仅提高了答案的准确性,还使得模型的推理过程具有可复现性。如果出现问题,我们可以很容易地回溯到具体的步骤,检查是哪一步出现了偏差。
而且,这种拆分步骤的方法具有很强的通用性。对于不同类型的问题,我们只需要根据问题的特点,设计相应的步骤提示,就可以引导模型进行有效的求解。例如,在处理数学问题时,我们可以将解题过程拆分为分析问题、列出已知条件、确定解题方法、进行计算等步骤;在处理文本分析问题时,我们可以将解题过程拆分为文本预处理、特征提取、模型推理等步骤。
此外,将问答步骤拆分还有助于提升模型的学习能力。模型在按照步骤进行多次任务后,会逐渐理解每个步骤的意义和作用,从而在面对类似问题时,能够更加自主地运用这些步骤进行求解。这就像是人类在学习新技能时,通过反复练习分解动作,最终能够熟练掌握整个技能一样。
总之,通过提示(Prompt )对问题求解过程进行拆分,并指示模型依据步骤进行回答,这是一种非常有效的提升模型性能和可解释性的方法。它为人工智能的发展提供了一种新的思路,有望推动人工智能在更多领域取得更好的应用效果。
推理模型实战
在之前讲解的示例中,无论是进行日常对话还是调用特定工具,我们所依赖的底层技术均是 DeepSeek 普通对话模型。这一模型以其高效和稳定的性能,为我们的交流提供了坚实的基础。然而,技术的探索永无止境, DeepSeek 团队在此基础上更进一步,推出了一种创新的输出方案—— DeepSeek-Reasoner 推理模型,为我们与大模型的对话体验增添了新的维度。
DeepSeek-Reasoner ,作为DeepSeek 家族中的新成员,是一款专为复杂推理任务设计的模型。它不仅仅满足于给出一个直接的答案,而是在生成最终回答之前,会精心构建一段详尽的思维链内容。这段思维链,就像是模型在解题过程中的 “ 草稿纸 ” ,记录了它从问题出发,逐步分析、推理,直至得出结论的全过程。通过这种方式,DeepSeek-Reasoner 显著提升了最终答案的准确性和可信度,让用户不仅知其然,更知其所以然。
为了增强透明度和互动性,DeepSeek API 特别向用户开放了DeepSeek-Reasoner 的思维链内容。这意味着,用户不仅可以获得最终的回答,还能深入查看模型是如何一步步得出这个结论的。这一特性对于教育、研究以及需要高度解释性的应用场景来说,无疑是一大福音。用户可以根据需要,选择查看、展示甚至进一步蒸馏这些思维链内容,以更好地理解和利用模型的推理过程。具有思维链的多轮对话如图4-3 所示。
图4-3 具有思维链的多轮对话
在具体的应用场景中,当我们使用DeepSeek-Reasoner 进行每一轮对话时,模型都会输出两部分内容:一部分是思维链内容(reasoning_content ),它详细记录了模型的推理步骤;另一部分是最终回答(content ),即模型基于思维链得出的结论。值得注意的是,为了保持对话的连贯性和简洁性,在下一轮对话中,之前轮次输出的思维链内容并不会被直接拼接到上下文中。这样的设计既保证了每轮对话的独立性,又避免了信息冗余,使得对话更加高效和流畅。
下面我们演示一下如何使用DeepSeek 推理模型访问思维链和最终回答,以及如何在多轮对话中进行上下文拼接的方法,代码如下所示:
from openai import OpenAI
client = OpenAI(api_key="sk-dfd742ec38dc4ede96977974085485b0", base_url="https://api.deepseek.com")
# Round 1
messages = [{"role": "user", "content": "9.11 与 9.8, 哪个数字比较大?"}]
response = client.chat.completions.create(
model="deepseek-reasoner",
messages=messages
)
reasoning_content = response.choices[0].message.reasoning_content
content = response.choices[0].message.content
print("Answer 1:",content)
# Round 2
messages.append({'role': 'assistant', 'content': content})
messages.append({'role': 'user', 'content': "一斤的铁和一斤的棉花哪个重?"})
response = client.chat.completions.create(
model="deepseek-reasoner",
messages=messages
)
content = response.choices[0].message.content
print("Answer 2:",content)
这个示例首先比较一个经典的数学题,之后又使用一个脑筋急转弯问题考察推理模型的思考能力,结果如下:
Answer 1: 在数值比较中,9.8 比 9.11 大。具体分析如下: 1. **整数部分相同**:两数的整数部分均为 9,因此需比较小数部分。 2. **小数部分比较**: - 9.8的小数部分为 **0.8**(等价于 0.80)。 - 9.11的小数部分为 **0.11**。 - 由于 **0.80 > 0.11**,因此 **9.8 > 9.11**。 **结论**:9.8 更大。 (若比较版本号,则 9.11 可能代表更高版本,但按数值计算时 9.8 更大。) Answer 2: **答案:两者重量相同,都是一斤。** 1. **单位明确**: 在标准单位下,1斤(市斤)= 500克。无论是铁还是棉花,若均为“一斤”,则其质量均为500克,重量相等。 2. **常见误解解析**: 铁密度大、体积小,棉花密度小、体积大,容易让人误以为“棉花更轻”。但**重量与体积无关**,仅取决于质量。因此,**一斤铁 = 一斤棉花**。 3. **扩展思考(若考虑复杂因素)**: - **空气浮力**:体积大的棉花受空气浮力影响略多,实际称重可能极轻微减少,但日常可忽略。 - **单位差异**:若使用非标准“斤”(如台斤600克),需确认单位,但通常按市斤计算。 **结论**:严格按照质量单位比较,两者一样重。
从上面结果可以看到,相对于原有的输出,在问题的解答上推理模型使用了更多的推理过程与解答,并且对结果进行更细密的分析,从而获得对逻辑和推理步骤进行说明的结果。有兴趣的读者可以自行尝试更多的内容。
本文节选自《DeepSeek原生应用与智能体开发实践》一书,获出版社和作者授权发布,仅供读者个人学习使用。
