首页 > 其他分享 >如果让现在的部分主流 LLM 模型做 SCP-S?(个人补充)

如果让现在的部分主流 LLM 模型做 SCP-S?(个人补充)

时间:2024-08-27 23:04:43浏览次数:7  
标签:选项 10 return 函数 function results 主流 LLM SCP

ChatGLM(58.5 分)

个人认为比较厉害但是没有被 cz 评测,部分试题打开联网。

一、单项选择题(24 分)

T1(3 分)

在 CSP-S 第二轮评测中,用于编译题目英文名为 luogu 的传统型试题的选手代码的编译命令是 B. g++ -std=c++14 -O2 -o luogu.cpp。这个命令使用了 C++ 编译器 g++,并指定了 C++14 标准,同时使用了 -O2 优化选项。

T2(3 分)

在2023年CSP-S第二轮认证中,关于申诉的相关规定如下:

  1. 认证者只能通过报名系统提出申诉,且每个题目只能申诉一次。
  2. 申诉必须在规定的时间内提出,即2023年10月31日9:00至11月2日13:00。
  3. 申诉必须经过指导教师审核并提交给CCF。
  4. CCF NOI竞赛委员会明确指出,以下情况的申诉将不被接受:
    • 与个人名次、他人成绩和他人名次有关的申诉。
    • 未通过NOI科学委员会指定渠道提交的申诉。
    • 以操作系统、语言环境的具体差异为由提出的申诉。
    • 对使用随机数和随机算法的程序的申诉。
    • 发布成绩与认证者使用非规范环境和数据、参数评测出的成绩不同,并因此提出的申诉。
    • 在与标准测试环境相同的机器上,自测用时超过题目时限的5%,并由此提出的申诉。
    • 以修改过的程序或答案为依据的申诉。
    • 因认证者错误而导致答案文件名错误,或者源文件存放目录结构不规范,且所提出的申诉与此有关的。
    • 未描述清楚自测状况的申诉。
    • 因认证者个人失误提出的申诉。
    • 涉及违反编程语言使用限制等技术规则的申诉。
      根据这些规定,选项中可能被接受的申诉是:
      D. 小陈在与评测环境相同的电脑上运行程序,使用了850毫秒运行得出正确答案,而该题的时间限制为1秒。程序运行并未超出内存限制。
      这个申诉可能会被接受,因为它涉及的是程序在标准评测环境下的运行时间,且没有超出题目规定的时限。然而,最终是否接受还需取决于CCF的审核结果。
      参考来源:
  • CCF NOI竞赛委员会的公告
  • 自主选拔在线的通知

T3(3 分)

在考虑哪些人工智能技术不属于大型语言模型(LLM)的应用时,我们首先需要了解LLM的定义和应用范围。大型语言模型(LLM)是一种基于深度学习的自然语言处理技术,它通过训练能够处理和生成自然语言文本的大型模型,以实现对自然语言的深入理解和生成能力。
LLM技术的核心在于使用深度神经网络和大规模文本数据进行预训练,然后利用这些预训练模型进行下游任务的微调或直接应用。它的主要应用领域包括语言理解和生成、机器翻译、问答系统、对话生成以及文本摘要和生成等。
根据这些信息,我们可以分析给出的选项:
A. ChatGPT - 这是一种基于LLM技术的聊天机器人,能够生成自然语言文本,属于LLM的应用范畴。
B. Stable Diffusion - 这是一个基于深度学习的图像生成模型,主要用于生成图像,不属于LLM的应用范畴。
C. Gemini - 这个选项需要更多信息来确定其具体技术背景,但根据名字,它可能是一个特定的人工智能模型或系统。
D. 文心一言 - 这是由百度开发的一种基于LLM技术的语言模型,用于生成和理解自然语言文本,属于LLM的应用范畴。
综上所述,不属于LLM应用范畴的是 B. Stable Diffusion,因为它主要用于图像生成,而不是自然语言处理。
参考来源:

  • CSDN博客关于大型语言模型的全面解读
  • CSDN博客关于LLM的原理、发展历程、训练方法、应用场景和未来趋势
  • CSDN博客关于LLM的应用与前景

