GitHub Copilot 智能体记忆系统设计与实现
我们的愿景是将 GitHub Copilot 发展为一个由多个智能体组成的生态系统,在整个开发生命周期中协作——从编码和代码审查,到安全、调试、部署和维护。要释放多智能体工作流的全部潜力,我们需要超越彼此孤立、每次会话都从零开始的交互方式,转向一个随着每次使用不断积累的知识库。
跨智能体记忆使各类智能体能够在整个开发流程中基于经验进行记忆和学习,而无需依赖用户的明确指示。每一次交互都会让 Copilot 更加了解你的代码库和约定,使其随着时间推移变得越来越高效。例如,当 Copilot 编码智能体在修复安全漏洞时学会了你的仓库如何处理数据库连接,Copilot 代码审查智能体之后就可以利用这些知识,在未来的拉取请求中识别不一致的模式。
目前 GitHub Copilot 中的记忆功能已进入公开预览,首先支持 Copilot 编码智能体、Copilot CLI 和 Copilot 代码审查。该功能默认关闭,完全自愿启用,你可以在设置中开启。这意味着你决定何时以及在何处让 Copilot 开始从你的工作流中学习。
挑战:记住什么,以及何时遗忘
我们的智能体在持续提升提取特定任务所需上下文的能力。记忆系统的核心挑战并不在于信息检索,而在于确保任何存储的知识在代码随分支和时间演变的过程中仍然有效。
在实践中,这意味着记忆系统必须处理代码变更、被放弃的分支以及相互冲突的观察结果——同时确保智能体仅基于与当前任务和代码状态相关的信息采取行动。例如,在某个分支中观察到的日志约定,之后可能被修改、替代,甚至根本未被合并。
一种选择是实现离线整理服务,用于去重、解决冲突、跟踪分支状态并清理过时信息。然而在 GitHub 的规模下,这种方式会引入显著的工程复杂性和 LLM 成本,同时仍然需要在读取时进行变更协调。因此我们首先探索了一种更简单、更高效的方法。
解决方案:即时验证
信息检索是一个非对称问题:解决它很难,但验证它却很容易。通过使用实时验证,我们既能获得预存记忆的优势,又能避免过时或误导信息的风险。
我们不进行离线记忆整理,而是以带引用的方式存储记忆:每条事实都附带支持该事实的具体代码位置引用。当智能体遇到存储的记忆时,它会实时验证这些引用,在使用前确认信息在当前分支中仍然准确且相关。这种验证仅需少量简单的读取操作,在我们的测试中不会为智能体会话带来显著延迟。
将记忆创建作为工具调用
我们将记忆创建实现为一个工具,当智能体发现某些信息可能对未来任务具有可执行意义时,可以调用该工具。
考虑以下示例:在审查一位资深开发者的拉取请求时,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."


