视觉Agent在真实业务里出现的错误,往往不是模型完全不认识物体,而是它过于自信地补全了不存在的信息。比如一个工业质检Agent会把金属表面的高光区域识别为划痕,一个商品识别Agent会把两瓶包装相近的饮料判断为同一款。这类问题统称为视觉幻觉,本质是视觉编码器在压缩图像信息时丢弃了细节,而语言生成模块又倾向于根据统计模式填充缺失证据。要解决这个问题,单纯增加训练数据或调高分辨率效果有限,更实用的做法是在推理阶段引入检索验证:让Agent的每个关键视觉判断都经过外部证据库的比对和确认。

检索验证并不是新概念,它在文本问答里已经被广泛使用,也就是常说的检索增强生成。把同样的思路迁移到视觉任务中,难点在于视觉特征的相似性并不等于语义一致性。两张图片在像素层面很接近,可能对应完全不同的物体状态;而同一物体在不同光照、角度下的成像差异又很大。因此,视觉检索验证需要同时考虑特征向量距离、局部区域匹配和元数据约束,不能只依赖单一的相似度分数。
一、视觉幻觉从哪里来
视觉幻觉的第一来源是视觉编码器与语言模型之间的模态对齐损失。当前主流的多模态模型通常先把图像编码成一组向量,再把这些向量映射到语言模型的输入空间。这个映射过程会丢失大量空间信息和细粒度纹理特征。例如一张产品图上的微小裂纹,经过视觉编码后可能只占特征向量的极小分量,语言模型在生成描述时很难保留这种微弱信号。相反,模型熟悉的常见纹理、边缘和形状会被优先重建出来,于是原本不存在的划痕、字母或结构就被补全了。
第二个原因是训练数据的分布偏差。多模态模型在预训练阶段见过大量互联网图片,这些图片往往配有概括性文字,很少精确描述局部缺陷、临时遮挡或异常状态。因此模型倾向于给出平均化答案。当Agent面对一张带有轻微色差的零件图时,它可能直接回答颜色均匀,因为训练数据中绝大多数正常零件都是这种描述方式。这种偏差不是模型故意出错,而是统计学习带来的必然倾向。
第三个原因是Agent的工具调用链路会放大错误。一个典型视觉Agent可能先调用检测模型定位目标,再把裁剪区域交给多模态模型生成描述,最后让语言模型根据描述做决策。如果第一步检测框偏移,或者裁剪区域过小丢失了关键背景,后续的检索和判断就会基于错误输入进行。这种错误会沿着调用链传递,并且每一步都可能产生新的幻觉。检索验证机制必须放在关键节点上,而不是只在最终输出前做一次检查。
二、检索验证的核心链路
检索验证的基本流程可以拆成四步:生成初步判断、提取查询特征、检索候选证据、验证并修正输出。以商品真伪识别Agent为例,模型先对用户上传的图片给出一个候选结论,比如标签字体异常,疑似仿冒。接着系统不会直接返回这个结论,而是用同一视觉编码器提取该商品标签区域的特征向量,到已标注的正品样本库中检索最相似的若干张图片。
检索回来的候选样本会与查询图进行更细粒度的比对。这里不能只看余弦相似度,因为仿冒品和正品在整体外观上可能非常接近。更稳妥的做法是分区域比对:把查询图和候选图都切分成多个局部块,分别计算每个块的特征相似度,再结合位置信息判断哪些区域出现了显著差异。如果差异集中在关键部位,比如logo的某个笔划、封口纹理或防伪标识,就说明初步判断有较高可信度。如果差异分散在背景或无关区域,则可能是拍摄条件不同造成的误报。
最后一步是验证修正。检索结果会作为上下文重新输入给多模态模型,让它基于证据重新组织回答。这个重写过程可以约束模型只引用检索到的相似样本和差异区域,不允许自由发挥。实际工程中还可以增加一个规则层,例如当相似度低于阈值时直接返回无法确认,当检索库中正品样本覆盖不足时提示需要人工复核。这样Agent的输出从生成式猜测变成了证据驱动的判断。
三、视觉检索库的构建要点
视觉检索库的质量直接决定验证效果。存储的样本不能只是原始图片,还需要结构化的元数据,包括物体类别、拍摄角度、光照条件、批次信息、是否异常等。元数据的作用是在检索后做硬性过滤。比如查询图来自室内暖光环境,检索库中优先返回同样光照条件下的样本,否则相似度分数会受到光源颜色干扰。元数据过滤可以大幅减少误匹配。
特征提取模型的选择也很关键。通用场景下CLIP模型的特征表达能力较强,适合做语义级检索;而对细粒度缺陷识别,DINOv2等自监督模型在局部纹理和边缘保持上表现更好。实际系统可以同时维护两套特征:一套用于粗筛,一套用于精细验证。粗筛阶段用高维向量快速找到前100个候选,精细验证阶段再对候选做局部特征比对。这种两级检索在延迟和准确率之间能达到较好平衡。
下面是一个使用FAISS构建视觉检索索引的示例,假设已经用预训练模型提取了图像特征向量:
import faiss
import numpy as np
# 假设每张图片提取得到512维特征向量
dim = 512
index = faiss.IndexFlatIP(dim) # 内积相似度,需对特征做L2归一化
# 模拟已标注样本特征,shape为 (n_samples, dim)
gallery_features = np.random.rand(1000, dim).astype('float32')
gallery_features = gallery_features / np.linalg.norm(gallery_features, axis=1, keepdims=True)
index.add(gallery_features)
# 查询图片特征
query_feature = np.random.rand(1, dim).astype('float32')
query_feature = query_feature / np.linalg.norm(query_feature, axis=1, keepdims=True)
# 检索最相似的5个样本
top_k = 5
scores, indices = index.search(query_feature, top_k)
print("相似度分数:", scores)
print("候选索引:", indices)
索引构建完成后,还需要设计更新策略。业务数据会不断变化,新出现的正品批次、新型缺陷、新包装样式都应该及时入库。可以采用增量更新方式,每天定时对新标注数据提取特征并追加到索引中。对于已经过时或错误标注的样本,要建立回滚机制。另外,检索库的规模增长会带来内存和检索延迟压力,可以按类别拆分成多个子索引,查询时先由分类模型确定子索引,再做局部检索。
四、工程落地中的验证策略
验证策略不能只靠一个相似度阈值。实际业务中,光照变化、背景干扰和拍摄设备差异都会让同一个物体的特征向量产生波动。如果把阈值设得太高,很多正确判断会被误杀;设得太低,幻觉又容易通过验证。比较实用的做法是采用相对阈值:取查询图与top-k候选的相似度分数的均值和标准差,如果最高分与均值之间的差距超过一定倍数,才认为检索结果具有区分度。
除了数值上的验证,还需要对验证过程做可解释记录。每次检索验证都应保存查询图、命中的候选图、相似度分数、元数据过滤条件以及最终决策。这样当Agent出错时,可以快速定位是检索库覆盖不足、特征提取失效,还是阈值设置不合理。对于重要场景,可以加入人工复核环节,把低置信度的判断推送给审核人员,并将人工修正结果作为新样本补充到检索库中,形成闭环。
下面是一个简单的验证函数示例,它比较查询特征与候选特征的相似度,并根据相对阈值决定是否接受模型判断:
import numpy as np
def verify_with_retrieval(query_feat, candidate_feats, candidate_scores, base_ratio=1.5):
"""
query_feat: 查询图片特征向量
candidate_feats: 检索返回的候选特征矩阵
candidate_scores: 候选相似度分数列表
base_ratio: 最高分需要超过均值的最小倍数
"""
if len(candidate_scores) == 0:
return False, "检索库无候选样本"
scores = np.array(candidate_scores)
mean_score = scores.mean()
std_score = scores.std()
best_score = scores[0]
# 相对阈值:最高分至少比均值高出一定比例
if best_score < mean_score * base_ratio:
return False, "相似度区分度不足"
# 额外检查:最佳候选与查询特征的距离不能过大
best_feat = candidate_feats[0]
norm_diff = np.linalg.norm(query_feat - best_feat)
if norm_diff > 0.8:
return False, "特征距离过大"
return True, "验证通过"
在Agent框架中,检索验证可以作为独立工具暴露给模型。模型在需要确认视觉细节时调用该工具,而不是自己凭空生成结论。例如视觉问答Agent遇到用户询问商品标签上的日期时,先调用检测工具截取日期区域,再调用检索验证工具比对已知日期样式。只有验证通过后,模型才输出具体日期。这种工具化设计把验证逻辑从模型推理中解耦出来,便于单独升级和维护。
五、效果评估与目前局限
评估检索验证机制的效果,不能只看最终任务的准确率。还需要统计验证通过率、误拒率、误纳率以及检索命中率。验证通过率过低说明阈值太严或检索库覆盖不足,会导致Agent频繁请求人工介入,影响效率。误纳率是关键指标,它表示模型判断通过了验证但实际上仍然错误的比例。这个指标直接反映检索库和特征提取方案能否有效拦截幻觉。实践中建议每周生成一次评估报告,分场景统计这些指标,并针对最差的场景优先优化。
检索验证也有明显局限。首先是冷启动问题,新建系统往往缺少足够多的已标注样本,检索库覆盖不足时验证形同虚设。其次,对于完全未见过的物体或极端异常,检索机制可能找不到有效候选,此时仍然需要模型本身具备一定判断能力。第三,视觉特征存在对抗脆弱性,细微的噪声或遮挡可能导致相似度大幅下降,从而误拒正确回答。最后,检索验证增加了延迟和存储成本,对实时性要求极高的场景需要做缓存和并行化优化。
综合来看,检索验证并不能完全消除视觉幻觉,但它把幻觉从不可控的随机错误转化为可观测、可追溯、可修正的系统性问题。对于需要高可靠性的视觉Agent,这是一种成本可控且效果明显的工程方案。下一步可以探索的方向包括多模态检索融合、局部特征对齐、检索结果的反馈训练,以及用更轻量的模型压缩检索链路。最终目标不是让模型永远不犯错,而是让每一次错误都有据可查,并能够通过数据闭环持续收敛。