【项目实训】【项目博客#04】ArkTS代码切分与微调数据集提示词生成(4.7-4.20)

【项目实训】【项目博客#04】ArkTS代码切分与微调数据集提示词生成(4.7-4.20)

文章目录

  • 【项目实训】【项目博客#04】ArkTS代码切分与微调数据集提示词生成(4.7-4.20)
    • 项目博客概述
    • 一、整体架构设计
    • 二、代码静态分析与切分
      • 2.1 Tree-sitter环境配置
      • 2.2 语法解析器编译
      • 2.3 核心解析流程
      • 2.4 数据结构化输出
    • 三、提示词工程与数据集生成
      • 3.1 系统架构设计
      • 3.2 核心提示词模板
      • 3.3 质量保障机制
        • 1. 代码去重机制
        • 2. API响应验证
    • 四、实战案例
    • 五、应用价值与展望
      • 5.1 当前成果
      • 5.2 后续计划
    • 六、总结

项目博客概述

在HarmonySmartCoding项目中,高质量的训练数据是实现精准代码生成的关键基础。本文将详细介绍我们如何从ArkTS项目代码解析到生成DeepSeek大模型微调数据集的完整技术方案,涵盖静态代码分析、语法树解析、代码切分以及提示词工程等关键环节,为后续模型微调提供高质量的训练数据支撑。

一、整体架构设计

我们设计了一套完整的ArkTS代码处理与数据集生成流水线,主要分为两大核心模块:
【项目实训】【项目博客#04】ArkTS代码切分与微调数据集提示词生成(4.7-4.20)_第1张图片

  1. 代码静态分析与切分模块

    • 基于Tree-sitter的ArkTS代码解析器
    • 语法树构建与遍历
    • 代码结构化提取与分类
  2. 提示词生成与数据集构建模块

    • DeepSeek API交互式问答生成器
    • 质量控制与过滤机制
    • 数据集格式化与存储

这种模块化设计使我们能够灵活应对不同类型的代码处理需求,同时保证了生成数据的质量和多样性。

二、代码静态分析与切分

2.1 Tree-sitter环境配置

Tree-sitter是一个高性能的增量解析库,能够为多种编程语言生成具体的语法树。我们选择它作为ArkTS代码解析的核心工具,主要基于以下考虑:

  1. 增量解析能力:支持局部代码更新时的快速重新解析
  2. 多语言支持:ArkTS基于TypeScript,可以复用现有语法定义
  3. 精确定位:能够准确定位代码中的各类语法结构

环境配置步骤如下:

# 安装tree-sitter Python绑定
pip3 install tree_sitter==0.20.0

# 获取TypeScript语法解析器
mkdir -p vendor && cd vendor
git clone https://github.com/tree-sitter/tree-sitter-typescript

2.2 语法解析器编译

为了在Python环境中使用Tree-sitter,我们需要编译语法解析器:

from tree_sitter import Language

Language.build_library(
    'build/my-languages.so',  # 输出文件
    ['vendor/tree-sitter-typescript']  # 语法定义
)

需要注意的是,在Windows环境下需要安装Visual Studio的C++编译工具链才能成功编译语法库。

2.3 核心解析流程

我们设计了一个完整的代码解析器(CodeParser)类,用于处理ArkTS代码文件:

class CodeParser:
    def __init__(self):
        self.parser = Parser()
        self.parser.set_language(TS_LANGUAGE)  # 加载ArkTS语法
        
    def parse_file(self, file_path: Path):
        with open(file_path, 'r', encoding='utf-8') as f:
            code = f.read()
        tree = self.parser.parse(bytes(code, 'utf-8'))
        return self._walk_tree(tree.root_node, code, file_path)

在解析过程中,我们重点关注以下关键节点类型:

  1. class_declaration:提取类名/方法/属性/继承关系,用于类结构分析
  2. function_declaration:提取参数/返回值/函数体,用于功能单元提取
  3. interface_declaration:提取属性/方法签名,用于类型定义收集
  4. import_statement:提取导入路径/模块名,用于依赖关系分析

这种有针对性的节点提取策略使我们能够精确捕获代码中的关键结构,为后续的数据增强提供基础。

2.4 数据结构化输出

解析后的代码被转换为结构化的JSON格式,便于后续处理:

