type
status
date
slug
summary
tags
category
icon
password
comment
2025.4.1 今天开始需要把之前做的模棱两可的实验系统化做出来 然后论文开始撰写了,这个文章记录一下实验及结果 2025.4.22 论文投稿至arXiv 2025.5.30 论文投稿至ASE2025

实验规划

注意:使用一套prompt,只不过添加不同的信息进去
  1. 让大模型对代码的功能进行分析
    1. 单位时间内消耗token数目,异味代码显著高于干净代码
    2. 结论:大模型在处理异味代码的过程中会消耗更多token
      思路:如何增强大模型对异味代码的处理效率
  1. 模拟实际开发场景:先对clean code和smelly code分别进行提取User Story再生成代码的过程
    1. 对clean code和smelly code抽取User Story再生成新代码
    2. 记录输入token、输出token、总token、代码行数
    3. 记录生成每一部分的内容所需时间
    4. 计算单位时间内处理的token
    5. 抽取一些token异常的例子观察
    6. 结论:大模型在处理异味代码的过程中单位时间内会消耗比干净代码更多token
      思路:如何增强大模型对异味代码的处理效率
  1. 对于smelly code进行处理(baseline):
    1. 先对原代码进行重构,保存生成的代码,然后计算生成代码的复杂度、token消耗
    2. 然后再次进行抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间
    3. 交叉验证User Story的等效性
    4. 再次对比smelly code和这一次生成的新代码的单位复杂度上token消耗
  1. 异味类型对token影响(探索大模型对于哪些异味比较敏感/不敏感)
    1. 对于每种异味使用50条数据
    2. 先直接进行抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间
    3. 再进行重构以后抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间
    4. 交叉验证前后User Story的等效性
    5. 计算每种异味前后token增长率,计算每种异味的均值
  1. 测试对模型提示"这段代码存在[异味类型]"是否会影响生成效率
    1. 对比显式提示异味 vs 仅提供原始代码的效果差异
    2. 在prompt中加入显示提醒异味,然后进行抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间
    3. 交叉验证User Story的等效性
    4. 对比1中的结果和本步骤的结果,从而探索知识蒸馏对模型的影响
  1. 对于smelly code做如下操作(探索减少token的方式):
    1. 在不添加任何信息情况下抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间(第1步)
    2. 在添加代码相关信息情况下抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间 context awareness
    3. 在添加角色限制情况下抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间 responsibility tunning(3个)
        • Developers / Software Engineers
        • QA Engineers / Automation Testers
        • DevOps Engineers
    4. 在添加生成字符数限制情况下抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间 cost sensitive
    5. 在添加代码相关信息、角色限制和生成字符数情况下抽取User Story并生成新代码,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间
    6. 交叉验证和原来第1步中smelly code的User Story的等效性
    7. 对比以上过程单位复杂度上消耗token的平均值
  1. 整个流程User Story对代码生成的复杂度的影响
    1. 存在User Story比较简短,但是代码过长或复杂度过高的状况出现
    2. 可能是模型自动脑补一些信息进去
    3. 在5过程中,逐步观察生成代码复杂度变化
 
 
验证: 1. Control Flow Graph / Data Flow 分析:比较控制流图、数据流图,甚至做一部分2. 如果目标场景里,有一些“关键性逻辑”或“关键节点”(如数据库操作、网络调用、关键算法等),只要这个核心调用逻辑不变,就视为功能等价;否则就不合格。 3. 让模型同时生成新的 docstring,描述自己实现了哪些功能、处理了哪些边界情况。然后比对是否与原 docstring 要求一致。 4. codeXGLUE指标验证
 
 

实验流程

PS:数据集获取
  • 利用codeXGLUE中Text-To-Code的dataset,提取其中的java代码,利用tree_sitter进行异味代码提取,共十种类型的异味代码,均来源于工程项目complicated_regex_expression.jsonl、parameter_list_too_long.jsonl、binary_operator_in_name.jsonl、cyclomatic_complexity.jsonl、loops.jsonl、primitive_obsession.jsonl、complicated_boolean_expression.jsonl、func_name.jsonl、mutation_too_much.jsonl、too_long.jsonl,没有异味的代码提取为baseline.jsonl
  • smelly_code.jsonl来源于十个异味代码数据集中每一个提取30条组成,共300条,clean_code.jsonl来源于baseline.jsonl提取300条
一、观察类实验
  • 利用deepseek-r1推理模型对clean_code.jsonl和smelly_code.jsonl中每一条数据中的”code”字段进行多方面分析:功能正确性、可读性、健壮性、可维护性、可扩展性、安全性
  • 记录全过程时间以及token消耗,并计算单位时间内token消耗作为评价指标
  • 结果是smelly_code单位时间内消耗token要比clean_code更多
  • 结论:大模型理解分析异味代码要消耗更多token,处理效率低
