在HarmonySmartCoding项目中,高质量的训练数据是实现精准代码生成的关键基础。本文将详细介绍我们如何从ArkTS项目代码解析到生成DeepSeek大模型微调数据集的完整技术方案,涵盖静态代码分析、语法树解析、代码切分以及提示词工程等关键环节,为后续模型微调提供高质量的训练数据支撑。
我们设计了一套完整的ArkTS代码处理与数据集生成流水线,主要分为两大核心模块:
代码静态分析与切分模块:
提示词生成与数据集构建模块:
这种模块化设计使我们能够灵活应对不同类型的代码处理需求,同时保证了生成数据的质量和多样性。
Tree-sitter是一个高性能的增量解析库,能够为多种编程语言生成具体的语法树。我们选择它作为ArkTS代码解析的核心工具,主要基于以下考虑:
环境配置步骤如下:
# 安装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
为了在Python环境中使用Tree-sitter,我们需要编译语法解析器:
from tree_sitter import Language
Language.build_library(
'build/my-languages.so', # 输出文件
['vendor/tree-sitter-typescript'] # 语法定义
)
需要注意的是,在Windows环境下需要安装Visual Studio的C++编译工具链才能成功编译语法库。
我们设计了一个完整的代码解析器(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)
在解析过程中,我们重点关注以下关键节点类型:
这种有针对性的节点提取策略使我们能够精确捕获代码中的关键结构,为后续的数据增强提供基础。
解析后的代码被转换为结构化的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 {"
}
}
]
}
除了基本的代码结构提取外,我们还实现了以下特色功能:
为了生成高质量的问答对数据集,我们设计了一套完整的提示词生成系统,核心包括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()
这种设计具有以下优势:
提示词设计是生成高质量问答对的关键。我们设计了专门针对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"]}
"""
这个提示词模板具有以下设计要点:
为了确保生成的问答对数据集质量,我们实现了多层次的质量保障机制:
使用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
(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代码片段转换为有意义的问答对,既保留了代码的功能特性,又以自然语言形式表达了开发者可能的实际需求。
截至目前,我们的系统已经取得了以下成果:
这些数据为我们后续的模型微调奠定了坚实的基础。
基于当前的数据集构建成果,我们计划开展以下工作:
模型微调优化:
可视化分析:
数据集迭代更新:
通过本项目,我们成功实现了从ArkTS代码到高质量问答对数据集的自动化构建流程。这一流程的技术优势主要体现在精准解析方面,我们基于Tree-sitter的语法树分析确保了代码理解的准确性,能够精确捕获ArkTS代码的结构特征和语义信息。
在效率方面,自动化的提示词工程显著提升了数据集构建效率,相比传统的人工标注方式,我们的方案将数据处理速度提高了10倍以上,同时保证了数据质量的一致性和可靠性。
此外,我们的架构设计具有良好的扩展性,支持快速适配其他编程语言,为未来拓展到更多技术领域奠定了基础。该方案已在HarmonyOS开发者工具链中实际应用,未来将持续优化以支持更复杂的代码生成场景。