技术速递|为 GitHub Copilot 构建智能体记忆系统

技术速递|为 GitHub Copilot 构建智能体记忆系统
作者:Tiferet
排版:Alan Wang
Copilot 的跨智能体记忆系统使各类智能体能够在整个开发工作流中学习和改进,涵盖从编码智能体、CLI 到代码审查。

我们的愿景是将 GitHub Copilot 发展为一个由多个智能体组成的生态系统,在整个开发生命周期中协作——从编码和代码审查,到安全、调试、部署和维护。要释放多智能体工作流的全部潜力,我们需要超越彼此孤立、每次会话都从零开始的交互方式,转向一个随着每次使用不断积累的知识库。

跨智能体记忆使各类智能体能够在整个开发流程中基于经验进行记忆和学习,而无需依赖用户的明确指示。

每一次交互都会让 Copilot 更加了解你的代码库和约定,使其随着时间推移变得越来越高效。例如,当 Copilot 编码智能体在修复安全漏洞时学会了你的仓库如何处理数据库连接,Copilot 代码审查智能体之后就可以利用这些知识,在未来的拉取请求中识别不一致的模式。又比如,如果 Copilot 代码审查智能体发现某些文件必须保持同步,那么在未来生成新代码时,Copilot 编码智能体会自动同时更新这些文件。

目前 GitHub Copilot 中记忆的工作方式(公开预览版)
Copilot 的新记忆系统已进入公开预览,首先支持 Copilot 编码智能体、Copilot CLI 和 Copilot 代码审查,面向所有付费 Copilot 计划,其他智能体将很快跟进(了解其工作方式请参阅我们的文档)。该功能默认关闭,完全自愿启用,因此由你决定何时以及在何处让 Copilot 开始从你的工作流中学习。
你可以在 GitHub Copilot 设置中开启记忆功能。
了解如何启用记忆功能 >

挑战:记住什么,以及何时遗忘

我们的智能体在持续提升提取特定任务所需上下文的能力。记忆系统的核心挑战并不在于信息检索,而在于确保任何存储的知识在代码随分支和时间演变的过程中仍然有效。

在实践中,这意味着记忆系统必须处理代码变更、被放弃的分支以及相互冲突的观察结果——同时确保智能体仅基于与当前任务和代码状态相关的信息采取行动。例如,在某个分支中观察到的日志约定,之后可能被修改、替代,甚至根本未被合并。

一种选择是实现离线整理服务,用于去重、解决冲突、跟踪分支状态并清理过时信息。然而在 GitHub 的规模下,这种方式会引入显著的工程复杂性和 LLM 成本,同时仍然需要在读取时进行变更协调。因此我们首先探索了一种更简单、更高效的方法。

我们的解决方案:即时验证

信息检索是一个非对称问题:解决它很难,但验证它却很容易。通过使用实时验证,我们既能获得预存记忆的优势,又能避免过时或误导信息的风险。

我们不进行离线记忆整理,而是以带引用的方式存储记忆:每条事实都附带支持该事实的具体代码位置引用。当智能体遇到存储的记忆时,它会实时验证这些引用,在使用前确认信息在当前分支中仍然准确且相关。这种验证仅需少量简单的读取操作,在我们的测试中不会为智能体会话带来显著延迟。

将记忆创建作为工具调用

我们将记忆创建实现为一个工具,当智能体发现某些信息可能对未来任务具有可执行意义时,可以调用该工具。

Copilot 智能体在执行任务过程中如何存储值得记住的学习内容

考虑以下示例:在审查一位资深开发者的拉取请求时,Copilot 代码审查发现 API 版本跟踪必须在代码库的不同部分保持同步。它可能在同一个拉取请求中看到以下三个更新:

在 src/client/sdk/constants.ts 中:

export const API_VERSION ="v2.1.4";

在 server/routes/api.go 中:

const APIVersion ="v2.1.4"

在 docs/api-reference.md 中:

Version: v2.1.4