T4(3 分)

首先,我们需要将选项中的数值转换为十进制数,然后与十进制数47进行比较。
A. 将八进制数(56)8转换为十进制:

\[(56)_8 = 5 \times 8^1 + 6 \times 8^0 = 40 + 6 = 46 \]

B. 将二进制数(1100110)2转换为十进制:

\[(1100110)_2 = 1 \times 2^6 + 1 \times 2^5 + 0 \times 2^4 + 0 \times 2^3 + 1 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 \]

\[= 64 + 32 + 0 + 0 + 4 + 2 + 0 = 102 \]

C. 将五进制数(142)5转换为十进制:

\[(142)_5 = 1 \times 5^2 + 4 \times 5^1 + 2 \times 5^0 = 25 + 20 + 2 = 47 \]

D. 将十六进制数(2D)16转换为十进制:

\[(2D)_{16} = 2 \times 16^1 + 13 \times 16^0 = 32 + 13 = 45 \]

现在,我们可以比较这些值与47,找出与之相等的数值。

# Converting each option to decimal and comparing with 47
# Option A: Octal to Decimal
octal_to_decimal_A = 5 * 8**1 + 6 * 8**0
# Option B: Binary to Decimal
binary_to_decimal_B = 1 * 2**6 + 1 * 2**5 + 0 * 2**4 + 0 * 2**3 + 1 * 2**2 + 1 * 2**1 + 0 * 2**0
# Option C: Quinary to Decimal
quinary_to_decimal_C = 1 * 5**2 + 4 * 5**1 + 2 * 5**0
# Option D: Hexadecimal to Decimal
hexadecimal_to_decimal_D = 2 * 16**1 + 13 * 16**0
# Comparing with 47
target_decimal = 47
comparison_results = {
    "A": octal_to_decimal_A == target_decimal,
    "B": binary_to_decimal_B == target_decimal,
    "C": quinary_to_decimal_C == target_decimal,
    "D": hexadecimal_to_decimal_D == target_decimal
}
comparison_results
{'A': False, 'B': False, 'C': True, 'D': False}

选项C,即(142)5,表示的数值与十进制数47一致。因此,正确答案是C. (142)5。

T5(3 分)

要计算13在模29意义下的乘法逆元,我们需要找到一个数x,使得 \(13x \equiv 1 \pmod{29}\)。这可以通过扩展欧几里得算法或试错法来解决。我将使用Python来尝试不同的值,找到满足条件的x。

# 计算13在模29意义下的乘法逆元
p = 29
a = 13
# 尝试不同的x值,直到找到满足条件的x
for x in range(1, p):
    if (a * x) % p == 1:
        inverse = x
        break
inverse
9

13在模29意义下的乘法逆元是9。因此,正确答案是D. 9。

T6(3 分,笔者评价:相当精彩)

要计算 $ T_8^0 + T_8^1 + T_8^2 + \cdots + T_8^{16} $ 的值,我们首先需要理解三项式系数 $ T_n^k $ 的定义。这里 $ T_n^k $ 是指在 $ (1 + x + x2)n $ 的展开式中 $ x^k $ 项的系数。
对于 $ (1 + x + x2)8 $,我们可以通过多项式展开的方法来找出每个 $ x^k $ 项的系数 $ T_8^k $。然后,我们将这些系数相加,即 $ T_8^0 + T_8^1 + T_8^2 + \cdots + T_8^{16} $,来得到最终结果。
我们将使用 Python 来进行这个计算。首先,我们需要生成 $ (1 + x + x2)8 $ 的所有项,并计算每个项的系数。然后,我们将这些系数相加得到最终结果。让我们开始编写代码来执行这个计算。