{
  "type": "class_declaration",
  "name": "MyResult",
  "code": "class MyResult {\n  detection_classes?: string[]\n  detection_boxes?: number[][]\n  detection_scores?: number[]\n}",
  "file_path": "D:\\Desktop\\arkts_llm_trainer\\HarmonySmartCoding\\Yu_project\\data\\raw\\0dot618__my_PCB_detection_harmony_app\\MyApplication2\\entry\\src\\main\\ets\\bean\\DetectResult.ts",
  "comments": [],
  "dependencies": [
    {
      "name": "MyResult",
      "type": "type_reference",
      "location": {
        "line": 1,
        "column": 14,
        "file": "D:\\Desktop\\arkts_llm_trainer\\HarmonySmartCoding\\Yu_project\\data\\raw\\0dot618__my_PCB_detection_harmony_app\\MyApplication2\\entry\\src\\main\\ets\\bean\\DetectResult.ts",
        "context": "export class MyResult {"
      }
    }
  ]
}

除了基本的代码结构提取外,我们还实现了以下特色功能:

  • API调用热力图:统计并可视化项目中最常用的API
  • 跨文件依赖关系可视化:构建组件间的调用关系图
  • 注释与代码关联分析:提取有价值的注释信息,与代码块关联

三、提示词工程与数据集生成

3.1 系统架构设计

为了生成高质量的问答对数据集,我们设计了一套完整的提示词生成系统,核心包括DeepSeek API封装和数据集生成器两个主要组件:

"""封装API请求,包含速率限制和重试机制"""
class DeepSeekAPI:
    def __init__(self, api_config_name: str = "sdu"):
        self.client = DSOneAPIClient(api_config_name)
        self.last_request_time = 0
        self.min_request_interval = 1.2
        self.max_retries = 3

    def call_api(self, prompt: str, temperature: float = 0.3) -> str:
        elapsed = time.time() - self.last_request_time
        if elapsed < self.min_request_interval:
            time.sleep(self.min_request_interval - elapsed)

        for retry in range(self.max_retries):
            try:
                response = self.client.chat_completion(
                    messages=[{"role": "user", "content": prompt}],
                    temperature=temperature
                )
                self.last_request_time = time.time()
                return response
            except Exception as e:
                if retry == self.max_retries - 1:
                    raise Exception(f"API调用失败: {str(e)}")
                wait_time = 2 ** retry + random.random()
                print(f"请求失败,{wait_time:.1f}秒后重试...")
                time.sleep(wait_time)
"""管理数据集生成全流程"""
class ArkTSQAGenerator:
    def __init__(self, api_config_name: str = "sdu"):
        self.api = DeepSeekAPI(api_config_name)
        self.state_file = Path("generator_state.json")
        self.state = {
            "processed_hashes": set(),
            "last_position": 0,
            "output_files": {}
        }
        self.debug_dir = Path("debug_logs")
        self.debug_dir.mkdir(exist_ok=True)
        self._load_state()

这种设计具有以下优势:

  1. 稳定性保障:内置重试机制和速率限制,避免API调用失败
  2. 状态持久化:支持断点续传,避免重复处理
  3. 灵活配置:可根据不同需求调整API参数

3.2 核心提示词模板

提示词设计是生成高质量问答对的关键。我们设计了专门针对ArkTS代码的提示词模板:

def _generate_prompt(self, code_block: Dict) -> str:
    return f"""请以json格式回答以下问题。只返回json内容,不要有其他说明。

我们期望研发一款基于DeepSeek大模型微调的面向HarmonyOS开发者的API搜索引擎以及应用框架和代码生成工具,用于帮助开发者快速查找开发过程中需要的API或者快速得到一个应用框架,并按照开发者的需要进行代码填充。现在请将上述arkts代码转换成模型微调的提示语句。
以问答的形式进行输出,比如:
{{
"instruction": "用"梦想"、"坚持"和"成功"这三个词组成一个句子。",
"input": "",
"output": "只有坚持追逐梦想,才能最终取得成功。"
}},
所以你需要针对代码块编写一个合适的问题进行提问,作为模型微调提示词,输出内容是问题对应的arkts代码。以此来满足arkts代码高质量生成的问答效果,从而达到模型微调的效果。
代码块:
{code_block["code"]}
"""

这个提示词模板具有以下设计要点:

  1. 明确输出格式要求:指定JSON格式,避免额外说明
  2. 提供典型示例:通过具体例子说明期望的输出形式
  3. 保持问题多样性:鼓励生成不同类型的问题
  4. 强调HarmonyOS特定语境:明确指出面向HarmonyOS开发者的应用场景

