尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI Agent Harness Engineering 用户体验设计:从意图识别到交互闭环,让智能体更懂用户

AI Agent Harness Engineering 用户体验设计:从意图识别到交互闭环,让智能体更懂用户 1. 为什么你的 Agent 总被吐槽听不懂人话我试过把一个内部工单助手从 Demo 推到 300 人日常使用第一周就收到一堆反馈有人说“帮我查下上周的报销进度”被回成“请提供工单编号”有人说“明天下午三点约个会议室”被反问“请问会议室容量需求是多少”。这些不是模型不行而是中间那层 Harness 没设计好。AI Agent Harness Engineering 说白了就是智能体的“线束层”它夹在大模型、工具 API、知识库和用户界面之间负责把用户随口一句话翻译成可执行的任务再把执行结果翻译回用户能看懂的话。它决定了三件事——意图识别准不准、交互反馈顺不顺、任务闭环完不完整。适合谁做智能体产品的开发、做 Agent 体验设计的产品经理、以及想把内部工具接上大模型的工程师。意图识别是这条链路的第一道关。用户不会按你设计的槽位说话他会省略、会指代、会一句话塞三个需求。Harness 层要做的不是让模型“更聪明”而是给它补上下文、设阈值、留退路。置信度低于阈值就别硬猜给选项让用户点参数能从用户画像或历史会话里拿到的绝不重复问。这一层做扎实后面交互反馈和任务闭环才有意义。这篇会给你一套可复制的 Harness 配置示例、意图识别的验证步骤以及怎么用 TaoToken 统一 Key 和 API 通道把调用跑通。全程按能跟做的步骤写不堆概念。2. TaoToken 前置准备统一 Key 与 API 通道在写 Harness 代码之前先把调用通道理顺。很多团队卡在这一步不同模型、不同工具各配一套 Key环境变量满天飞换台机器就跑不起来。TaoToken 的作用是把模型调用收敛到一个 Base URL 和一把 Key 上Harness 层只认这一套配置后面换模型、加工具都不用动业务代码。你需要准备的东西很少一个 TaoToken 账号、一把 API Key、一个能跑 Python 的环境。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建 Key。API 地址统一用 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 OpenAI 兼容的 base_url 使用。为什么 Harness 层特别需要这种统一通道因为 Harness 的核心职责之一是“能力路由”——同一个用户意图可能命中不同模型或工具。如果每个能力背后都是一套独立鉴权路由逻辑会变得又臭又长。统一通道之后路由只需要改 model 字段和请求参数鉴权、重试、限流都在通道层解决。创建 Key 的路径登录后进控制台找到 API Keys 页面新建一个 Key 并复制保存。这个 Key 只显示一次丢了就重建。建议按环境分 Key比如 dev 一把、prod 一把方便排查问题时定位来源。拿到 Key 之后先别急着写 Harness用最小请求验证通道是通的。这一步能排掉 80% 的环境问题。把 Key 写进环境变量不要硬编码在代码里export TAOTOKEN_API_KEY你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用 Claude Code 这类编码工具配置方式略有不同需要同时填 Base URL、Key 和 Model ID 三件套。以 settings 片段为例路径和字段名要和工具要求一致{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }注意这里 Base URL 同样不带 UTM 参数Key 和 Model ID 必须同时存在缺一个就会报鉴权或模型不存在。Cline、Codex 的 auth.json 也是同样的三件套逻辑Base URL 指向 https://taotoken.net/api Key 填你创建的那把Model ID 填你要用的模型标识。三件套齐了工具才能正常发起请求。通道验证通过的标准很简单发一条 chat 请求能拿到正常回复且返回结构里有 choices 字段。下一节我们把这一步写进可复制的配置里。3. 可复制 Harness 配置与意图识别代码这一节是全文的核心给你一份能直接跑的 Harness 最小实现。它包含三部分统一客户端配置、意图识别函数、以及置信度分流逻辑。代码用 Python依赖只有 openai 和 pydantic装完就能跑。先装依赖pip install openai pydantic python-dotenv然后建一个.env文件把上一节的变量放进去TAOTOKEN_API_KEY你的Key TAOTOKEN_BASE_URLhttps://taotoken.net/api接下来是 Harness 的核心配置。注意 base_url 直接读环境变量model 字段按你实际要用的模型填。意图识别用 JSON 输出约束让模型返回 intent、confidence、params 三个字段这样 Harness 层才能做阈值判断和参数补全。import os import json from dotenv import load_dotenv from openai import OpenAI from pydantic import BaseModel from typing import Dict, List, Optional load_dotenv() client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL) ) INTENT_LIST [ {name: query_order, desc: 查询订单进度, required: [order_id]}, {name: book_room, desc: 预订会议室, required: [date, time, capacity]}, {name: apply_leave, desc: 申请请假, required: [start_date, end_date, leave_type]}, {name: unknown, desc: 未知意图, required: []} ] class UserProfile(BaseModel): user_id: str dept: str common_city: str 北京 reply_style: str concise def recognize_intent(user_input: str, context: str, profile: UserProfile) - Dict: prompt f你是意图识别模块。根据用户输入、上下文和画像输出JSON。 可选意图{json.dumps(INTENT_LIST, ensure_asciiFalse)} 用户画像{profile.model_dump_json()} 上下文{context} 用户输入{user_input} 只输出JSON格式 {{intent: 意图名, confidence: 0.0到1.0, params: {{参数名: 值}}}} resp client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: prompt}], temperature0 ) return json.loads(resp.choices[0].message.content)这段代码里有两个设计点值得说。第一temperature 设为 0意图识别要的是稳定不是创意同一句话每次识别结果应该一致。第二prompt 里把意图列表和用户画像都塞进去模型才能结合“这个用户是研发部、常用城市北京”来补全参数而不是干巴巴地问。置信度分流是 Harness 体验的关键。低于阈值不要硬执行给选项让用户点参数缺失不要一次问一个能合并就合并。下面这个函数把分流逻辑写全def handle_request(user_input: str, context: str, profile: UserProfile) - str: result recognize_intent(user_input, context, profile) intent result[intent] confidence result[confidence] params result.get(params, {}) if confidence 0.8: options / .join([i[desc] for i in INTENT_LIST if i[name] ! unknown]) return f我不太确定你的意思你是想{options} intent_cfg next((i for i in INTENT_LIST if i[name] intent), None) if not intent_cfg: return 这个需求我暂时还不支持你可以试试查订单、订会议室、请假。 missing [p for p in intent_cfg[required] if not params.get(p)] if missing: return f还需要你补充{、.join(missing)} return execute_intent(intent, params, profile)execute_intent 就是你接工具 API 的地方按 intent 分发到不同函数。这里不展开具体工具实现重点是 Harness 层的结构识别、分流、补参、执行、对齐五步清晰。如果你用 Claude Code 做编码类 Agent配置片段要写成工具认的格式。下面这份 settings 片段可以直接放进项目配置路径和字段名保持一致{ model: claude-sonnet-4-20250514, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的Key }, permissions: { allow: [Read, Write, Bash] } }三件套 Base URL、Key、Model ID 一个都不能少。少了 Base URL 会走默认地址少了 Key 直接 401少了 Model ID 会报模型不存在。Cline 的 MCP 配置同理在 MCP server 配置里把这三项填全。4. 验证请求与成功结果对照配置写完必须验证。验证分两步先验通道再验 Harness 逻辑。通道验证用一条最小 chat 请求Harness 验证用几条典型用户输入跑一遍看分流是否符合预期。通道验证代码resp client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: 回复ok}] ) print(resp.choices[0].message.content)成功结果应该打印出ok或类似短回复。如果这里就报错先别往下走对照第 5 节的排查表处理。通道通了再跑 Harnessprofile UserProfile(user_idu001, dept研发部) print(handle_request(帮我查下订单12345到哪了, , profile)) print(handle_request(明天下午三点订个能坐10人的会议室, , profile)) print(handle_request(我想请下周一和周二的事假, , profile))预期结果对照输入预期 intent预期行为查订单12345query_order参数齐全直接执行订会议室book_room参数齐全直接执行请假apply_leave参数齐全直接执行随便说一句unknown 或低置信给选项让用户选如果第一条返回“还需要你补充order_id”说明模型没从“12345”里提取出参数检查 prompt 里的参数说明是否够明确。如果第三条返回低置信选项说明 leave_type 没识别出“事假”可以在意图配置里给 leave_type 加枚举提示。成功跑通的标志是三条明确需求都直接执行模糊需求走选项分流没有一条出现“答非所问”。这时候你的 Harness 层已经具备基本可用性。再补一个多轮验证。用户第一句说“订会议室”Harness 反问“还需要补充date、time、capacity”用户回“明天下午三点10人”Harness 应该能结合上下文补全并执行。这验证的是上下文管理子系统是否生效。如果第二轮还是重复问全部参数说明上下文没传进 recognize_intent检查 context 变量是否在会话间正确保存。5. 常见报错排查401、local proxy failed、reading choices这一节按真实报错来。你在接入和验证过程中大概率会碰到下面几类对照处理。401 Unauthorized。最常见的原因是 Key 没读到或填错。先确认环境变量是否生效echo $TAOTOKEN_API_KEY有没有输出。如果输出为空说明 .env 没加载或 export 没执行。如果 Key 有值还报 401检查 base_url 是否写成了带路径的形式正确写法是https://taotoken.net/api不要在后面加/v1或多余斜杠。还有一种情况是 Key 被删除或过期去控制台重新建一把。local proxy failed。这个报错通常出现在工具类客户端Claude Code、Cline里意思是客户端尝试走本地代理但没连上。处理方式是检查客户端配置里的 Base URL 是否指向https://taotoken.net/api以及是否有其他代理配置干扰。把客户端里多余的 proxy 设置清掉只保留 Base URL、Key、Model ID 三件套。如果系统环境变量里有 HTTP_PROXY 之类临时 unset 再试。reading choices 报错。典型表现是KeyError: choices或NoneType has no attribute choices。这说明返回结构里没有 choices 字段通常是请求没真正到达模型服务或者返回的是错误 JSON。先打印完整 response 看内容如果是鉴权错误回到 401 处理如果是模型名不对检查 model 字段是否拼写正确。还有一种情况是流式和非流式混用Harness 里统一用非流式避免解析复杂。OAuth 相关报错。出现在 Claude Code 这类工具里提示 OAuth 失败或 token 无效。原因是工具默认走 OAuth 登录而你用的是 API Key 模式。解决方式是在配置里显式指定 API Key 和 Base URL关掉 OAuth 流程。settings 片段里ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL同时存在工具就会走 Key 模式。模型不存在或 model not found。检查 Model ID 是否和通道支持的模型列表一致。不同工具对模型名的写法要求不同有的要全称有的要简称。最稳的方式是先用一条 curl 请求测通道确认模型名可用后再填进配置。排查顺序建议先 curl 测通道再测单次 chat再跑 Harness 逻辑。每一步都确认通过再往下不要跳步。跳步的结果是报错定位不到具体层浪费时间。6. 把 Harness 跑进日常从验证到长期使用验证通过之后下一步是把它用起来。短期验证和调试用 API Keys 加接入文档就够了路径在 https://taotoken.net/api-keys 和 https://taotoken.net/doc 照着文档把 Key 管理和请求格式对齐即可。如果你要对比不同模型在意图识别上的表现用模型对话页面快速试几条输入看哪个模型对省略句和指代处理得更稳路径在 https://taotoken.net/chat 。长期跑编码类 Agent 或者多轮任务型 Agent建议走 Coding Plan路径在 https://taotoken.net/coding-plan 。原因是这类场景请求量大、会话长按量计费容易失控套餐制更可控。Harness 层的上下文管理会频繁调用模型做意图识别和结果对齐调用量比单次对话高不少提前规划额度能避免中途断掉。回到体验设计本身Harness 层做完基础版之后优先优化两件事。一是把高频意图的置信度阈值调优用真实用户语料跑一批看哪些意图容易误判针对性补 few-shot 示例。二是把结果对齐做细同一个执行结果对简洁型用户只给结论对详细型用户给完整信息这个在 UserProfile 里加一个 reply_style 字段就能控制。最后留一个实操建议每次改完 Harness 配置用固定的一组测试输入回归一遍确认没有把之前能识别的意图改坏。这组测试输入就放在项目里当成 Harness 的单元测试。体验设计的迭代靠的是这种小步验证不是一次大改。
返回列表