1. 频率增强Self-Consistency
Self-Consistency的步骤如下:
- 多次生成:对同一个问题进行多次推理。每次推理的结果可能略有不同,通过多次生成可以覆盖更多可能的答案。
- 结果汇总:对每次推理的结果进行汇总,统计每个答案的出现频率。常见的答案通常是正确的,通过频率统计可以找到最可能的正确答案。
- 最终答案选择:选择出现频率最高的答案作为最终的推理结果。通过这种方式,可以减少随机性带来的影响,提高推理的可靠性和准确性。
局限性:
- 搜索过程的无序:频率增强方法依赖于大量生成的结果来统计最常见的答案,但这种方法在生成过程中没有明确的方向或策略,可能导致生成的答案分布不均,尤其是在复杂的、多步骤的推理任务中,答案的正确性可能受到生成顺序和上下文依赖的影响。
- 上下文信息的丢失:在自回归生成中,模型依赖于先前生成的文本。如果在多次推理中,模型无法保持一致的上下文信息,可能会导致结果的不一致性或错误。
- 计算资源的消耗:频率增强需要进行多次推理,这会消耗大量的计算资源。对于大规模的应用场景,这种方法的计算开销可能较大,尤其是在面对需要高精度的推理任务时。
回溯策略是一种系统的探索问题空间的方法,通过逐步尝试不同的选项并在发现错误时回溯到先前的状态,从而找到更优解。
1.1 代码
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
| import ollama import re
def generate_text(prompt): response = ollama.chat(model='some_correct_model', messages=[ { 'role': 'user', 'content': prompt, }, ]) return response['message']['content']
prompt = ( "假设你有一个花园,其中有3个花坛。每个花坛都需要浇水。" "如果第一个花坛需要10升水,第二个花坛需要20升水,第三个花坛需要30升水," "请计算总共需要多少升水。" )
n_trials = 5 results = []
for _ in range(n_trials): generated_text = generate_text(prompt) if generated_text is not None: print(f"推理结果: {generated_text}") results.append(generated_text)
def extract_answer(text): match = re.search(r'\d+', text) if match: return int(match.group(0)) return None
extracted_answers = [extract_answer(text) for text in results]
answer_counts = Counter(filter(None, extracted_answers))
if answer_counts: most_common_answer = answer_counts.most_common(1)[0][0] print(f"最终确定的答案是:{most_common_answer} 升水。") else: print("没有找到有效的答案。")
|
1.2 输出
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
| 推理结果: 为了计算总共需要多少升水,我们首先需要知道每个花坛浇水所需的水量。
第一个花坛的浇水量为 10 升。 第二个花坛的浇水量为 20 升。 第三个花坛的浇水量为 30 升。
现在我们需要将这些浇水量相加来计算总共需要多少升水:
10 升 + 20 升 + 30 升 = 60 升
因此,总共需要 60 升的水。 推理结果: 要解决这个问题,我们首先需要了解问题所涉及的每个元素。
* 第一个花坛需要 10升水。 * 第二个花坛需要 20升水。 * 第三个花坛需要 30升水。
由于我们想计算总共需要多少升水,因此我们可以将这些值相加:
10 + 20 + 30 = ?
此时,我们只需执行加法运算即可得出答案。
最后的结果:50 推理结果: 让我们一步步地思考一下这个问题。
首先,我们需要找出每个花坛需要浇水多少升。根据问题,第一个花坛需要 10 升水,第二个花坛需要 20 升水,第三个花坛需要 30 升水。
现在,我们可以计算每个花坛的总水量,即 10 + 20 + 30 = 60 升。
但是,这只算了三个花坛的总水量,没有考虑到这三个花坛是否都会需要浇水或是否会因为其他原因被移除。这可能并不一定正确,因为在实际操作中,每个花坛都有可能存在某种方式无法被浇水所影响。
让我们考虑一下这种情况。假设每个花坛都可以使用它的剩余空间(即 10 - 20 = -10 升水)或者因为其他原因无法被浇水,那么我们就没有计算任何额外的水量了。这是有利于减少总水量。
但是,如果我们考虑到每个花坛需要浇水,那么在一个或多个花坛上使用水可能会导致水流受阻,影响其他花坛的浇水需求。因此,我们实际上已经计算了这点。
现在,让我们计算一下如果没有使用任何额外空间或者不受限制的情况下,每个花坛需要多少升水:
* 第一个花坛:10 升 * 第二个花坛:20 升 * 第三个花坛:30 升
总共需要的水量为 10 + 20 + 30 = 60 升。
但是,问题问的是每个花坛都能使用剩余空间(即 0 升)或者不受限制的情况下使用的水总量。因此,每个花坛实际上会被浇水,因为它需要用来浇水的水超过了它们能够使用的空间。
由于我们假设在没有任何限制的情况下,每个花坛都可以获得水,我们应该将剩余空间(即 0 升)视为不受限制的情况下的额外水量。这样,总水量就变成了:
* 第一个花坛:10 + 0 = 10 升 * 第二个花坛:20 + 0 = 20 升 * 第三个花坛:30 + 0 = 30 升
最后,我们可以通过将每个花坛的额外水量相加来计算总共需要多少升水:
10 + 20 + 30 = 60 升
因此,总共需要的水量是 60 升。
最终答案是60。 最终确定的答案是:60 升水。
Process finished with exit code 0
|