对此,Copilot 代码审查可以调用记忆存储工具,创建如下记忆:

{ subject:"API version synchronization", fact:"API version must match between client SDK, server routes, and documentation.", citations:["src/client/sdk/constants.ts:12","server/routes/api.go:8","docs/api-reference.md:37"], reason:"If the API version is not kept properly synchronized, the integration can fail or exhibit subtle bugs. Remembering these locations will help ensure they are kept synchronized in future updates."}

结果是:下次智能体在这些位置中的任意一个更新 API 版本时,它都会看到这条记忆,并意识到必须同步更新其他位置,从而避免可能破坏集成的版本不一致。同样,如果一位经验不足的开发者只更新了其中一个位置并提交拉取请求,Copilot 代码审查会指出遗漏并建议补充更新,从而将资深成员的知识自动传递给新成员。💥

记忆的使用

检索

当智能体开始新的会话时,我们会检索目标仓库中最新的记忆,并将其包含在提示中。未来的实现将支持更多检索技术,例如搜索工具和加权优先级排序。

Copilot 如何将以往任务的记忆加入到智能体提示中
验证

在应用任何记忆之前,系统会提示智能体通过检查引用的代码位置来验证其准确性和相关性。如果代码与记忆内容相矛盾,或引用无效(例如指向不存在的位置),智能体会被鼓励根据新证据存储修正后的记忆。如果引用有效且记忆被认为有用,智能体会再次存储该记忆以刷新时间戳。

隐私与安全

需要强调的是,记忆具有严格的作用范围。某个仓库的记忆只能在该仓库内由具有写入权限的贡献者操作时创建,并且只能在同一仓库中由具有读取权限的用户发起的任务中使用。就像源代码本身一样,关于某个仓库的记忆仅限于该仓库之内,从而确保隐私和安全。

跨智能体记忆共享

我们记忆系统的真正力量在于不同 Copilot 智能体之间的相互学习。

  1. Copilot 代码审查在审查拉取请求时发现一个日志约定:“日志文件名应遵循 ‘app-YYYYMMDD.log’ 模式。使用 Winston 进行日志记录,格式为:时间戳、错误代码、用户 ID。”
  2. 之后,Copilot 编码智能体被分配实现一个新的微服务任务。它看到并验证了这条记忆,并自动应用相同的日志格式。
  3. Copilot CLI 帮助开发者调试问题时,可以高效检索正确的日志文件,并基于代码审查智能体学到的日志格式找到相关时间戳。

每个智能体都为共享知识库做出贡献并从中受益,使智能体能够在不同任务中复用经过验证的仓库知识。随着更多智能体采用记忆机制——无论是用于开发流程、调试还是安全分析——它们都将参与并受益于对代码库不断演进的共同理解。

评估

对智能体韧性进行压力测试

我们最大的担忧是过时、不正确甚至恶意注入的记忆所带来的影响。为测试系统的韧性,我们故意在仓库中植入对抗性记忆——与代码库相矛盾的事实,并附带指向无关或不存在代码位置的引用。

在所有测试案例中,智能体都持续验证引用、发现矛盾并更新错误记忆。记忆池会在智能体根据自身观察存储修正版本后实现自我修复。引用验证机制有效防止了误导性记忆的风险。

模拟真实的记忆池

对于评估集中的每个仓库,我们在多种历史任务(早于目标评估任务)上运行智能体,并让其通过我们提供的 “store_memory” 工具自然填充记忆数据库。为模拟最坏情况,我们刻意提高来自已被放弃或未合并分支的记忆比例,确保记忆环境具有现实噪声。

当我们在评估集的拉取请求上运行 Copilot 代码审查时,使用记忆后,精确率提升 3%,召回率提升 4%。

衡量对开发者的影响

