@@ -211,7 +211,7 @@ GitHub Copilot 采用了相似上下文的架构模式,其精略的架构分
211211- 服务端(Server)。处理 prompt 请求,并交给 LLM 服务端处理。
212212
213213在 “公开” 的 [Copilot-Explorer](https://github.com/thakkarparth007/copilot-explorer) 项目的研究资料里,可以看到 Prompt
214- 是如何构建出来的。如下是发送到的 prompt 请求::
214+ 是如何构建出来的。如下是发送到的 prompt 请求:
215215
216216` ` ` json
217217{
@@ -323,7 +323,7 @@ BlogService 类信息,作为上下文(在注释中提供)提供给模型
323323IDE、编辑器作为开发者的主要工具,其设计和学习成本也相对比较高。首先,我们可以用官方提供的模板生成:
324324
325325- [IDEA 插件模板](https://github.com/JetBrains/intellij-platform-plugin-template)
326- - [VSCode 插件模板 ](https://code.visualstudio.com/api/get-started/your-first-extension)
326+ - [VSCode 插件生成 ](https://code.visualstudio.com/api/get-started/your-first-extension)
327327
328328然后,再往上添加功能(是不是很简单),当然不是。以下是一些可以参考的 IDEA 插件资源:
329329
@@ -419,6 +419,61 @@ class AutoDevEditorListener : EditorFactoryListener {
419419</group>
420420```
421421
422+ #### 多语言上下文架构
423+
424+ 由于 Intellij 的平台策略,使得运行于 Java IDE(Intellij IDEA)与在其它 IDE 如 Python
425+ IDE(Pycharm)之间的差异性变得更大。我们需要提供基于多平台产品的兼容性,详细介绍可以参考:[Plugin Compatibility with IntelliJ Platform Products](https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html)
426+
427+ 首先,将插件的架构进一步模块化,即针对于不同的语言,提供不同的模块。如下是 AutoDev 的模块化架构:
428+
429+ ```bash
430+ java/ # Java 语言插件
431+ src/main/java/cc/unitmesh/autodev/ # Java 语言入口
432+ src/main/resources/META-INF/plugin.xml
433+ plugin/ # 多平台入口
434+ src/main/resources/META-INF/plugin.xml
435+ src/ # 即核心模块
436+ main/resource/META-INF/core.plugin.xml
437+ ```
438+
439+ 在 `plugin/plugin.xml` 中,我们需要添加对应的 `depends`,以及 `extensions`,如下是一个示例:
440+
441+ ```xml
442+ <idea-plugin package="cc.unitmesh" xmlns:xi="http://www.w3.org/2001/XInclude" allow-bundled-update="true">
443+ <xi:include href="/META-INF/core.xml" xpointer="xpointer(/idea-plugin/*)"/>
444+ <content>
445+ <module name="cc.unitmesh.java"/>
446+ <!-- 其它模块 -->
447+ </content>
448+ </idea-plugin>
449+ ```
450+
451+ 而在 `java/plugin.xml` 中,我们需要添加对应的 `depends`,以及 `extensions`,如下是一个示例:
452+
453+ ```xml
454+ <idea-plugin package="cc.unitmesh.java">
455+ <!--suppress PluginXmlValidity -->
456+ <dependencies>
457+ <plugin id="com.intellij.modules.java"/>
458+ <plugin id="org.jetbrains.plugins.gradle"/>
459+ </dependencies>
460+ </idea-plugin>
461+ ```
462+
463+ 随后,Intellij 会自动加载对应的模块,以实现多语言的支持。根据我们预期支持的不同语言,便需要对应的 `plugin.xml`,诸如于:
464+
465+ ```bash
466+ cc.unitmesh.javascript.xml
467+ cc.unitmesh.rust.xml
468+ cc.unitmesh.python.xml
469+ cc.unitmesh.kotlin.xml
470+ cc.unitmesh.java.xml
471+ cc.unitmesh.go.xml
472+ cc.unitmesh.cpp.xml
473+ ```
474+
475+ 最后,在不同的语言模块里,实现对应的功能即可。
476+
422477### 上下文构建
423478
424479为了简化这个过程,我们使用 Unit Eval 来展示如何构建两种类似的上下文。
@@ -742,7 +797,7 @@ fun filterByThreshold(job: InstructionFileJob) {
742797 return
743798 }
744799
745- // like js minified file
800+ // like js minified file
746801 if (summary.binary || summary.generated || summary.minified) {
747802 return
748803 }
@@ -768,7 +823,7 @@ fun filterByThreshold(job: InstructionFileJob) {
768823}
769824```
770825
771- 在过虑之后,我们就可以由不同语言的 Worker 来进行处理,诸如 JavaWorker、PythonWorker 等。
826+ 在过虑之后,我们就可以由不同语言的 Worker 来进行处理,诸如 JavaWorker、PythonWorker 等。
772827
773828```kotlin
774829val lists = jobs.map { job ->
@@ -801,7 +856,7 @@ SimilarChunksStrategyBuilder 主要逻辑如下
8018561. 使用配置中指定的规则检查以识别存在问题的数据结构。
8028572. 收集所有具有相似数据结构的数据结构。
8038583. 为每个被识别的数据结构中的函数构建完成生成器。
804- 4. 过滤掉具有空的前置和后置光标的完成生成器。
859+ 4. 过滤掉具有空的前置和后置光标的完成生成器。
8058605. 使用JavaSimilarChunker计算块补全的相似块。
8068616. 为每个完成生成器创建SimilarChunkIns对象,包括语言、前置光标、相似块、后置光标、输出和类型的相关信息。
8078627. 返回生成的SimilarChunkIns对象的列表。
0 commit comments