写点什么

提示词工程 -HIL 场景与洞见

作者:Jxin
  • 2025-09-12
    福建
  • 本文字数:6662 字

    阅读完需:约 22 分钟

提示词工程-HIL场景与洞见

文 | 三七 (转载请注明出处)

公众号:三七-编程实战


不积跬步无以至千里,欢迎来到 AI 时代的编程实战课

场景引入:带 2 岁女儿爬山的智慧启发

周末阳光正好,我牵着 2 岁女儿的小手爬山。她穿着粉色运动鞋,一路咿咿呀呀数着台阶:"一、二、三!"小短腿倒腾得飞快,兴奋得像只小松鼠。


半山腰时,前方出现一个古朴的观景台。女儿一看到开阔的山谷,眼睛瞬间亮了:"哇!好大呀!"挣脱我的手就要往前冲。


我心脏都提到嗓子眼——那观景台年代久远,边缘竟然没有护栏!


没有任何犹豫,我飞扑过去紧紧拉住她的小手,把她拽回怀里。女儿被突然的动作吓了一跳,小嘴一瘪要哭。但我顾不了那么多,抱着她后退好几步。这种时候不解释、不商量,就是强制保护。


爬到山顶后,我们都累了。女儿在小卖部看到别的小朋友舔冰棍,立刻眼巴巴地拉着我衣角:"爸爸,我也要吃冰棍!"


我摸摸她发热的小脸,看着她渴望的眼神。确实该补水了,但刚爬完山就吃冰品对小肠胃不好。


"宝贝,你看那边还有果汁和小饼干呢!冰棍太凉了会肚子疼,我们买苹果汁配饼干,坐树荫下看风景,就像小野餐一样,好不好?"


女儿歪着小脑袋想了想:"果汁也是甜甜的吗?"


"当然!而且比冰棍更健康。"


"好吧!那我要苹果汁!"


我们在绿荫下坐成一团。女儿一边喝着果汁,一边兴奋地指着远山:"爸爸你看,好漂亮!"小脸上满足的笑容告诉我,今天又是愉快的一天。


下山路上,女儿蹦蹦跳跳走在前面,不时回头冲我甜甜一笑。那一刻我突然意识到:这次爬山的两个小插曲,竟然藏着人机协作的智慧密码。

破俗立新:Agent 不是万能的,聪明的 Agent 知道何时求助

很多人以为 Agent 越智能越好,最好什么都能自己搞定。错了!


真正聪明的 Agent 就像我的宝贝女儿:知道什么场景需要爸爸强制介入,什么时候需要主动说"爸爸我需要帮助"。

HIL 的两种核心机制

静态 HIL = 悬崖边强制保护

  • Agent 行为:准备执行危险操作(删除数据、转账、发布代码)

  • 人类介入:系统强制暂停,必须人类确认才能继续

  • 设计原则:预定义危险边界,无条件触发

动态 HIL = 渴了主动求助

  • Agent 行为:检测到信息不足或风险超阈值,主动寻求协作

  • 人类介入:提供信息、修改方案或做最终决策

  • 设计原则:智能评估自身能力边界,主动求助

人类协作的五种姿势

就像爸爸面对女儿需求的不同回应方式:


  1. 补充信息:"告诉爸爸具体怎么不舒服"

  2. 同意提案:"好的,我们就买果汁"

  3. 修改方案:"冰棍改成果汁+饼干更好"

  4. 拒绝提案:"不行,悬崖边太危险"

  5. 直接转人工:"这个问题太复杂,找妈妈吧"


核心洞察:好的 Agent 不是什么都会,而是精确知道自己不会什么。

深度阐释:HIL 的两种实现方式

方式一:LangGraph 工程实现

以银行转账系统为例:



关键设计要点


🏗️ 架构层次区分


  • 📊 LangGraph 图编排层:蓝色系节点,负责流程控制、HIL 中断、状态管理

  • 🤖 Agent 内部操作层:紫色系节点,负责业务逻辑、工具调用、风险判断


🛑 HIL 机制


  • 静态 HILUserConfirm 图节点对所有转账强制确认

  • 触发原因:金融操作必须用户明确授权,确保每笔转账都经过用户同意

  • 动态 HILHumanReview 图节点仅在 Agent 检测到高风险时触发

  • 触发原因:Agent 检测到高风险因素,需要人类专业判断来决策是否继续


🔧 Agent 智能决策


  • 工具调用序列:Agent 按顺序调用initialize_transfer_sessionperform_risk_assessment

  • 决策分支逻辑:基于风险评估工具返回的"需要人工审核: 是/否"影响图的流程分支

  • 跨层协作:Agent 内部决策结果驱动 LangGraph 图的路由选择