记忆系统的最终考验是它在开发者日常工作流中的实际影响。我们在首批部署记忆功能的两个 Copilot 智能体——Copilot 代码审查和 Copilot 编码智能体——上进行了 A/B 测试,衡量关键用户指标的变化。

  • Copilot 编码智能体:拉取请求合并率提升 7%(启用记忆为 90%,未启用为 83%)。这意味着当开发者将任务交给 Copilot 时,可以节省更多时间,更频繁获得期望结果。
  • Copilot 代码审查:评论的正向反馈率提升 2%(启用记忆为 77%,未启用为 75%)。这意味着自动化代码审查带来了更高质量的质量保障。
  • 两项提升均具有高度统计显著性,p 值 < 0.00001。

这些结果表明,跨智能体记忆为开发者的日常工作流带来了可衡量的价值。

下一步

我们已在 Copilot CLI、Copilot 编码智能体和 Copilot 代码审查中,以自愿启用方式部署了基于仓库范围的记忆存储与使用功能。我们正在倾听用户反馈,并密切跟踪性能指标,以便在更广泛的 Copilot 工作流中推广之前持续迭代。同时,我们也在探索多种方法来优化记忆的生成、整理、优先级排序和使用。

跨智能体记忆通过让经过验证的信息在智能体工作流中持续存在,减少了每次任务开始时重新建立上下文的需要。我们对记忆将带来的可能性充满期待,而这仅仅是一个开始。期待你的反馈,帮助我们确保 GitHub Copilot 以最符合你需求的方式不断演进。祝编程愉快!

阅读我们的文档,了解如何在 Copilot 中启用记忆功能 >

Read more

前端防范 XSS(跨站脚本攻击)

目录 一、防范措施 1.layui util  核心转义的特殊字符 示例 2.js-xss.js库 安装 1. Node.js 环境(npm/yarn) 2. 浏览器环境 核心 API 基础使用 1. 基础过滤(默认规则) 2. 自定义过滤规则 (1)允许特定标签 (2)允许特定属性 (3)自定义标签处理 (4)自定义属性处理 (5)转义特定字符 常见场景示例 1. 过滤用户输入的评论内容 2. 允许特定富文本标签(如富文本编辑器内容) 注意事项 更多配置 XSS(跨站脚本攻击)是一种常见的网络攻击手段,它允许攻击者将恶意脚本注入到其他用户的浏览器中。

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)

目录 1. 打开浏览器开发者工具 2. 使用 Network 面板 3. 查看具体的API请求 a. Headers b. Payload c. Response d. Preview e. Timing 4. 实际操作步骤 5. 常见问题及解决方法 a. 无法看到API请求 b. 请求失败 c. 跨域问题(CORS) 作为一名后端工程师,理解前端如何调用接口、传递参数以及接收返回值是非常重要的。下面将详细介绍如何通过浏览器开发者工具(F12)查看和分析这些信息,并附带图片案例帮助你更好地理解。 1. 打开浏览器开发者工具 按下 F12 或右键点击页面选择“检查”可以打开浏览器的开发者工具。常用的浏览器如Chrome、Firefox等都内置了开发者工具。下面是我选择我的一篇文章,打开开发者工具进行演示。 2. 使用

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例)

Cursor+Codex隐藏技巧:用截图秒修前端Bug的保姆级教程(React/Chakra UI案例) 前端开发中最令人头疼的莫过于那些难以定位的UI问题——元素错位、样式冲突、响应式失效...传统调试方式往往需要反复修改代码、刷新页面、检查元素。现在,通过Cursor编辑器集成的Codex功能,你可以直接用截图交互快速定位和修复这些问题。本文将带你从零开始,掌握这套革命性的调试工作流。 1. 环境准备与基础配置 在开始之前,确保你已经具备以下环境: * Cursor编辑器最新版(v2.5+) * Node.js 18.x及以上版本 * React 18项目(本文以Chakra UI 2.x为例) 首先在Cursor中安装Codex插件: 1. 点击左侧扩展图标 2. 搜索"Codex"并安装 3. 登录你的OpenAI账户(需要ChatGPT Plus订阅) 关键配置项: // 在项目根目录创建.