Zed 编辑预测评测体系剖析:tuple-to-struct-literal 评测样例与 Edit Prediction 数据格式

发布时间:2026/10/28 13:17:49

Zed 编辑预测评测体系剖析:tuple-to-struct-literal 评测样例与 Edit Prediction 数据格式 Zed 编辑预测评测体系剖析tuple-to-struct-literal 评测样例与 Edit Prediction 数据格式【免费下载链接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.项目地址: https://gitcode.com/GitHub_Trending/ze/zedZed 的编辑预测Zeta/edit prediction功能依赖一套评测样例体系来持续验证模型在真实代码重构场景下的表现。本文以仓库中的评测样例 tree-sitter--tuple-to-struct-literal.md 为主线完整解读这类样例的三段式结构编辑历史、光标位置、期望补丁、Rust 重构的具体技术细节以及该样例如何被edit_prediction_cli工具链读取、加载、预测与打分。读完后你可以独立看懂、编写并运行这类评测样例。评测样例在 Zed 工程中的位置该文件位于crates/edit_prediction_cli/evals/目录与多个同构样例并列存放例如tree-sitter--tuple-to-struct-definition.mdtree-sitter--tuple-to-struct-destructuring.mdtree-sitter--tuple-to-struct-for-loop.mdflask--add-test-function.md、vscode--add-async-and-await.md 等。文件名遵循仓库名--重构场景描述的命名约定双横线分隔与解析逻辑一致example.rs 中的read_example_files会按扩展名分发——.md走parse_markdown_example即ExampleSpec::from_markdown.json反序列化为单个Example.jsonl按行反序列化且当ExampleSpec的name为空时默认以文件名为样例名。驱动这些样例的工具是名为ep的命令行程序其子命令定义在 main.rsread读取样例、load-project为每个样例创建 git worktree 并加载文件、context检索上下文、format-prompt生成模型提示词、predict执行编辑预测、parse-output把模型输出解析为统一 diff、score/eval按实际补丁与期望补丁计算得分等。仓库还提供入口脚本 script/run-unit-evals其核心是GPUI_TEST_TIMEOUT1500 cargo nextest run --workspace --no-fail-fast \ --features unit-eval --no-capture -E test(::eval_)即通过unit-evalfeature 编译并以::eval_前缀筛选测试用例把评测样例跑成集成测试。样例文件的通用格式规范从 example_spec.rs 中定义的分节标题常量可以看出一个 Markdown 评测样例由以下可选分节构成标题匹配不区分大小写分节标题内容对应字段front matter ... 包裹的 TOMLrepository_url、revision等指定样例所基于的外部仓库及精确提交## Uncommitted Diff可选光标时刻的未提交改动uncommitted_diff## Edit History之前若干次编辑构成的 diff 序列edit_history## Cursor Position光标所在文件的摘录片段用标记注释标出光标列cursor_pathcursor_position## Expected Patch一个或多个期望的统一 diff多个即代表多个可接受答案expected_patches## Rejected Patch可选被拒绝的预测用于 DPO 训练rejected_patch解析实现from_markdownexample_spec.rs用 pulldown-cmark 遍历事件## Cursor Position代码块围栏后的 info string 就是文件路径如tree-sitter/crates/loader/src/loader.rs块内文本是光标摘录## Expected Patch下的每个diff代码块都追加为一个期望补丁缺少光标位置代码块会直接报错 Missing cursor position codeblock。光标列的标注格式由 example_spec.rs 的cursor_excerpt文档注释规定光标所在行的下一行写一条注释包含[CURSOR_POSITION]字符串注释中用一个箭头指明列号——^表示光标列就是^字符所在位置表示光标位于该行第一个非空白字符处。此外还支持行内标记|user_cursor|INLINE_CURSOR_MARKER直接嵌在代码中常见于期望补丁的 added 行里用来同时表达预测出的代码与预测后光标应落在何处。本样例详解从元组到结构体字面量的重构front matter锁定外部仓库与提交 repository_url gitgithub.com:tree-sitter/tree-sitter revision 24007727d42b4caceda3095ac685c463fae1ba1a 样例并不针对 Zed 自身代码而是引用 tree-sitter 仓库在指定 revision 处的状态。ep load-project阶段会按 example.rs 的repo_name/worktree_path逻辑解析出 owner/repo支持gitgithub.com:owner/repo.git与 http 两种 URL 形式并在 worktree 目录中 checkout 到该 revision从而让编辑历史与光标摘录中的代码路径可被真实解析。Edit History此前已完成的编辑编辑历史是喂给模型的核心上下文信号本样例记录了在tree-sitter/crates/loader/src/loader.rs中把匿名元组类型逐步重构为具名结构体LanguageEntry的过程--- a/tree-sitter/crates/loader/src/loader.rs b/tree-sitter/crates/loader/src/loader.rs -604,7 604,7 pub struct Loader { pub parser_lib_path: PathBuf, - languages_by_id: Vec(PathBuf, OnceCellLanguage, OptionVecPathBuf), languages_by_id: VecLanguageEntry, language_configurations: VecLanguageConfigurationstatic, language_configuration_ids_by_file_type: HashMapString, Vecusize, language_configuration_in_current_path: Optionusize, -619,6 619,12 #[cfg(feature wasm)] wasm_store: MutexOptiontree_sitter::WasmStore, } struct LanguageEntry { path: PathBuf, language: OnceCellLanguage, external_files: OptionVecPathBuf, } pub struct CompileConfiga { -767,7 773,7 pub fn get_all_language_configurations(self) - Vec(LanguageConfiguration, Path) { self.language_configurations .iter() - .map(|c| (c, self.languages_by_id[c.language_id].0.as_ref())) .map(|c| (c, self.languages_by_id[c.language_id].path.as_ref())) .collect() } -920,13 926,17 } fn language_for_id(self, id: usize) - LoaderResultLanguage { - let (path, language, externals) self.languages_by_id[id]; let LanguageEntry { path, language, external_files, } self.languages_by_id[id]; language .get_or_try_init(|| { let src_path path.join(src); self.load_language_at_path(CompileConfig::new( src_path, - externals.as_deref(), external_files.as_deref(), None, )) }) -1532,10 1542,9 // Determine if a previous language configuration in this package.json file // already uses the same language. let mut language_id None; - for (id, (path, _, _)) in - self.languages_by_id.iter().enumerate().skip(language_count) for (id, entry) in self.languages_by_id.iter().enumerate().skip(language_count) { - if language_path *path { if language_path entry.path { language_id Some(id); } } --- a/tree-sitter/crates/loader/src/loader.rs b/tree-sitter/crates/loader/src/loader.rs -1553,10 1553,10 let language_id if let Some(language_id) language_id { language_id } else { - self.languages_by_id.push(( - language_path, - OnceCell::new(), - grammar self.languages_by_id.push(LanguageEntry { path: language_path, language: OnceCell::new(), external_files: grammar .external_files .clone() .into_vec()这段历史覆盖了五处改动点字段类型替换、新结构体定义、按位置索引.0的访问改为命名字段访问、解构从元组模式改为结构体模式、循环中的元组迭代改为按entry字段访问最后一段则是把push((...))元组构造改写为push(LanguageEntry { ... })字面量——注意最后一个 diff 块在into_vec()处被截断说明用户此刻正写到一半。Cursor Position光标正在编辑的结构体字面量let language_id if let Some(language_id) language_id { language_id } else { self.languages_by_id.push(LanguageEntry { path: language_path, language: OnceCell::new(), external_files: grammar .external_files .clone() .into_vec() .map(|files| { files .into_iter() .map(|path| { let path parser_path.join(path); // prevent p being above/outside of parser_path if path.starts_with(parser_path) { Ok(path) } else { Err(LoaderError::ExternalFile( path.to_string_lossy().to_string(), parser_path.to_string_lossy().to_string(), )) } }) .collect::LoaderResultVec_() }) .transpose()?, // ^[CURSOR_POSITION] )); self.languages_by_id.len() - 1 };按前述格式规范解读围栏 info string 给出文件路径tree-sitter/crates/loader/src/loader.rs标记行// ^[CURSOR_POSITION]中的^指向上方//前第 12 列处即transpose()?,之后、));之前的位置——用户刚写完字段值的.transpose()?表达式正准备敲结构体字面量的收尾括号。Expected Patch一行括号修复--- a/tree-sitter/crates/loader/src/loader.rs b/tree-sitter/crates/loader/src/loader.rs -1578,7 1578,7 .collect::LoaderResultVec_() }) .transpose()?, - )); }); self.languages_by_id.len() - 1 };期望补丁只有一行把收尾的));改成});。这正是编辑历史所引出的陷阱——上一段历史编辑把self.languages_by_id.push((元组构造改成了self.languages_by_id.push(LanguageEntry {结构体字面量构造但用户尚未同步修改与之配对的右括号。模型必须从编辑历史中理解元组构造 → 结构体字面量构造这一语义转变而不是机械地补一个右圆括号。这个用例考察的正是编辑预测模型对跨 hunk 配对语法开括号与闭括号类型一致的敏感度也是tuple-to-struct系列用例definition / destructuring / field-access / for-loop / literal中字面量构造这一环。运行与扩展这个评测样例运行方式上ep的输入参数支持本地.md文件路径也支持-表示 stdin 的 JSONL以及captured-after:、rejected-after:等远端数据源标记说明见 main.rs 的INPUTS_HELP。一条典型的评测链路为# 1. 读取并规范化样例md - jsonl ep read crates/edit_prediction_cli/evals/tree-sitter--tuple-to-struct-literal.md -o out.jsonl # 2. 按 repository_url/revision 建立 git worktree 并载入光标文件 ep load-project out.jsonl # 3. 采集上下文默认 LSP 类型可用 --type 指定 ep context out.jsonl # 4. 生成提示词 - 预测 - 解析输出 - 打分 ep format-prompt out.jsonl ep predict out.jsonl --providerprovider ep parse-output out.jsonl ep score out.jsonl全局参数还包括--limit、--offset、--name、--repo按样例名或仓库过滤、--markdown把结果按每样例一个.md文件写回等见 main.rs。若要以集成测试形式跑全量评测则使用 script/run-unit-evals设置UNIT_EVAL_COMMIT可先固定到指定提交然后以--features unit-eval编译并用 nextest 过滤::eval_前缀的测试。若要为这条流水线新增用例按 example_spec.rs 的解析约束编写即可front matter 中repository_url与revision必填解析时FrontMatter要求这两个字段## Cursor Position代码块必须存在且围栏 info string 写文件路径## Expected Patch下可放多个diff块表示多个可接受答案若期望预测后光标移动可在 added 行内嵌|user_cursor|标记序列化时通过encode_cursor_in_patch编入补丁、extract_cursor_from_patch取出example_spec.rs。小结tuple-to-struct-literal 样例 是 Zed 编辑预测评测体系的一个缩影front matter 把样例锚定到外部仓库的精确 revisionEdit History 提供用户正在做什么重构的语义线索Cursor Position 用标准化的^[CURSOR_POSITION]/|user_cursor|标记精确描述编辑点Expected Patch 给出唯一的正确修复));改});。整套格式由edit_prediction的ExampleSpec定义、由edit_prediction_cli的ep工具链消费配合unit-evalfeature 的集成测试形成闭环。理解并遵循这一格式就能为编辑预测模型贡献可复现、可打分的回归用例。【免费下载链接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.项目地址: https://gitcode.com/GitHub_Trending/ze/zed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/28 10:48:44