LangGraph 核心代码


# ============================================================================# 静态HIL实现:强制确认机制(悬崖边保护)# ============================================================================
def create_hybrid_hil_graph(): """创建混合架构的HIL图""" graph = StateGraph(HILTransferState) # 添加节点 graph.add_node("user_confirm", user_confirmation_node) # 静态HIL节点 graph.add_node("process_user_confirm", process_user_confirmation) graph.add_node("agent_processing", agent_processing_node) graph.add_node("human_review", human_review_node) # 动态HIL节点 graph.add_node("execute", execute_transfer_node) # 🔑 核心机制:interrupt_before实现HIL暂停 # 这两个节点会自动暂停,等待人类输入 compiled_graph = graph.compile( checkpointer=memory, interrupt_before=["user_confirm", "human_review"] # 静态+动态HIL中断点 ) return compiled_graph
def user_confirmation_node(state: HILTransferState) -> HILTransferState: """静态HIL节点:无条件强制确认""" # 🛑 静态HIL特征:所有转账都必须经过此节点 # 📋 显示确认信息,然后图会自动暂停等待用户输入 confirm_msg = f"""⏸️ 静态HIL - 用户确认💰 金额:¥{state['amount']:,.2f}🏦 路径:{state['from_account']} → {state['to_account']}📊 类型:{'大额转账' if state['amount'] > 100000 else '普通转账'}""" state["messages"].append(SystemMessage(content=confirm_msg)) return state # 返回后图会在interrupt_before处暂停
# ============================================================================# 动态HIL实现:智能求助机制(渴了求助)# ============================================================================
def agent_processing_node(state: HILTransferState) -> HILTransferState: """Agent业务处理节点:智能判断是否需要人工审核""" agent = create_business_agent() message = f"请处理转账:从账户 {state['from_account']} 转账 ¥{state['amount']:,.2f} 到账户 {state['to_account']},完成初始化和风险评估" result = agent.invoke({"messages": [HumanMessage(content=message)]}, agent_config) # 🤔 动态HIL触发逻辑:Agent基于工具返回结果智能判断 if result and "messages" in result: for msg in result["messages"]: if hasattr(msg, 'content'): content = str(msg.content) # 🚨 关键判断:Agent通过工具调用结果决定是否需要人类协作 if "需要人工审核: 是" in content: state["requires_human_review"] = True # 标记需要动态HIL elif "需要人工审核: 否" in content: state["requires_human_review"] = False # 跳过动态HIL return state
@tooldef perform_risk_assessment(session_id: str) -> str: """Agent风险评估工具:动态HIL的触发源""" session = transfer_sessions[session_id] amount = session["amount"] # 🔍 Agent智能评估逻辑 risk_score = 0 if amount > 500000: # 50万以上高风险 risk_score += 3 elif amount > 100000: # 10万以上中风险 risk_score += 2 # 🎯 动态HIL触发条件:基于量化标准而非Agent"感觉" requires_review = risk_score >= 4 or (risk_score >= 2 and random.choice([True, False])) # 📤 返回结构化结果,供Agent节点解析判断 result = f"风险评估完成 | 风险等级: {'HIGH' if risk_score >= 4 else 'MEDIUM' if risk_score >= 2 else 'LOW'}" result += f" | 需要人工审核: {'是' if requires_review else '否'}" return result
def route_after_agent_process(state: HILTransferState) -> Literal["human_review", "execute"]: """智能路由:基于Agent分析结果决定流程走向""" # 🔀 动态HIL路由逻辑:只有Agent标记需要时才触发人工审核 return "human_review" if state.get("requires_human_review", False) else "execute"
# ============================================================================# HIL实现的核心洞察# ============================================================================# 🛑 静态HIL = 预定义强制中断:所有危险操作都必须暂停等待确认# 🤔 动态HIL = 智能条件中断:Agent基于量化标准主动寻求人类协作# 🔑 关键机制 = interrupt_before:LangGraph自动暂停,等待人类输入后继续
复制代码


运行效果


💰 转账 ¥200万⏸️ 静态HIL: 请确认 → 用户输入"确认"🤖 Agent评估: 检测高风险⏸️ 动态HIL: 需要审核 → 审核员"批准"✅ 转账成功
复制代码

方式二:提示词实现

以反馈工单助手为例,展示动态 HIL 的核心智慧:


核心洞察:Agent 无法自我判断信息缺失,必须预定义检查清单。


动态 HIL 实现机制