from sympy import symbols, expand
# 定义变量
x = symbols('x')
n = 8
# 展开多项式 (1 + x + x^2)^n
polynomial_expansion = expand((1 + x + x**2)**n)
# 提取多项式中各项的系数
coefficients = [polynomial_expansion.coeff(x, k) for k in range(17)]
# 计算系数之和
sum_of_coefficients = sum(coefficients)
sum_of_coefficients
6561

计算结果显示 $ T_8^0 + T_8^1 + T_8^2 + \cdots + T_8^{16} $ 的值为 6561。

如果我们令 $ x = 1 $,那么 $ (1 + x + x2)8 $ 变为 $ (1 + 1 + 12)8 $,即 $ 3^8 $。这是因为当 $ x = 1 $ 时,每一项 $ x^k $ 都变为 1,所以整个表达式就变成了 3 的 8 次幂。
因此,我们可以直接计算 $ 3^8 $ 来得到 $ T_8^0 + T_8^1 + T_8^2 + \cdots + T_8^{16} $ 的值。让我们进行这个计算。

# 计算 3^8
result = 3**8
result
6561

通过令 $ x = 1 $ 并计算 $ 3^8 $,我们得到 $ T_8^0 + T_8^1 + T_8^2 + \cdots + T_8^{16} $ 的值为 6561,这与之前的计算结果一致。这种方法更为简单和直观。

T7(3 分)

在二叉排序树中,每个节点的左子树都只包含小于该节点关键字的值,而右子树只包含大于该节点关键字的值。当插入一个新节点时,如果它的关键字小于当前节点的关键字,我们就沿着左子树方向继续查找插入位置;如果它的关键字大于当前节点的关键字,我们就沿着右子树方向继续查找。由于新节点的关键字小于根节点的关键字,因此它将被插入到根节点的左子树中。至于它将成为左子树的叶子节点还是非叶子节点,取决于左子树中已经存在的节点结构。如果左子树有节点,新节点可能会成为某个节点的左或右子节点,即非叶子节点;如果左子树为空,新节点将成为左子树的叶子节点。
因此,最准确的答案是:
A. 左子树的某一叶子结点
但请注意,如果根节点的左子树已经存在节点,新节点也可能成为左子树的某一非叶子节点。

T8(3 分)

要计算从盒子中随机抽取 3 个球,其中恰好有 1 个红球、1 个蓝球和 1 个绿球的概率,我们可以按照以下步骤进行:

  1. 计算总的可能性数量:首先,我们需要知道从盒子中总共 4 个红球、5 个蓝球和 6 个绿球中抽取 3 个球的总可能性数量。这可以通过组合数来计算,即从 15 个球中抽取 3 个球的组合数。
  2. 计算满足条件的可能性数量:接着,我们需要计算满足条件的情况的数量,即从 4 个红球中抽取 1 个,从 5 个蓝球中抽取 1 个,从 6 个绿球中抽取 1 个的组合数。
  3. 计算概率:最后,将满足条件的情况数量除以总的可能性数量,得到所求概率。
    现在,我将使用 Python 来计算这些值。
from math import comb
# 总球数
total_balls = 4 + 5 + 6
# 计算总的可能性数量
total_combinations = comb(total_balls, 3)
# 计算满足条件的可能性数量
# 从4个红球中抽取1个,从5个蓝球中抽取1个,从6个绿球中抽取1个
desired_combinations = comb(4, 1) * comb(5, 1) * comb(6, 1)
# 计算概率
probability = desired_combinations / total_combinations
probability
0.26373626373626374

从盒子中随机抽取 3 个球,其中恰好有 1 个红球、1 个蓝球和 1 个绿球的概率大约是 0.264,即大约 26.4%。

from fractions import Fraction
# 将概率转换为分数形式
probability_fraction = Fraction(desired_combinations, total_combinations)
probability_fraction
Fraction(24, 91)

以分数形式表示,从盒子中随机抽取 3 个球,其中恰好有 1 个红球、1 个蓝球和 1 个绿球的概率是 \(\frac{24}{91}\)。

T9(3 分)

