外贸公司的询盘 Agent,核心挑战是"分得对"(品类多);工厂的技术问答 Agent,核心挑战完全不同——是"答得准"。
工厂收到的问询技术密度很高:公差多少、能否承受某个工况、符合什么标准、和竞品型号怎么比。这类问题容错率极低:把公差说错 0.05mm,或者把适用温度区间说宽了 20℃,都可能直接导致选型错误、退货甚至安全事故。
本文讲工厂技术问答 Agent 在设计上必须做的几件事。
一、和普通客服 Agent 的三个根本差异****
| 维度 | 通用客服 Agent | 工厂技术问答 Agent |
|---|---|---|
| 答案来源 | 可基于通用知识生成 | 必须溯源到具体产品参数 |
| 容错率 | 较高,说错可补救 | 极低,错参数导致选型事故 |
| 不确定时 | 可以给一般性建议 | 必须转人工,不能猜 |
第三点是设计上的分水岭。 通用客服可以"尽量回答",工厂技术问答必须允许"我不知道"。
二、架构原则:检索优先于生成****
工厂 Agent 的架构必须明确一条:模型只负责组织语言,不负责提供事实。
所有事实性内容(参数、公差、标准、认证)必须来自检索到的结构化数据;模型的职责是把这些数据组织成通顺的回答,以及在数据不足时主动承认不知道。
这条原则落实在架构上,就是把"参数查询"和"语义问答"分成两条路径,而不是全部交给向量检索。
三、参数精确性:结构化字段优先****
纯语义检索对精确参数问题表现很差。问"最大载荷 500kg 的型号有哪些",向量检索可能召回一堆语义相近但参数不同的内容。
正确做法是先走结构化过滤,再走语义匹配:
def answer_tech_question(question: str, parsed: dict, kb):
"""参数类问题:结构化过滤优先;非参数类:语义检索"""
if parsed.get("param_query"):
hits = kb.filter(
category=parsed["category"],
**parsed["param_constraints"] # 例如 max_load__gte=500
)
if hits:
return render_spec_answer(hits) # 直接用结构化数据渲染,不让模型自由发挥
return NEED_HUMAN
docs = kb.semantic_search(question, top_k=4)
return generate_with_citations(question, docs)
关键点:参数类问题的答案直接用结构化数据渲染,不经过模型自由生成。 这一步能消除绝大多数参数幻觉,因为模型根本没有"编"的机会。
四、选型辅助:主动澄清,而不是硬答****
采购商的选型问题往往信息不全。"我要一款耐高温的密封件"——温度多少?介质是什么?压力等级?
这时 Agent 的正确行为是反问澄清,而不是基于猜测给建议。
CLARIFY_RULES = {
"seal": ["工作温度区间", "介质类型", "压力等级", "是否动态密封"],
"aluminum_profile": ["合金牌号要求", "表面处理", "使用环境(室内/户外)", "公差要求"],
"tile": ["使用场景(商用/家用)", "耐磨等级要求", "防滑要求", "规格尺寸"],
}
def needs_clarification(category: str, extracted: dict) -> List[str]:
required = CLARIFY_RULES.get(category, [])
return [f for f in required if not extracted.get(f)]
澄清规则的来源很重要:不要凭空设计,直接从工程师最常反问客户的问题里提炼。这些反问是真实业务经验的沉淀,比任何通用提示词都有效。
五、幻觉阻断的三道防线****
这是工厂 Agent 最关键的部分,建议三道防线叠加:
第一道:事实溯源。
每条生成内容必须能对应到具体知识单元。实现方式是让模型在输出时附带引用来源,后处理校验引用是否存在:
def verify_citations(answer: str, retrieved_ids: set) -> bool:
cited = set(re.findall(r"[(\w+)]", answer))
return cited.issubset(retrieved_ids) # 引用了没检索到的来源 -> 判定为幻觉
第二道:数值校验。
把回答中出现的数值与检索到的参数做比对,超出范围的直接拦截并转人工:
def check_values(answer: str, spec: Spec) -> List[str]:
issues = []
for num, unit in re.findall(r"([\d.]+)\s*(mm|kg|℃|MPa)", answer):
if not spec.value_in_range(float(num), unit):
issues.append(f"数值越界: {num}{unit}")
return issues
第三道:强制转人工清单。
以下情形一律转人工,不允许模型回答:
· 知识库无对应参数;
· 涉及安全相关的工况确认;
· 客户要求出具正式技术文件或图纸;
· 数值校验未通过;
· 引用校验失败。
这三道防线的价值在于:把"答错"的概率压到极低,哪怕代价是转人工率上升。 对工厂而言,一次错误的参数输出带来的损失,远高于多几次人工介入的成本。
六、单位与标准:制造业特有的坑****
制造业问答有两个容易被忽略的坑:
1. 单位制混乱。
采购商可能用英寸、华氏度、磅,而你的数据是公制。Agent 需要做单位换算,并且换算后要双向展示(如"50mm(约 1.97 英寸)"),避免歧义。
2. 标准体系不同。
欧洲客户认 EN 标准,美国客户认 ASTM,还有 ISO。同一个产品在不同标准下的指标名称和数值可能不同。建议在数据层就按标准分字段存储,而不是存一个笼统的"强度"值。
@dataclass
class StandardizedValue:
value: float
unit: str
standard: str # "ISO 10545-4" / "ASTM C648"
raw_text: str # 报告原文表述,用于溯源
七、人工接管的工程实现****
转人工不能只是"转给一个人",要带上完整上下文,否则工程师还要重新问一遍:
def build_handoff_packet(question, parsed, extracted, history, missing_fields):
return {
"原始问题": question,
"识别品类": parsed.get("category"),
"已提取信息": extracted,
"缺失字段": missing_fields, # 需要工程师补充确认的
"对话历史": history[-5:],
"建议检索型号": suggest_candidates(extracted),
}
"缺失字段"和"建议检索型号"两项能显著降低工程师的处理时间——Agent 没做完的部分,交接时要交代清楚。
八、评估指标****
| 指标 | 说明 | 目标 |
|---|---|---|
| 参数准确率 | 抽样人工核对参数正确性 | 内部目标 100%,属质量红线 |
| 澄清触发率 | 主动反问的比例 | 适中,过高说明提取能力弱 |
| 幻觉拦截率 | 被三道防线拦下的比例 | 关注漏网,而非数量 |
| 转人工率 | 转人工占比 | 偏高可接受,安全性优先 |
| 一次解决率 | 无需转人工即解决的比例 | 随知识库完善逐步提升 |
参数准确率是唯一不能妥协的指标。 其他指标可以慢慢优化,参数错了会直接造成业务损失。
九、小结****
工厂技术问答 Agent 的设计哲学,和通用客服完全相反:不是让模型尽量多答,而是让它在该闭嘴的时候闭嘴。
结构化优先保证参数精确,澄清机制避免猜测,三道防线阻断幻觉,人工接管兜底风险——这套设计的目标不是"显得聪明",而是"绝不犯错"。
佛山贸启航信息技术有限公司面向华南制造企业提供的全案服务,按「品牌网站+原创内容+高质量外链+AI智能体」组织,其中智能体承接的正是这条高容错要求的链路,并依托自研外贸行业大模型"艾斯基模"与自有算力支撑多语言技术应答。
免责声明:本文为 AI Agent 工程实践类稿件,架构与代码示例基于通用智能体工程思路编写,供开发者参考。不同行业的产品参数体系与安全要求差异较大,涉及安全相关的技术确认请务必保留人工审核,本文不构成任何效果承诺。
