想象一个四岁的小朋友,精力旺盛、好奇心爆棚,在游乐场里撒欢。他可能会冲到马路上去捡球,也可能对着别的小朋友喊“你是个大笨蛋”,还可能一本正经地说“我昨天看见恐龙了”。你说这孩子坏吗?不坏,他只是还不懂规则。这时候,一位经验丰富的巡场老师出现了——他不阻止孩子玩耍,只在几个关键节点轻轻拦住、纠正、引导:入园时检查有没有带危险品,玩耍时看见孩子冲向危险区域就喊停,说话时提醒“要讲礼貌哦”,孩子说离谱的话时温柔地反问“真的吗?我们去查查百科好不好”。 AI Agent 就是这样的小朋友。它学识渊博、执行力强,但同样“不懂规则”:可能输出带歧视的话,可能编造根本不存在的“事实”,也可能不返回你要求的 JSON 格式。NVIDIA 开源的 [NeMo Guardrails](0),就是给 AI Agent 配备的那位“巡场老师”。
学会用 NeMo Guardrails 给 Agent 加护栏,是 AI 应用工程师从“能跑通 Demo”走向“可上线、可治理”的关键一步——在金融、医疗、政务等强合规场景,这甚至是必备技能。
可视化演示
展示AI Agent输出经护栏架构检查、敏感话题拦截流程与延迟权衡,含多级规则校验和通过/拦截路径,支持模式切换。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Guardrails护栏架构 AI输出经多级规则校验 通过则输出拦截则阻断 Output → Rules → Pass/Block Guardrails在输出层添加约束确保可控
认识护栏
巡场老师的工作原则是什么?不是把小朋友关进笼子,而是在他自由探索的同时,用几条“看不见的轨道”保证安全。这轨道不限制速度,只限制方向——孩子可以尽情跑、跳、笑,但不许冲出安全区。NeMo Guardrails 的核心理念与之完全一致:它不替代 LLM,也不重新训练模型,而是在模型外部布置一层“导轨”(rails),把任意一个“野性”的 LLM 包装成可控的 Agent 组件。
我们常说的“输出约束”,本质就是在这层导轨上做文章。NeMo Guardrails 把护栏分成几类:输入护栏检查用户发给模型的消息,输出护栏检查模型生成的回复,对话护栏控制整个多轮对话的走向。它们共同构成一个闭环:先净化输入,再调用模型,最后校验输出。因为约束完全在模型外围,所以理论上可以套用任何 LLM——开源模型、商用 API 都可以被“装上护栏”。
这种设计带来的最大价值是“可治理性”:业务方不需要动模型内部,只要改配置就能调整 Agent 的边界。就像游乐园调整围栏位置,不需要重新装修园区。
所以你看,巡场老师并没有教孩子知识,只是让孩子的每个动作都“有轨可循”。AI Agent 的输出从“自由发挥”变成了“受控表达”——这正是治理(Governance)的意义。
- 用户输入 \(x\)用户的原始消息,未经任何处理,可能是危险、越界的。
- 输入护栏 \(\text{Rails}_{\text{in}}(x)\)在模型看到消息前先做检查,拦截注入攻击、敏感话题等,输出一个“净化后”的消息。
- 模型生成 \(\text{LLM}(\cdot)\)净化后的消息交给大模型,模型正常发挥它的知识和推理能力。
- 输出护栏 \(\text{Rails}_{\text{out}}(\cdot)\)对模型生成的文本做二次检查,如格式、话题、事实,不通过就拦截或修正。
- 受控输出 \(y\)最终到达用户的消息,是被“巡场老师”确认过安全的回答。
Colang语言
巡场老师再厉害,也不可能凭空知道所有规则。游乐园运营方会给他一本《工作手册》,上面写着:“孩子冲向水域,拦;孩子说脏话,纠正;有人问路,领到服务台。”手册里每一条都清晰、可执行。NeMo Guardrails 同样有一本“工作手册”,名字叫 Colang——一种专为对话控制设计的领域语言(DSL),用接近自然语言的方式定义“什么情况、做什么事”。
Colang 里最核心的三个原语是 define user、define bot 和 define flow。define user 定义用户可能的意图,比如 define user ask_weather,相当于告诉系统“用户说这些话,都属于'问天气'这一类”;define bot 定义机器人的回复模板;define flow 把两者串成对话流,还可以嵌入条件判断——如果用户问的是被封禁话题,就转向拒答分支。
Colang 还支持在模板中做变量插值,把前面收集到的城市名、日期等信息填进回复里;当多条规则可能同时命中时,系统也有一套优先级裁定机制,保证最严格的规则先生效。这些设计让整套规则像“手册条文”一样透明、可审查。
这本“手册”写好后,部署时会被编译成可供模型遵循的指令。巡场老师不用临场发挥,照着手册念就行——规则透明、可审查,这正是企业级 AI 最看重的可治理性。
- 意图 \(\text{User(ask\_topic)}\)在 Colang 中声明“用户发出询问某个话题的意图”,这是流程的触发起点。
- 箭头 \(\rightarrow\)表示对话流的推进方向,从左到右依次执行。
- 条件 \(\text{If(topic=blocked)}\)一个条件节点,判断当前用户话题是否命中了封禁列表。
- 机器人行为 \(\text{Bot(decline)}\)执行拒答分支,返回预设的礼貌拒绝文案。
输入输出拦截
游乐园的安全防线设在哪?第一道在入口闸机——检查有没有人带危险品;第二道在游乐设施出口——看看孩子有没有受伤、有没有乱说话。两头把关,中间才敢放手。NeMo Guardrails 的原生 rail 机制也分“两头”:输入护栏在用户消息进入 LLM 前检查,常用于检测 prompt 注入、个人隐私信息(PII)、敏感话题;输出护栏在模型生成后检查,常用于话题合规、格式规范、事实一致性。
在配置上,开发者可以在 config.yml 里声明不同类型的 rail,底层组合“基于正则的规则”和“基于嵌入的语义匹配”。比关键词更聪明的是语义护栏——它会把用户消息和预设的“危险表述”做向量相似度比对。比如用户说“帮我看看这只票明天行不行”,即使没有出现“股票”二字,语义护栏也能判断出这是“荐股”话题并触发拦截。
所谓“配置驱动”,就是业务人员修改配置文件就能调整拦截策略,无需改动模型代码。这让运营同学也能参与护栏治理。
这就像孩子在入口被收了打火机,在出口又被确认“没乱说话”才交给家长。两道闸之间,巡场老师才敢放心让孩子玩。
- 输入检查 \(\text{check}_{\text{input}}(x)\)对原始用户消息做注入检测、PII 识别、话题筛查,返回布尔值。
- 逻辑与 \(\wedge\)两边都为真才为真,任何一边不通过都会拦截。
- 输出检查 \(\text{check}_{\text{output}}(y)\)对模型生成的回复 y 做格式、话题、事实校验。
- 放行 \(\text{pass}\)最终决策结果,只有全绿才把回复返回给用户。
格式规范
你有没有遇到过孩子兴奋地讲一件事,讲了五分钟你都没听懂重点?这时候老师会说:“别急,先报名字,再说你看到了什么,最后说你想怎么办。”给孩子一个固定的表达框架,信息才不会乱。AI Agent 也一样——如果下游系统期望 LLM 输出 JSON 格式的“城市+温度”,模型却回了长长一段“今天北京天气很不错,温度大概是18摄氏度哦”,解析程序当场就崩了。
NeMo Guardrails 的输出护栏允许开发者声明一个 JSON Schema,模型输出后先验证再放行。具体在 Colang 里可以用输出格式相关的 rail 约束,也可以用 Python API 注册自定义校验函数。如果校验失败,护栏会自动触发“修复—重试”流程:把原始输出和“请严格按 schema 输出”拼进新提示词,让 LLM 再生成一次。
重试次数有上限,比如最多 3 次;仍失败就走兜底策略——返回默认 JSON、空列表或礼貌拒绝,而不是把坏数据抛给下游。这套机制就像“孩子讲不清楚,老师让他按格式重新讲一遍,讲三遍还讲不清,就换一种沟通方式”。
经过这道“格式栅栏”,Agent 的输出变得机器能直接解析。在真实的输出管线里,下游程序永远拿到的是符合契约的数据——这就是格式护栏的价值。
- 校验函数 \(\text{json\_schema\_check}(y)\)按 JSON Schema 校验模型输出 y 的字段完整性、类型正确性。
- 合法判定 \(\text{valid}(y)\)校验通过则为 True,不通过则为 False。
- 修复提示 \(\text{repair\_prompt}(y)\)把非法输出附加到提示词末尾,要求模型“只输出合法 JSON”。
- 重写 \(\text{LLM}(\cdot)\)让模型带着约束重新生成,直到通过或超限。
事实性校验
孩子信誓旦旦地告诉小伙伴“我家的猫会飞”。老师听见了,不会直接骂他,而是带着他去科普角翻书:“你看,猫的骨骼结构决定它不能飞。”用事实说话,而不是凭感觉。LLM 最大的毛病就是“一本正经地胡说八道”(幻觉)。在医疗、金融场景,一个编造的数字就可能造成事故。
NeMo Guardrails 提供了事实核查 rail:它允许你把知识库/检索到的证据文本与模型输出做“蕴含”检测,判断输出是否被证据支持。具体做法是,在 Agent 生成回答后,护栏把回答和证据库片段组成一对文本,用一个小型的蕴含模型打分——输出与证据一致给高分,矛盾给低分。
得分低于阈值就触发拒答或修正策略,让 Agent 回复“我无法根据现有资料确认这一点,建议您咨询专业人士”,而不是硬着头皮编。实际项目中,可以把 RAG 检索到的文档片段直接作为证据来源,让护栏与知识库天然打通。
巡场老师这样“翻书对质”,既保护孩子不被误导,也保护了游乐园不被家长投诉。事实护栏,就是 Agent 的“科普角”。
- 证据 \(\text{evidence}\)来自知识库或外部检索到的权威文本片段。
- 蕴含检测 \(\text{entailment}(\cdot)\)判断 y 是否被 evidence 逻辑支持,返回 0~1 的分值。
- 阈值 \(\tau\)人为设定的最低支持分,低于分数线就认为“证据不足”。
- 拒答 \(\text{refuse}(y)\)拦截该输出,替换为预设的保守回复。
工程集成
巡场老师不是孤零零站在操场中央的。他兜里别着对讲机,监控室能看到每台设备的状态;哪个区域出事,他一按对讲机,保安三秒就到。融入指挥系统,老师才能真正发挥作用。NeMo Guardrails 也不是独立服务,而是一个可以嵌入任何 Agent 管线的“中间层”。
最常见的用法是把 LLMRails 包在原有推理流程外面:以前你直接调用 LLM,现在改成调用 rails.generate(messages),内部自动完成“输入护栏→模型→输出护栏”的编排。Agent 的工具调用、检索步骤都可以放在这个编排里,护栏层对上层业务透明。
工程上需要重点关注性能和延迟。输入护栏里的正则匹配是毫秒级,但如果用了嵌入模型做语义护栏,就会增加一次向量推理;事实校验如果额外调用蕴含模型,也一样增加耗时。成熟的实践是:给 rails 做缓存、把嵌入计算异步化、按场景拆分“轻量护栏”和“重量护栏”——普通闲聊只做正则,金融问答才开事实校验。
好的巡场老师知道什么情况用眼睛扫一眼就行、什么情况才需要调监控。工程上的护栏架构,同样讲究“分级响应,不浪费每一毫秒”。
- 输入检查耗时 \(t_{\text{in}}\)正则匹配或嵌入向量检索的耗时,通常很小。
- 模型生成耗时 \(t_{\text{llm}}\)LLM 生成本身的时间,占大头,受 token 数和模型大小影响。
- 输出校验耗时 \(t_{\text{out}}\)格式校验、事实打分的耗时。
- 重试开销 \(t_{\text{retry}}\times k\)每次重试都会追加一次 LLM 调用,k 是重试次数。
调试运维
优秀的游乐园,每天晚上闭园后会开会复盘:今天哪个区域被拦的孩子最多?是规则太严误伤了,还是确实有隐患?第二天调整巡逻点位。日复一日,游乐园才越来越安全又好玩。NeMo Guardrails 上线后同样需要“复盘”。
它本身会输出结构化的事件日志——哪条消息被哪个 rail 拦了、拦截原因是话题、格式还是事实。开发者可以拿这些数据做热更新:修改 Colang 规则文件后热加载,无需重启服务。生产环境的推荐做法是灰度发布护栏规则:先让新规则作用在 5% 流量上,对比拦截率、误杀率(正常回答被拦的比例)和用户反馈,再逐步放大到全量。
同时配置监控告警:拦截率突然飙高,可能意味着规则过严或有新型攻击方式;拦截率骤降,则可能意味着护栏失效或被绕过。两者都需要人工介入。这套“日志—热更新—灰度—告警”的闭环,让护栏规则不断进化。
巡场老师日复一日的复盘,让规则越来越精准——既不放跑真危险,也不误伤爱玩的孩子。护栏治理,从来不是“配好就不管了”。
- 总请求数 \(N_{\text{total}}\)统计窗口内的所有对话消息数。
- 拦截数 \(N_{\text{blocked}}\)被任一条 rail 拦截的消息数。
- 命中率 \(\text{hitRate}\)拦截的占比,反映护栏“活跃程度”。
- 告警阈值 \(\theta\)人工设定的红线,超过即认为异常。
- 触发告警 \(\text{alert}\)把异常推送到监控平台,通知值班工程师。
AI 应用场景
金融理财 Agent 的合规输出
阶段:输出约束 / 合规部署
解决的问题:理财类 Agent 不能承诺收益、不能诱导投资。传统做法靠 prompt 写“不要承诺收益”,但 LLM 容易被越狱或换个说法绕开。NeMo Guardrails 在输出侧加敏感话术 rail,用语义匹配拦截“稳赚”“保本高息”等表达,一旦触发就走合规话术兜底。
具体案例:某金融科技公司把理财对话 Agent 接入 NeMo Guardrails,配置了 80 条收益敏感话术模板 + 嵌入语义护栏。上线两周内,违规收益承诺出现率从 7% 降到 0.2%,所有拦截记录自动进入审计日志,满足监管留痕要求。
医疗问答 Agent 的事实性校验
阶段:事实校验 / RAG 管线
解决的问题:患者问“头晕该吃什么药”,如果 Agent 凭幻觉给出建议,风险极高。传统做法是纯 RAG 检索,但模型依然可能脱离检索结果编造。NeMo Guardrails 的事实验证 rail 把模型输出与检索证据做蕴含比对,不一致就拒答。
具体案例:某互联网医疗平台为用药咨询 Agent 挂了 3 万条药品说明书作为证据库。护栏检测到模型输出“阿司匹林可治疗儿童发烧”与证据冲突,自动改写为“请遵医嘱”,并附上证据链接,避免了一次潜在的医疗事故投诉。
电商导购 Agent 的 JSON 输出
阶段:输出管线 / 结构化数据
解决的问题:导购 Agent 必须返回商品推荐 JSON 给前端渲染,模型多说一句解释就让解析崩溃。传统方式靠 prompt 强求 + 后端正则硬解析,脆弱且难维护。
具体案例:某电商团队在 Agent 后端套了格式 rail,声明 {items: [{name, price, reason}]} 的 schema,不合法自动重试 2 次、第 3 次兜底返回空列表。上线后前端解析失败率从 11% 降到 0.3%,后端代码也删掉了一大堆“脏数据补救逻辑”。
Python 演示
# -*- coding: utf-8 -*-"""简化版 NeMo Guardrails: 用三道护栏约束 Agent 输出"""import json class NeMoLikeGuardrails: """在 LLM 前后布置检查哨的护栏类""" def __init__(self, blocked_topics, facts, max_retry=2): self.blocked_topics = blocked_topics self.facts = facts self.max_retry = max_retry self.counter = {"input": 0, "format": 0, "fact": 0, "pass": 0, "retry": 0} def check_input(self, text): """第一道护栏: 输入检查""" for topic in self.blocked_topics: if topic in text: self.counter["input"] += 1 return False, "话题[" + topic + "]被输入护栏拦截" return True, "" def llm(self, prompt): """模拟一个偶尔不守规矩的 LLM""" table = { "北京今天多少度": '{"city": "北京", "temp": "999"}', "推荐一款手机": "我不确定, 但X手机非常棒!", "北京今天天气": '{"city": "北京", "temp": "18"}', } return table.get(prompt, '{"city": "未知", "temp": "0"}') def check_format(self, text): """第二道护栏: 格式检查""" try: data = json.loads(text) return isinstance(data, dict), data except ValueError: return False, None def check_fact(self, data): """第三道护栏: 事实检查""" city = data.get("city") if city not in self.facts: return True if str(data.get("temp")) != self.facts[city]: self.counter["fact"] += 1 return False return True def generate(self, prompt): """对外主入口: 输入护栏 -> LLM -> 输出护栏""" ok, reason = self.check_input(prompt) if not ok: return reason text = self.llm(prompt) for _ in range(self.max_retry): ok, data = self.check_format(text) if not ok: self.counter["format"] += 1 self.counter["retry"] += 1 text = '{"city": "未知", "temp": "0"}' continue if not self.check_fact(data): return "检测到事实矛盾, 已拒答: 输出与知识库不一致" self.counter["pass"] += 1 return text return "重试多次仍不符格式, 已拦截" def report(self): """输出拦截统计""" return self.counter def main(): facts = {"北京": "18", "上海": "22"} rails = NeMoLikeGuardrails(blocked_topics=["股票", "打赌"], facts=facts) prompts = [ "帮我看看这只股票明天会不会涨", "推荐一款手机", "北京今天多少度", "北京今天天气", ] for prompt in prompts: print("用户:", prompt) print("护栏:", rails.generate(prompt)) print("----") print("统计:", rails.report()) if __name__ == "__main__": main()
llm() 替换成 OpenAI/本地模型调用即可。self.counter = {"input": 0, "format": 0, "fact": 0, "pass": 0, "retry": 0}用计数器记录每种拦截发生次数,方便上线后复盘。ok, reason = self.check_input(prompt)第一道闸:先拦输入,再进模型,避免危险内容浪费 token。text = self.llm(prompt)模拟模型生成,真实项目里这一行会替换成openai.ChatCompletion.create(...)或本地模型调用。for _ in range(self.max_retry):格式失败不立刻放弃,给模型最多 n 次“重写”机会。ok, data = self.check_format(text)第二道闸:用json.loads验证输出是不是合法 JSON。if str(data.get("temp")) != self.facts[city]:第三道闸:把解析结果与知识库 facts 比对,不一致就拒答。self.counter["pass"] += 1全绿才计数放行,输出进入下游。if __name__ == "__main__":提供可执行入口,方便直接python跑通演示。
常见误区
误区以为给 Agent 加了几条关键词拦截规则就高枕无忧了,“再也不用担心模型乱说话了”。
正解护栏是“刹车”而不是“教育”。它能拦截明文违规词、明显越界话题,但挡不住谐音、多语言、编码变体或精心构造的对抗样本。可靠的生产系统需要对齐训练、护栏过滤、人工抽检三层配合。就像游乐园老师能拦住狂奔的孩子,但若孩子本身就受过“不能打人”的教育,安全系数才是真高。
为何常见:护栏配置简单、效果立竿见影,容易让人产生“一劳永逸”的错觉。
误区规则写得越多越好,正则模板越多越安全,最好把所有能想到的违规词都列进去。
正解规则数量与安全性不是线性关系。规则过多会互相踩踏,造成“误杀”——合法问题被错误拦截,用户一脸懵。正确做法是用小批量测试集回归,每加一条规则查看它对正常对话的误伤率,追求“精准拦截”而非“海量拦截”。
为何常见:安全焦虑让人本能地“宁多勿少”,却忽略误杀对用户体验的损害。
误区听说护栏要额外调模型做语义匹配和事实校验,就认定延迟不可接受,“加了护栏 Agent 就废了”。
正解护栏的延迟开销分等级。纯正则和规则流是毫秒级;语义匹配和事实校验确实要额外模型推理,但可以用小模型、缓存、批量处理和异步化把开销压到可接受范围。工程上还会按场景分级,普通对话用轻量护栏,高风险操作才上重护栏。
为何常见:把“最重的护栏”当成“所有护栏”的代价,以偏概全。
误区格式校验失败了就让模型无限重试,多试几次总能生成合法 JSON。
正解重试不是万能的。每次都花钱花时间,而且如果 prompt 或 schema 本身有歧义,模型可能稳定地生成同一种错误格式——重试只会放大成本。正确做法是限制次数 + 兜底返回 + 分析根因,比如给模型更多示例或放宽 schema。
为何常见:把 LLM 的随机性理解成“多抽几次总能中奖”,忽略了系统性问题。
误区护栏是临近上线才需要做的事,“先开发核心功能,最后再加一层拦截就行”。
正解护栏应该从架构设计第一天就参与。它的配置会影响 prompt 设计、输出协议约定、测试集构建。如果等项目跑通了再套护栏,你会发现模型输出格式、话题边界全都要推倒重来,硬加规则只会频繁误杀。
为何常见:开发节奏压力下,安全总被排到“最后一步”,结果变成事后补救。
面试题
Q1. NeMo Guardrails 的主要作用是?
- A.代替大模型做智能生成
- B.给大模型加可控安全护栏← 正确答案
- C.提升大模型的推理速度
- D.自动微调用户的私有数据
答案:B。NeMo Guardrails 是套在 LLM 外围的规则层,负责约束输入和输出,让模型行为可控。它不参与生成(A 错)、不优化推理速度(C 错)、也不做数据微调(D 错)。就像巡场老师并不替代孩子玩耍,只是保障玩耍安全。
Q2. Colang 中定义“用户意图”的关键字是?
- A.define model
- B.define user← 正确答案
- C.define bot
- D.define flow
答案:B。Colang 用 define user 声明用户可能表达的意图,比如 define user ask_weather。define bot 定义机器人回复模板,define flow 定义整体对话流。这对应工作手册里“孩子说了哪种话、属于哪一类”的归类规则。
Q3. 输出护栏在 Agent 流程中的位置是?
- A.用户提问进入模型之前
- B.模型更新内部参数时候
- C.模型生成回复之后返回前← 正确答案
- D.训练数据预处理的时候
答案:C。输入护栏管“进门”,输出护栏管“出门”。模型完成生成、回复发给用户之前,输出护栏先做格式、话题、事实检查。B 和 D 都发生在训练/内部阶段,与推理链路无关。
Q4. 下列哪种需求最适合用“事实性护栏”解决?
- A.拦截用户消息中的提示词注入
- B.让输出严格符合 JSON 规范
- C.判断回答是否被证据所支持← 正确答案
- D.提高语言模型的采样速度
答案:C。事实性护栏做的事是“把模型输出和知识库证据做蕴含比对”,低分则拒答。A 属于输入护栏,B 属于格式护栏,D 是推理优化,都与证据核对无关。
Q5. 模型输出 JSON 格式不稳定时,护栏的推荐操作是?
- A.放弃 JSON 改用纯自然语言
- B.校验 schema 并重试加兜底← 正确答案
- C.把采样温度直接调到最大
- D.更换性能更差的大模型
答案:B。标准做法是声明 JSON Schema,输出后校验;不合法就让模型带提示词重写,多次失败走兜底(如返回空 JSON)。A 放弃结构化是因噎废食,C 会加剧不稳定,D 是反向操作。
Q6. 集成护栏后主要的额外性能开销来自?
- A.服务器磁盘读写性能下降
- B.额外模型调用与语义匹配← 正确答案
- C.前端页面渲染速度变慢
- D.数据库索引膨胀开销变大
答案:B。护栏增加的开销主要是:语义护栏要多做一次嵌入向量匹配,事实校验要多调用一次蕴含模型,重试则追加 LLM 调用。磁盘、前端、数据库都不是护栏引入的典型瓶颈。
Q7. 护栏规则上线时最稳妥的生产策略是?
- A.立刻全量替换所有运行流量
- B.灰度发布并对比拦截误杀← 正确答案
- C.写完规则只放文档不部署
- D.同时关闭全部格式类校验
答案:B。生产环境推荐先 5% 流量试点,对比拦截率、误杀率和用户反馈,确认没问题再全量。A 风险太高,C 等于没上线,D 直接放弃了格式保障。
Q8. 输入护栏可以检测哪些风险?
- A.提示词注入与恶意指令← 正确答案
- B.身份证号等个人隐私信息← 正确答案
- C.涉政涉暴等敏感话题词← 正确答案
- D.模型内部梯度与权重数值
答案:ABC。输入护栏作用在用户消息层,能拦注入、PII、敏感话题,对应“入园安检”那一步。D 是模型内部状态,在推理链路中不可见也不受输入护栏影响。
Q9. 下列属于输出约束手段的有?
- A.用 JSON Schema 强校验格式← 正确答案
- B.与知识库做蕴含比对纠错← 正确答案
- C.把用户请求转发给外部工具
- D.按话题转向拒答对话流← 正确答案
答案:ABD。JSON Schema 校验是格式约束;蕴含比对是事实约束;话题转向拒答是对话流约束,三者都属输出侧。C 是 Agent 的工具调用能力,不是约束手段。
Q10. 关于护栏拦截率的判断正确的有?
- A.拦截率越高说明系统越安全
- B.要同时关注误杀正常对话率← 正确答案
- C.拦截率结合人工抽检才可靠← 正确答案
- D.规则无限增加无需回归测试
答案:BC。拦截率高可能是真拦截了风险,也可能是误杀大量正常对话,所以单看拦截率不科学。要同时看误杀率、结合人工抽检,并对规则做回归测试。A 绝对化,D 明显错误。