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)
|
推理 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)
|
完整的 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 使用量 } """ extraction_prompt = self._build_extraction_prompt(problem) extraction_response = self._call_llm(extraction_prompt) extracted_info = extraction_response["content"]
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"])
print("\n推理过程:") print(result["reasoning"])
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 倍而不损失准确率,这一结果在推理效率优化中颇具实用价值。
核心优势
- 即插即用:无需训练,可直接用于任何 LLM
- 效率显著提升:2-3 倍 token 节省,降低 API 成本
- 认知合理:符合人类问题求解的注意力聚焦原理
- 可解释性强:提取的信息可作为推理的中间表示
局限性
- 额外调用:两阶段设计需要两次 LLM 调用
- 领域限制:主要适用于结构化问题
- 提取质量依赖:信息提取的准确性影响最终结果
未来方向
- 单 Prompt 优化:探索在单次调用中实现两阶段效果
- 领域扩展:应用于逻辑推理、科学问题等更多领域
- 自适应提取:根据问题类型自动调整提取策略
评分: 4.0/5.0
技术亮点: information extraction, structured reasoning, token efficiency, cognitive psychology inspired
适用场景: 算术应用题、逻辑推理、多步推理任务、成本敏感的推理应用
代码仓库: GitHub
相关资源: