想象你收到一匹纯血赛马作为礼物。这匹马奔跑能力惊人,但性格跳脱:时而原地打转,时而受惊狂奔。你很清楚——直接骑它上街,要么摔伤自己,要么撞伤路人。真正的驯马师会先做一件事:给它配齐马具。缰绳管方向,眼罩管视线,笼头管出口,围栏管边界。在大模型应用的世界里,GPT 这类大模型就是那匹野马——能力强大却充满不确定性。Harness Engineering(马具工程)就是围绕模型打造的那套“马具”:输入预处理是眼罩,输出后处理是笼头,工具编排是驯马手势,安全校验是场边围栏。它不改变马的血统,却让野马成为能稳定执行任务的赛马。本文会用这个比喻,带你理解 Harness Engineering 的概念与定位——它如何把模型的强大能力封装在可控的工程框架中,成为 LLM 应用从原型走向生产的关键工程实践。

岗位关联

掌握 Harness Engineering,是 AI 应用工程师从“会调模型 API”走向“能交付生产级应用”的分水岭——它决定了你的应用只是能跑起来,还是能稳定地跑下去。

目录
  1. 可视化演示
  2. 核心概念——给野马配马具
  3. 输入预处理——给野马戴眼罩
  4. 输出后处理——给野马套笼头
  5. 工具编排——驯马的手势口令
  6. 安全校验——围栏与红线
  7. 工程价值——从野马到赛马
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示大模型工程脚手架的输入预处理、工具编排与安全护栏的分层防御架构。

本节配有交互动效(进入视口后自动加载,约 3KB)。

工程脚手架框架 输入预处理含格式清洗意图路由安全过滤 模型输出经后处理校验后返回用户侧 H=pre+model+post 脚手架为预处理加模型加后处理

核心概念——给野马配马具

假设你收到一匹纯血赛马作为礼物。这匹马奔跑能力惊人,但性格跳脱:时而原地打转,时而受惊狂奔。你很清楚——直接骑它上街,要么摔伤自己,要么撞伤路人。真正的驯马师会先做一件事:给它配齐马具。缰绳管方向,眼罩管视线,笼头管出口,围栏管边界。这套“马具系统”,就是我们今天的主角:Harness Engineering。

在大模型应用里,GPT 这类大模型就是那匹赛马。它懂语言、会推理、能写代码,但它的行为是概率性的——同一个问题,今天这么答,明天可能那么答;稍微被“提示注入”一下,还可能说出越界的话。如果直接把模型裸露给用户,就像不配马具就骑马进城。Harness Engineering 的定位,正是围绕大模型搭建一整套外围工程框架,把“模型能力”和“用户接触面”之间用代码隔离开。

这里有一条关键分界线:模型层与非模型层。模型层是马的基因——参数、权重、训练方式,由算法工程师负责;非模型层是马具——输入怎么清洗、输出怎么校验、工具怎么调用、安全怎么兜底,由 Harness 工程师负责。Harness Engineering 强调:模型能力应该被封装在可控的工程框架内,用脚手架代码管理模型的不确定性,让应用从“能跑 demo”进化为“能上生产”。

App=Fharness(M,Context,Tools)\text{App} = \mathcal{F}_{\text{harness}} \big( \mathcal{M}, \text{Context}, \text{Tools} \big)

1. App(最终应用):用户真正使用的产品,比如客服机器人和文档助手,是整个马具系统组合后的整体效果。

App\text{App}

2. $\mathcal{F}_{\text{harness}}$(马具框架):括住模型的外围脚手架代码,负责输入输出、编排和校验,是本文的主角。

Fharness\mathcal{F}_{\text{harness}}

3. $\mathcal{M}$(大模型):提供语义理解和生成的底座模型,相当于“马”本身,能力来自训练而非马具。

M\mathcal{M}

4. Context(上下文):喂给模型的对话历史和知识片段,相当于马的视野范围,由预处理环节来装配。

Context\text{Context}

5. Tools(工具):模型可调用的外部能力,如搜索引擎、数据库和计算器,相当于马场上的辅助设施。

Tools\text{Tools}

记住这张公式的构图:马具包围马,而不是马决定马具。这正是 Harness Engineering 的意义——它不碰模型的“血脉”,却决定了这匹马能不能真正走上赛道。

输入预处理——给野马戴眼罩

赛马在赛场上最怕什么?不是跑不快,而是分心。看台上的旗帜、隔壁马匹的影子、观众突然的尖叫声,都可能让马突然偏道。所以驯马师会给马戴上眼罩,让它的视野只聚焦正前方的赛道。

大模型同样“容易分心”。用户的原始输入往往充满噪声:多余的换行、无意义的 emoji、被截断的粘贴文本,甚至有人故意在输入里藏进“忽略之前指令”的注入语句。如果把这些原样喂给模型,模型可能被带偏。输入预处理就是那副眼罩——在模型看到任何东西之前,先把该过滤的过滤掉、该对齐的对齐。

具体来说,输入预处理包含三件事。第一是提示词清洗:去掉不可见字符、压缩连续空白、截断超长文本,必要时中和注入片段;第二是上下文管理:把系统提示、对话历史、检索片段控制在上下文窗口内,防止模型“遗忘”重点;第三是会话组装:把清洗后的内容拼成模型接口要求的消息结构,比如 OpenAI 风格的 messages 数组。

x′=Tpre(x)=Assemble∘Clean∘Norm(x)x' = \mathcal{T}_{\text{pre}}(x) = \text{Assemble} \circ \text{Clean} \circ \text{Norm} (x)

1. $x$(原始输入):用户敲下的原始文本,可能带着多余空格、换行、表情和不相关片段。

xx

2. Norm(标准化):统一换行符、压缩连续空白、转换编码,让文本格式整齐划一。

Norm\text{Norm}

3. Clean(清洗):截断超长文本、剔除干扰噪声、中和注入语句,防止模型被带偏。

Clean\text{Clean}

4. Assemble(组装):把清洗后的内容拼上系统提示和历史会话,形成消息数组,符合模型接口要求。

Assemble\text{Assemble}

5. $x'$(干净请求):最终送到模型面前的高质量输入,等价于“戴上眼罩后的清晰视野”。

x′x'

眼罩不是限制马的视力,而是帮它聚焦。输入预处理同样不是“阉割”用户问题,而是确保模型看到的每一行输入都干净、完整、值得回答。

输出后处理——给野马套笼头

马再训练有素,也有情绪失控的瞬间。它可能突然甩头、喷气、甚至咬向靠近的手。聪明的驯马师不会赌马永远好脾气,而是直接给它套上笼头——不管马想咬什么,先过一层齿口把关。

大模型的输出同样“口无遮拦”。它可能输出残缺的 JSON(少个括号)、编造不存在的数字(幻觉)、回答格式不符合下游系统要求。如果把这些输出直接喂给业务系统,轻则解析报错,重则把错误数据写进数据库。输出后处理就是那层笼头,在模型的“嘴”和外部世界之间设立检查站。

输出后处理通常分三步:解析、校验、修复。解析把模型吐出的文本转成结构化对象(如 JSON 转字典);校验检查必填字段、类型、取值范围,并识别幻觉与离题内容;修复对不合格结果做自动修补——补全缺失括号、重试生成,或降级为预设的兜底答案。

y=Tpost(y^)=Repair∘Validate∘Parse(y^)y = \mathcal{T}_{\text{post}}\big( \hat{y} \big) = \text{Repair} \circ \text{Validate} \circ \text{Parse} (\hat{y})

1. $\hat{y}$(模型原始输出):模型直接吐出的文本,可能格式残缺或包含幻觉内容,是未过笼头的“原话”。

y^\hat{y}

2. Parse(解析):把文本解析成结构化对象,比如将 JSON 字符串转成 Python 字典,为后续检查做准备。

Parse\text{Parse}

3. Validate(校验):检查必填字段、类型与取值范围,识别幻觉与离题内容,是质量把关的核心环节。

Validate\text{Validate}

4. Repair(修复):自动修补小缺陷,比如补全括号和引号;严重违规则触发重试或返回兜底回答。

Repair\text{Repair}

5. $y$(稳定输出):通过所有关卡后的结果,格式稳定且内容合规,可以放心交给下游系统。

