原力注入

过年八天乐 - DeepSeek 1.5b、7b 和官网模型快速对比

Image

在昨天的文章(过年八天乐 - 在 Mac 上运行 DeepSeek-R1 模型)中,我们通过 ollma 在本地运行了 deepseek-r1:1.5b 模型,今天让我们对比一下 1.5b、7b 和官网模型。

我们使用同一个编程问题,然后来对比三个模型的输出,从而做一个初步的评价。

原文地址:

  1. 1. 在 Mac 上运行 DeepSeek-R1 模型:https://github.com/ForceInjection/AI-fundermentals/blob/main/llm/mac-deepseek-r1.md

  2. 2. DeepSeek 1.5b、7b 和官网模型快速对比:https://github.com/ForceInjection/AI-fundermentals/blob/main/llm/deepseek-r1-cmp.md

问题

写一段 Python 代码计算斐波那契数列,并输出前 50 个数

总结

模型代码响应时间评价
1.5b参见正文13s不满足要求
7b参见正文28s满足要求,可读性最佳
官网参见正文82s满足要求,但引入了变量

单从这次任务来说,7b 的表现非常优异,可以持续观察其后续在不同任务中的表现,看是否可以胜任大部分场景。如果可以胜任,那等于就不用花钱了。

电脑配置

  • • 生成年份:2021

  • • 芯片:Apple M1 Pro

  • • 内存:16 GB

  • • macOS:15.2 (24C101)

deepseek-r1:1.5b

Thought for 13 seconds以下是使用递推公式和指数计算来生成斐波那契数列表的方法:
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n - 2):
        a, b = b, a + b
    return [a, b]

fib_numbers = fibonacci(50)
for num in fib_numbers:
    print(num)

运行结果

4807526976
7778742049

代码解释:

  1. 1. 递推公式生成函数 fibonacci:

  • • 初始化两个变量 a 和 b,分别表示斐波那契数列的前两项。

  • • 使用一个循环从第3项开始计算到第50项(因为需要输出前50个数)。

    • • 在每次迭代中更新 a 为当前的 b,将 b 更新为新的值 a + b。

  • • 最后返回生成的斐波那契数列表。

  • 2. 循环输出结果:

    • • 使用上述函数生成前50个斐波那契数。

    • • 遍历生成的列表并逐行打印每个数字。

    这个方法利用了指数计算公式,可以在O(log n)的时间复杂度内计算出斐波那契数,适用于较大的 n 值。

    代码分析

    我们可以看到运行结果只有两个输出,这显然是不符合预期的,这说明 1.5b 其实没有理解需求。

    错误分析:

    1. 1. 代码只返回最后两个数 [a, b],而不是完整的前50个数;

    2. 2. 定义了通用的函数,应该要考虑 n 为 0 或者 1 以及 n < 0 的情况;

    3. 3. 需要用一个数组来保存每一个序号的数。

    基于上述的代码进行修改如下:

    def fibonacci(n):
        if n <= 0:
            return []
        fib_sequence = [0]
        if n == 1:
            return fib_sequence
        a, b = 0, 1
        for _ in range(n-1):  # 已包含a=0,再生成n-1个数
            fib_sequence.append(b)
            a, b = b, a + b
        return fib_sequence

    fib_numbers = fibonacci(50)
    for num in fib_numbers:
        print(num)

    deepseek-r1:7b

    Thought for 28 seconds以下是计算并输出前 50 个斐波那契数的 Python 代码:
    # 初始化斐波那契数列
    fib = [0, 1]

    # 计算前50个斐波那契数
    for i in range(2, 50):
        next_num = fib[i-1] + fib[i-2]
        fib.append(next_num)

    # 输出结果
    print("\n前50个斐波那契数如下:")
    for num in fib:
        print(num)

    输出结果:

    前50个斐波那契数如下:
    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    144
    233
    377
    610
    987
    1597
    2584
    4181
    6765
    10946
    17711
    28657
    46368
    75025
    121393
    196418
    317811
    514229
    832040
    1346269
    2178309
    3524578
    5702887
    9227465
    14930352
    24157817
    39088169
    63245986
    102334155
    165580141
    267914296
    433494437
    701408733
    1134903170
    1836311903
    2971215073
    4807526976
    7778742049

    代码解释:

    1. 1. 初始化斐波那契数列:

      fib = [0, 1]

      这里我们初始化了斐波那契数列的前两个数,分别是 0 和 1。

    2. 2. 计算斐波那契数:

      for i in range(2, 50):
          next_num = fib[i-1] + fib[i-2]
          fib.append(next_num)
    • • 使用一个循环从索引 2 到 49 来计算斐波那契数。

    • • 每次计算当前数为前两个数的和,并将其添加到列表中。

  • 3. 输出结果:

    for num in fib:
        print(num)

    遍历列表并逐行打印每个数。

  • 运行这段代码,会输出前 50 个斐波那契数。

    官网 R1

    已深度思考(82s)

    以下是生成并输出前50个斐波那契数列的Python代码:

    # 初始化前两个斐波那契数
    a, b = 0, 1
    n = 50

    # 生成前50个斐波那契数
    fib_sequence = []
    for _ in range(n):
        fib_sequence.append(a)
        a, b = b, a + b  # 更新a和b的值

    # 输出结果
    for num in fib_sequence:
        print(num)

    代码说明:

    1. 1. 初始化变量:
      a=0 和 b=1 分别表示斐波那契数列的前两个数(从0开始)。

    2. 2. 生成数列:
      通过循环 n=50 次,每次将当前数 a 添加到列表,并通过 a, b = b, a+b 更新下一对数。这种方式避免了递归的低效问题,时间复杂度为 O(n)。

    3. 3. 输出结果:
      遍历生成的列表 fib_sequence,逐行打印每个斐波那契数。

    输出结果:

    0
    1
    1
    2
    3
    5
    8
    ...
    (中间省略)
    ...
    7778742049

    该代码高效且简洁,直接通过迭代计算生成数列,能够正确输出前50个斐波那契数。

    Image