kimi-k2.6 在「实现基因序列比对算法」的评测结果

这是该 AI 模型在此测试用例上的详细评测结果。

基本信息

  • 模型名称:kimi-k2.6
  • 用例名称:实现基因序列比对算法
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(System Prompt)

这是给 AI 模型的背景设定和角色指令:

你是一名生物信息学入门课程的算法讲师,擅长用清晰易懂的方式讲解基础序列比对原理。 回答要求: 1. 在编写代码前,用1-2句话简述所用比对方法的核心思路(如逐位比较)。 2. 代码需包含输入合法性校验(仅允许A、T、C、G字符,不区分大小写)。 3. 相似度计算公式须明确:相似度 = 完全匹配的位置数 / 较短序列长度 × 100%。 4. 输出格式须包含:相似度百分比、匹配/错配的逐位对比字符串、完全匹配子序列列表及其起始位置。 5. 代码需有必要注释,变量命名清晰,适合初学者阅读。

用户提示词(User Prompt)

这是用户给 AI 模型的具体任务要求:

## 题目:实现基础DNA序列比对工具 请实现一个简单的DNA序列比对函数,完成两条DNA序列的基础比对分析。 ### 背景说明 DNA序列由四种碱基组成:腺嘌呤(A)、胸腺嘧啶(T)、胞嘧啶(C)、鸟嘌呤(G)。 基础比对即将两条序列按位置逐一对齐,统计匹配情况。 ### 功能要求 1. **输入校验** - 检查序列是否只包含合法碱基(A、T、C、G,不区分大小写,处理时统一转为大写) - 若包含非法字符,抛出异常或返回错误信息,并说明非法字符是什么 2. **相似度计算** - 对齐方式:将两条序列从头部对齐,以较短序列的长度为比对范围 - 相似度公式:`相似度(%) = 匹配位置数 / 较短序列长度 × 100` - 返回保留两位小数的百分比字符串,例如 `「87.50%」` 3. **逐位比对可视化** - 输出三行对比字符串(参考格式如下):

评测结果

综合得分

该模型在此用例的得分为:91.8 分(满分 100 分),已通过

基础难度评测结果

  • 得分:91.8 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

