JevEvidenceProcessor。它可直接处理授权段落,也可通过 search_evidence 工具接入 Agent。最终回答的依据检查由响应中间件另行完成。
场景:回答“所有退款都一定成功吗?”
检索器召回三段文本:一段内部政策、一段夹带“忽略规则”的指令、一段公开政策“退款需要符合条件并经人工审核,不能保证成功”。第三段反驳了问题中的前提,却正是回答所需的证据,不能简单当作“不相关”丢掉。 这时先用 ACL 移除用户无权读取的内部政策,再让 JEV 区分注入、相关证据和前提冲突。最后让生成模型基于保留的政策作答,并单独检查回答是否有依据。1. 配置处理器,先观察建议
client 初始化见客户端接入。SHADOW 保留原有授权材料,只记录筛选建议:
demonstration() 提供示例分类阈值,不能视为已经校准;0.0 表示不再按重排最低分数裁剪。5 秒限制一次处理的总预算。完成样本验证后切换 ENFORCE,才把建议应用于下游输入。
2. 提供候选、权限检查与问题
以下候选与离线案例一致。这里的 ACL 仅用于演示“公开可见、私有不可见”;生产应用应替换为与当前用户、租户绑定的实际权限查询。context 为当前调用的 RuntimeContext。
delivered 仍是原有授权候选;只有 ENFORCE 才过滤注入等材料。期望 policy-7 被识别为与问题前提冲突的有效证据,保留它以纠正“退款保证成功”的说法;实际判断需以报告为准。
也可传 Supplier<Mono<List<JevPassage>>>,把检索读取纳入同一预算。id/version 必须有界且非空,可见 ID 不得重复;attributes 留给宿主,不会传给判断模型。
3. 区分没有证据与处理失败
Report 区分 delivered(实际下游输入)、suggested(建议 topK)、assessments(逐段结果)、calls(请求状态与用量)、complete 和 applied。分类包含 INCLUDED、CONFLICTING、EXCLUDED、INCONCLUSIVE、ERROR、UNSCREENED。未知分数为 null,不能当作零或无关。 OFF 仍执行检索和 ACL,只禁用语义请求。SHADOW 返回原有授权候选的顺序及 topK,建议独立记录。ENFORCE 应用分类/重排;明确排除、弃权、错误和未筛选内容不进入 delivered。重排故障不推翻已通过的分类,排在所有已评分内容之后。没有候选不请求模型;空结果和不完整处理有不同状态,不应统一解释为“知识库没有答案”。 默认最多 32 个可见候选,每段 16,000 字符、query 8,000 字符、每请求 state 32,000 字符、64 次请求。总量超限不开始语义处理,单段超限标为 UNSCREENED,正文不静默截断。当前按段串行,过滤与重排分别请求。超时保留已有部分报告;取消停止证据读取/在途请求及后续派发,不保证远端停止计费。观察器异常不改变结果。OFF 的读取/ACL 故障继续作为应用检索错误传播。4. 让 Agent 通过只读工具检索
使用同一处理器注册search_evidence。下例复用上面的固定候选和演示 ACL;实际应用将 Source 的读取函数替换为检索后端,身份从运行上下文获取。
runContext,不要将跨用户的 Source 或身份保存在共享变量中。工具参数只有 query;32 是候选读取上限,2 是最多提供给 Agent 的段落数。工具虽只读,仍受现有权限链约束;缺少用户、会话或 Source 会明确报错。
Agent 得到的 Result 只包含实际 delivered 段落的 id、version、text、可空分类/分数,不返回被过滤的正文、内部 ACL attributes 或完整评估报告。SHADOW 的工具输出与 OFF 一致,不把建议偷偷写回实际输入;ENFORCE 才附加分类与分数。不完整处理使用 EVIDENCE_REVIEW_INCOMPLETE,完整空结果使用 NO_EVIDENCE。模型仍需根据证据作答、引用 id/version;本工具本身不执行最终答案审核或验证引用声明。
与最终草稿审核组合
JevResponseMiddleware.qualityState(input, answer) 从实际消息构造 user_question、assistant_answer、按调用 ID 配对的 tool_calls、成功工具结果的 supporting_context 及 trace_issues,同时保留兼容字段 prompt / answer。定义可以分别检查 grounded 和 answers_question,不能把“切题”自动当作“有依据”。元数据和模型思考不作为证据;工具输出是待核验材料,不因放进 supporting_context 就自动成为可信事实。
有重复/缺失调用 ID、孤立工具结果等轨迹问题时,不猜测对应关系,质量审核返回 INCONCLUSIVE / INCOMPLETE_JUDGING_EVIDENCE;整个序列化判断状态超过 maxChars 时返回 JUDGE_STATE_LIMIT,不静默截断。ENFORCE 不发布此类草稿,SHADOW 保留原事件。
同步发布前审核继续使用已有缓冲和预算。仅 FAIL 可进入有限草稿修订,修订调用没有工具;ERROR、INCONCLUSIVE 和修订耗尽不发布草稿。不会重跑已经执行的工具,也不会在修订耗尽后发布仍未通过的答案。参见最终草稿审核。引用格式/ID/version 的确定性验证仍由应用负责;本例保留引用并审核语义依据,没有实现通用引用解析器。
AgentScope Service
在现有 Agent overrides 中配置(以下阈值只用于演示,不代表已校准):JevServiceSupport.evidenceTool(overrides) 校验配置并创建工具;HarnessAgentBuildService 在 Harness 构建前注册进 Toolkit,避免工具快照看不到工具。overrides 参与现有构建缓存键,改为 OFF 会重建并移除此工具。宿主仍需在每次运行的 RuntimeContext 注入 Source 和真实 ACL;检索后端由你的应用提供,工具继续使用原有权限确认链。
开启时必须显式提供五个阈值,默认 OFF 不创建客户端。总预算默认 5 秒、上限 30 秒;候选默认 32、上限 128;topK 不大于候选上限;单段字符默认 16,000、上限 64,000;query 默认 8,000、上限 16,000;state 默认 32,000、上限 100,000;请求数默认 64、上限 256。阈值必须有限且否定阈值低于各接纳阈值。拒绝未知字段,不允许通过 Agent JSON 放入 API key 或 endpoint。决策观察关联现有运行上下文,默认只记计数、模式和状态,不保存完整报告及正文;需要调用用量可从宿主处理器 Report.calls 接入。
可运行案例
JevEvidenceExample提供上面三段候选及完整检索、回答、修订流程。按构建步骤设置JEV_CP 后运行:
retrievals=1, modelCalls=3, judgmentRequests=5,包含一个正确配对的工具结果,初稿没有泄漏给用户。判断与生成均为脚本,案例证明执行边界,不证明模型准确率。