# 智能反馈助手 - 动态HIL机制设计# 基于"爬山女儿渴了求助"的智慧
## 动态HIL:信息收集智能中断机制
### 核心设计:预定义信息完整性检查
information_completeness_check: | 对于每个反馈类型,Agent必须检查以下信息完整性: 故障反馈信息检查清单: 🔴 必填字段(缺失必须中断): - 异常现象: [具体发生了什么] - 使用环境: [设备/系统/功能] 🟡 重要字段(缺失时智能引导): - 操作流程: [遇到问题时正在进行什么操作] - 发生时间: [问题发生的具体时间] - 影响范围: [问题影响的用户范围]
### 动态HIL触发逻辑(智能评估)
dynamic_assessment_logic: | 每次用户输入后,Agent按以下逻辑评估: 第1步:智能分类识别 if 用户描述包含["崩溃", "错误", "无法使用", "异常"]: 反馈类型 = "故障反馈" 加载对应检查清单 第2步:信息完整性评估 缺失_必填字段 = [] 缺失_重要字段 = [] for 字段 in 必填字段列表: if not 从用户描述中提取到(字段): 缺失_必填字段.append(字段) 第3步:触发HIL决策 if len(缺失_必填字段) > 0: 触发强制信息收集HIL() return 等待用户补充 elif len(缺失_重要字段) > 0: 触发智能引导HIL() return 建议用户补充 else: 继续工单创建流程()
复制代码


实际运行效果展示

场景:用户提供不完整的故障反馈

用户输入:"软件有问题,帮我处理一下"


Agent 智能分析


  • 检测关键词:"问题" → 分类为故障反馈

  • 检查必填字段:

  • 异常现象:❌ 未明确(仅说"有问题")

  • 使用环境:❌ 未提及

  • 触发动态 HIL


Agent 响应(动态 HIL)


🤔 我理解您遇到了软件问题,为了给您提供精准的技术支持,我需要补充一些关键信息。
📊 当前已知信息:✅ 问题类型:软件故障
📋 还需要以下关键信息才能为您创建工单:
┌──────── 📋 故障信息表单 ────────┐│ ⚠️ 异常现象: ________________ ││ 示例:软件崩溃、按钮无响应、数据丢失 ││ 💻 使用环境: ________________ │ │ 示例:PS2扫描仪、移动APP、网页版 ││ ││ 💡 【重要信息】以下信息有助于更快解决:││ 🕐 发生时间: ________________ ││ 示例:今天上午10:30、昨天下午 ││ ⚙️ 操作流程: ________________ ││ 示例:点击扫描按钮后、登录时 │└────────────────────────────────┘
请补充红色必填信息,这样我能为您创建准确的技术工单。您也可以提供蓝色重要信息,帮助技术团队更快定位问题。
复制代码


用户补充:"扫描仪软件点击扫描按钮后就卡死了,今天上午开始的"


Agent 再次分析


  • 异常现象:✅ "点击扫描按钮后就卡死了"

  • 使用环境:✅ "扫描仪软件"

  • 发生时间:✅ "今天上午开始"

  • 操作流程:✅ "点击扫描按钮后"

  • 信息完整性:满足工单创建要求


Agent 响应(继续流程)


✅ 信息收集完整,正在为您创建技术工单...
🎫 【工单创建成功】┌─────────────────────────────────────┐│ 📋 工单标题: 扫描仪软件点击扫描按钮卡死 ││ 🔖 问题类型: 故障 ││ ⚡ 紧急级别: P2中优先级 ││ ⏱️ 处理承诺: 24小时内响应 ││ 👤 负责人: 技术支持部 ││ 🆔 工单编号: HD-20240315-001 ││ 📊 处理状态: 进行中 │└─────────────────────────────────────┘
💡 我们将持续跟进处理进度并及时反馈。
复制代码

设计原则:预定义检查清单的威力

为什么这种方式有效

  1. 🔴 明确的触发条件

  2. ❌ 错误方式:让 Agent"感觉"信息是否充足

  3. ✅ 正确方式:预定义必填字段清单,强制检查

  4. 💡 深层洞见:这是对 Agent 的"约束"——禁止 Agent 假装信息充足

  5. 📋 结构化信息收集

  6. ❌ 错误方式:Agent 随意询问"还需要什么信息吗?"

  7. ✅ 正确方式:显示标准化表单,突出缺失字段

  8. 💡 深层洞见:这是对人类的"约束"——要求人类按特定格式提供信息

  9. 💡 智能引导而非猜测

  10. ❌ 错误方式:Agent 基于部分信息"猜测"并继续处理

  11. ✅ 正确方式:明确告知缺失信息,提供具体示例

  12. ⏳ 强制等待机制

  13. ❌ 错误方式:Agent 说"如果有更多信息会更好"然后继续

  14. ✅ 正确方式:明确表示"需要这些信息才能继续"

