Claude Haiku 5 5 在「实现基因序列比对算法」的评测结果

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

基本信息

  • 模型名称:Claude Haiku 5 5
  • 用例名称:实现基因序列比对算法
  • 测试类型:文本生成
  • 评测维度:代码生成

系统提示词(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. **逐位比对可视化** - 输出三行对比字符串(参考格式如下):

评测结果

综合得分

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

基础难度评测结果

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

模型生成产物

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

## 核心思路 本题采用**逐位比较法(Ungapped Alignment)**:从两条序列的第一个碱基开始,按位置一一比对,相同记为匹配,不同记为错配,最后统计匹配数并计算相似度。 **相似度公式**:`相似度(%) = 完全匹配的位置数 / 较短序列长度 × 100%` ## 代码实现 ```python """ 基础DNA序列比对工具(逐位比对法) 功能: 1. 校验输入序列是否只含 A/T/C/G(不区分大小写) 2. 计算相似度 3. 输出逐位比对的三行可视化结果 4. 列出连续完全匹配的子序列及其起始位置 """ # 合法碱基集合 VALID_BASES = {"A", "T", "C", "G"} def validate_sequence(seq: str, name: str) -> str: """ 校验并标准化DNA序列。 参数: seq: 待校验的DNA序列字符串 name: 序列名称(如"序列1"),用于错误提示 返回: 转为大写、去除首尾空白后的合法序列 异常: TypeError: 输入不是字符串 ValueError: 序列为空或包含非法字符 """ if not isinstance(seq, str): raise TypeError(f"{name} 必须是字符串,实际类型为 {type(seq).__name__}") # 去除首尾空白并统一转为大写 cleaned = seq.strip().upper() if len(cleaned) == 0: raise ValueError(f"{name} 为空,请输入有效的DNA序列") # 找出所有非法字符(去重并排序,便于阅读) illegal_chars = sorted({ch for ch in cleaned if ch not in VALID_BASES}) if illegal_chars: raise ValueError( f"{name} 包含非法字符: {', '.join(illegal_chars)}" f"(仅允许 A、T、C、G)" ) return cleaned def find_matching_runs(match_flags, seq1, min_run_len=2): """ 在逐位匹配结果中,找出连续完全匹配的子序列。 参数: match_flags: 列表,True 表示该位置匹配 seq1: 第一条序列(用于截取子序列) min_run_len: 只保留长度 >= min_run_len 的连续匹配段 返回: 列表,每个元素为 (起始位置[从1开始], 子序列字符串) """ runs = [] length = len(match_flags) i = 0 while i = min_run_len: # 起始位置转为从1开始的编号 runs.append((i + 1, seq1[i:j])) i = j # 跳过已处理的匹配段 else: i += 1 return runs def align_dna(seq1: str, seq2: str, min_run_len: int = 2) -> dict: """ 对两条DNA序列进行逐位比对分析。 参数: seq1, seq2: 两条DNA序列 min_run_len: 连续匹配子序列的最小长度(默认2) 返回: 包含比对结果的字典 """ # 1. 输入校验 s1 = validate_sequence(seq1, "序列1") s2 = validate_sequence(seq2, "序列2") # 2. 确定比对范围:从头对齐,取较短序列长度 compare_len = min(len(s1), len(s2)) # 3. 逐位比较,生成匹配标记列表 match_flags = [s1[i] == s2[i] for i in range(compare_len)] match_count = sum(match_flags) # 4. 计算相似度(保留两位小数) similarity = match_count / compare_len * 100 similarity_str = f"{similarity:.2f}%" # 5. 构造三行可视化字符串 # 第一行:序列1;第二行:匹配符(| 表示匹配,空格表示错配);第三行:序列2 line_seq1 = s1[:compare_len] line_match = "".join("|" if flag else " " for flag in match_flags) line_seq2 = s2[:compare_len] # 6....

AI 评审点评

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

【CLAUDE】候选输出整体质量较高,完整实现了基础DNA序列比对工具的全部核心需求。代码结构清晰、注释详尽、示例可运行且输出经验算正确,适合作为入门课程的教学示例。主要局限在于未区分插入/删除与替换操作(题目背景提及但系统提示限定为基础逐位比对),以及 HTML 实体字符的渲染问题,整体不影响实用性。 【GEMINI】该回答表现优异,严格遵循了对话上下文中的各项具体需求。算法实现严谨、代码注释清晰、异常处理与边界考虑周全,输出格式整洁规范,是一份高质量的参考实现。 【KIMI】该实现是一份高质量的DNA序列比对工具代码,功能完整、逻辑严谨、代码规范,特别适合初学者学习。核心算法采用简单的逐位比对,准确实现了题目要求的所有输出格式。在输入校验、错误处理、代码可读性方面表现优秀。唯一可改进之处是子序列匹配的最小长度默认值与题目'完全匹配子序列'表述的契合度,以及是否需要在注释中更明确说明'插入/删除'在本基础版本中的处理方式(即尾部截断/忽略)。

进阶难度评测结果

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

模型生成产物

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

## 算法原理 Needleman-Wunsch 是一种全局动态规划比对算法。令 $F(i,j)$ 为序列 $S_1[1..i]$ 与 $S_2[1..j]$ 的最优比对得分,则 $F(0,0)=0$,$F(i,0)=-i\cdot g$,$F(0,j)=-j\cdot g$,递推式为: $$F(i,j)=\max\begin{cases}F(i-1,j-1)+s(S_1[i],S_2[j]) & \text{对角:匹配/错配}\\F(i-1,j)-g & \text{上方:} S_1[i]\text{ 对空位}\\F(i,j-1)-g & \text{左方:} S_2[j]\text{ 对空位}\end{cases}$$ 其中 $s(a,b)=+\text{match\_score}$(若 $a=b$),否则 $s(a,b)=-\text{mismatch\_penalty}$,$g$ 为 `gap_penalty`。回溯时从 $F(m,n)$ 出发,依据记录的方向指针逐步回到 $(0,0)$,即可还原最优比对。时间与空间复杂度均为 $O(mn)$。 --- ## 代码实现 ```python """ Needleman-Wunsch 全局序列比对(DNA 序列) """ from dataclasses import dataclass, field from typing import List VALID_BASES = frozenset("ACGT") DIAG, UP, LEFT = "D", "U", "L" # 回溯指针:对角 / 上方 / 左方 @dataclass class AlignmentResult: score: float # 最优比对得分 F(m, n) aligned_seq1: str # 比对后的序列1(空位用 '-' 表示) aligned_seq2: str # 比对后的序列2 match_line: str # 匹配线:'|' 匹配,'.' 错配,' ' 空位 score_matrix: List[List[float]] # 完整得分矩阵 (m+1) x (n+1) seq1: str = "" # 清洗后的输入序列 seq2: str = "" notes: List[str] = field(default_factory=list) # 边界情况提示 # --------------------------------------------------------------------------- # 输入校验 # --------------------------------------------------------------------------- def _validate_sequence(seq, name: str) -> str: """去除所有空白字符(支持粘贴多行序列),转大写,并检查非法字符。""" if not isinstance(seq, str): raise TypeError(f"{name} 必须是字符串,实际类型为 {type(seq).__name__}") cleaned = "".join(seq.split()).upper() illegal = sorted({c for c in cleaned if c not in VALID_BASES}) if illegal: raise ValueError( f"{name} 含有非法字符 {illegal},DNA 序列只允许 A/C/G/T(大小写不敏感)" ) return cleaned def _validate_params(match_score, mismatch_penalty, gap_penalty) -> None: """检查参数类型与取值。penalty 为扣分的绝对值(非负),实际计分为 -penalty。""" params = { "match_score": match_score, "mismatch_penalty": mismatch_penalty, "gap_penalty": gap_penalty, } for name, value in params.items(): if isinstance(value, bool) or not isinstance(value, (int, float)): raise TypeError(f"{name} 必须是数值,实际为 {type(value).__name__}") if mismatch_penalty AlignmentResult: """...

AI 评审点评

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

【CLAUDE】这是一份高质量的 Needleman-Wunsch 实现。算法原理阐述准确(含状态转移方程的 LaTeX 公式),代码完整可运行,输出包含得分、矩阵可视化和比对字符串,参数化支持完善,边界处理全面。整体达到生产级代码标准,几乎无明显缺陷。 【GEMINI】该生成结果是一份工业级水准的高质量回答。前置原理陈述精确,包含了完整的状态转移方程;代码实现完备无误,考虑了非法字符、空序列等多种边界情况;同时提供了美观的得分矩阵可视化和匹配指示线,完全符合各项提示与规范要求。 【KIMI】该实现是一份高质量的Needleman-Wunsch全局序列比对代码,算法正确、参数化完善、代码结构清晰。完全符合题目要求的四项输出(比对得分、得分矩阵可视化、比对序列字符串含'-'、参数化接口),边界处理周到,可直接运行。特别适合生物信息学教学与工程使用。

相关链接

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

加载中...