3.3 质量保障机制

为了确保生成的问答对数据集质量,我们实现了多层次的质量保障机制:

1. 代码去重机制

使用MD5哈希检验,避免相同代码块重复生成问答对:

@staticmethod
def _get_code_hash(code: str) -> str:
    return hashlib.md5(code.encode("utf-8")).hexdigest()

if code_hash in self.state["processed_hashes"]:  # 跳过已处理代码
    return 0
2. API响应验证

(1) 内容清洗管道

def _clean_response(self, response: str) -> str:
    # 移除模型内部思考标签
    response = re.sub(r".*?", "", response, flags=re.DOTALL).strip()
    # 清理Markdown代码块标记
    response = re.sub(r"^```(?:json)?", "", response).strip()
    response = re.sub(r"```$", "", response).strip()
    return response

(2) JSON格式检验

try:
    qa_data = json.loads(response)  # 强制JSON解析
except json.JSONDecodeError as e:
    print(f"JSON解析失败: {str(e)}\n返回内容:\n{response}")
    debug_file = self.debug_dir / f"fail_{code_hash[:8]}.txt"
    with open(debug_file, "w", encoding="utf-8") as f:
        f.write(f"PROMPT:\n{prompt}\n\nRESPONSE:\n{response}")
    return 0  # 标记为失败

这些验证机制确保了生成的问答对数据格式正确、内容完整,为后续的模型微调提供了高质量的训练数据。

四、实战案例

下面通过一个具体案例展示我们的数据集生成流程:

输入代码:

// 计算圆形面积
@Entry
@Component
struct CircleArea {
  @State radius: number = 0

  build() {
    Column() {
      Slider({ value: this.radius }).onChange(v => {
        this.radius = v
      })
      Text(`面积: ${Math.PI * this.radius ** 2}`)
    }
  }
}

生成问答对:

{
  "instruction": "在HarmonyOS中如何实现一个可交互的圆形面积计算组件?",
  "input": "",
  "output": "@Entry\n@Component\nstruct CircleArea {\n  @State radius: number = 0\n\n  build() {\n    Column() {\n      Slider({ value: this.radius }).onChange(v => {\n        this.radius = v\n      })\n      Text(`面积: ${Math.PI * this.radius ** 2}`)\n    }\n  }\n}"
}

这个例子展示了我们的系统如何将一个ArkTS代码片段转换为有意义的问答对,既保留了代码的功能特性,又以自然语言形式表达了开发者可能的实际需求。

五、应用价值与展望

5.1 当前成果

截至目前,我们的系统已经取得了以下成果:

  • 已处理1000+个开源ArkTS项目
  • 生成50,000+高质量问答对
  • 覆盖了HarmonyOS主要API和常见开发场景

这些数据为我们后续的模型微调奠定了坚实的基础。

5.2 后续计划

基于当前的数据集构建成果,我们计划开展以下工作:

  1. 模型微调优化

    • 实验不同LoRA配置
    • 评估指标设计(代码编译通过率、API匹配度)
    • 针对特定场景进行专项优化
  2. 可视化分析

    • 代码块复杂度分布图
    • API调用关系图谱
    • 数据集质量热力图
  3. 数据集迭代更新

    • 根据模型表现反馈优化数据集
    • 增加更多复杂场景的代码示例
    • 扩展到更多HarmonyOS特有功能

六、总结

通过本项目,我们成功实现了从ArkTS代码到高质量问答对数据集的自动化构建流程。这一流程的技术优势主要体现在精准解析方面,我们基于Tree-sitter的语法树分析确保了代码理解的准确性,能够精确捕获ArkTS代码的结构特征和语义信息。
在效率方面,自动化的提示词工程显著提升了数据集构建效率,相比传统的人工标注方式,我们的方案将数据处理速度提高了10倍以上,同时保证了数据质量的一致性和可靠性。
此外,我们的架构设计具有良好的扩展性,支持快速适配其他编程语言,为未来拓展到更多技术领域奠定了基础。该方案已在HarmonyOS开发者工具链中实际应用,未来将持续优化以支持更复杂的代码生成场景。

你可能感兴趣的:(创新项目实训—哈哈哈萌霓队,python,harmonyos,语言模型)