要解决这个问题,我们需要首先理解前缀表达式的求值方法。前缀表达式(也称为波兰式)是一种将运算符写在操作数之前的一种表示法。例如,前缀表达式 - + 10 * 2 3 + 5 / 6 2 表示的是一个数学运算,其中 -+*/ 是运算符,而 1023562 是操作数。
求值前缀表达式的步骤如下:

  1. 从右向左扫描表达式。
  2. 遇到操作数时,将其压入栈中。
  3. 遇到运算符时,从栈中弹出所需数量的操作数(对于二进制运算符,通常是两个),执行运算,然后将结果压回栈中。
  4. 当整个表达式扫描完毕后,栈顶的元素即为最终结果。
    现在,让我们按照这个方法来求值 - + 10 * 2 3 + 5 / 6 2
# 定义一个函数来计算前缀表达式的值
def evaluate_prefix(expression):
    # 操作数栈
    stack = []
    # 从右向左扫描表达式
    for char in reversed(expression.split()):
        # 如果是操作数,压入栈中
        if char.isdigit():
            stack.append(int(char))
        # 如果是运算符,弹出操作数,执行运算,结果压回栈中
        else:
            operand1 = stack.pop()
            operand2 = stack.pop()
            if char == '+':
                stack.append(operand1 + operand2)
            elif char == '-':
                stack.append(operand1 - operand2)
            elif char == '*':
                stack.append(operand1 * operand2)
            elif char == '/':
                stack.append(operand1 / operand2)
    # 栈顶元素即为最终结果
    return stack[0]
# 计算给定前缀表达式的值
expression = "- + 10 * 2 3 + 5 / 6 2"
result = evaluate_prefix(expression)
result
8.0

前缀表达式 - + 10 * 2 3 + 5 / 6 2 的求值结果是 8。因此,正确答案是 A. 8。

T10(0 分,第一次翻车)

要解决这个问题,我们需要理解循环队列的工作原理。在循环队列中,当队列的尾部到达数组的末尾时,它会“环绕”回到数组的开头。因此,队列的长度是由头指针和尾指针之间的距离决定的,但这个距离可能跨越数组的末尾和开头。
给定的信息是:

  • 头指针指向下标 8
  • 尾指针指向下标 3
  • 队列的存储空间是数组 data q[21],即数组有 21 个元素
    在循环队列中,尾指针指向的是队列末尾的下一个元素。因此,队列的实际末尾元素是尾指针的前一个元素,即下标 2。
    由于数组是循环的,我们需要计算从下标 8 到下标 2 的距离。在循环数组中,这个距离可以通过以下方式计算:
  • 如果头指针的位置大于尾指针的位置,那么队列的长度是头指针位置减去尾指针位置。
  • 如果头指针的位置小于尾指针的位置,那么队列的长度是数组长度加上头指针位置减去尾指针位置。
    现在,让我们计算队列的长度。
# 定义头指针和尾指针的位置
head_position = 8
tail_position = 3
# 定义数组长度
array_length = 21
# 计算队列长度
# 由于头指针的位置大于尾指针的位置,直接计算差值
queue_length = head_position - tail_position
queue_length
5

队列当前的长度为 5。因此,正确答案是 A. 5。

T11(3 分)

思考:
要确定哪种排序算法的运行时间复杂度与整数大小无关,我们需要分析每种算法的特点:

  1. 基数排序(Radix Sort):这种排序算法是根据数字的每一位来排序的,例如先按个位排序,然后按十位排序,以此类推。它的运行时间复杂度与数字的大小(即位数)有关,但与数列中整数的具体大小无关。
  2. 计数排序(Counting Sort):这种排序算法适用于整数排序,特别是当整数的范围不大时。它通过计数每个不同元素出现的次数来排序,运行时间复杂度与最大值和最小值之差有关,因此与整数的大小有关。
  3. 希尔排序(Shell Sort):这是一种改进的插入排序算法,它通过比较距离较远的元素来改善插入排序的性能。希尔排序的运行时间复杂度与整数的大小无关,因为它只依赖于元素之间的比较和交换。

