核心问答先掌握这 20 题
EachOf:30 分钟抓重点
先读每题的短回答。被继续追问,再展开原理和实现。第一轮先看 1、2、4、5、6、11、12、14、16、20。
一、先把项目讲明白
01用一分钟介绍 EachOf。
EachOf 是我做的 AI 长期记忆项目,用来保存项目背景、偏好、决定和来源,让不同会话、不同 Agent 按权限接着使用。写入由 Python 处理器提取候选、Go Core 校验入库;读取采用关键词和向量混合检索。重点是信息纠正或撤销后,检查旧结论和缓存答案还能不能继续使用。
继续追问时怎么说
用一个例子收尾:之前决定“日志保留 30 天”,后来改成“7 天”。新 Agent 要能查到新规则,基于旧规则生成的结论也要检查是否失效。
准备自己的贡献:补充你实际负责的模块、解决的一次具体故障和验证方式。不要把所有仓库功能都说成自己独立完成。
查看对应实现讲解
02AI 记忆是怎么实现的?要重新训练模型吗?
不需要每记一条信息就重新训练模型。做法是把重要信息持久化到外部数据库,新问题来了再检索相关内容,放进模型这次的上下文。记忆服务负责存和查,Agent 或应用负责把结果提供给模型。
继续追问时怎么说
基本流程:提取 → 存储 → 检索 → 提供上下文。数据库里有数据,不等于模型已经知道;还要真的把检索结果传给它。
可以类比开卷答题:数据库是资料库,上下文是这一次放到桌上的材料。
查看对应实现讲解
03和普通 RAG、聊天记录有什么区别?
RAG 主要描述“先检索资料,再生成回答”的过程,EachOf 也会用到。EachOf 还管理长期信息的来源、状态、权限、纠正和撤销。聊天记录是原始历史,其中的猜测、旧方案和确认决定不能都当成当前事实。
继续追问时怎么说
例如“我考虑用 MySQL”与“最终决定用 PostgreSQL”,都可能出现在聊天里;长期记忆需要区分试探和确定决定。
成熟 RAG 系统同样可以实现版本和权限管理,所以要比较具体能力,不要声称所有 RAG 都只会存文档。
查看对应实现讲解
04项目架构是什么,为什么 Go + Python?
Go Core 负责接口、权限、检索、任务调度和正式写入;Python 负责抽取、向量化等模型计算。PostgreSQL 保存数据,pgvector 支持向量检索,S3 兼容存储放原始对象。分开后能独立替换和重启处理器,代价是增加部署和协议维护成本。
继续追问时怎么说
最关键的边界:处理器不能直接连接数据库,只能交候选结果,由 Core 校验提交。这样算法变化不必获得平台全部写权限。
Next.js Console 给人查看和纠正;API / SDK / MCP 给程序和 Agent 调用。
查看对应实现讲解
二、Embedding:最容易被继续问的原理
05Embedding 到底是什么?
Embedding 是用模型把文本转换成一组数字,也叫向量。这个向量用于表达文本特征,让意思接近的文本在向量空间里更容易被找到。例如“怎么减少启动耗时”和“冷启动优化”用词不同,但语义相关。
继续追问时怎么说
教学示意:一句话变成 [0.12, -0.35, 0.81, …]。真实维度由模型确定,常有几百或几千维。
每个数字不是人工规定的“速度”“Android”等标签,而是模型学到的特征。相似度高只说明表达相关,不能证明事实正确。
查看对应实现讲解
06Embedding 的原理是什么?文字怎么变成数字?
以常见文本 Embedding 模型为例:先把文字切成 token,再用 Transformer 编码,得到带上下文信息的 token 向量;最后通过平均池化、取特定位置等方式得到整段文本的向量,有时还会做归一化。训练时常用对比学习,让相关文本靠近、不相关文本远离。
继续追问时怎么说
分词:把文本转成模型能识别的 token 编号。
编码:Transformer 的注意力机制让一个 token 的表示结合周围内容。例如“苹果手机”和“苹果很好吃”,相同词会有不同上下文表示。
池化:把多个 token 表示变成一个句子表示。具体模型可能用平均、CLS、最后一个 token 等方式,不能断言全部都取平均。
对比学习:用“查询—相关文档”等正样本和负样本调整模型参数,形成适合检索的向量空间。不是你存资料时现训练,也不是你在 EachOf 里从零训练了一个模型。
07怎么比较两个向量的相似度?
常见方法有余弦相似度、点积和欧氏距离。余弦相似度比较向量方向,越接近 1 通常表示方向越接近。实际选择要匹配模型的训练方式和推荐配置。
继续追问时怎么说
cos(a,b) = (a·b) / (||a|| × ||b||),即点积除以两者长度。非零向量的余弦范围为 -1 到 1,它不是“正确概率”。
两个向量都归一化为单位长度后,点积等于余弦相似度。pgvector 的 <=> 返回余弦距离,即 1 - 余弦相似度,距离越小越近。
“相似度多少算相关”没有通用阈值,需要结合模型和数据验证。
08查询和资料为什么要用同一套 Embedding?换模型怎么办?
查询向量与资料向量必须来自兼容的向量空间,通常用同一个模型和版本,并遵守各自的查询、文档编码规则。只要维度一样,仍不代表可以混用。更换不兼容模型时,需要重新生成资料向量并完成索引迁移。
继续追问时怎么说
有些模型要求 query 和 document 用不同前缀或入口;它们仍属于经过配套训练的空间。
EachOf 已有机制:查询服务与 Core 检查模型身份、版本、维度、向量长度及数值有效性。换模型时可以设计新旧索引并行重建与切换,但不要未经核对就称它已是项目完整上线流程。
查看对应实现讲解
09向量检索为什么快?HNSW 是什么?
向量很少时可以逐条计算距离,叫精确检索。数据量大时可用近似最近邻索引减少比较。HNSW 把向量连成多层邻近图,先在上层快速找到大致区域,再向下层寻找更近的结果,用一部分召回率换速度。
继续追问时怎么说
参数理解:m 影响图连接数量;ef_construction 影响构建时搜索范围;ef_search 影响查询时搜索范围。增大范围通常提高找到近邻的机会,也增加计算或内存成本。
HNSW 是通用原理。本项目是否使用索引、索引是否生效,要看当前维度、数据库配置和执行计划,不能声称每次查询都走 HNSW。
10Embedding、Reranker、生成模型有什么区别?
Embedding 把问题和资料分别编码,适合从大量资料里快速找候选。Reranker 把问题与少量候选一起评估,用于更细地重排。生成模型再结合选出的资料组织答案。它们分别解决“找候选、排顺序、写答案”。
继续追问时怎么说
常见两阶段设计是先召回几十条,再精排到几条,但条数要按预算调整。
项目口径:EachOf 已有混合检索与排序;不能直接把“独立 Cross-Encoder Reranker 已上线”说成事实,本次没有核实该实现。可以把它作为排序不足时的候选改进方案。
查看对应实现讲解
三、项目具体实现:讲清数据怎么走
11一条记忆具体怎么写进去?
请求进入 Core,创建 Operation 和内部 Task。Python Worker 领取任务,从输入里提取候选记忆,再交回 Core。Core 检查候选结构、任务、来源与策略后幂等入库;当前抽取实现先标为 suggested,后续确认。需要检索的内容还会生成对应向量。
继续追问时怎么说
说清输入输出:输入是对话或资料;中间结果是候选陈述;正式保存的是内容、Space、来源、状态、时间等数据。网页场景还可能有抓取、合并和归纳任务。
代码入口:core/internal/operations/commit.go 中的 DefaultCommitter.Commit、commitExtract。
“请求已接收”只代表开始处理,不代表抽取和向量化已经完成。
查看对应实现讲解
12用户问一句话,项目怎么找回记忆?
先确认调用者能访问哪些 Space;关键词检索查明确词语,查询 Embedding 则用于查语义相近的内容。合并排序后,只返回权限允许、来源可用、状态和版本仍适用的记忆,并控制条数与 token 预算。Agent 再把这些内容用于当前回答。
继续追问时怎么说
写入与读取的区别:资料向量通常预先生成并存储;用户问题的向量在查询时生成。真实模型场景使用独立查询向量服务的同步调用。
代码入口:handlers_memories.go 的 Recall,以及 memory/service.go 的 RecallProjection。
权限与有效性可以在多个层次校验,不能先让无权限内容进入上下文,再靠模型忽略它。
查看对应实现讲解
13为什么混合检索?具体怎么融合?
关键词检索擅长型号、API 名称等准确词语,向量检索擅长同义表达。EachOf 当前排序实现采用多信号加权:综合关键词、语义、有效时间匹配、使用反馈和来源可信度,置顶还有加分。新近程度用于分数近似相同的结果之间排序。
继续追问时怎么说
追问 RRF:对每路结果按排名贡献分数,形式为 Σ 1 / (k + rank),再求和排序;这样不必直接比较不同通道的原始分数。
讲项目时:目前已核对 EachOf 使用混合召回与排序,但本次没有逐行核对融合公式、权重和候选数。上面的 RRF 是可解释的通用方案,不要硬说就是项目现用实现。
查看对应实现讲解
14记忆改了以后,旧答案如何失效?
记录派生结论依赖的来源及语义版本。比如“保留 30 天”改成“7 天”,来源版本变化,依赖旧版本的结论就不能继续当成当前事实;答案缓存也要检查引用依据。后台可以重新计算,读取时先避免返回已无效的旧结果。
继续追问时怎么说
并发例子:Worker 正在用版本 1 计算,用户改成版本 2。提交时要比较快照与当前版本,避免迟到的结果把旧事实重新写回来。
代码线索:candidate_refs.go 检查 SemanticRevision;读取/提交路径检查 IsClaimInferenceCurrent。
这正是“改数据库的一行”之外需要处理的工程问题。
查看对应实现讲解
15数据怎样隔离?MCP 又负责什么?
Space 是共享和权限边界,Core 根据调用者身份与授权限制读写范围。MCP 让 Agent 通过标准协议调用记忆能力;它负责接入方式,权限和数据规则仍由 Core 执行,也不保证 Agent 会自动调用或正确使用记忆。
继续追问时怎么说
连接同一服务的两个 Agent,可能有不同授权、查询和上下文预算,因此不一定得到同样内容。
撤销权限后,应限制后续受控读取;已发给外部 Agent 的文本,不能保证从对方历史或文件里自动删除。
查看对应实现讲解
四、工程追问与效果验证
16Worker 崩溃了怎么办?任务重复执行怎么办?
任务有租约和心跳,Worker 失联后可以重新分配。重试可能导致重复执行,所以采用“至少一次执行 + 幂等提交”:允许计算重做,但重复提交不能重复产生权威记录。旧执行者迟到的结果还要检查资格和来源版本。
继续追问时怎么说
网络回复丢失时,客户端不知道提交是否成功,这就是重复请求很常见的原因。幂等关注业务副作用,不保证模型每次输出相同。
抽取提交中使用确定性标识和已存在检查等方式处理重复写入。Operation 的同一幂等键配同一请求可复用原操作,换了输入则应冲突。
查看对应实现讲解
17为什么撤销要用事务和 Outbox?
撤销时,把撤销状态、日志和待处理事件一起持久化,避免“状态已经改了,后续通知却丢了”。读取先根据撤销状态阻止使用,后台再消费事件做隔离、索引清理等工作。
继续追问时怎么说
Outbox 就是数据库里的待处理通知记录。事务保证业务变更和通知记录一起成功或失败,后台通过重试继续处理;消费者仍要能应对重复事件。
不要等后台完成物理清理才停止返回已撤销数据。
查看对应实现讲解
18为什么 PostgreSQL + pgvector?为什么不单独用向量库?
项目既要管理关系、权限、版本、任务和事务,又需要向量检索,PostgreSQL + pgvector 可以把这些能力放在较统一的数据体系里,减少多套存储同步的复杂度。代价是向量规模、索引内存和混合查询性能仍要实测。
继续追问时怎么说
独立向量库可能更适合某些大规模或特定检索负载,但会增加部署与一致性处理。技术选择要结合实际规模,不要说一个方案永远更快。
原始对象放 S3 兼容存储,数据库保存相应元数据和关系。
查看对应实现讲解
19如果检索慢、效果差或者模型服务挂了,怎么处理?
慢就分段量耗时:查询向量生成、数据库检索、融合过滤、答案生成;效果差就检查资料是否入库、向量是否匹配、候选是否找到、正确结果是否排得太后。EachOf 查询向量服务失败时会降级为关键词召回,并返回语义通道不可用标记。
继续追问时怎么说
优化思路:固定数据测召回质量;检查索引与执行计划;减少无效候选;必要时考虑精排。改变模型、过滤或缓存时,要重新验证权限和旧内容失效。
Embedding 不应因服务失败就偷偷换不兼容模型,继续与旧向量比较。
查看对应实现讲解
20怎么证明项目有效?能说哪些结果?
分别检查机制正确、检索找得准、回答用得对、真实任务有收益。检索看 Precision@K、Recall@K、MRR;机制看越权、撤销、版本变化和重复提交等测试。过去的小样本提升必须带上模型、基线和数据条件,不能直接说整体准确率或竞品领先。
继续追问时怎么说
简单记:Precision 看“返回的有多少对”;Recall 看“该找的找回多少”;MRR 看“第一条相关结果排多前”。
前 5 条有 4 条相关,Precision@5 是 80%。如果全部应找回的有 10 条、其中找回 4 条,Recall@5 是 40%;具体评测也可能采用查询级命中口径,需说明定义。
本次读取的仓库调查记录过排序与评测适配问题。可以讲这些实际发现和后续改进,不把历史“提升 3.75 个百分点”无条件当作当前结论。
查看对应实现讲解
项目依据沿用已核对的 EachOf 版本 7b1cc48;算法常识与当前项目实现已分别说明。代码入口 · 完整来源
原理参考:Sentence Transformers 模型结构 · 对比学习 · pgvector 距离与索引
01 · 基础15 分钟
AI 记忆到底是什么
AI 长期记忆的基本做法:把值得保留的信息存到外部,回答新问题时再找出相关部分,提供给模型。
先把模型当作“拿着材料回答的人”
你向模型提问时,应用会把问题、指令、相关历史等组成一份输入材料。这份材料叫上下文(Context)。模型根据这份材料和训练时学到的能力生成回答。
普通推理调用不会因为你说“我主要写 Java”,就自动把这句话永久写进模型参数。下一次调用能否知道,取决于应用有没有重新提供相关信息,以及它使用了什么记忆机制。
四个容易混淆的东西
| 概念 | 通俗理解 | 例子 |
|---|
| 模型参数 | 训练后形成的能力与知识 | 模型知道 Java 的基本语法。 |
| 上下文 / 短期工作记忆 | 这次回答拿到的材料 | 当前对话中的问题、近期消息、工具结果。 |
| 长期记忆 | 跨会话保存、可按需找回的外部信息 | “这个项目使用 PostgreSQL”以及来源和时间。 |
| 聊天记录 | 发生过什么的原始记录 | 几十页对话;其中只有一部分值得提炼成记忆。 |
为什么不把所有聊天都塞回去
输入长度有上限,传入更多内容通常也增加成本和处理时间。大量无关、重复、已过时的信息还会干扰回答。例如旧方案和新方案一起放进去,却没有说明哪个仍有效,模型可能选错。
所以长期记忆需要做两件事:保存有价值的信息;在当前问题下选出仍然适用的信息。
记忆的四个基本动作
- 提取:从“聊了很多内容”中选出可能长期有用的陈述。
- 存储:保存文字,以及属于哪个项目、来自哪里、何时有效等信息。
- 检索:新问题来了,查找相关且允许使用的记忆。
- 提供上下文:把选中的记忆交给 Agent 或回答流程,由其用于生成回复。
RAG、记忆、Agent 的关系
RAG 即检索增强生成:先查资料,再让模型结合资料作答。长期记忆可以采用这条读取路径,同时还需要管理信息如何写入、纠正、过时和撤销。
Agent 可以理解为围绕模型运行的一套程序:接收目标、调用工具、观察结果、继续行动。EachOf 提供可调用的上下文能力;Agent 负责何时调用,以及如何使用结果。
自查:存进数据库后,模型就自动知道了吗?
没有。还需要应用或 Agent 发起检索,并把返回内容放进模型本次输入。存储、返回、实际使用,是三个不同环节。
02 · 完整例子15 分钟
用一个故事贯穿全过程
下面是教学示例:你在做一个“座舱资料助手”,先决定日志保留 30 天,后来调整为 7 天。所有示例记录与数值只用于解释机制。
第一天:记下一条项目决定
你说:“这个项目的诊断日志保留 30 天,方便排查偶发问题。”
- 把这段信息交给 EachOf,并指定“座舱资料助手”这个 Space。
- 处理器提取候选陈述:“诊断日志保留 30 天”。
- Core 校验候选与来源,把它写成带状态的记忆。抽取内容最初是
suggested,不能直接当作已确认事实。 - 确认后,后续有权限的 Agent 可以查询到它。
第二天:换一个 Agent 继续
你问:“帮我设计日志自动清理方案。”新 Agent 通过接入的工具查询项目记忆,EachOf 返回“保留 30 天”及相关来源信息。Agent 再结合当前任务给出方案。
这里需要同时满足:Agent 连接到了 EachOf、有该 Space 的权限、发起了查询,并实际使用返回的上下文。仅仅安装服务,不代表所有 AI 会自动共享记忆。
第三天:决定调整为 7 天
你把记忆改成“保留 7 天”。假设系统之前根据旧记忆产生过派生结论:“30 天以前的日志可以清理”。这条结论的依据已变化,需要退出当前可用结果,等待重新计算。
同样,如果曾缓存“日志保留多久?”的答案“30 天”,也不能只看缓存还在就返回。系统需要重新检查引用的记忆和版本。
第四天:撤销一份资料的使用授权
你撤销了某个来源。系统应立即阻止后续受控检索继续使用由该来源支撑的相关内容,后续再异步做索引清理、隔离和对象清除。
用一张表记住整个故事
| 动作 | 系统关心什么 | 能讲出的价值 |
|---|
| 记住决定 | 来源、范围、状态 | 知道保存的是什么,以及依据在哪里。 |
| 换 Agent 使用 | 权限、相关性、上下文预算 | 新会话按需继续。 |
| 纠正决定 | 源版本、推导依赖、缓存引用 | 减少旧事实继续影响新回答。 |
| 撤销来源 | 授权状态、受影响链路 | 停止后续受控使用。 |
自查:只把“30 天”那一行改为“7 天”,为什么还不够?
旧事实可能已经被用于生成其他结论和缓存答案。源记忆、派生内容、答案缓存需要保持一致,否则用户看到的仍可能是“30 天”。
本章依据:docs/architecture/overview.md · core/internal/operations/commit.go · core/internal/operations/candidate_refs.go
03 · 数据对象12 分钟
Memory、Space、Connection
Memory 是记住的陈述,Space 是组织与授权边界,Connection 是与外部应用、Agent 或人的连接。
| 对象 | 怎么理解 | 教学例子 |
|---|
| Memory | 一条持久化陈述,带内容、时间、来源、状态 | “诊断日志保留 7 天”。 |
| Space | 记忆、来源和授权所在的范围,也是分享和导出的单位 | “座舱资料助手”项目。 |
| Connection | 外部读写参与方的连接 | 一个 Agent、一个资料来源、一个成员。 |
一条记忆为什么需要这么多附加信息
只有一句话,你很难知道它属于哪个项目、谁说的、是否还有效、是不是模型猜的。附加信息用来回答这些问题。
// 教学数据结构,非 EachOf 接口的精确字段定义
{
id: "m-log-policy",
content: "诊断日志保留 7 天",
space: "座舱资料助手",
source: "已确认的项目决定",
status: "confirmed",
validSince: "2026-09-20",
recordedAt: "2026-09-23",
semanticRevision: 2
}
六种对外状态
| 状态 | 含义 | 怎么处理 |
|---|
| suggested | 抽取出来,尚未确认 | 作为待审内容,不展示成定论。 |
| confirmed | 经人、规则或可信来源确认 | 仍要检查权限、时效和来源。 |
| contested | 存在冲突 | 保留冲突信息,不能擅自当成一致事实。 |
| outdated | 已不再是当前事实 | 保留历史,避免用于当前事实回答。 |
| revoked | 来源或授权被撤销 | 限制后续使用。 |
| deleted | 按策略删除 | 可能仅保留不可恢复内容的审计锚点。 |
两个时间,解决两类问题
有效时间:事实在现实里何时成立。记录时间:系统何时得知或记录这件事。
例:9 月 20 日开始改成保留 7 天,但 9 月 23 日才录入。问“9 月 21 日实际是什么规则”,应看有效时间;问“9 月 21 日系统当时知道什么”,应看记录历史。迟到的信息让这两个时间有了不同意义。
自查:Space 和普通文件夹有什么差别?
文件夹可以只是分类;EachOf 的 Space 还参与访问授权、共享、检索范围和导出。属于哪个 Space 直接影响谁能读写。
本章依据:docs/product/model.md · README.md
04 · 架构分工20 分钟
把整体架构讲清楚
Go Core 管平台规则和正式写入;Python 处理器做抽取、向量化等计算;PostgreSQL 保存状态与记忆;客户端通过 API、SDK 或 MCP 使用这些能力。
人:Console · 开发者:SDK / API · Agent:MCP
统一进入平台的鉴权与业务路径
Go Core权限 · 检索 · 任务调度 · Trusted Commit · 撤销
PostgreSQL + pgvector记忆、权限、状态、任务与向量
Core 向处理器提供限定输入,处理器返回候选结果
Python Processor · 抽取 / 向量化 / 合并 / 归纳
每一层具体负责什么
| 模块 | 职责 | 可用的类比 |
|---|
| Go Core | HTTP、身份与授权、检索、任务租约、校验和正式写入 | Android 里负责规则与状态的服务层。 |
| Python Processor | 处理限定输入,调用模型,返回候选结果 | 后台计算执行者;结果仍要经过业务校验。 |
| PostgreSQL | 保存结构化数据、关系、事务与查询状态 | 持久化事实与关系的数据库。 |
| pgvector | 让 PostgreSQL 能保存和比较向量 | 为数据库增加语义检索能力的扩展。 |
| S3 / MinIO | 保存原始文件等对象 | 原始附件所在的对象仓库。 |
| Next.js Console | 供人查看、纠正记忆和管理连接 | 用户操作这些能力的界面。 |
| MCP / SDK / API | 为 Agent 或程序提供调用入口 | 不同调用方式访问同一套核心规则。 |
为什么 Go 和 Python 分开
平台层需要稳定地处理权限、状态、并发和存储;模型处理层需要接入不同算法与模型。通过有版本的协议分开,可以独立替换或重启处理器。处理器离线时,已提交记忆的读取、撤销和任务查看仍应可用。
代价也要说出来:多一个运行时,就多一份部署、接口版本和故障定位成本。分层是否值得,取决于是否需要这些隔离和扩展能力,不能只说“Go 快、Python 适合 AI”。
一个容易讲错的细节:查询向量怎么生成
写入时的向量化属于后台处理任务。读取时,用户问题需要及时转换成查询向量;真实模型场景使用独立的私有 Python 查询向量服务,通过有超时限制的同步调用完成。
这个查询服务没有数据库写权限,也不是异步任务 Worker。它失败时,语义检索通道不可用,关键词检索仍继续,并返回降级标记。
自查:Processor 全部停了,是不是整个系统就不能用了?
已有正式记忆的读取、授权撤销和任务检查仍应可用。新内容的抽取等后台任务会受影响;真实查询向量服务是另外一条依赖,失败时只降级语义检索通道。
本章依据:docs/architecture/overview.md · docs/architecture/query-embedding-service.md
05 · 写入链路20 分钟
一条记忆如何写进去
外部请求先变成可追踪的操作,后台处理器产生候选内容,Core 再校验并完成正式写入。
先认清 Operation 和 Task
Operation:用户发起的一次完整操作,例如“记住这个网页”。Task:完成该操作的一项内部工作,例如抓取、抽取、向量化。
一个操作可以拆成多项有前后依赖的任务。所有任务加起来形成一张有向无环图,简称 DAG。类比 Android:提交一项完整后台工作,内部再组织若干有顺序或可并行的步骤;这里涉及跨进程与持久化,机制比进程内线程池更完整。
以记住网页为例
- Capture:取得资料,建立原始资源与事件记录。
- Extract:提取可长期保留的候选陈述。
- Concept / Embed:进行概念处理和向量化,部分步骤可并行。
- Consolidate:整合已有内容与新内容,减少重复或处理关系。
- Generalize:从具体信息中形成更一般的候选结论。
这是架构文档中的示例任务链,不意味着每一种写入请求都必须跑完全部步骤。
候选结果为什么不能直接入库
模型可能提取错,处理器也可能存在缺陷。更严重的是,计算期间权限或来源已经变化。处理器拿到输入时可以用,不代表交结果时仍然可以用。
因此处理器不能直接连接数据库,也不能自行写成权威记忆。它只交候选结果,Core 校验协议与结构、任务身份、来源、权限和策略,并按任务类型完成幂等写入。这一步叫 Trusted Commit。
“已接收”不等于“已经记住”
请求被接受后,操作可能仍在排队或处理中。客户端需要查看操作状态,判断最终成功、失败或需要重试。后台任务的失败不会把已经接受的那个 HTTP 响应重新变成失败响应。
自查:我应该如何用一句话解释 Trusted Commit?
“模型只提交候选结果,由核心服务检查权限、来源和数据约束,再按可重试、避免重复副作用的方式写入。”
本章依据:docs/architecture/overview.md · core/internal/operations/commit.go
06 · 检索与上下文22 分钟
怎么找回真正相关的记忆
召回先限制可访问和仍有效的数据,再结合关键词与语义检索找候选,排序后按预算返回相关内容与依据。
关键词检索:看你用了什么词
查询“pgvector 索引”时,包含这个专有名词的记忆通常很有价值。全文检索会把文本处理成适合搜索的形式,再匹配查询和评估相关性。不同语言的切词与配置会影响结果,中文不能默认与英文效果相同。
语义检索:看表达的意思是否接近
你问“以前决定把数据存在哪里”,记忆写的是“项目使用 PostgreSQL”。两句话用词不完全一样,但含义相关。Embedding 模型把文本转换成一组数字,即向量,让系统能够比较表达之间的接近程度。
混合检索怎么理解
关键词通道擅长处理明确词语;向量通道补充语义相近的候选。系统把两路结果合并、排序,再检查适用性。两路结合是可用策略,效果仍需要在实际数据上验证,不能自动推出一定比单路好。
一次读取,按这六步讲
- 识别调用者:确定其身份与有效授权。
- 限定范围:只允许目标 Space 中可访问的内容进入受控查询。
- 取得候选:关键词搜索,并在语义通道可用时结合查询向量搜索。
- 检查有效性:排除被撤销、过时、不再有有效推导依据等不适用内容。
- 组织上下文:排序,控制条数和 token 预算,附带来源信息。
- 交给使用者:Agent 或回答服务收到上下文,再用于当前任务。
这是便于讲解的逻辑顺序。实际代码可能在数据库查询、服务层、答案提交和缓存读取等多处重复校验,不能把安全约束只放在最后一步。
为什么要有 token 预算
Token 是模型处理文本的计量单位,与汉字或单词没有固定一一对应关系。找回 100 条记忆,并不代表都应塞进输入;上下文需要留给问题、指令和回答。预算限制让返回内容有明确上限。
Recall 和 Ask 有什么不同
Recall:找回相关记忆。Ask:结合可用记忆形成答案,需要处理引用、答案提交和可能的缓存。找回一条正确资料,并不等于最终答案一定正确。
自查:为什么“能搜到”还不够?
还要相关、授权范围正确、事实仍有效、来源未撤销,并且在上下文预算内。最终 Agent 是否使用、使用是否正确,还需要另外验证。
本章依据:docs/architecture/overview.md · docs/architecture/query-embedding-service.md · docs/benchmarks/recall-precision-investigation.md
基础延伸:PostgreSQL 全文检索
07 · 核心机制25 分钟
纠正、撤销与旧答案失效
记忆发生变化时,要同时考虑原记录、基于它产生的结论、缓存答案,以及后续读取是否还允许使用。
先分清三种关系
| 关系 | 回答的问题 | 教学例子 |
|---|
| 来源追溯(Provenance) | 这句话来自哪里? | “日志保留 30 天”来自一次已确认决定。 |
| 推导依赖(Dependency) | 这条结论建立在哪些记忆上? | “30 天前的日志可清理”依赖保留期规则。 |
| 答案引用(Citation) | 这次回答用了哪些依据? | “30 天”这个答案引用了规则记忆。 |
纠正:旧依据与新依据不是同一个版本
原记忆内容发生语义变化时,需要能区分修改前后。派生结果提交时携带它所依据的来源快照,Core 检查其中的版本等信息是否仍与当前来源匹配。
例:处理器拿到版本 1(30 天),运算期间用户改为版本 2(7 天)。处理器晚交的旧结论不能直接写成当前有效结论,需要按新投影重新处理。这就是防止“过时计算把旧事实写回来”。
读取现有派生内容和答案时也要检查依赖是否仍当前有效。仅在生成时校验一次,挡不住生成之后的变化。
撤销:先阻止使用,再处理清理
架构中的来源撤销使用短事务,把撤销标记(tombstone)、访问日志和 outbox 事件一起写下。受控召回立即排除被撤销来源影响的内容;隔离、重建索引与物理清理放到后台。
Outbox 可以理解为“和业务变更一起保存的待处理通知”。如果只改状态、再临时发一条通知,程序在中间崩溃,后续工作可能丢失;把通知也写进同一事务,后台就能继续读取并处理。
纠正、撤销、删除的区别
| 操作 | 改变什么 | 关注点 |
|---|
| 纠正 | 事实内容或有效时间 | 旧结论是否还成立,历史如何保留。 |
| 撤销 | 来源或授权的可用性 | 是否继续在未来受控调用中泄漏。 |
| 删除 | 按策略移除内容 | 实体数据与审计锚点的保留规则。 |
缓存也必须检查依据
“命中缓存”只说明以前算过。返回前还需要确认支持它的记忆没有被撤销、替换或变得不再有效。依据不可用时,应停止返回旧答案;需要时用当前上下文重新生成。
一致性的边界
立即:安全撤销后的后续受控读取不能继续使用该来源。最终完成:语义重新处理和后台清理可以稍后完成。系统有时暂时缺少新的派生结果,也应避免返回已经无效的旧结果。
另外,无法保证外部 Agent 已取得的文字被自动抹去;跨系统撤回需要接收方配合。
自查:撤销以后数据库里还能看到记录,是不是撤销失败?
不一定。逻辑上停止可用与物理删除是两件事。撤销标记、依赖关系或不可恢复的审计锚点可能保留;关键是相关内容能否继续通过应受限制的路径被获取。
本章依据:docs/architecture/overview.md · core/internal/operations/candidate_refs.go · core/internal/ask/current_state.go · core/internal/operations/commit.go
08 · 工程可靠性18 分钟
后台任务为什么能恢复
任务会失败、超时和重复执行,所以系统要能重新分配任务,并让重复提交不会造成重复副作用。
用“领任务”理解租约
一个 Worker 从 Core 领取 Task,同时取得有期限的执行资格,叫 Lease(租约)。处理期间发送 Heartbeat(心跳) 告诉 Core 自己仍在工作。进程崩溃或失联后,租约到期,任务可以重新安排。
这比“在内存里标记正在执行”更可靠,因为处理器或主机重启后,任务状态仍保存在外部。
为什么重复执行不可避免
Worker 做完了,提交请求的回复却在网络中丢失。Worker 无法判断服务端有没有成功,只能查询或重试。租约过期后,新旧 Worker 也可能短时间都以为自己在做同一项任务。
EachOf 的架构约束是任务至少一次执行(at-least-once),提交路径具备幂等性(idempotency)。它不等于任务永远只运行一次,而是重复交同一结果不会重复制造本应只有一份的权威数据。
幂等不只是加一个请求 ID
外部操作根据范围、类型、调用者、输入、有效策略等形成语义约束。同一个幂等键对应同一请求,返回原操作;同一个键被拿来提交不同请求,应报冲突。
在已查看的抽取提交实现中,陈述与事件采用确定性标识和已存在检查等方式处理重复写入。不同任务的幂等细节要按各自提交路径检查。
故障场景怎么解释
| 场景 | 机制 | 目的 |
|---|
| 处理器中途退出 | 租约、心跳、重新调度 | 工作不被永久卡住。 |
| 模型接口暂时失败 | 有限重试与失败状态 | 恢复短暂故障,同时避免无休止消耗。 |
| 结果提交两次 | 幂等提交 | 避免重复写入。 |
| 上游任务最终失败 | 依赖管理,取消受影响后继 | 不拿不存在的输入继续计算。 |
| 旧 Worker 晚交结果 | 任务/租约校验与来源版本检查 | 防止过期结果覆盖当前状态。 |
与你熟悉的 Android 怎么联系
可以把 Processor 类比为后台工作执行者,把 Core 调度器类比为管理任务生命周期的服务。但线程池只管理当前进程中的线程,不能直接提供跨机器租约、持久化任务和提交一致性。
自查:幂等能保证模型每次输出相同吗?
不能。模型输出是否一致与提交副作用是否重复是两回事。幂等关注同一业务操作重复请求、重复提交时,系统状态是否被重复或错误改变。
本章依据:docs/architecture/overview.md · core/internal/operations/commit.go
09 · 接入与使用18 分钟
Agent 怎样真正用上记忆
接入需要明确身份与 Space 授权,然后由 Agent 或宿主在合适时机调用 EachOf,将得到的上下文提供给模型。
API、SDK、MCP 各是什么
| 入口 | 适合谁 | 通俗理解 |
|---|
| HTTP API | 自行编写接入逻辑的程序 | 按照接口协议发请求、收响应。 |
| SDK | 使用支持语言的开发者 | 把接口调用封装成方法,减少手写请求。 |
| MCP | 支持该协议的 Agent 宿主 | 用标准方式发现和调用工具、获取上下文。 |
MCP 是接口协议。它不负责自动挑出高质量记忆,也不保证宿主一定调用某个工具。真正何时查、查什么、怎么用,仍由宿主和 Agent 工作流决定。
一次实际接入需要哪些步骤
- 运行服务并完成身份配置。
- 建立或选择 Space,明确允许访问的内容。
- 为 Agent 配置受限凭证和连接入口。
- 把记忆查询能力接入宿主,设定调用方式或显式触发。
- 确认结果真的进入模型上下文;更进一步检查回答是否正确使用。
- 验证撤销权限后,后续调用无法继续访问。
这是接入检查路径,不是可直接执行的完整部署命令;具体配置要遵循当前仓库与宿主版本。
Space updates、Pinned context、按需查有什么区别
| 能力 | 什么时候用 | 文档中的行为 |
|---|
| Continue / Space updates | 回来看看上次之后变了什么 | 返回上次成功查看以来的变化、决定变化、Agent 回执和待确认项。 |
| Standing / Pinned context | 明确请求一份常驻重点上下文 | 确认且当前有效的记忆投影,选择性启用。 |
| On-demand | 当前任务需要特定资料 | 有范围、有预算的显式检索。 |
| Deep history | 查看某条记忆的版本和状态历史 | 明确指定 Space 与 memory,限制条目数量。 |
Continue 不是任务执行断点。第一次查看建立比较边界;后续增量为空,不代表 Space 没有记忆。Standing 也不是每次请求都会自动附加。
什么是 Context Receipt
可以理解为一次上下文交付的回执,记录向 Agent 提供了哪些内容,便于追溯。已返回内容不能直接证明模型实际使用了它,更不能直接证明任务因此完成得更好。
自查:为什么两个 Agent 连接同一个服务,也不一定得到相同内容?
它们可能有不同身份、Space 授权、查询、时间和上下文预算。正确的共享建立在明确范围上,不是对所有连接公开全部记忆。
本章依据:docs/product/continuity.md · docs/architecture/overview.md
协议延伸:MCP 服务端能力概览
10 · 评估与边界20 分钟
怎样证明项目有效
分别验证“机制是否正确”“资料能否找对”“答案是否用对”“任务是否变好”。这四层证据不能相互替代。
四层验证
| 层次 | 要验证什么 | 例子 |
|---|
| 机制正确性 | 权限、纠正、撤销和重复提交是否按设计工作 | 撤销来源后,受控路径不再返回相关内容。 |
| 检索质量 | 能否找回相关资料,排序靠不靠前 | 相关记忆有没有进入前 5 或前 20。 |
| 回答质量 | 答案是否正确、依据是否有效 | 回答引用新规则,没有继续引用旧规则。 |
| 真实任务收益 | 使用者是否更快、更准确地继续工作 | 减少重复交代背景,提高跨会话任务完成率。 |
先理解三个指标
Precision@K:前 K 个结果里,相关结果占多少。示例:返回前 5 条,其中 4 条相关,Precision@5 = 4/5 = 80%。
Recall@K:全部应找回的相关资料中,前 K 条找回多少。示例:共 10 条相关资料,前 5 个结果覆盖 4 条,Recall@5 = 4/10 = 40%。某些问答评测用“有没有命中一个正确支持项”作为 recall@K 的查询级定义,必须读具体评测口径。
MRR:看第一条相关结果排第几。排第 1 得 1,排第 2 得 1/2,排第 5 得 1/5,再对查询求平均。它关心用户多快遇到第一条相关结果。
为什么指标会“看着进步,实际不可比”
换了数据集、模型、噪声量、K 值或“相关”的判定方式,数字就可能不能直接比较。例如按字符串出现判断相关,会把偶然命中当成功;按完整词覆盖判断,又可能漏掉同义表达。
所以讲任何提升,都要补充:相对哪个基线、在什么样本上、用什么模型、按什么规则、重复了几次。
当前资料怎么讲才准确
过往讨论中的“Precision@5 提升 3.75 个百分点”属于特定受控小样本、相对无衰减基线的结果,不能直接当作当前整体性能结论。本 Wiki 不把它放进默认项目讲述稿。
这次读取的仓库检索调查记录了 LoCoMo 场景下的排序不足,以及相关性判定规则与数据适配带来的评价限制;旧版 precision 与新版 recall 不能放在同一比较中。
一个可执行的演示验证清单
- 在 Space A 写入并确认一条规则,记录来源。
- 授权的 Agent 在新会话查询,检查是否返回该规则及依据。
- 把 30 天改为 7 天,再查询原问题,检查旧答案是否被阻止或替换。
- 撤销来源,再从召回和答案路径检查。
- 用仅能访问 Space B 的身份查询,检查是否隔离。
- 在测试环境重试同一操作,检查没有重复权威记录。
这是建议的验证脚本思路,本次没有执行。报告时附上环境、版本、输入、输出与测试结果,才能称为当次验证证据。
本章依据:docs/benchmarks/recall-precision-investigation.md · docs/architecture/overview.md
11 · 口述练习20 分钟
把项目讲成自己的话
先理解,再复述。下面讲述只覆盖当前读取到的架构与机制,不包含未经核实的个人贡献、企业生产规模或性能领先结论。
30 秒版:让不懂 AI 的人听明白
EachOf 是我做的 AI 长期记忆项目。使用 AI 做一个长期项目时,换了会话或工具,经常要重新解释背景。EachOf 把项目偏好、决定和依据保存起来,让有权限的 Agent 按需找回。用户也能查看、纠正和撤销这些记忆;来源变了以后,系统会检查旧结论和答案是否还能继续使用。
90 秒版:说明核心流程
EachOf 解决的是跨会话、跨 Agent 的项目上下文延续问题。它把长期信息组织成 Memory,放在有权限边界的 Space 中,通过 Connection 接入外部应用或 Agent。
写入时,Python 处理器提取候选记忆,Go Core 负责校验来源、权限和数据约束,再正式写入。读取时,结合关键词与向量检索,找出相关且仍有效的记忆,在预算内交给 Agent。
我关注的一个重点是记忆变化后的影响。比如日志保留规则从 30 天改成 7 天,不能只改原记录,还要检查基于旧版本产生的结论和缓存答案。架构上通过来源、推导依赖和版本校验处理这些问题;异步任务则用租约、重试与幂等提交提高可靠性。效果需要分别验证检索质量和实际使用收益。
3 分钟版:按照这五段展开
| 时间 | 讲什么 | 可以使用的句子 |
|---|
| 0:00–0:30 | 问题与定位 | “长期项目跨会话会丢背景,旧信息也可能继续误导新任务。” |
| 0:30–1:05 | 完整例子 | “先记住日志保留 30 天,换一个 Agent 设计清理任务,再把规则改成 7 天。” |
| 1:05–1:45 | 架构与数据流 | “Go 管权威状态,Python 产候选;PostgreSQL 与 pgvector 支撑数据和混合检索。” |
| 1:45–2:30 | 两个技术难点 | “变化之后如何阻止旧依据被继续使用;任务失败重试时如何避免重复提交。” |
| 2:30–3:00 | 验证与限制 | “分别检查权限、失效、检索和任务收益;外部已取得的内容不能假设自动收回。” |
卡壳时,回到这六个动词
记住 · 校验 · 找回 · 使用 · 纠正 · 撤销
每个动词解释一句,串起来就是完整项目。名词是为解释动作服务的。
技术选择怎么讲得有说服力
使用“需求 → 选择 → 获得什么 → 付出什么 → 怎么验证”这个顺序。例如:“需要计算与权威写入隔离,所以把 Python 处理器放在进程外,通过协议交结果;这样可替换和重试,但增加部署与协议维护成本;需要通过故障测试验证恢复行为。”
暂时不要这样表述
| 容易误导的说法 | 更准确的表述 |
|---|
| “模型已经学会了用户资料。” | “应用保存资料,在需要时提供给模型。” |
| “向量检索保证找到正确答案。” | “向量搜索返回语义相关候选,效果需要评估。” |
| “Trusted Commit 保证记忆真实。” | “它保证正式写入经过平台约束与校验。” |
| “撤销后所有 Agent 都忘了。” | “撤销限制未来的受控读取,外部副本另有边界。” |
| “已经证明全面优于竞品。” | “只有同条件、可复现的对照才支持性能比较。” |
闭卷练习:用日志保留期的例子,连续讲 90 秒。
检查是否说到了:写入不是立即确认;新 Agent 要主动接入并获取上下文;修改规则会影响派生结论和答案;撤销不能自动清除外部已获得副本。四点完整,比堆满术语更重要。
12 · 自查问答25 分钟
常见追问与直接回答
先口头回答,再展开。每道题的第一段直接回答问题,后面补充原因或例子。
1. EachOf 到底存的是什么?
保存与工作有关的长期陈述,例如偏好、项目决定、历史事实,以及对应的来源、状态、时间与范围。原始资料、抽取出来的记忆、推导关系是不同层次的数据。
2. 是不是把聊天记录全部存下来就行?
不够。聊天记录含有重复、试探、错误与过时内容,需要识别值得保留的信息,并知道它是否确认、属于哪个范围、何时有效。原始记录有追溯价值,但不能直接等同于可用事实。
3. EachOf 是怎么让 AI“记住”的?
把信息持久化,查询时找出相关且有效的部分,交给 Agent 作为上下文。它不要求为每次用户信息更新都重新训练模型。
4. 和知识库 RAG 有什么关系?
都能采用“检索资料再生成”的读取方式。EachOf 的产品重点还包括长期陈述的状态、来源、纠正、撤销、跨会话使用与迁移。成熟 RAG 系统也可能实现其中很多能力,所以区别应按具体功能和约束说明。
5. 为什么不用一个 Markdown 文件?
少量固定项目规则可以用 Markdown。需要按范围授权、追踪来源与版本、管理多条派生关系、支持多个调用方和受控撤销时,服务化的结构与校验才更有价值,同时也增加维护成本。
6. Memory 和数据库里普通一行有什么区别?
物理上可以由数据库记录承载;产品语义上,它还绑定来源、时间、状态、范围和关联关系,并经过写入与读取规则约束。价值来自这些行为及其一致性。
7. 为什么处理器不能直接写数据库?
防止处理器绕过权限、来源、版本和状态约束,也减少算法实现与数据库结构的耦合。处理器只提供候选,Core 决定能否正式写入。
8. Core 校验了,为什么还需要 suggested?
结构和权限校验不等于事实真实性校验。模型可能提取错,因此候选可以被正式记录为“待确认”,而不是直接标成已确认事实。
9. 为何不全用 Go 或全用 Python?
单一语言可以降低运维与协作成本。当前架构把平台状态和模型处理分开,分别使用 Go 与 Python,是为了独立运行与替换处理逻辑。回答应说明这项隔离带来的收益及额外复杂度。
10. 向量检索与关键词检索,选哪个?
当前架构采用混合检索,分别覆盖明确词语和语义表达。如何融合与排序、是否真的带来收益,要用具体数据验证;不是永远固定哪一路更好。
11. 查不到相关记忆怎么办?
应明确返回不足或无结果,由上层决定澄清、查询其他来源或使用通用知识,并区分依据。不能为了给出答案就编造项目事实。
12. Embedding 服务挂了怎么办?
真实查询向量服务失败时,语义通道不可用,关键词检索继续,返回 semantic_channel_unavailable 标记。调用方应知道结果来自降级路径。
13. 修改一条记忆,如何影响旧结论?
记录派生结论使用的来源及版本,当前版本不匹配或来源不可用时,把旧推导排除出当前有效结果,并按需要重新处理。答案缓存也要重新检查依据。
14. 撤销和重新算向量,哪个先做?
先让撤销对后续受控读取生效。向量重建、隔离和物理清理可以异步完成;不能等待后台计算结束才停止使用已撤销内容。
15. 已经把内容给了 Agent,还能撤回吗?
EachOf 可以限制未来访问,无法单方面保证外部 Agent 删除历史、日志和文件中的副本。这需要接收方协议和实现配合。
16. 租约到期时旧 Worker 恢复了怎么办?
需要校验它提交时的执行资格和候选依据,不能只因它曾领过任务就接受。任务可能重复运行,因此提交侧还必须保证幂等。具体拒绝与重试细节要追当前任务路径。
17. 幂等和事务有什么区别?
事务关注一组数据库操作的原子性与隔离等属性;幂等关注同一业务操作重复执行时的结果。一次事务成功后再收到相同请求,仍需要幂等约束避免重复业务副作用。
18. 为什么撤销事件放 outbox?
让业务状态变更和待处理事件一起持久化,降低“状态变了但通知丢了”的风险。后台消费者可以重试处理这些事件,也要处理重复投递。
19. Space 如何避免串数据?
身份与有效授权决定可访问范围,查询和后续返回、派生提交等路径需要保持该范围。不能只靠前端隐藏,也不能让模型自己决定哪些项目数据可以看。
20. MCP 会自动让模型调用记忆吗?
不会。MCP 提供标准接入能力,宿主与 Agent 决定是否、何时以及怎样调用。必须验证工具返回内容确实进入当前上下文。
21. 有访问回执就能证明记忆有用吗?
不能。回执证明交付了上下文。实际使用、使用正确、提高任务表现,需要额外的行为记录或端到端评估。
22. 为什么不直接说“准确率提升 3.75%”?
需要区分百分比和百分点,说明指标、模型、样本、基线及实验条件。过去的小样本 Precision@5 提升不能概括当前所有任务,也不能推出相对竞品领先。
23. 当前最值得继续优化什么?
根据本次读取的仓库调查,检索排序质量和评测数据适配是明确问题;同时应持续验证撤销、纠正和跨会话实际使用。具体优先级取决于当前实验和用户需求。
24. 怎么说明自己的个人贡献?
只讲自己真实完成并能追到代码或设计依据的部分。按“我负责什么、为何这样设计、遇到什么故障、如何验证”展开。本 Wiki 不替你推定每个模块都由你独立实现。
13 · 代码阅读25 分钟
从概念走到仓库
第一次读仓库,只追三个问题:候选在哪里被接受、记忆在哪里被返回、来源变化在哪里让旧内容失效。
不要从所有目录一起读起
写入路径:先读这几个位置
DefaultCommitter.Commit 先验证候选 JSON,再根据任务种类分发;commitExtract 把抽取出来的陈述置为 suggested,并采用确定性标识处理重复写入。
继续看 answerSupportingClaims:它在答案提交时检查引用的来源与记忆,过滤不可用依据,并调用 IsClaimInferenceCurrent 检查推导是否仍然当前有效。
语义版本:重点看什么
candidate_refs.go 中存在对来源快照 SemanticRevision 与当前记忆版本的比较。找出错误 ErrInferenceNeedsReprojection 的返回条件,再追调用者怎样重投影或重试。
不要只找到一个函数名就认定所有路径都安全。一次完整代码走查应把 HTTP、MCP、缓存、导出等实际相关读取路径分别列出来,查看它们是否复用或补足必要校验。
读不懂 Go 时,先找“边界”
- 输入:谁调用?参数来自用户、任务,还是处理器?
- 状态:读了哪些当前记录?是否可能并发变化?
- 校验:什么条件返回错误、跳过或重试?
- 写入:哪些字段被修改?重复执行会怎样?
- 输出:返回事实、候选、状态,还是上下文投影?
本章依据:core/internal/operations/commit.go · core/internal/operations/candidate_refs.go · core/internal/ask/current_state.go
14 · 速查按需查阅
术语速查与阅读来源
遇到生词时查这一页。先记住它在流程中做什么,再记住英文。
| 术语 | 一句话解释 |
|---|
| Context · 上下文 | 模型这一次实际获得的输入材料。 |
| Prompt · 提示 | 传给模型的指令与输入文本,通常构成上下文的一部分。 |
| Token | 模型处理文本的计量单位,不等同于固定数量的汉字。 |
| Agent | 围绕模型组织工具调用与任务执行的程序。 |
| Harness | 组织模型、工具、上下文、执行循环与运行约束的宿主框架。 |
| RAG | 检索相关资料,再让模型结合资料生成。 |
| Embedding | 把文本等输入转换成可比较的向量表示。 |
| Vector · 向量 | 一组数字,用于表示和比较特征。 |
| FTS · 全文检索 | 处理文本与查询,进行词语匹配和相关性搜索。 |
| Recall · 召回 | 项目动作指找回记忆;指标语境指相关资料被找回的比例。 |
| Projection · 投影 | 从完整状态中按权限、目的和预算形成一份有限视图。 |
| Candidate · 候选 | 处理器产出的、尚未通过平台提交校验的结果。 |
| Trusted Commit | 平台控制的、校验后的幂等正式写入。 |
| Provenance · 来源追溯 | 说明内容来自哪项资料、事件或证据。 |
| Lineage · 血缘链路 | 记录资源、事件、陈述及派生内容之间的关联。 |
| Semantic revision · 语义版本 | 区分内容语义发生变化前后的版本。 |
| Revocation · 撤销 | 使来源或授权不再可用于后续受控访问。 |
| Tombstone · 墓碑标记 | 保留“该对象已撤销或删除”的状态锚点。 |
| Operation / Task | 一次外部完整操作 / 一项内部执行工作。 |
| DAG | 任务依赖构成的有向无环图。 |
| Lease / Heartbeat | 有限时长的执行资格 / 仍在工作的续约信号。 |
| Retry / DLQ | 重试 / 无法继续自动处理任务的死信队列概念;是否使用要看具体任务实现。 |
| Idempotency · 幂等 | 重复同一操作不会重复产生不应重复的副作用。 |
| Outbox | 与业务变更同事务保存、供后台继续处理的事件记录。 |
| MCP | 为模型宿主接入工具与上下文提供标准的协议。 |
| Context receipt | 记录某次交付给 Agent 的上下文,不自动证明被正确使用。 |
项目来源
本 Wiki 以 shane654/eachof 的固定版本 7b1cc48e7d340bde18903cd025093847909d168a 为主要参考。链接指向当时读取的版本,后续仓库变化不自动更新本页。
基础阅读
项目源码链接可能需要你自己的仓库访问权限。
最后一次闭卷检查
现在合上页面,回答:“记忆从哪里来、由谁校验、怎么找回、变了怎么办、失败怎么办、如何证明有用?”这六个问题能连贯回答,你就已经能讲清项目主线。