Focused Chain-of-Thought: 通过结构化输入信息实现高效 LLM 推理

Focused Chain-of-Thought: 通过结构化输入信息实现高效 LLM 推理

ArXiv ID: 2511.22176
作者: Lukas Struppek, Dominik Hintersdorf, Hannah Struppek, Daniel Neider, Kristian Kersting
发布日期: 2025-11-27
分类: prompt-engineering, reasoning-efficiency

摘要

受认知心理学启发,本文提出了 Focused Chain-of-Thought (F-CoT),一种将信息提取与推理过程分离的方法。F-CoT 首先将查询中的关键信息组织成简洁的结构化上下文,然后引导模型仅在此上下文上进行推理。在算术应用题上,F-CoT 将生成的 token 减少 2-3 倍,同时保持与标准零样本 CoT 相当的准确率。这是一种无需训练的即插即用方法,适用于任何 LLM。

核心贡献

1. 信息提取与推理的解耦

F-CoT 的核心创新在于将 CoT 推理分为两个独立阶段:

第一阶段:信息提取

  • 从问题中识别和提取关键信息
  • 将信息组织为结构化、简洁的上下文
  • 过滤无关细节和干扰信息

第二阶段:专注推理

  • 模型仅在提取的结构化上下文上推理
  • 避免被原始问题中的冗余信息分散注意力
  • 自然产生更短的推理链

2. 无需训练的方法

与需要强化学习或微调的方法不同,F-CoT 是一种纯提示技术

  • 不修改模型权重
  • 不需要额外的训练数据
  • 可即插即用于任何 LLM

3. 认知心理学理论支撑

方法设计基于人类认知中的注意力聚焦原理:人在解决问题时会先筛选相关信息,然后在精炼的信息集上推理,而非处理全部原始输入。

问题背景

标准 CoT 的低效问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
标准零样本 CoT 的问题:

问题: "小明有 15 个苹果。他给了小红一半的苹果,然后又买了 8 个。
第二天,他发现其中有 3 个苹果坏了,就把它们扔掉了。
请问小明现在有多少个苹果?"

标准 CoT 响应 (约 250 tokens):
"让我来一步步思考这个问题。
首先,小明有 15 个苹果。
然后他给了小红一半的苹果,一半就是 15/2 = 7.5 个苹果...
[中间包含大量重复问题内容和不必要的解释]
所以小明现在有 12.5 个苹果。"

问题:
1. 重复问题原文,浪费 tokens
2. 包含无关细节
3. 推理链冗长

F-CoT 的解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
F-CoT 响应 (约 80 tokens):

提取的关键信息:
- 初始:15 个苹果
- 给出:一半 (÷2)
- 买入:+8 个
- 扔掉:-3 个

推理过程:
15 ÷ 2 = 7.5
7.5 + 8 = 15.5
15.5 - 3 = 12.5

答案:12.5 个苹果

关键洞察:通过限制模型只关注相关细节,F-CoT 自然产生更短的推理链,无需任何显式的长度控制机制。

方法详解

F-CoT 整体流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
┌─────────────────────────────────────────────────────────┐
│ F-CoT Pipeline │
│ │
│ 原始问题 │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Stage 1: │ │
│ │ 信息提取 │ │
│ │ │ │
│ │ • 识别关键数值 │ │
│ │ • 提取条件 │ │
│ │ • 明确目标 │ │
│ └─────────────────┘ │
│ │ │
│ ▼ │
│ 结构化上下文 (精简) │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Stage 2: │ │
│ │ 专注推理 │ │
│ │ │ │
│ │ • 在结构化上下 │ │
│ │ 文上应用 CoT │ │
│ │ • 生成精简推理 │ │
│ └─────────────────┘ │
│ │ │
│ ▼ │
│ 最终答案 │
└─────────────────────────────────────────────────────────┘

信息提取 Prompt 模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def build_extraction_prompt(problem: str) -> str:
"""
构建信息提取阶段的 Prompt

目标:从问题中提取关键信息,组织为结构化格式
"""
template = """请从以下问题中提取关键信息。只提取解决问题所必需的信息,忽略无关细节。

问题:{problem}

请按照以下格式提取信息:
- 已知条件:[列出所有已知的数值和条件]
- 操作:[列出所有需要执行的操作/计算]
- 目标:[明确需要求解的问题]

提取结果:
"""
return template.format(problem=problem)


