@@ -421,17 +421,69 @@ class AutoDevEditorListener : EditorFactoryListener {
421421
422422### 上下文构建
423423
424+ 为了简化这个过程,我们使用 UnitEval 来展示如何构建上下文。
425+
424426#### 静态代码分析
425427
428+ 通过静态代码分析,我们可以得到当前的函数、当前的类、当前的文件等。再结合路径相似性,寻找最贴进的上下文。
429+
430+ ```kotlin
431+ private fun findRelatedCode(container: CodeContainer): List<CodeDataStruct> {
432+ // 1. collects all similar data structure by imports if exists in a file tree
433+ val byImports = container.Imports
434+ .mapNotNull {
435+ context.fileTree[it.Source]?.container?.DataStructures
436+ }
437+ .flatten()
438+
439+ // 2. collects by inheritance tree for some node in the same package
440+ val byInheritance = container.DataStructures
441+ .map {
442+ (it.Implements + it.Extend).mapNotNull { i ->
443+ context.fileTree[i]?.container?.DataStructures
444+ }.flatten()
445+ }
446+ .flatten()
447+
448+ val related = (byImports + byInheritance).distinctBy { it.NodeName }
449+ // 3. convert all similar data structure to uml
450+ return related
451+ }
452+ ```
453+
426454#### 相关代码分析
427455
456+ 先寻找,再通过代码相似性,来寻找相关的代码。核心逻辑所示:
457+
458+ ```kotlin
459+ fun pathLevelJaccardSimilarity(chunks: List<String>, text: String): List<Double> {
460+ //...
461+ }
462+ fun tokenize(chunk: String): List<String> {
463+ return chunk.split(Regex("[^a-zA-Z0-9]")).filter { it.isNotBlank() }
464+ }
465+ fun similarityScore(set1: Set<String>, set2: Set<String>): Double {
466+ //...
467+ }
468+ ```
469+
470+ 详细见:[SimilarChunker](https://github.com/unit-mesh/unit-eval/blob/master/unit-core/src/main/kotlin/cc/unitmesh/core/intelli/SimilarChunker.kt)
471+
428472### VSCode 插件
429473
430474TODO
431475
432476### 度量体系设计
433477
434- #### 指标
478+ #### 常用指标
479+
480+ **代码接受率**
481+
482+ AI 生成的代码被开发者接受的比例。
483+
484+ **入库率**
485+
486+ AI 生成的代码被开发者入库的比例。
435487
436488#### 开发者体验驱动
437489
@@ -454,8 +506,13 @@ TODO
454506
455507#### 模型选择
456508
509+ 现有的开源模型里采用 LLaMA 架构相对比较多,并且由于其模型的质量比较高,其生态也相对比较完善。因此,我们也采用 LLaMA
510+ 架构来构建,即:[DeepSeek Coder](https://huggingface.co/deepseek-ai/deepseek-coder-6.7b-base)。
511+
457512#### OpenBayes 平台部署与测试
458513
514+ 构建 API,详细见:`code/server` 目录下的相关代码。
515+
459516```python
460517if __name__ == "__main__":
461518 try:
@@ -471,12 +528,31 @@ if __name__ == "__main__":
471528
472529### 指令生成
473530
531+ ```json
532+ {
533+ "instruction": "Write unit test for following code.\n<SomeCode>",
534+ "output": "<TestCode>"
535+ }
536+ ```
537+
538+ 或者:
539+
540+ ```json
541+ {
542+ "instruction": "Write unit test for following code.",
543+ "input": "<SomeCode>",
544+ "output": "<TestCode>"
545+ }
546+ ```
547+
474548#### 开源指令
475549
476550[https://huggingface.co/datasets/ise-uiuc/Magicoder-OSS-Instruct-75K](https://huggingface.co/datasets/ise-uiuc/Magicoder-OSS-Instruct-75K)
477551
478552#### 数据蒸馏
479553
554+ 数据蒸馏。即将大型真实数据集(训练集)作为输入,并输出一个小的合成蒸馏数据集。
555+
480556### 模型微调
481557
482558有监督微调(SFT)是指采用预先训练好的神经网络模型,并针对你自己的专门任务在少量的监督数据上对其进行重新训练的技术。结合 【[SFT最佳实践](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Xlkb0e6eu)
@@ -510,6 +586,16 @@ TODO
510586
511587## 步骤 3:围绕意图的数据工程与模型演进
512588
589+ 
590+
591+ Unit Eval 是一个针对于构建高质量代码微调的开源工具箱。其三个核心设计原则:
592+
593+ - 统一提示词(Prompt)。统一工具-微调-评估底层的提示词。
594+ - 代码质量管道。诸如于代码复杂性、代码坏味道、测试坏味道、API 设计味道等。
595+ - 可扩展的质量阈。自定义规则、自定义阈值、自定义质量类型等。
596+
597+ 即要解决易于测试的数据集生成,以及易于评估的模型评估问题。
598+
513599### IDE 指令设计与演化
514600
515601#### 模板指令
@@ -535,10 +621,18 @@ TODO
535621
536622### 高质量数据集生成
537623
538- - 统一提示词(Prompt)。统一工具-微调-评估底层的提示词。
539- - 代码质量管道。诸如于代码复杂性、代码坏味道、测试坏味道、API 设计味道等。
540- - 可扩展的质量阈。自定义规则、自定义阈值、自定义质量类型等。
624+ #### 质量流水线设计示例
625+
626+ 
627+
628+ 基于 Thoughtworks 在软件工程的丰富经验,以及 Thoughtworks 的架构治理开源工具 [ArchGuard](https://archguard.org/) 作为基础设施。
629+ 在 UnitEval 中,我们也将代码质量的筛选构建成 pipeline 的方式:
630+
631+ - 代码复杂度。在当前的版本设计里,可以直接通过代码复杂度来决定是否放代码文件进入数据库。
632+ - 不同的坏味道检查类型。诸如于代码坏味道、测试坏味道等。
633+ - 特定的规则检查。Controller 的 API 设计、Repository 的 SQL 设计 等。
541634
635+ 而基于 ArchGuard 中所提供的丰富代码质量和架构质量分析能力,诸如 OpenAPI、 SCA(软件依赖分析)能力,我们也在思考未来是否也加入相关的设计。
542636
543637## 附:相关资源
544638
0 commit comments