下面这个方法的核心思路是:**将两条DNA序列从头部(5'端)对齐,以较短序列的长度为比对窗口,逐位比较碱基是否相同**;在此基础上统计匹配数、计算全局相似度,并提取所有连续完全匹配的片段。 ```python def basic_dna_alignment(sequence1: str, sequence2: str) -> dict: """ 基础DNA序列比对函数。 采用头部对齐、逐位比较的方式,以较短序列长度为比对窗口, 计算相似度并提取所有连续完全匹配的子序列。 """ # --- 1. 输入类型校验 --- if not isinstance(sequence1, str) or not isinstance(sequence2, str): raise TypeError("输入序列必须是字符串(str)类型。") # --- 2. 碱基合法性校验(不区分大小写,统一转大写处理) --- seq1_upper = sequence1.upper() seq2_upper = sequence2.upper() valid_bases = {'A', 'T', 'C', 'G'} illegal_chars = set() for base in seq1_upper + seq2_upper: if base not in valid_bases: illegal_chars.add(base) if illegal_chars: # 排序后输出,保证结果稳定、易读 illegal_list = ', '.join(sorted(illegal_chars)) raise ValueError( f"检测到非法碱基字符: [{illegal_list}]。" f"仅允许使用 A、T、C、G(不区分大小写)。" ) # --- 3. 确定比对范围:以较短序列的长度为准 --- len1, len2 = len(seq1_upper), len(seq2_upper) compare_length = min(len1, len2) # 边界情况:若任一序列为空,无法比对 if compare_length == 0: return { "similarity": "0.00%", "comparison_lines": ["", "", ""], "matched_subsequences": [] } # --- 4. 逐位比对与数据统计 --- match_count = 0 # 完全匹配的位置计数 alignment_marks = [] # 中间的可视化标记行('|' 表示匹配,'*' 表示错配) # 用于提取“连续完全匹配子序列”的临时变量 current_match_start = None # 当前连续匹配段的起始索引(0-based) current_match_bases = [] # 当前连续匹配段的碱基列表 matched_subsequences = [] # 最终保存的所有连续匹配子序列 for i in range(compare_length): base1 = seq1_upper[i] base2 = seq2_upper[i] if base1 == base2: # 该位置完全匹配 match_count += 1 alignment_marks.append('|') # 记录连续匹配 if current_match_start is None: current_match_start = i current_match_bases.append(base1) else: # 该位置错配 alignment_marks.append('*') # 如果之前存在连续匹配段,先将其保存 if current_match_start is not None: matched_subsequences.append({ "sequence": ''.join(current_match_bases), "start": current_match_start }) current_match_start = None current_match_bases = [] # 循环结束:检查末尾是否还有未保存的连续匹配段 if current_match_start is not None: matched_subsequences.append({ "sequence": ''.join(current_match_bases), "start": current_match_start }) # --- 5. 相似度计算 --- # 公式:相似度(%) = 完全匹配的位置数...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】这是一份高质量的基因序列比对实现方案。代码逻辑严谨,功能完整,注释详尽,完全满足生物信息学入门课程的教学需求。核心算法(头部对齐逐位比较)表述清晰,相似度计算、可视化输出、连续匹配子序列提取等功能均准确实现。代码规范性良好,适合初学者学习。主要改进空间在于清理 HTML 实体编码和进一步优化注释准确性,但这些都是细节问题,不影响整体优秀表现。 【GEMINI】作为一名算法讲师的回复,该生成结果表现出色。它不仅在技术实现上完全符合用户在对话中设定的各项约束,而且在代码风格和解释说明上非常契合其设定的角色定位。代码不仅能跑通,而且具有很高的教学参考价值,特别是在处理连续匹配子序列提取和非法字符校验等细节上表现得非常细致。 【KIMI】整体而言,这段代码实现了题目要求的核心功能,代码结构清晰,注释详尽,易于理解和维护。相似度计算公式正确,输出结果格式符合要求。但在边界情况处理和异常提示上还有改进空间。代码质量较高,变量命名规范,逻辑清晰。建议进一步优化冗余逻辑,提升代码简洁性。

进阶难度评测结果

  • 得分:95.5 分
  • 通过状态:已通过

模型生成产物

以下是该模型针对此任务的实际生成内容:

**核心原理简述** Needleman-Wunsch 算法基于动态规划构建 $(m+1)\times(n+1)$ 的得分矩阵 $M$,其中 $M[i][j]$ 表示序列1前缀 $x_{1..i}$ 与序列2前缀 $y_{1..j}$ 的全局最优比对得分;其状态转移方程为 $$M[i][j] = \max\!\big(M[i-1][j-1]+s(x_i,y_j),\; M[i-1][j]+d,\; M[i][j-1]+d\big)$$ 其中 $s(x_i,y_j)$ 在匹配时取 `match_score`、错配时取 `mismatch_penalty`,$d$ 为 `gap_penalty`,最终从矩阵右下角回溯至左上角即可重建最优比对路径。 --- ```python #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Needleman-Wunsch 全局 DNA 序列比对工具 支持自定义 match_score、mismatch_penalty、gap_penalty """ def needleman_wunsch(seq1, seq2, match_score=1, mismatch_penalty=-1, gap_penalty=-1): """ 执行 Needleman-Wunsch 全局比对。 参数: seq1, seq2: 输入 DNA 序列字符串 match_score: 匹配得分 (int/float) mismatch_penalty: 错配罚分 (int/float) gap_penalty: 空位罚分 (int/float) 返回: dict: { 'score': 最优比对得分, 'matrix': 完整的得分矩阵 (list of list), 'seq1_aligned': 比对后的序列1(含'-'), 'seq2_aligned': 比对后的序列2(含'-') } """ # ---------- 1. 输入校验与预处理 ---------- if seq1 is None or seq2 is None: raise ValueError("输入序列不能为 None") # 去除首尾空白并统一为大写 seq1 = str(seq1).strip().upper() seq2 = str(seq2).strip().upper() # 处理双空序列 if not seq1 and not seq2: return {"score": 0, "matrix": [[0]], "seq1_aligned": "", "seq2_aligned": ""} # 处理单空序列(直接全是空位) if not seq1: return { "score": len(seq2) * gap_penalty, "matrix": [[j * gap_penalty for j in range(len(seq2) + 1)]], "seq1_aligned": "-" * len(seq2), "seq2_aligned": seq2, } if not seq2: return { "score": len(seq1) * gap_penalty, "matrix": [[i * gap_penalty] for i in range(len(seq1) + 1)], "seq1_aligned": seq1, "seq2_aligned": "-" * len(seq1), } # DNA 非法字符检查(仅允许 A/T/C/G) valid_dna = set("ATCG") invalid1 = set(seq1) - valid_dna invalid2 = set(seq2) - valid_dna if invalid1: raise ValueError(f"序列1包含非法DNA字符: {sorted(invalid1)},仅支持 A/T/C/G") if invalid2: raise ValueError(f"序列2包含非法DNA字符: {sorted(invalid2)},仅支持 A/T/C/G") m, n = len(seq1), len(seq2) # ---------- 2. 初始化得分矩阵 ---------- # score_matrix 维度: (m+1) x (n+1) score_matrix = [[0] * (n + 1) for _ in range(m + 1)] # 第一列: seq2 为空,seq1 不断引入空位 for i in range(1, m + 1):...

AI 评审点评

以下是 AI 评审对该模型输出的点评:

【CLAUDE】这是一个优秀的 Needleman-Wunsch 算法实现。核心算法完全正确,状态转移方程和回溯逻辑准确无误;参数化支持完美,三个评分参数均可灵活配置;代码质量极高,结构清晰、注释详尽、错误处理完善,还提供了矩阵可视化和比对结果展示功能。边界情况处理全面,包含了空序列和非法字符的校验。唯一需注意的是代码中出现了 HTML 实体编码(>),建议在实际使用时替换为正常的 > 符号。整体而言,该实现不仅满足了所有功能要求,还在代码质量和用户体验上超出预期。 【GEMINI】这是一份非常优秀的实现。它不仅完全满足了所有任务要求(原理简述、完整代码、可视化输出、参数化支持、边界处理),而且在代码健壮性和可读性上表现出色。特别是得分矩阵的可视化和比对结果的对齐显示,极大地增强了结果的可读性,体现了资深生物信息学算法工程师的专业水准。 【KIMI】该实现基本满足了 Needleman-Wunsch 算法的核心要求,在算法正确性、参数化支持和代码质量方面表现较好。但仍有一些细节可以优化,如参数化程度和代码健壮性方面。总体而言,这是一个质量较高的实现。

困难难度评测结果

  • 得分:— 分
  • 通过状态:未通过

AI 评审点评

以下是 AI 评审对该模型输出的点评:

模型返回空输出,已跳过 AI 评分(finish_reason=length)

相关链接

您可以通过以下链接查看更多相关内容:

加载中...