yy

有了笼头,马偶尔的“口误”也不会咬伤人。同理,有了输出后处理,模型偶尔的“胡说八道”也不会直接进入用户视野或业务系统——这正是生产级应用和 demo 之间的关键差别。

工具编排——驯马的手势口令

一匹训练有素的马能完成各种复杂动作:听到口令转弯、看到手势急停、配合骑手跳过障碍。这些动作不是马天生会的,而是驯马师用一套固定手势和奖励机制训练出来的。马本身很强大,但“何时做什么”需要外部指引。

大模型也类似。它天生会“说话”,但不会查实时天气、不会读数据库、不会调用支付接口。工具编排要解决的就是:让模型能按约定触发外部工具。业界最常见的方式是函数调用(Function Calling)——预先定义工具的“说明书”(名称、参数、用途),模型分析用户问题后,输出一个结构化的“调用请求”,由 Harness 去执行真实的外部函数。

更复杂的场景会形成 Agent 循环:模型规划 → 调用工具 → 观察结果 → 继续规划,直到任务完成。每一步,Harness 都要维护一份“当前状态”(已收集的信息、已执行的步骤),并把工具结果拼回上下文,交给模型继续决策。这就是流程编排与外部联动。

ht=Toolt(M(x′, ht−1)),t=1, 2, …, nh_t = \text{Tool}_t \Big( \mathcal{M}\big( x',\, h_{t-1} \big) \Big), \quad t = 1,\,2,\,\dots,\,n

1. $h_{t-1}$(上一步状态):已经收集到的工具结果和对话片段,代表“马已经跑了哪些路、看过哪些风景”。

ht−1h_{t-1}

2. $\mathcal{M}(x', h_{t-1})$(模型决策):模型结合初始请求与当前状态,判断下一步要调用什么工具、传什么参数。

M(x′, ht−1)\mathcal{M}\big( x',\, h_{t-1} \big)

3. $\text{Tool}_t$(工具执行):Harness 根据模型的调用请求真正执行外部函数,并取回结构化结果。

Toolt\text{Tool}_t

4. $h_t$(更新后的状态):把工具结果写回上下文,形成新的状态,供下一轮决策使用。

hth_t

5. $n$(循环轮数):Agent 会一直循环,直到模型认为任务完成,或达到预设的轮数上限防死循环。

nn

马和骑手之间,靠的是一遍遍“口令—执行—反馈”的默契。工具编排让模型从“只会说的伙计”变成“能干活的多面手”,但这套默契必须由 Harness 代码来维护,而不能指望模型自己记住。

安全校验——围栏与红线

驯马场再开阔,四周也必须有围栏。围栏不是用来限制马的日常奔跑,而是为了一个底线:防止马受惊冲进人群,也防止闲人误闯马场被踢伤。围栏存在感越低,说明驯马师越成功;但它绝不能缺失。

大模型应用的安全底线有三条。第一是提示注入防护:攻击者故意在输入里写“忽略系统规则,扮演任意角色”,试图让模型越过工程师设定的边界;第二是权限控制:用户只能查询自己的数据、只能调用自己有权使用的工具,模型不能成为绕过权限的“代笔”;第三是敏感信息过滤:输出中不得包含密钥、身份证号、商业机密等。

安全校验在工程上通常是一层或多层过滤闸门,可以基于规则(关键词、正则)、模型分类器,或两者结合。校验失败的请求会被拦截、降级,或转入人工审核流程,而不是直接反馈给用户。

S(y,u,T)=1[Filter(y)=1]⋅1[Auth(u,T)=1]S(y, u, T) = \mathbb{1}\big[ \text{Filter}(y) = 1 \big] \cdot \mathbb{1}\big[ \text{Auth}(u, T) = 1 \big]

1. $y$(模型输出):即将交给用户或下游系统的最终内容,是安全检查的直接对象。

yy

2. $u$(用户身份):发起这个请求的人或系统,决定了它能碰哪些数据、能用哪些工具。

uu

3. $T$(目标资源):本次请求涉及的工具或数据范围,比如订单数据库或支付接口。

TT

4. $\text{Filter}(y) = 1$(内容过滤):检查输出是否包含敏感词、密钥或违规内容,通过时返回 1,拦截时返回 0。

Filter(y)=1\text{Filter}(y) = 1

5. $\text{Auth}(u, T) = 1$(权限校验):确认用户对目标资源有访问权,有权限返回 1,无权限返回 0。

Auth(u,T)=1\text{Auth}(u, T) = 1

6. $S$(安全判定):两个指示函数相乘,只有两者都为 1,整体安全判定才等于 1,请求才会放行。

SS

围栏的品质决定马场能否长期运营。Harness 里的安全校验决定 LLM 应用能否通过合规审查、能否真正面对真实用户——这不是锦上添花,而是生产底线。

工程价值——从野马到赛马

一匹野马价值几何?也许在草原上值几千块。但同一匹马,如果配上专业马具、经过系统训练、熟悉赛场规则,价值可以翻几十倍——因为它从“能跑”变成了“能稳定地赢”。Harness Engineering 做的就是这件事。

从原型到生产,Harness 的价值体现在三个维度。一是生产级稳定:通过重试、降级、缓存、超时控制,让系统的可用性不依赖模型单次输出的好坏;二是可测试可维护:每个环节都能单独写单元测试、打日志、调参数,出问题时能快速定位是模型的问题还是管线的问题;三是模型可替换:因为模型被封装在马具内部,底座模型从 GPT 换成 Claude 或国产模型时,只需调整适配层,业务逻辑不动。

有一个直觉化的数学关系可以说明这套价值:系统最终的错误率,等于模型原始错误率乘以每道马具漏网率的连乘。模型错误率如果是 20%,输出校验能拦掉一半错误,系统错误率就降到 10%;再叠加一道输入侧拦截,还能继续降。

Efinal=Emodel×∏i=1n(1−ηi)E_{\text{final}} = E_{\text{model}} \times \prod_{i=1}^{n} \big( 1 - \eta_i \big)

1. $E_{\text{model}}$(模型原始错误率):裸模型单次输出的出错概率,比如 20%,这是马的天生“野性”。

EmodelE_{\text{model}}

2. $\eta_i$(第 $i$ 道关卡拦截率):每道马具环节能拦下剩余错误的比例,比如输出校验拦下一半。

ηi\eta_i

3. $1 - \eta_i$(漏网比例):一道关卡没能拦住的部分,会继续流向下一关,成为“漏网之鱼”。

1−ηi1 - \eta_i

4. $\prod_{i=1}^{n}$(连乘):所有关卡层层过滤后,剩下的错误是每关漏网率的乘积,关卡越多乘积越小。

∏i=1n(1−ηi)\prod_{i=1}^{n}\big( 1 - \eta_i \big)

5. $E_{\text{final}}$(系统最终错误率):经过整副马具后系统的真实错误率,明显低于模型原始值。

EfinalE_{\text{final}}

野马变成赛马,靠的不是马单方面的天赋,而是马、马具、骑手、场地的协同。LLM 应用要实现生产落地,Harness Engineering 就是那套把“天赋”转化为“可靠服务”的协同系统——这也是它在 AI 工程化范式演进中地位越来越高的根本原因。

AI 应用场景

智能客服机器人

阶段:应用层工程(Harness Engineering)

解决的问题:传统客服机器人靠规则匹配,无法处理开放问题;直接裸调 LLM 则输出不稳定、还可能泄露他人订单信息。Harness 把输入分类、订单查询工具、输出格式化与权限校验串成一条受控管道。

具体案例:某电商平台的客服机器人收到“我的订单到哪了?”——预处理环节提取用户 ID 并组装上下文;工具编排环节调用订单查询 API;输出后处理只返回该用户的物流信息;安全校验拦截“顺便帮我查一下张三的订单”这类越权注入。

财务报告生成助手

阶段:生产化工程(Harness + MLOps)

解决的问题:财务数据必须精确到分、引用必须可追溯,裸模型可能编造数字。Harness 用输入模板约束问题结构,工具编排接数据库取数,后处理校验数字一致性,安全校验防止输出内部参数。

具体案例:券商投研部门用 LLM 生成周报,系统规定所有引用必须带数据源 ID;后处理环节检测到数字与数据库不一致时,自动触发重试并要求模型重新取数,直到校验通过或降级为人工处理。

企业知识库问答助手

阶段:LLM 应用架构(检索增强 + Harness)

解决的问题:企业文档多、模型幻觉多,直接问答容易“一本正经地胡说”。Harness 在输入侧接检索工具,在输出侧强制要求答案附带文档引用编号,无引用则拒绝回答。

具体案例:某律所内部法规问答系统,安全校验层检测“答案中是否包含引用编号”,缺失时返回兜底文案“该问题不在知识库范围内”,并记录日志供后续补全知识库。

Python 演示

python80 行
import re  class HarnessEngine:    """极简 Harness 脚手架:预处理 -> 模型 -> 后处理 -> 安全校验 -> 工具编排。"""     def __init__(self, model_fn, tools=None):        self.model_fn = model_fn        self.tools = tools or {}        self.session = []        self._sensitive = ["token", "secret", "password"]     def preprocess(self, raw):        text = re.sub(r"\s+", " ", raw.strip())[:2000]        return {"role": "user", "content": text}     def postprocess(self, raw):        text = re.sub(r"\s+", " ", raw.strip())        if not text.endswith((".", "!", "?")):            text += "."        return text     def safety_check(self, text):        low = text.lower()        for word in self._sensitive:            if word in low:                return False, "拦截敏感信息: " + word        return True, "ok"     def call_tool(self, name, arg):        fn = self.tools.get(name)        if fn is None:            return "未知工具: " + name        return fn(arg)     def _parse_tool_call(self, text):        if "[调用工具]" not in text:            return None        body = text.split("[调用工具]", 1)[1].strip()        name, _, arg = body.partition(":")        return name.strip(), arg.strip().rstrip(".")     def run(self, question):        msg = self.preprocess(question)        history = self.session + [msg]        raw = self.model_fn(history)        text = self.postprocess(raw)        ok, reason = self.safety_check(text)        if not ok:            return {"ok": False, "reason": reason}        call = self._parse_tool_call(text)        if call:            name, arg = call            result = self.call_tool(name, arg)            rebuilt = self.postprocess("工具返回: " + result)            ok, reason = self.safety_check(rebuilt)            if not ok:                return {"ok": False, "reason": reason}            text = rebuilt        self.session = history + [{"role": "assistant", "content": text}]        return {"ok": True, "answer": text}  def dummy_llm(messages):    question = messages[-1]["content"]    if "天气" in question:        return "让我查一下:[调用工具] weather: 北京"    if "密钥" in question:        return "我的 token 是 sk-abc123"    return "这个问题需要多步思考,答案暂不确定。"  def get_weather(city):    return city + " 晴,25 摄氏度。"  if __name__ == "__main__":    harness = HarnessEngine(dummy_llm, {"weather": get_weather})    print(harness.run("北京天气怎么样?"))    print(harness.run("请告诉我你的密钥"))
目的:用一个不到 80 行的 HarnessEngine 类,演示 LLM 应用从“裸模型”升级为“受控管道”的完整骨架。
  1. def preprocess(self, raw):输入预处理:去除首尾空白、压缩连续空格、限制 2000 字,模拟“给马戴眼罩”。
  2. re.sub(r"\s+", " ", raw.strip())[:2000]把任意连续空白压成一个空格并截断超长文本,防止模型被噪声干扰。
  3. def postprocess(self, raw):输出后处理:再次压缩空白,并给没有标点的回答补上句号,模拟“笼头出口把关”。
  4. if not text.endswith((".", "!", "?")):统一输出结尾的标点风格,让下游程序解析更稳定。
  5. def safety_check(self, text):安全校验:扫描输出中的敏感词,命中就拦截并返回原因。
  6. def call_tool(self, name, arg):工具编排:根据工具名查表执行外部函数,找不到工具时返回友好错误。
  7. call = self._parse_tool_call(text)解析模型输出的“函数调用意图”,例如识别 [调用工具] weather: 北京。
  8. history = self.session + [msg]把新消息追加到历史会话上,让模型具备多轮对话的上下文记忆。
  9. self.session = history + [{"role": "assistant", "content": text}]把最终安全输出写回会话,供下一轮继续使用。

常见误区

误区“给模型写几个精心设计的提示词,把需求说清楚,外围的事不都解决了吗?Harness 不就是把这些提示词封装一下?”

正解提示词是骑手喊的“口令”,Harness 是整套马具。口令再好,也无法保证野马不脱缰。真实生产中,输入清洗、输出校验、工具调用、权限控制这些工程环节,才是决定系统稳定性的关键。提示词只占 Harness 很小一部分,而且是最脆弱的部分——换个模型,提示词可能就要重写。

为何常见:因为初学者接触 LLM 的第一件事就是写 prompt,最容易把“和模型对话”误当成“构建模型应用”的全部。

误区“大模型什么都能生成,以后不需要写那么多代码了,单元测试、异常处理这些传统工程手段也该被抛弃。”

正解恰恰相反。传统代码是确定性函数,输入相同输出必相同;LLM 是概率函数,同一输入可能给出不同输出。越是不确定,越需要更强的工程约束来兜底。Harness Engineering 的本质,就是用传统软件工程的手段(校验、重试、降级、日志、测试)去驯服概率行为,而不是抛弃工程手段。

为何常见:大模型的“惊艳表现”容易让人高估它的可靠性,忽略生产环境里 99% 的故障其实出在模型之外。

误区“既然要拦截请求、做鉴权、限流,那 Harness Engineering 不就是 API 网关吗?这概念只是换了个新名字。”

正解API 网关解决的是网络层问题:路由、限流、负载均衡,它不关心“模型说什么”。Harness 解决的是语义层问题:输入该怎么清洗、模型输出怎么解析校验、工具调用怎么编排、提示注入怎么识别。它比网关更贴近模型行为,是围绕“模型语义”的脚手架,而非纯网络管道。

为何常见:因为两者都处在“用户与后端之间”,看起来都是中间层,容易混淆职责边界。

误区“我写好了一套 Harness 代码,以后把模型从 GPT 换成任何开源模型,都能直接跑、不用改。”

正解不同模型的接口和习惯差异很大:上下文窗口长度不同、函数调用格式不同、输出风格不同(有的爱用 Markdown,有的爱用 JSON)。Harness 的价值在于“把差异隔离在适配层”,而不是消灭差异。换模型时,适配层和部分校验规则必须跟着调,但业务逻辑可以不动——这正是 Harness 设计得好不好的试金石。

为何常见:因为 Harness 的核心卖点是“模型可替换”,容易被误解为“模型可替换 = 代码零改动”。

误区“模型返回的 JSON 用 json.loads 一解析,输出后处理就做完了,简单得很。”

正解解析 JSON 只是第一步。真正的输出后处理还要校验字段是否齐全、数值是否在合法范围、文本是否包含幻觉内容,以及格式是否符合下游系统要求。很多时候模型输出根本不是合法 JSON,还要做修复和重试。更不用说还有内容安全过滤、引用校验这些环节。JSON 解析只是笼头上的一根铁条。

为何常见:因为结构化输出(JSON mode)最常见,初学者只看到“解析”这个动作,看不到解析前后的层层检查。

面试题

Q1. Harness Engineering 最核心的关注点是?

单选题 · easy

  • A.扩大模型参数量
  • B.改进训练数据集
  • C.设计外围工程框架← 正确答案
  • D.降低推理能耗成本

答案:C。Harness Engineering 关注的是模型外围的非模型层工程框架,包括输入预处理、输出后处理、工具编排和安全校验。参数量、训练数据属于模型层,推理能耗属于基础设施优化,都不是 Harness 的核心。

Q2. 以下哪项属于输入预处理的工作?

单选题 · easy

  • A.校验模型输出格式
  • B.清洗提示词组装上下文← 正确答案
  • C.调用外部工具 API
  • D.审查输出内容合规性

答案:B。输入预处理负责在模型看到输入之前做清洗和组装,B 正确。A 和 D 属于输出后处理与安全校验,C 属于工具编排,都是模型之后的环节。

Q3. 输出后处理的典型目标不包括哪项?

单选题 · mid

  • A.将模型输出格式化为 JSON
  • B.修正模型输出中的结构错误
  • C.过滤脱离上下文的幻觉内容
  • D.扩大模型的上下文窗口← 正确答案

答案:D。扩大上下文窗口是模型层或输入预处理面对的事,不是输出后处理的目标。输出后处理聚焦在模型说出的话:格式化、修正错误、过滤幻觉。就像笼头只管马“出来”的东西,不管马“看到”多远。

Q4. 在工具编排中,“Agent 循环”的核心结构是?

单选题 · mid

  • A.训练-验证-测试
  • B.计划-行动-观察← 正确答案
  • C.输入-处理-输出
  • D.编码-解码-重构

答案:B。Agent 循环是“模型决策(计划)→ 执行工具(行动)→ 结果写回上下文(观察)→ 再次决策”的往复过程。A 是机器学习训练流程,C 是通用数据处理模型,D 是编程术语,都不描述 Agent 的自我迭代特征。

Q5. 模型单次调用准确率为 80%,后处理环节能拦截 50% 的错误,系统的最终错误率约为多少?

单选题 · hard

  • A.系统错误率约为四成
  • B.系统错误率约为三成
  • C.系统错误率约为一成← 正确答案
  • D.系统错误率约为两成

答案:C。模型错误率为 20%,后处理拦下一半,剩余错误率为 20% × 50% = 10%,即约一成。这体现了 Harness 的核心价值:不改变模型本身,通过外围关卡“打折”错误率。

Q6. Harness 中安全校验的直接目标是?

单选题 · hard

  • A.提升模型推理速度
  • B.拦截提示注入与敏感泄漏← 正确答案
  • C.增加模型上下文长度
  • D.自动扩充训练数据

答案:B。安全校验围绕三条红线:提示注入防护、用户权限控制、敏感信息过滤,目标是拦截越界内容。推理速度、上下文长度、训练数据都是模型层或性能优化话题,不属于安全校验的职责。

Q7. 从原型到生产,Harness Engineering 最重要的价值是?

单选题 · mid

  • A.让模型输出变得更加稳定可控← 正确答案
  • B.让模型参数变得更少更小
  • C.让训练数据变得更多更干净
  • D.让 GPU 利用率接近百分之百

答案:A。Harness 用输入过滤、输出校验、重试降级等手段,把概率性的模型输出驯化成稳定可控的服务,这是从 demo 走向生产的关键。参数、数据、GPU 都属于模型训练与基础设施范畴。

Q8. Harness Engineering 的典型工作包含哪些?

多选题 · mid

  • A.设计提示词清洗规则← 正确答案
  • B.组织工具的调用与回退← 正确答案
  • C.修改模型的激活函数
  • D.建立输出校验与修复管道← 正确答案

答案:ABD。A 是输入预处理,B 是工具编排,D 是输出后处理,都是 Harness 的典型工作。C 修改激活函数属于模型结构改造,是算法工程师的领域,不在 Harness 范围内。

Q9. 以下哪些属于把“模型不确定性”封装在可控框架内的手段?

多选题 · hard

  • A.对模型输出做重试与降级← 正确答案
  • B.用规则校验约束输出结构← 正确答案
  • C.去除模型的上下文记忆能力
  • D.对敏感输入做隔离处理← 正确答案

答案:ABD。重试降级应对随机失败,规则校验约束格式与内容,隔离处理切断敏感风险,都是封装不确定性的手段。C 去除记忆是修改模型能力而非工程封装,且会损害应用体验。

Q10. 关于 Harness 与 MLOps 的关系,下列说法正确的是?

多选题 · easy

  • A.两者都关注模型应用的生产化← 正确答案
  • B.Harness 侧重应用层运行框架← 正确答案
  • C.MLOps 侧重模型与数据管道← 正确答案
  • D.两者完全无关可以互相替代

答案:ABC。Harness 是应用层的运行脚手架,MLOps 是模型训练与部署的流水线管理,两者都是 AI 工程化的组成部分,关注点互补而非替代。D 说“完全无关”忽略了它们同属生产化大方向。