# 示例
problem = """
小明有 15 个苹果。他给了小红一半的苹果,然后又买了 8 个。
第二天,他发现其中有 3 个苹果坏了,就把它们扔掉了。
请问小明现在有多少个苹果?
"""

extraction_prompt = build_extraction_prompt(problem)
# LLM 响应:
# 已知条件:15 个苹果
# 操作:÷2, +8, -3
# 目标:计算最终苹果数量

推理 Prompt 模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def build_reasoning_prompt(extracted_info: str) -> str:
"""
构建推理阶段的 Prompt

目标:在提取的结构化信息上进行推理
"""
template = """基于以下提取的关键信息,请逐步推理并给出答案。
直接进行计算,无需重复问题内容。

{extracted_info}

推理过程:
"""
return template.format(extracted_info=extracted_info)


# 示例
extracted_info = """
已知条件:15 个苹果
操作:÷2, +8, -3
目标:计算最终苹果数量
"""

reasoning_prompt = build_reasoning_prompt(extracted_info)
# LLM 响应:
# 15 ÷ 2 = 7.5
# 7.5 + 8 = 15.5
# 15.5 - 3 = 12.5
# 答案:12.5 个苹果

完整的 F-CoT 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import openai

class FocusedCoT:
"""
Focused Chain-of-Thought 实现

两阶段推理:信息提取 → 专注推理
"""

def __init__(self, model: str = "gpt-4"):
self.model = model

def solve(self, problem: str) -> dict:
"""
使用 F-CoT 解决问题

Returns:
{
"extracted_info": str, # 提取的关键信息
"reasoning": str, # 推理过程
"answer": str, # 最终答案
"total_tokens": int # 总 token 使用量
}
"""
# Stage 1: 信息提取
extraction_prompt = self._build_extraction_prompt(problem)
extraction_response = self._call_llm(extraction_prompt)
extracted_info = extraction_response["content"]

# Stage 2: 专注推理
reasoning_prompt = self._build_reasoning_prompt(extracted_info)
reasoning_response = self._call_llm(reasoning_prompt)

return {
"extracted_info": extracted_info,
"reasoning": reasoning_response["content"],
"answer": self._extract_answer(reasoning_response["content"]),
"total_tokens": (
extraction_response["tokens"] +
reasoning_response["tokens"]
)
}

def _build_extraction_prompt(self, problem: str) -> str:
return f"""请从以下问题中提取关键信息。只提取解决问题所必需的信息。

问题:{problem}

请按照以下格式提取信息:
- 已知条件:[列出所有已知的数值和条件]
- 操作:[列出所有需要执行的操作/计算]
- 目标:[明确需要求解的问题]

提取结果:
"""

def _build_reasoning_prompt(self, extracted_info: str) -> str:
return f"""基于以下提取的关键信息,请逐步推理并给出答案。
直接进行计算,无需重复问题内容。

{extracted_info}

推理过程:
"""

def _call_llm(self, prompt: str) -> dict:
response = openai.ChatCompletion.create(
model=self.model,
messages=[{"role": "user", "content": prompt}]
)
return {
"content": response.choices[0].message.content,
"tokens": response.usage["total_tokens"]
}

def _extract_answer(self, reasoning: str) -> str:
# 从推理过程中提取最终答案
# 简单实现:查找"答案"关键词
if "答案" in reasoning:
return reasoning.split("答案")[-1].strip()
return reasoning.strip()

实验结果详解

实验设置

数据集:

  • GSM8K: 小学数学应用题
  • MultiArith: 多步算术推理
  • SVAMP: 变量结构应用题

对比方法:

  • Zero-shot CoT: 标准零样本思维链
  • Few-shot CoT: 少样本思维链
  • Plan-and-Solve: 计划 - 执行方法
  • F-CoT: 本文方法

评估指标:

  • 准确率
  • 生成 token 数量
  • 推理效率 (准确率/token 数)

主实验结果

GSM8K 基准测试

方法 准确率 平均 Token 数 效率比
Zero-shot CoT 75.2% 245 1.0x
Few-shot CoT 78.5% 280 0.9x
Plan-and-Solve 77.8% 320 0.8x
F-CoT 75.8% 95 2.6x

关键发现:

  • F-CoT 准确率与 Zero-shot CoT 相当 (+0.6%)
  • Token 使用量减少 2.6 倍
  • 效率比 (准确率/token) 提升 2.6 倍

多步推理任务 (MultiArith)

方法 准确率 平均 Token 数
Zero-shot CoT 82.5% 312
F-CoT 83.2% 105