AI与裁员席卷游戏业:从程序化生成到生成式AI的正确用法

游戏圈最近有个话题挺值得坐下来聊聊:《矮人要塞》创作者 Tarn Adams 公开表示,游戏行业正因 AI 与裁员陷入混乱。这句话放在 2024 到 2025 年的行业语境里,几乎不算夸张。一边是大厂批量裁撤美术、策划、QA 岗位,一边是生成式 AI…

2026/10/27 3:41:53

AI基建电力瓶颈解析:数据中心供电架构与电价成本优化实践

最近,关于“AI 基建”最热的新闻之一,来自大洋彼岸的一则报道:WSJ(《华尔街日报》)援引特朗普发文力挺数据中心建设,并指出地方电价已经成为美国 AI 基建扩张过程中的核心政治瓶颈。消息一出,国…

2026/10/28 13:16:07

约瑟夫问题可视化:C++与SFML实现算法动画演示

1. 约瑟夫问题模拟算法可视化程序概述约瑟夫问题(Josephus Problem)是一个经典的数学游戏和算法问题,描述的是N个人围成一圈,从某个指定的人开始报数,数到k的那个人就被淘汰出局,接着从下一个人重新开始报数…

2026/10/28 13:16:07

tosnuc888指令手册:G代码与M代码核心解读

