第 3 篇
工程技术
事实、推断和未知:为 AI 的工程判断划定边界
结合实际开发项目,讨论事实、推断和未知:为 AI 的工程判断划定边界,说明设计理由、关键源码、验证方法及适用边界。
本文目录 · 8 节
本文属于 Memory Center:AI 编程上下文与记忆系统工程实践,第 03 篇,位于“问题与设计思想”模块。案例背景统一采用实际开发项目;复现步骤使用脱敏教学样例,不代表特定生产事故。
从实际问题出发
没有搜索结果,可能是内容不存在,也可能是项目未索引、文件解析失败或查询被截断。把这些情况统一说成“没有调用方”,会让后续删除和重构建立在错误前提上。
负向断言需要更强条件
找到一个声明即可证明该声明存在;要证明没有任何调用方,需要先说明搜索范围和覆盖条件。因此返回 NOT_FOUND 之外,还应提供 coverage、truncated 与 negative_claim_allowed 等边界。

图中展示的是本篇关注的职责和顺序。正常流程之外,还要结合下面的源码与实验检查失败分支;它不是对某次线上调用的运行时追踪。
置信度不能替代验证
解析得到的声明、类型推断的调用、名称相似的关联,其证据强度不同。高分只表达某种规则的把握,不能证明程序运行符合预期。文章应将静态推断与测试结果分列,避免用一个数值掩盖不确定性。
一个容易误用的响应
{
"state": "NOT_FOUND",
"symbols": [],
"coverage": {"complete": false},
"negative_claim_allowed": false
}
这是用于说明字段含义的响应片段,并非完整协议。它表达“在当前条件下没有取得目标证据”,不能改写成“实际开发项目中不存在这个符号”。读取者必须把状态和边界一起解释。
关键源码与阅读方法
源码基线为 Memory Center 6e90553(文档标注 5.0.0b24)。定位:memory_center/platform/code_graph.py,函数 claim_boundary,起始行 312。
以下为当前基线中的函数代码;依赖项目模块,不能作为独立脚本执行。
def claim_boundary(graph, scope_unresolved=(), *, require_no_unresolved=False):
"""判断空结果能否作为否定结论,返回 (是否允许, 原因)。
只有在覆盖完整、且相关范围内没有未解析调用时,才允许断言“不存在”。动态分派、
继承/接口分派、匿名回调、外部依赖与跨语言调用都不会进入代码图,因此默认不放行,
否则调用方会把“未解析”误读成“无调用方”并据此删除代码。
"""
incomplete = sorted(path for path, value in graph['coverage'].items() if value['status'] != 'parsed')
if incomplete:
return False, f'{len(incomplete)} 个文件未完整解析(例如 {incomplete[0]}),覆盖不完整'
if scope_unresolved:
return False, f'锚点仍有 {len(scope_unresolved)} 个未解析调用(动态分派或外部依赖等)'
if require_no_unresolved and graph['unresolved']:
return False, f'索引范围内仍有 {len(graph["unresolved"])} 个未解析调用,可能隐藏调用方'
return True, ''
阅读时先找输入由谁提供,再区分纯计算、读取和写入;遇到异常或提前返回,追问调用方会得到什么,以及已有状态是否仍然有效。上面的代码只证明展示范围内的实现,跨模块行为应继续查看调用处和相应测试。
用一个小实验核对设计
建议在独立临时目录和隔离数据中操作,使用虚构的接口、文档与项目名称。
- 建立正常文件和故意损坏的示例文件。
- 查询一个未出现的符号。
- 对比覆盖完整与不完整时的否定结论。
**要核对的结果:**部分覆盖时应明确限制结论;不能因为 symbols 为空就认定安全。
可把观察记录为下表;没有执行的项写“未执行”,不能用设计预期冒充实测结果。
| 核对项 | 应保留的证据 |
|---|---|
| 使用条件 | 源码版本、配置、输入与项目范围 |
| 正常行为 | 实际返回、来源位置或状态变化 |
| 关键失败分支 | 错误码、可见结果与原状态是否保留 |
| 结论范围 | 已覆盖、未覆盖和需要进一步验证的条件 |
适用边界与继续阅读
本篇以静态源码与项目设计为依据,给出可执行的核对方法,未据此宣称已经完成新的性能或生产环境测试。不同版本的入口、默认值和底层实现可能变化,应先核对当前合同,再把方法用于自己的实际开发项目。
理解这一节后,可以回到专题总导航,沿同一模块继续阅读;顺序学习时使用专栏内的上一篇和下一篇。涉及具体技术选择,应连同本篇的代价与限制一起采用。