Shire 编码智能体语言:打造你的专属 AI 编程助手
Phodal 2024-07-14 08:01:04 阅读 59
TL;DR:
Shire 提供了一种简便 AI 编码智能体语言,能够让大型语言模型(LLM)与控制集成开发环境(IDE)之间自由对话,以实现自动化编程。
在 Intellij Marketplace 上搜索 Shire,或者在 GitHub 上下载与安装最新版本。
GitHub:https://github.com/phodal/shire
文档:https://shire.phodal.com/
PS:由于,当前版本(0.4.2)支持本地的自定义 RAG 能力,内置本地的 embedding 模型,因此还需要 Onnx Runtime、HF Tokenizer,因此在体积上会比较大。
为什么需要 Shire 智能体语言?
在 AutoDev 中,我们提供了一系列丰富的自定义能力,以支持开发人员自定义自己的指令,但是受限于框架限制,开发人员的自定义能力还是不够。同时,我们还引入了 DevIns 语言,以支持开发人员更好地自定义自己的 AI 指令。而随后,我们会发现仅仅是这样, 还不足以满足开发人员的日常需求。
1. 辅助研发需求的多样性
AI 软件研发效能提升并不是一件容易的事情,在过去的一年多里,我们做了非常多的尝试。从端到端 AI 辅助研发的开源 Unit Mesh 方案,再到目前 国内最好的开源 AI 驱动编程插件 AutoDev。在这个过程中,我们发现了一些非常有意思的点,诸如于,开发人员需要一个适合自己合适的 AI IDE, 而不是一个通用的 AI IDE。
特别领域代码生成。你需要结合 RAG 来生成包含领域知识的代码,而非简单的补充。
文档实时更新。你需要 AI 来帮你更好生成整个项目的文档,而不仅仅是当前的代码片段注释。
辅助架构分析。你需要结合代码库的 AST 来生成更好的架构分析报告,而不是自己去分析。
还有大量的其它类似的需求,通过现有的 AI IDE 是无法满足的。
2. 文本数据的多样性
在完成自定义任务时,我们所需要的文本数据是丰富多样的。如在 AutoDev 中,用户可以从 IDE 中获取当前的文件、当前的代码片段、当前的选择、当前的光标位置等等。但是依旧存在一些问题:
缺少简单的文本处理逻辑。你可能只需要数据的一部分,而不是整个代码段或者文件作为上下文。
更多的数据信息。你并不能获取到更多的数据,比如,你无法获取到当前的文件的 AST、你无法获取到当前的文件的语法树、你无法获取到当前的文件的类型等等。
知识检索以提取关键信息。甚至于,由于你的代码库太大,生成单个 prompt 容易超过上下文,你需要做一些检索,以获取到你所需要的数据。这些都是当前 IDE 所不能满足的。
如何通过一些简单的方式,以让用户能处理这些文本是我们所需要解决的问题。
3. 数据获取的复杂性
虽然,你可能有更种强烈的需求,但是你的 IDE 接口知识限制了你的能力。哪怕现在的生成式 AI 能力非常强大,但是你提不到一个好的问题,你也无法得到一个好的答案。
诸如于,你不知道 IDE 领域的知识,RAG 无法发挥作用,需要大量的对话来增强你的知识库。然后,你还需要去开发一个 IDE 插件,去获取所需的文本数据,然后再去调用 AI 模型,这个过程是非常复杂的。
那么,我们能不能简化这个过程呢?
4. 其它
其实上面都不重要,重点是,我手痒,想写一个新的东西。
Shire 编码智能体语言
Shire 提供了一种简便 AI 编码智能体语言,能够让大型语言模型(LLM)与控制集成开发环境(IDE)之间自由对话,以实现自动化编程。
简单来说,你可以通过 Shire 去:
调用封装的 IDE API,以生成 prompt 所需的数据。在 Shire 中,数据在 prompt 中以变量的形式存在。
定义在 IDE 中的行为,如何触发、如何执行,以及如何处理结果。
定义简单的数据流处理,如何处理数据、如何存储数据。
因此,你可以通过 Shire 作为中间语言,访问自己的 IDE 数据,生成与 AI 模型对话的 prompt,以实现自动化编程。
Shire 设计原则
结合先前的 AutoDev 开发经验,为了让开发人员更好地使用 AI IDE,我们定义了一些设计原则:
原则 1:IDE 即上下文环境。围绕这一原则,去分解 IDE 的能力,对应有三个实现:上下文感知变量化、模式-动作上下文构建、AST 查询语言。
原则 2:语言即抽象接口。我们使用领域特定语言(DSL)来让开发人员定义 IDE 交互,同时自然语言作为 LLM 接口使用。
原则 3:原子功能单元。即将复杂系统分解为独立且功能明确的最小操作单元。这种设计原则受到 Linux 设计思想的启发,强调模块化、独立性和简洁性。
详细的设计原则说明见:https://shire.phodal.com/design-principle.html
Shire 示例
先让我们再看一个简单的代码示例:
<code>---
name: "On Streaming Done 文档更新"
actionLocation: ContextMenu
interaction: RunPanel
onStreamingEnd: { saveFile("docs/lifecycle/on-streaming-done.md") }
---
根据如下当前的最新代码,更新现有的文档:
/file:ContextVariable.kt
在这个示例中,我们定义了一个 AI 指令,以用于更新文档。在这个 AI 指令中,我们将通过 file
指令来获取当前的文件,然后转换为 LLM 的 prompt, 再交由 AI 模型来生成文档。最后,我们在 onStreamingEnd
里定义了,将文档保存到 docs/lifecycle/on-streaming-done.md
文件中。
Shire Doc Sample
当然了,你还可以定义更多复杂的 AI 指令,诸如于:
定义 <code>selectionStrategy,定义如何选择当前的代码片段。
定义触发条件 when
,以定义何时在菜单上显示。
定义 afterStreaming
,以在当前任务结束后,执行任务的决策,路由到不同的任务。
详细参考:https://shire.phodal.com/shire/shire-hobbit-hole.html
Shire 将如何帮助你设计专属 AI IDE 呢?
1. AI 武装的 IDE
通过上面的示例,你可以看到 Shire 的基本能力,通过编写 Shire 代码,你可以结合 IDE 定义自己的 AI 指令。并将它们组织到一起,如下目录所示:
.shire
├── autotest.shire
├── commit-message.shire
├── javadoc.shire
├── quick-input.shire
├── refactoring-code.shire
├── search
│ └── TextSearch.shire
├── terminal.shire
├── workflow
│ ├── custom-agent.shire
│ └── lifecycle-streaming-end.shire
└── write-doc.shire
在 .shire
目录中,你可以管理你的所有 AI 指令,以及定义它们的行为。
更详细的信息,可以参考我们的示例项目:https://github.com/shire-lang/shire-spring-java-demo
2. 结合研发 AI Agent 打造端到端自动化
与 AutoDev 相似,我们在 Shire 中也提供了 AI Agent 的能力。你只需要在项目中创建一个 xxx.shireCustomAgent.json
,就可以在 Shire 代码中 调用它。
[
{
"name": "内部 API 集成",
"description": "生成 API 信息",
"url": "http://127.0.0.1:8765/api/agent/api-market",
"responseAction": "Direct"
}
]
通过结合 AI Agent,你可以实现更多的自动化任务,如:自动化编写需求,自动化生成文档,自动化生成代码等等。同时,结合 Shire 的能力,你可以在执行 完当前 Shire 任务后,再执行新的 Shire 任务。
---
afterStreaming: {
condition {
"error" { output.length < 1 }
"json-result" { jsonpath("${'$'}.store.*") }
}
case condition {
"error" { notify("Failed to Generate JSON") }
"json-result" { execute("sample.shire") } /* go to execute sample.shire */
default { notify("Failed to Generate JSON") /* mean nothing */ }
}
}
---
更详细的文档可以参考:https://shire.phodal.com/workflow/remote-ai-agent.html
3. 本地 RAG
在 Shire 中,我们提供了本地 RAG 的能力,你可以通过简单的配置,来使用本地的 RAG 模型,作为问答知识库的一部分。示例如下:
---
name: "Search"
variables:
"testTemplate": /.*.java/ { caching("disk") | splitting | embedding | searching("comment") }
---
根据如下的代码,回答用户的问题:博客创建的流程
$testTemplate
在这个示例中,我们定义了一个变量 testTemplate
,它的值是从所有 *.java
文件中检索 comment
的结果。在这个定义中,我们使用了一系列的操作符, 如 caching
、 splitting
、 embedding
、 searching
,最后我们将结果返回给用户。
除了代码外,你还可以将文本文件、pdf、docx 等文件作为输入,以获取更多的信息。更详细的文档可以参考:https://shire.phodal.com/examples/search.html 。
总结
GitHub:https://github.com/phodal/shire
Shire 智能体语言通过简便的 DSL 和设计原则,为开发人员提供了强大的自定义能力,使得大型语言模型(LLM)能够与控制集成开发环境(IDE)之间自由对话, 实现了自动化编程。Shire 的设计初衷是为了满足多样化的研发需求、处理复杂的数据获取以及简化开发流程。通过 Shire,开发人员可以设计专属的 AI IDE,实现端到端的自动化,提升研发效能。Shire 将成为你打造高效、智能化开发环境的得力助手。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。