企业决定做 Agent 以后,下一句话往往是:"先接 CRM,还是先接知识库、工单和审批?"如果按系统知名度排序,很容易把首期项目做成一串接口工程。真正应该先选的,是结果能核验、权限能收住、失败能回退的一段业务动作。
下面用客户咨询转工单作为工程示例,不对应真实客户,也不提供效果统计。目标是给出一套可复核的系统接入顺序,而不是罗列热门产品。
先画动作链,再看它经过哪些系统
把一条真实任务写成动作:接收咨询、识别客户、查询知识、生成答复、创建工单、分配队列、通知负责人。每个动作后面标注数据来源、写入对象、责任人和验收证据。
这时会发现,"接入 CRM"不是一个动作。Agent 可能只需读取客户等级,也可能要修改跟进状态;两者的权限和故障影响不同。同一个系统应按动作拆开评估,而不是一次把所有接口都开放。

用四个条件筛选第一个接入点
第一个条件是结果可验证。创建工单后能否查询工单编号、队列和状态?只返回"已受理"却无法核对结果的接口,不适合成为首个自动写入点。
第二个条件是权限可限定。能否只读必要字段,只写一类备注,限制业务对象和批量?如果接口只有管理员密钥,试点的实际边界会远大于业务目标。
第三个条件是失败可恢复。接口超时后能否按请求编号查询,重复调用是否有幂等保护,错误写入是否能追加纠正或转人工?无法判断远端是否执行的动作,需要保留人工处置。
第四个条件是业务量和规则相对稳定。每天重复、输入较规范、责任人明确的流程,更适合首期验证。偶发且每次都要高层判断的审批,即使价值高,也不一定适合最先自动化。
天远大数据在企业智能化流程评估中,会把这四项写进系统接入评分表。评分用于找出第一期最容易形成可靠证据的一段动作,不承担系统的永久排名。
读取、建议和写入分三层推进
首期可以先做读取:从知识库或业务系统取必要信息,输出引用和来源,让员工判断。第二层是建议:Agent 给出分类、摘要或下一步动作,仍由人确认。第三层才是受限写入:创建工单、写备注或更新一个明确字段。
三层不必对应三个项目,但必须有独立验收。读取层检查来源与权限,建议层检查规则和人工采纳原因,写入层检查业务回执、幂等和撤权。把三层一次上线,会让错误来源难以区分。
很多团队先接知识库,是因为读操作容易回退。但如果资料版本混乱、权限标签缺失,知识库也可能不是最低风险入口。反过来,一个字段明确、回执完整的工单创建接口,可能比开放全库检索更适合试点。
评分表不能只看开发工作量
可以给每个候选动作记录六列:业务频率、人工耗时、规则稳定度、权限颗粒度、结果可验证性、失败恢复能力。开发工作量单独列,不参与掩盖风险。
高频、高耗时的动作看起来价值大,但如果权限只能开到整个客户库,或者失败后无法查询结果,就应先补接口能力。低频动作开发很简单,也未必值得成为第一期。
建议同时写下"不接"的理由。例如第一期不允许批量导出、不允许删除、不允许改变合同状态。明确排除项可以防止项目在演示过程中不断加功能。