根据以上分析,我们可以得出结论。
执行:
根据分析,我们可以直接回答这个问题,不需要编写代码。希尔排序(Shell Sort)的运行时间复杂度与整数大小无关。
因此,正确答案是 C. 希尔排序。

T12(3 分,最抽象的一集,Python 跑 C++ 代码)

思考:

这个问题涉及到C++语言的基础知识,包括数据类型、运算符、循环等。我们逐一分析每个选项的正确性。
A. 在C++中,两个32位有符号整型变量相乘,结果可能会超出32位整型的范围。但是,auto关键字会根据右侧表达式的结果自动推断变量类型,所以d的类型不一定是64位整型,它取决于a * b的结果是否超出32位整型的范围。
B. 这个表达式涉及到max函数和长整型(1LL表示64位长整型)。我们需要确认max(a, b) * 1LL * c是否总是等于max(1LL * a * c, 1LL * b * c)
C. sizeof运算符返回的是变量所占用的字节数。对于32位整型变量,其大小通常是4字节。
D. 当a为负数时,将其赋值给无符号整型变量i会导致i变成一个很大的正数。如果b也是一个负数或者小于i,那么循环条件i < b将始终为真,导致死循环。
接下来,我将使用Python来验证选项B的正确性。

执行:

对于选项B,我们可以通过编写一个简单的Python脚本来验证这个逻辑表达式是否总是为真。我们将随机生成一些abc的值,并检查表达式是否成立。

import random
# 验证选项B的正确性
def check_expression(a, b, c):
    return max(a, b) * 1LL * c == max(1LL * a * c, 1LL * b * c)
# 生成随机测试数据
test_cases = [(random.randint(-10**9, 10**9), random.randint(-10**9, 10**9), random.randint(-10**9, 10**9)) for _ in range(1000)]
# 检查所有测试案例
all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
all_true
  Cell In[1], line 5
    return max(a, b) * 1LL * c == max(1LL * a * c, 1LL * b * c)
                       ^
SyntaxError: invalid decimal literal

在Python中,1LL这种表示法是不正确的。在Python中,长整型可以直接通过数字后面加上Ll来表示。我将修正这个错误,并重新运行代码来验证选项B的正确性。

# 修正长整型的表示方法
def check_expression(a, b, c):
    return max(a, b) * 1L * c == max(1L * a * c, 1L * b * c)
# 重新检查所有测试案例
all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
all_true
  Cell In[2], line 3
    return max(a, b) * 1L * c == max(1L * a * c, 1L * b * c)
                       ^
SyntaxError: invalid decimal literal
在Python 3中,长整型(long)已经与整型(int)合并,所有整数都是长整型。因此,不需要特别指定`1L`。我将再次修改代码,并重新运行以验证选项B的正确性。
# 修正长整型的表示方法,直接使用整数
def check_expression(a, b, c):
    return max(a, b) * 1 * c == max(1 * a * c, 1 * b * c)
# 重新检查所有测试案例
all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
all_true
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[3], line 6
      3     return max(a, b) * 1 * c == max(1 * a * c, 1 * b * c)
      5 # 重新检查所有测试案例
----> 6 all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
      7 all_true
NameError: name 'test_cases' is not defined

出现了一个错误:我没有重新定义测试用例。我将重新生成测试用例并再次运行验证。

# 重新生成随机测试数据
test_cases = [(random.randint(-10**9, 10**9), random.randint(-10**9, 10**9), random.randint(-10**9, 10**9)) for _ in range(1000)]
# 再次检查所有测试案例
all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
all_true
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[4], line 2
      1 # 重新生成随机测试数据
----> 2 test_cases = [(random.randint(-10**9, 10**9), random.randint(-10**9, 10**9), random.randint(-10**9, 10**9)) for _ in range(1000)]
      4 # 再次检查所有测试案例
      5 all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
Cell In[4], line 2, in <listcomp>(.0)
      1 # 重新生成随机测试数据
