我们想要一个准确的答案,需要让模型“一步步思考”进行推理分析,得出答案。
但是“思考”后的内容很长,如果只需要一个准确的答案,而不要思考过程,怎么办呢?
过往做法
当我们向大型模型提问时,常常会发现它给出的答案并不总是准确,这是因为模型缺乏逐步推理的能力(即COT,Chain of Thought)。引入思维链后,虽然答案的准确性有所提升,但同时也带来了冗长的推理过程。很多时候,我们只想要一个简洁准确的答案,而不需要繁琐的推理步骤。
以往的做法是建立两个大型模型:第一个负责推理思考,第二个则用于总结答案。然而,这种方案不仅增加了成本,还延长了响应时间。
今天,我们将介绍一种最佳实践——将原本需要两个模型的任务整合到一个模型中。这种方法不仅能提高效率,还能在保证准确性的同时减少冗余信息,让你更快地获得所需答案。
原始问题
我们将从最基本的问题出发,直接让模型进行解答。每个模型都有其独特的回答方式,但其准确率波动较大,表现不够稳定。
我的测试问题是:
问题:1919年5月5日,天津《大公报》刊登“北京特约通讯”,标题为《北京学界之大举动﹣﹣昨日之游街大会/曹汝霖宅之焚烧/青岛问题之力争/章宗祥大受夷伤。从上述标题中能获得的信息是( ) 选项:(A)京津两地工人罢工游行 (B)学生爱国浪潮遍及全国 (C)外争主权、内除国贼 (D)北洋政府逮捕大批学生
答案:从A到D, 我们应选择什么?
这道历史题的正确答案时C。
下边是使用deepseek做的测试。但是这个答案是错误的。
Pasted image 20241108175723.png
为了提升模型回答的稳定性和准确性,我们计划引入思维链机制。通过这种方式,模型将在推理过程中进行更深入的思考,从而为我们提供更加细致和可靠的答案。
增加推理
我们引入思维链,引导模型先深入思考,全面分析问题后,再给出精准回答。
我们增加的推理逻辑是:
你在做历史试题,综合从多个方面慢慢思考,一步步的推理,告诉我你的答案是什么。
完整的提示语是:
问题:1919年5月5日,天津《大公报》刊登“北京特约通讯”,标题为《北京学界之大举动﹣﹣昨日之游街大会/曹汝霖宅之焚烧/青岛问题之力争/章宗祥大受夷伤。从上述标题中能获得的信息是( ) 选项:(A)京津两地工人罢工游行 (B)学生爱国浪潮遍及全国 (C)外争主权、内除国贼 (D)北洋政府逮捕大批学生
答案:从A到D, 我们应选择什么?
你在做历史试题,综合从多个方面慢慢思考,一步步的推理,告诉我你的答案是什么。
deepseek回答的效果是这样的:
Pasted image 20241108175848.png
经过深入推理,它的回答终于正确了。
我们引导它进行了全面思考,最终得到了答案。这种经过深思熟虑的答案,无疑更加准确和可靠。
然而,最大的问题是,我们渴望的是一个简洁明了的答案,而非冗长的推导过程。
因此,我们引入了一项重要的输出技巧:格式化输出。
格式化输出
在输出内容时,若要求大型语言模型(LLM)将问题的思考过程与最终答案分开呈现,我们可以巧妙地设计输出格式:思考内容单独成段,答案则置于另一段。这样一来,我们便能轻松提取出纯粹的答案部分,使得信息的获取更加高效且直观。
我们增加了提示语输出的格式要求:
推理和思考的过程写在<think></think>标签内,答案写在<answer></answer>内。
答案中只能包含选项字母(eg. <answer>A</answer>)
完整的提示语:
问题:1919年5月5日,天津《大公报》刊登“北京特约通讯”,标题为《北京学界之大举动﹣﹣昨日之游街大会/曹汝霖宅之焚烧/青岛问题之力争/章宗祥大受夷伤。从上述标题中能获得的信息是( ) 选项:(A)京津两地工人罢工游行 (B)学生爱国浪潮遍及全国 (C)外争主权、内除国贼 (D)北洋政府逮捕大批学生
答案:从A到D, 我们应选择什么?
你在做历史试题,综合从多个方面慢慢思考,一步步的推理,告诉我你的答案是什么。
推理和思考的过程写在<think></think>标签内,答案写在<answer></answer>内。
答案中只能包含选项字母(eg. <answer>A</answer>)
这样,推理和思考的过程写在<think></think>
标签内,答案写在<answer></answer>
内。
Pasted image 20241108180116.png
接下来,我们该如何巧妙地提取出答案部分呢?
提取关键答案
只需要写一个程序,将xml中的answer部分提取出来就可以了。
运行的效果时这样的:
Pasted image 20241108180205.png
相关代码:
import re
pattern = r'<answer>(.*?)</answer>'
match = re.search(pattern, text)
if match:
answer = match.group(1)
print(f"提取的答案是: {answer}")
else:
print("未找到答案")
这样,我们就即使用到了LLM的推理能力,而又只拿到了模型的结果部分。
延伸
为何选择XML?
XML以其简洁的格式和清晰的结构,成为内容隔离的最佳选择。相较于JSON,XML无需考虑复杂的数据类型,使其在处理上更为简便。其宽松的要求使得它特别适合大型语言模型(LLM)在输出时进行内容隔离,确保信息的清晰与独立。
隔离输出的优势何在?
- 无缝融入现有流程:通过将不同部分进行隔离,我们可以更轻松地将这些结构化的输出整合到现有的工作流程中。这不仅简化了操作,还极大地拓展了LLM在各种场景中的应用潜力。
-
提升输出的连贯性与完整性:采用隔离输出的方式,模型能够一次性生成多个相关内容,确保每个部分既考虑了原始输入,也兼顾了之前的输出。例如,在进行英语分级阅读时,你可以使用
<A1>
、<B1>
、<C1>
等标签来标记不同难度的内容。这样生成的三段内容不仅更加统一,而且比分别调用三次LLM生成的结果更具连贯性和完整性。