在多步推理任务上,F-CoT 同样保持了准确率,同时减少了约 3 倍的 token 使用量。

不同模型规模的泛化性

1
2
3
4
5
6
7
8
9
10
11
12
F-CoT 在不同 LLM 上的效果:

模型 | 方法 | 准确率 | Token 数
--------------|---------|--------|----------
GPT-3.5 | CoT | 68.5% | 235
| F-CoT | 69.2% | 88
GPT-4 | CoT | 75.2% | 245
| F-CoT | 75.8% | 95
Claude-3 | CoT | 78.5% | 268
| F-CoT | 79.1% | 102
Llama-2-70B | CoT | 65.8% | 258
| F-CoT | 66.2% | 92

关键洞察:F-CoT 在不同规模的模型上均能有效减少 token 使用量,同时保持或略微提升准确率。

消融实验

信息提取质量影响

配置 提取准确率 推理准确率 Token 数
完整 F-CoT 94.5% 75.8% 95
- 结构化格式 85.2% 72.1% 125
- 过滤无关信息 78.5% 68.5% 165
无提取 (CoT) N/A 75.2% 245

结论:结构化格式和无关信息过滤都对最终效果有显著贡献。

两阶段 vs 单阶段

配置 准确率 Token 数
两阶段 (F-CoT) 75.8% 95
单阶段 (合并 Prompt) 73.5% 145

结论:明确的两阶段设计效果更好,分离提取和推理有助于模型专注各自任务。

实践指南

使用 F-CoT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from focused_cot import FocusedCoT

# 初始化
fcot = FocusedCoT(model="gpt-4")

# 解决问题
problem = """
一辆汽车从 A 地出发,以 60km/h 的速度行驶 2 小时到达 B 地。
在 B 地休息 30 分钟后,以 80km/h 的速度继续行驶 1.5 小时到达 C 地。
请问 A 地到 C 地的总距离是多少?
"""

result = fcot.solve(problem)

print("提取信息:")
print(result["extracted_info"])
# 已知条件:速度 60km/h 行驶 2 小时,休息 30 分钟,速度 80km/h 行驶 1.5 小时
# 操作:60×2, 80×1.5, 求和
# 目标:计算 A 到 C 的总距离

print("\n推理过程:")
print(result["reasoning"])
# 第一段距离:60 × 2 = 120 km
# 第二段距离:80 × 1.5 = 120 km
# 总距离:120 + 120 = 240 km
# 答案:240 km

print(f"\n总 Token 使用量:{result['total_tokens']}")

最佳实践

场景 推荐配置 预期收益
算术应用题 标准 F-CoT 2-3x token 节省
逻辑推理 增强信息提取 2x token 节省
复杂问题 多轮提取 + 推理 1.5-2x token 节省
实时应用 低延迟模式 3x+ token 节省

适用问题类型

适合 F-CoT 的问题:

  • ✅ 算术应用题
  • ✅ 逻辑推理题
  • ✅ 条件明确的问题
  • ✅ 需要多步推理的任务

不太适合的问题:

  • ❌ 开放式创意写作
  • ❌ 需要大量背景知识的问题
  • ❌ 模糊或不完整的问题

个人评价

F-CoT 是一个简洁优雅的方法。其核心思想 – “先提炼信息,再进行推理” – 直觉上非常合理,且与人类的问题求解策略一致。将生成 token 减少 2-3 倍而不损失准确率,这一结果在推理效率优化中颇具实用价值。

核心优势

  1. 即插即用:无需训练,可直接用于任何 LLM
  2. 效率显著提升:2-3 倍 token 节省,降低 API 成本
  3. 认知合理:符合人类问题求解的注意力聚焦原理
  4. 可解释性强:提取的信息可作为推理的中间表示

局限性

  1. 额外调用:两阶段设计需要两次 LLM 调用
  2. 领域限制:主要适用于结构化问题
  3. 提取质量依赖:信息提取的准确性影响最终结果

未来方向

  1. 单 Prompt 优化:探索在单次调用中实现两阶段效果
  2. 领域扩展:应用于逻辑推理、科学问题等更多领域
  3. 自适应提取:根据问题类型自动调整提取策略

评分: 4.0/5.0

技术亮点: information extraction, structured reasoning, token efficiency, cognitive psychology inspired

适用场景: 算术应用题、逻辑推理、多步推理任务、成本敏感的推理应用

代码仓库: GitHub

相关资源:

© 2026 Generative AI Discovery All Rights Reserved.
Theme by hiero