核心洞见:约束让 Agent 协作高效

约束的双向性


  • 对 Agent 的约束:不能假装信息充足,必须明确表达需求

  • 对人类的约束:必须按结构化格式提供信息


约束的威力


"约束让协作双方的沟通高效——人与人之间是这样,人与 Agent 也是这样。好的 HIL 设计不是放任自由,而是设计合理的双向约束。"


技术层面的深层原因


上下文窗口的限制


  • 高效协作:结构化对话 → 上下文简洁 → 信息不丢失 → 协作顺畅

  • 低效协作:来回纠偏 → 上下文膨胀 → 超过 LLM 处理上限 → 信息丢失 → 越走越偏


"LLM 有上下文窗口限制,无论是总结还是丢弃最老信息都会造成信息丢失。约束让对话保持聚焦,避免上下文爆炸。"


现实场景的对应


爬山场景


  • 女儿的约束:渴了必须说"爸爸我需要水",不能装不渴

  • 爸爸的约束:必须围绕需求给出更好方案,不能顾左右而言其他


架构决策场景


  • 参与者的约束:必须针对决策文档逐条讨论,不能天马行空

  • 主持人的约束:必须紧抓议题不走偏,不能任由发散


"架构决策文档就是多方协作的约束机制——让会议聚焦在关键决策点上,避免无效讨论消耗时间和注意力。"

总结回顾:Agent 协作的三大智慧

一次爬山,两个场景,三个洞察,让我们理解了 Agent 与人类协作的精髓。


两个经典场景


  • 静态 HIL:悬崖边瞬间决策:父亲强制拉住冲向无护栏观景台的女儿

  • 动态 HIL:山顶需求协商:女儿要冰棍,父亲提供果汁配饼干的更好方案

三个核心洞察

洞察 1:悬崖边保护机制

Agent 心声:"我知道删库跑路很爽,但我也知道你会打死我,所以我主动暂停等你确认。"

技术翻译:预定义危险操作的强制确认点,无条件触发静态 HIL。

洞察 2:信息不足求助机制

Agent 心声:"我能装懂,缺啥说啥。就像小女孩说'爸爸我渴了',我会说'主人我缺信息'。"

技术翻译:基于检查清单的动态 HIL,主动识别能力边界并寻求协作。

洞察 3:双向约束提高协商效率

Agent 心声:"我必须明确说'我要冰棍'(表达约束),爸爸必须围绕我的需求给方案(响应约束)。这种约束让我们的协商又快又好!"

技术翻译:双向约束机制——Agent 约束自己明确表达需求,人类约束自己针对需求提供方案,避免无效沟通,提高协商效率。就像架构决策文档约束会议参与者一样,结构化的约束让协作更高效。

HIL 设计的三重价值

🛡️ 安全价值:智能边界守护

  • 静态边界:预定义危险操作的强制确认点,如悬崖边的瞬间保护

  • 动态边界:Agent 基于能力自省主动寻求人类协作,如渴了求助

  • 零容错:关键业务绝不允许 Agent 独自决策

🚀 效率价值:约束驱动的高效协作

  • 避免试错:明确的检查清单替代模糊的"感觉"判断

  • 上下文保护:结构化对话避免 LLM 上下文窗口爆炸

  • 聚焦机制:像架构决策文档一样,约束让协作紧抓核心问题

🎯 体验价值:智能引导而非被动等待

  • 主动表达:Agent 明确说出需要什么帮助,而不是让用户猜

  • 结构化协作:提供清晰的选择和表单,降低用户认知负担

  • 渐进优化:基于人类反馈持续改进决策质量

如果今天你只记得一句话

"最好的 Agent 架构师不是设计一个万能的自动系统,也不是什么都问用户的烦人系统——而是设计一个知道在什么时候寻求什么帮助,并且可以引导用户协助它,最后还能基于人类的协助做出更好决策的智能系统。"




本文基于真实工程场景和理论分析编写,所有技术案例均已验证。愿你在 AI 时代的编程路上游刃有余,既能直接收敛解决明确问题,又能系统性探索解决复杂挑战!

发布于: 2025-09-12阅读数: 6
用户头像

Jxin

关注

极限编程小🐎农 2018-09-22 加入

你的每一行代码,都是你的名片。

评论

发布
暂无评论
提示词工程-HIL场景与洞见_提示词工程_Jxin_InfoQ写作社区