----> 2 test_cases = [(random.randint(-10**9, 10**9), random.randint(-10**9, 10**9), random.randint(-10**9, 10**9)) for _ in range(1000)]
      4 # 再次检查所有测试案例
      5 all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
NameError: name 'random' is not defined

出现了一个新的错误:我忘记导入random模块。我将修正这个错误,然后再次尝试验证选项B的正确性。

import random
# 重新生成随机测试数据
test_cases = [(random.randint(-10**9, 10**9), random.randint(-10**9, 10**9), random.randint(-10**9, 10**9)) for _ in range(1000)]
# 再次检查所有测试案例
all_true = all(check_expression(a, b, c) for a, b, c in test_cases)
all_true
False

选项B的逻辑表达式在大多数情况下是正确的,但并非总是如此。在C++中,当两个32位有符号整型变量相乘时,结果可能会超出32位整型的范围。如果结果超出了这个范围,就会发生溢出,导致结果不正确。因此,不能保证max(a, b) * 1LL * c总是等于max(1LL * a * c, 1LL * b * c)。这取决于ab的具体值。
对于选项C,sizeof运算符返回的是变量所占用的字节数。对于32位有符号整型变量,其大小通常是4字节。因此,选项C是正确的。
对于选项D,如果a是一个负数,将其赋值给无符号整型变量i会导致i变成一个很大的正数(因为无符号整型变量不能存储负数)。如果b也是一个负数,那么i < b将始终为真,因为无符号整型变量总是大于任何有符号整型变量。这会导致死循环。因此,选项D是错误的。
综上所述,只有选项C是正确的。

T13(3 分)

思考:

要分析calc函数的时间复杂度,我们需要观察其结构和递归行为。calc函数通过递归将问题分解为更小的部分,并在每次递归调用后执行val函数。

  1. 递归分析calc函数递归地将问题规模减半,即calc(n / 2)。这意味着它会递归log2(n)次。
  2. val函数分析val函数包含两个嵌套循环。外层循环运行n次,内层循环的步长为i,因此内层循环的总次数是n + (n-1) + (n-2) + ... + 1,这是一个等差数列求和,其和为n(n+1)/2
    接下来,我将计算val函数的时间复杂度,然后结合递归调用的次数来确定calc函数的总时间复杂度。
# 计算val函数的时间复杂度
# val函数的内层循环次数是 n + (n-1) + (n-2) + ... + 1
# 这是一个等差数列求和,其和为 n(n+1)/2
# val函数的时间复杂度
def val_time_complexity(n):
    return n * (n + 1) / 2
# 测试几个n的值
test_values = [10, 100, 1000, 10000]
[val_time_complexity(n) for n in test_values]
[55.0, 5050.0, 500500.0, 50005000.0]

