自定义 RAG 工作流:在 IDE 中结合 RAG 编排,构建可信的编码智能体
构建编码智能体从来不是一件轻松的事。结合我们在 AutoDev、ArchGuard Co-mate、ChocoBuilder 等智能体项目上摸爬滚打的经验,我们开始在 Shire 语言中尝试一种新的 RAG 工作流。说白了,就是利用先前搭建好的 IDE 基础设施——代码生成、校验、执行那一套接口——现在终于可以打造出更靠谱、更可信的编码智能体了。
TL;DR(太长不看)版
现在,你可以用 Shire 配合自定义的 RAG 流程来编排智能体。看下面这段代码:
用自己写的 prompt 和 IDE 接口捞取代码数据
对代码做向量化、检索,以及常规的代码搜索
把参数传给下一个流程(
execute函数)
---
name: "Search"
variables:
"placeholder": /.*.ja va/ { splitting | embedding }
"input": "博客创建流程"
afterStreaming: {
case condition {
default { searching($output) | execute("SummaryQuestion.shire", $output, $input) }
}
}
---
xxx
User: $input
Response:
再配合代码校验、代码执行这些能力,一个完整、可信的编码智能体就搭起来了。
基础 Shire 能力:Pattern Action 与代码可信函数

Shire 是一种简化的 AI 编码智能体语言,能让大型语言模型(LLM)与集成开发环境(IDE)自由对话,从而实现自动化编程。
简单概括,通过 Shire 你能做到:
调用封装好的 IDE API,生成 prompt 所需的数据。在 Shire 里,数据在 prompt 中以变量形式存在。
定义在 IDE 中的行为——怎么触发、怎么执行、结果如何处理。
定义简单的数据流——数据怎么处理、怎么存储。
所以,用 Shire 作为中间语言,你可以访问自己的 IDE 数据,生成与 AI 模型对话的 prompt,实现真正的自动化编程。
Shire RAG 基础:Pattern Action 构建数据流
在先前的 Shire 中,你可以通过 variables 自定义 Pattern Action,从 IDE 里拉取数据。比如:
---
variables:
"logContent": /.*.ja va/ { grep("error.log") | head }
---
检查用户的代码是否有问题:$logContent
这里定义了一个变量 logContent,它的值是从所有 *.ja va 文件中检索 error.log 的结果。最后把结果发给 LLM,由 AI 来处理。
Shire RAG 基础:代码可信校验
Shire 的代码校验是在生命周期中的 onStreamingDone 阶段执行的——也就是 Streaming 完成后,通过一系列后处理器对生成内容做处理。当前版本支持三个函数:
parseCode把文本解析成代码块。verifyCode检查代码错误或 PSI 问题。runCode运行生成的文本代码。
因此,你可以这样处理 LLM 生成的代码:
---
onStreamingEnd: { parseCode | sa veFile | openFile | verifyCode | runCode }
---
生成一个 python hello world,使用 markdown block返回
启动 Shire 指令的那一刻,一场精心编排的编码舞蹈就开始了。首先,Shire RAG 工作流调用 LLM,这个强大的语言模型迅速生成一段 Python 的 Hello World 代码块。
生成的代码块接着通过
sa veFile保存到指定文件。为了确保准确性和可靠性,启动
verifyCode函数做严格的语法校验。一旦通过校验,就用
runCode函数运行这段代码。
这一刻,代码仿佛被赋予了生命,在 IDE 中输出 "Hello, World!"。
Shire RAG 基础:Index 与 Query
借助我们之前做 RAGScript 和相关 RAG 项目的经验,通过简单的函数就可以实现代码的检索和查询。例如:
---
name: "Search"
variables:
"testTemplate": /.*.kt/ { splitting | embedding | searching("blog") }
---
$testTemplate
这里定义了一个变量 testTemplate,它的值是从所有 *.kt 文件中检索 blog 的结果。接着把结果发给 LLM,由 AI 处理。
Shire RAG Flow:解释代码示例

当我们使用领先的 AI IDE(比如 AutoDev VSCode 版本)的业务知识解释功能时,通常会分 3~5 个步骤:
- 。把用户的问题转换成某种形式的查询语句——关键字、假设性代码等。
查询转换
- 。结合本地数据(文本、向量等)进行检索,获取相关信息。
信息检索
- 。对检索到的信息排序、解释,生成对应结果。
重新排序
- 。最后把结果发给 LLM,由 AI 处理。
内容总结
根据不同的上下文或业务需求,这个流程可能略有差异,但基本套路是一样的。而在使用 Shire 开发时,由于只需要和 LLM 交互两次,所以可以简化为两步:
把用户的问题发给 LLM 并检索
由 LLM 总结上一步的结果
尽管简化了,但如何抽象出这种原子能力,对 Shire 提出了更高的要求。这里我们只是作为一个 PoC 来展示,后续版本会提供更多能力。
步骤 1:使用 Shire 自定义代码检索
有了上面这些基础,可以开始搭建 RAG 流程了。比如:
---
name: "Search"
variables:
"placeholder": /.*.ja va/ { splitting | embedding }
"lang": "ja va"
"input": "博客创建流程"
afterStreaming: {
case condition {
default { searching($output) | execute("summary.shire", $input, $output) }
}
}
---
[]: 这里写一些 CoT 相关的指令
这里定义了一个变量 placeholder,它的值是从所有 *.ja va 文件中检索“博客创建流程”的结果。默认情况下,embedding 的结果会存在内存中,所以在 afterStreaming 时可以直接拿来用。
afterStreaming 在 Streaming 完成后执行,这里用 searching 函数结合上一步的结果进行检索,最后把结果传给下一个流程。
步骤 2:使用 LLM 进行总结
第一步中,我们指定了下一个指令的名称为 summary.shire,传递了两个参数:$input 和 $output。在这个流程里,可以直接使用这两个参数:
[]: 这里写一些 prompt 代码信息如下: $output 用户的问题: $input
随后,Shire 会自动执行这个指令,把结果返回给用户——也就是问题的总结。
Shire RAG 工作流的实现
实现 Shire RAG 工作流可没那么简单。在人力有限的情况下,我们做了大量调研、试验和场景验证。我们调研了被广泛采用的编码 RAG 工具,尝试了不同的编码智能体实现方式,以探索更多可能性。
Shire RAG 技术栈
Shire RAG 工作流主要使用的技术栈如下:
推理框架:ONNX Runtime
Embedding 模型:Sentence Transformers all-MiniLM-L6-v2
相似度算法:Jaccard similarity(默认)
数据存储:内存(默认)、本地文件(项目目录)、未来:SQLite
Tokenizer:HF Tokenizer
除了 RAG 部分,基于 NLP 与搜索的传统检索方式也支持,比如:
similarCode变量:通过 Jaccard 等算法检索相似代码。similarTestCase变量:通过 TF-IDF 检索相似测试用例。
我们还在尝试把更多算法和技术集成到 Shire RAG 工作流中,提供更丰富的能力。
文档支持
基于我们构建的 LLM 开发框架 ChocoBuilder,现在可以支持:
Office 文档:docx, pptx, xlsx 文件
PDF 文档
非二进制文件
IDE 支持语言代码文件
IDE 不支持语言代码文件
当然,现在版本的代码拆分机制还不够完善,后续版本会提供更多支持。
下一步
目前的版本只能满足一些简单需求,实际开发中还需要更多能力。后续版本会持续增强:
支持更多存储方式,比如向量数据库。
支持对结果重排,如 LIM、LLM Rerank 等。
支持更多检索方式,如 BM25+、BM42 等。
……
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名