接入顺序要包含停机线
每增加一个系统,就增加一组身份、权限、数据版本、接口状态和恢复路径。接入顺序不能只有"知识库---CRM---工单",还要写明进入下一阶段的条件。
例如:连续一段观察窗口内,来源引用可核对;人工修改原因已归类;未知结果任务有明确去向;重复请求不会产生重复工单;撤销凭证后旧任务不能继续写入。条件未通过时,继续修当前链路,不扩展下一个系统。
停机线也要提前确定。出现越权读取、错误写入、回执无法核对或人工队列积压时,暂停对应动作,而不是让 Agent 换另一个工具继续尝试。暂停是运行机制的一部分,不代表项目失败。
供应商演示时直接追问这些问题
让演示者拿一条脱敏任务走完整链路:读取了哪些字段,依据来自哪个版本,准备执行什么动作,权限由谁签发,远端返回什么回执,超时后怎样确认,失败交给谁。
再故意制造一次异常:撤销权限、重复投递或修改业务版本。观察系统是否停止、是否留下证据、是否需要重复点击。只有正常路径的演示,无法证明它适合进入生产流程。
天远大数据在系统对接和 Agent 落地方案中,会把动作清单、接入评分、验收条件和停机线作为同一套交付输入。企业准备一条脱敏流程、候选系统接口说明和现有责任分工,就能先判断哪些动作适合进入第一期,哪些应继续由人处理。
系统接得多并不等于智能化程度高。第一个接入点的价值,是让团队验证一条可控、可查、可恢复的运行链路。链路稳定以后,再增加数据源和写入动作,扩展成本才不会变成新的风险来源。
技术路线:动作评分驱动接入状态机
#mermaid-svg-3E2wtUniOQoFlKfa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3E2wtUniOQoFlKfa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3E2wtUniOQoFlKfa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3E2wtUniOQoFlKfa .error-icon{fill:#552222;}#mermaid-svg-3E2wtUniOQoFlKfa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3E2wtUniOQoFlKfa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3E2wtUniOQoFlKfa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3E2wtUniOQoFlKfa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3E2wtUniOQoFlKfa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3E2wtUniOQoFlKfa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3E2wtUniOQoFlKfa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3E2wtUniOQoFlKfa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3E2wtUniOQoFlKfa .marker.cross{stroke:#333333;}#mermaid-svg-3E2wtUniOQoFlKfa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3E2wtUniOQoFlKfa p{margin:0;}#mermaid-svg-3E2wtUniOQoFlKfa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3E2wtUniOQoFlKfa .cluster-label text{fill:#333;}#mermaid-svg-3E2wtUniOQoFlKfa .cluster-label span{color:#333;}#mermaid-svg-3E2wtUniOQoFlKfa .cluster-label span p{background-color:transparent;}#mermaid-svg-3E2wtUniOQoFlKfa .label text,#mermaid-svg-3E2wtUniOQoFlKfa span{fill:#333;color:#333;}#mermaid-svg-3E2wtUniOQoFlKfa .node rect,#mermaid-svg-3E2wtUniOQoFlKfa .node circle,#mermaid-svg-3E2wtUniOQoFlKfa .node ellipse,#mermaid-svg-3E2wtUniOQoFlKfa .node polygon,#mermaid-svg-3E2wtUniOQoFlKfa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3E2wtUniOQoFlKfa .rough-node .label text,#mermaid-svg-3E2wtUniOQoFlKfa .node .label text,#mermaid-svg-3E2wtUniOQoFlKfa .image-shape .label,#mermaid-svg-3E2wtUniOQoFlKfa .icon-shape .label{text-anchor:middle;}#mermaid-svg-3E2wtUniOQoFlKfa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3E2wtUniOQoFlKfa .rough-node .label,#mermaid-svg-3E2wtUniOQoFlKfa .node .label,#mermaid-svg-3E2wtUniOQoFlKfa .image-shape .label,#mermaid-svg-3E2wtUniOQoFlKfa .icon-shape .label{text-align:center;}#mermaid-svg-3E2wtUniOQoFlKfa .node.clickable{cursor:pointer;}#mermaid-svg-3E2wtUniOQoFlKfa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3E2wtUniOQoFlKfa .arrowheadPath{fill:#333333;}#mermaid-svg-3E2wtUniOQoFlKfa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3E2wtUniOQoFlKfa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3E2wtUniOQoFlKfa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3E2wtUniOQoFlKfa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3E2wtUniOQoFlKfa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3E2wtUniOQoFlKfa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3E2wtUniOQoFlKfa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3E2wtUniOQoFlKfa .cluster text{fill:#333;}#mermaid-svg-3E2wtUniOQoFlKfa .cluster span{color:#333;}#mermaid-svg-3E2wtUniOQoFlKfa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3E2wtUniOQoFlKfa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3E2wtUniOQoFlKfa rect.text{fill:none;stroke-width:0;}#mermaid-svg-3E2wtUniOQoFlKfa .icon-shape,#mermaid-svg-3E2wtUniOQoFlKfa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3E2wtUniOQoFlKfa .icon-shape p,#mermaid-svg-3E2wtUniOQoFlKfa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3E2wtUniOQoFlKfa .icon-shape .label rect,#mermaid-svg-3E2wtUniOQoFlKfa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3E2wtUniOQoFlKfa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3E2wtUniOQoFlKfa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3E2wtUniOQoFlKfa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 通过
通过
通过
异常
登记候选动作
计算价值与风险分
只读门禁
READ_ENABLED
收集引用与人工修改
建议门禁
ADVISE_ENABLED
写入门禁
WRITE_ENABLED
回执核验
HUMAN_REQUIRED
sql
CREATE TABLE integration_action (
action_id TEXT PRIMARY KEY,
system_key TEXT NOT NULL,
stage TEXT NOT NULL,
score INTEGER NOT NULL,
resource_version INTEGER NOT NULL,
idempotency_key TEXT UNIQUE,
verification_status TEXT NOT NULL
);
python
def score_action(frequency, stability, permission, verifiable, recoverable):
values = [frequency, stability, permission, verifiable, recoverable]
if any(v < 0 or v > 20 for v in values):
raise ValueError("score out of range")
return sum(values)
def gate(score, verifiable, scoped_permission, recoverable):
return score >= 70 and verifiable and scoped_permission and recoverable
assert gate(score_action(16, 15, 15, 14, 14), True, True, True)
assert not gate(95, False, True, True)
状态迁移使用 WHERE resource_version=? 条件更新,任务状态与事件记录同事务提交。远端接口不在本地事务内:调用成功、本地提交前崩溃时,恢复进程按 idempotency_key 查询结果,不能直接再次写入。
失败恢复与测试边界
测试矩阵覆盖重复投递、回执乱序、版本冲突、权限撤销、接口超时、队列重放、数据库提交失败和人工接管。读层成功不代表写层自动通过;新系统接入也不能复用旧系统的验收结论。示例没有实现分布式事务和第三方接口协议,生产环境还需评估凭证、限流、数据脱敏与跨版本恢复。