二、探究性实验
1. 对于下面实验采用的链路为
  • Natural Language + code —— To —— Requirements —— To ——Generated code
  • 以下简称“链路处理”
  1. 代码等效性评价(主要为了确保功能一致性):
      • 利用codeBLEU进行评价
      • 交叉验证:利用qwen-2.5-max大模型提取code和generated_code的docstring,描述自己实现了哪些功能、处理了哪些边界情况,然后利用paraphrase-MiniLM-L6-v2进行语义相似性比对
  1. baseline(smelly code消除bad smell后作为baseline)
      • 对于smelly code先利用deepseek-r1进行重构消除异味,记为rf_code
      • 然后对于rf_code采用链路处理
      • 记录全过程消耗的token数目,并计算其Halstead复杂度以及圈复杂度
      • 计算单位Halstead复杂度token消耗数目以及单位代码行数token消耗数目作为评价指标
      • 代码等效性评价,比较rf_code和code
  1. 对比原始代码
      • 使用smelly code中的code进行链路处理
      • 记录全过程消耗的token数目,并计算其Halstead复杂度以及圈复杂度
      • 计算单位Halstead复杂度token消耗数目以及单位代码行数token消耗数目作为评价指标
      • 对比和baseline的指标
      • 代码等效性评价,比较rf_code和code
      • 结论:重构后的代码在功能评分达到75%的水平下token消耗降低了50%
  1. 异味类型的影响
      • 采集从10个smelly code数据集中每个抽取50条形成smelly code,共500条
      • 分别进行直接链路处理和重构后链路处理
      • 分别记录全过程消耗的token数目,并计算其Halstead复杂度以及圈复杂度
      • 分别计算单位Halstead复杂度token消耗数目以及单位代码行数token消耗数目作为评价指标
      • 分别代码等效性评价
        • 直接链路处理组:代码等效性评价,对比code和generated_code
        • 重构链路处理组:代码等效性评价,对比code和rf_code、code和generated_code、rf_code和generated_code
      • 结论:设计类和结构类异味对于token消耗影响比命名类异味要大
  1. 显示提示异味类型
      • 对比显式提示异味 vs 仅提供原始代码的效果差异
      • 在prompt中加入显示提醒异味,然后进行链路处理
      • 分别记录全过程消耗的token数目,并计算其Halstead复杂度以及圈复杂度
      • 分别计算单位Halstead复杂度token消耗数目以及单位代码行数token消耗数目作为评价指标
      • 分别进行代码等效性评价:对比code和generated_code
      • 对比baseline中的结果和本步骤的结果,从而探索知识蒸馏对模型的影响
      • 结论:在功能评分达到75%的水平下token消耗降低24.5%
  1. 探索减少token的方式:
      • 在不添加任何信息情况下链路处理,并计算新代码的复杂度、token消耗以及生成每一部分内容所需时间
      • 在添加代码相关信息情况下链路处理,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间 context awareness
        • 添加code context:path、repo
        • 添加code function:docstring、func_name
      • 在添加角色限制情况下链路处理,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间 responsibility tunning(3个)
        • Software Engineers
        • QA Engineers
        • DevOps Engineers
      • 在添加生成字符数限制情况下链路处理,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间 cost sensitive
        • absolute limitation
        • relative limitation
      • 在组合上面三种手段,进行链路处理,计算新代码的复杂度、token消耗以及生成每一部分内容所需时间
      • 代码等效性评价:code和generated_code
      • 对比以上过程单位复杂度上消耗token的平均值
      • 结论:采取上面的手段后在保证功能性评分75%水平下token消耗有2%~25%不同程度降低,证明手段有效
 
 
  1. 单位时间 token 消耗量
    1. 名称Time-Scaled Token Consumption
      说明:该指标衡量模型在单位时间内消耗的 token 数量,是评估模型推理效率的关键指标。
  1. 单位复杂度下 token 消耗量
    1. 名称Complexity-Normalized Token Consumption
      说明:该指标基于代码的 Halstead 或圈复杂度,衡量在单位复杂度下的 token 消耗情况,用于分析模型在处理不同复杂度代码时的推理负担。
  1. 单位代码行数上 token 消耗量
    1. 名称Line-Scaled Token Consumption
      说明:该指标衡量每行代码的平均 token 消耗,是评估模型在不同代码规模下推理效率的标准化度量。
  1. 重构前后 token 差异量
    1. 名称Token Consumption Delta After Refactoring
      说明:该指标表示代码重构前后 token 消耗量的差异,帮助量化重构优化对模型推理效率的提升。
 
2025.4.21 论文第一稿完成!
 
2025.4.22 论文投至arXiv
 
发疯日记Paper Reading: 论文阅读的记录
Loading...
Samuel Hu
Samuel Hu
沪上985软工在读 喜欢写代码 爱折腾的混子
小红书
统计
文章数:
20
访问量:
访客数:
公告

🎉 博客升级公告 🎉

全新升级,更好体验!
网站经过两位🤡的破坏之前下架一段时间,给大家带来不便深表抱歉
经过一段时间的精心修缮,我的博客终于以全新面貌与大家见面啦!

🛠 主要更新

🔍 智能搜索
💬 评论功能
🛡 安全升级
📂 内容整理
💬 在线客服
感谢大家一直以来的支持!期待与您继续分享优质内容~
🚀 新旅程,新开始! 🚀