val函数的时间复杂度随着n的增加而增加,大致呈平方增长。具体来说,对于n = 10,内层循环的次数是55;对于n = 100,次数是5050;对于n = 1000,次数是500500;对于n = 10000,次数是50005000。这表明val函数的时间复杂度是Θ(n²)。
接下来,考虑calc函数的递归行为。calc函数递归地将问题规模减半,即calc(n / 2),这意味着它会递归log2(n)次。每次递归调用都会执行val函数,其时间复杂度为Θ(n²)。
因此,calc函数的总时间复杂度是递归调用的次数乘以每次调用的复杂度,即Θ(n² * log2(n))。简化这个表达式,我们得到Θ(n log2 n)。
所以,calc函数的运行时间复杂度是Θ(n log2 n)。因此,正确答案是C. Θ(

标签:选项,10,return,函数,function,results,主流,LLM,SCP
From: https://www.cnblogs.com/JXOIer-zaochen/p/18383707

相关文章

  • NoteLLM论文阅读笔记
    NoteLLM:ARetrievableLargeLanguageModelforNoteRecommendation论文阅读笔记Abstract存在的问题:​ 现有的在线方法只是将笔记输入基于BERT的模型,生成用于评估相似性的笔记嵌入。然而,它们可能没有充分利用一些重要的线索,例如代表笔记关键概念的标签或类别。事实上,学习......
  • 阅读DDIA 《数据密集型应用系统设计》 之后,关于6大主流数据库一些思考
    根据DDIA:目前的应用大部分都是IO密集型系统,所以对于数据库存储要求更为重要。瓶颈往往发生在存储上1.有状态服务和无状态服务:网络和应用层服务是没有服务,任何时候执行的代码的逻辑都是不变的。但是无状态2.CPU密集型和IO密集型3.短板效应互联网无万能的解决方式1.算力取舍:空......
  • GaLore Memory-Efficient LLM Training by Gradient Low-Rank Projection
    目录概符号说明GaLoreZhaoJ.,ZhangZ.,ChenB.,WangZ.,AnandkumarA.andTianY.GaLore:Memory-efficientllmtrainingbygradientlow-rankprojection.ICML,2024.概本文提出了一种优化器中高效的缓存策略.符号说明\(W_t\in\mathbb{R}^{m\timesn}\),参......
  • LLM的轻量化推理:AirLLM
    AirLLM是一种针对LLM的轻量级推理框架,通常用于优化和加速大模型的推理过程,可以允许70B的LLM在单个4GB的GPU上运行,无需量化、蒸馏、剪枝。AirLLM是通过分层推理实现的上述功能,本质上是将LLM的每一层拆分出来,分别加载权重进行推理,在推理较大的LLM时会很慢。环境配置使用pip安装a......
  • 一文详细了解初学者怎么入门大语言模型(LLM)?
    关于如何入门LLM,大多数回答都提到了调用API、训练微调和应用。但是大模型更新迭代太快,这个月发布的大模型打榜成功,仅仅过了一个月就被其他模型超越。训练微调也已经不是难事,有大量开源的微调框架(llamafactory、firefly等),你只要懂部署,配置几个参数就能启动训练。甚至现在有大......
  • 从0开始构建LLM应用程序,超详细分步指南!
    大型语言模型(LLM)正迅速成为现代人工智能的基石。然而,目前尚未有既定的最佳实践,所以研究者们没有明确的路线图可遵循,经常陷入困境需要重新开始。在过去两年里,我帮助多个组织利用LLM构建创新应用。通过这段经历,我开发出了一种久经考验的方法来创建创新解决方案(受LLM.org.il社......
  • 从主流技术架构视角剖析 Java Web 项目的性能测试策略与挑战
    随着互联网应用的不断发展,JavaWeb项目在企业级应用中占据了重要地位。然而,如何在复杂的技术架构下,确保项目的高性能和稳定性,成为了每个开发与测试团队无法回避的难题。今天,我们将从主流技术架构的视角,深度剖析JavaWeb项目的性能测试策略与面临的挑战,为你揭开性能优化的神......
  • 一文读懂 LLM 如何进行微调?
    ​你知道吗,咱们用那些已经训练好的大型语言模型,其实有好多不同的玩法。最常见的有三种:一种是用模型提取的特征来训练新的小模型;另一种是直接给模型看新任务的例子,让它学着怎么回答,这招叫做提示;最后一种就是调整模型里面的一些参数,可能是全部,或者就那么几个,来让它更好地完成任务......
  • LLM-TRSR论文阅读笔记
    HarnessingLargeLanguageModelsforText-RichSequentialRecommendation论文阅读笔记Abstract现存的问题:​ 当推荐场景中的项目包含丰富的文本信息时,例如在线购物中的产品描述或社交媒体上的新闻标题,LLM需要更长的文本才能全面描述历史用户行为序列。这给基于LLM的推荐......
  • Bellmanford与Spfa解决存在负边权的单源汇最短路问题
    上个文章讲了Dijkstra算法但是Dijkstra算法只能解决单源汇非负边权的最短路问题这次文章来讲单源汇存在负边权的解决方法Bellmanforda和spfa算法二者适用场景区别:一般来说使用spfa就能解决大部分的问题,但问题出现不超过k条边的时候应当使用Bellmanford算法BellmanFord:随意存......