简介:《tosnuc888指令手册》是TOSNUC 888系统G代码、M代码的中文翻译资料,面向数控编程初学者、机床操作人员及需要查阅指令定义的工程技术人员,可用于理解程序控制代码的功能、适用场景与使用限制。压缩包内为1个doc文档,大小约2…

2026/10/28 13:16:07

Jenkins实现iOS自动化构建的最佳实践

1. Jenkins与iOS自动化构建概述在移动应用开发领域,iOS自动化构建一直是提升团队效率的关键环节。作为最流行的开源持续集成工具,Jenkins凭借其强大的插件生态和灵活的配置能力,成为实现iOS自动化构建的首选方案之一。我团队在过去三年中为17…

2026/10/28 13:16:07

iOS自动化构建实践:Jenkins与Xcode集成指南

1. iOS自动化构建的核心挑战与解决方案在移动应用开发领域,iOS自动化构建一直是个令人头疼的问题。不同于Android的开放生态,苹果的封闭体系给持续集成带来了独特的挑战:必须使用macOS系统、需要处理证书和描述文件、Xcode构建环境依赖复杂等…

2026/10/28 13:16:07

impeccable用法详解:从词源到搭配,掌握这个高级英语形容词

“impeccable”最近频繁出现在热搜里,刚开始我以为是哪个品牌的新系列,点进去才发现大家其实在聊一个英语词汇。这个词在英语里属于“高级感拉满”的那类形容词,中文可以翻译成“无可挑剔、无懈可击、完美无瑕”,但它和常见的 per…

2026/10/28 13:11:06

Java应用容器化部署与Kubernetes优化实践

1. Java应用容器化部署全景解读当我们在2023年谈论Java应用的现代化部署时,Docker和Kubernetes这对黄金组合已经成为行业标配。作为从业十余年的架构师,我见证过从物理服务器到虚拟化再到容器化的完整演进历程。容器化部署带来的不仅是环境一致性和资源利…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