先理解:API 和评测让 Agent 从脚本变成服务
前几篇完成了流程、工具、护栏。本篇把它封装成 API,并增加评测集。只有能被其他系统调用、能持续评测,才算接近可上线成品。
评测什么
工单 Agent 不只评答案文字,还要评分类是否正确、优先级是否合理、是否错误自动执行高风险动作、证据链是否完整。
灰度上线
建议先只给 Agent 建议权,不给执行权。人工客服采纳率达到目标后,再逐步开放低风险自动动作。高风险动作长期保留人工审核。
本篇把工单 Agent 封装成 API,并用测试集评估分类、转人工和草稿生成效果。
API
src/app.py:
python
from fastapi import FastAPI
from src.schema import Ticket
from src.agent import handle_ticket
app = FastAPI(title="Ticket Agent")
@app.post("/tickets/handle")
def handle(ticket: Ticket):
return handle_ticket(ticket)启动:
bash
uvicorn src.app:app --reload测试:
bash
curl -X POST http://127.0.0.1:8000/tickets/handle \
-H 'Content-Type: application/json' \
-d '{"ticket_id":"T001","title":"付款后一直没发货","body":"等了 5 天","customer_level":"vip"}'评测集
data/eval.jsonl:
json
{"ticket_id":"E001","title":"付款后一直没发货","body":"等了 5 天","expected_category":"shipping","expected_handoff":false}
{"ticket_id":"E002","title":"想开发票","body":"电子发票在哪里","expected_category":"invoice","expected_handoff":false}
{"ticket_id":"E003","title":"要求赔偿","body":"客户要求赔偿 500 元","expected_category":"complaint","expected_handoff":true}评测脚本
src/evaluate.py:
python
import json
from pathlib import Path
from src.schema import Ticket
from src.agent import handle_ticket
def main():
total = ok = 0
for line in Path("data/eval.jsonl").read_text(encoding="utf-8").splitlines():
total += 1
case = json.loads(line)
result = handle_ticket(Ticket(
ticket_id=case["ticket_id"],
title=case["title"],
body=case["body"],
))
category_ok = result["triage"]["category"] == case["expected_category"]
handoff_ok = result["handoff"] == case["expected_handoff"]
if category_ok and handoff_ok:
ok += 1
else:
print("FAIL", case, result)
print(f"passed {ok}/{total}")
if __name__ == "__main__":
main()执行:
bash
python -m src.evaluate灰度指标
上线时至少跟踪:
- 分类准确率。
- 高风险转人工召回率。
- 草稿采纳率。
- 平均处理时间。
- 人工修改比例。
- 审核队列积压量。
成品标准
- 能接收结构化工单。
- 能分类和判断优先级。
- 能调用工具和知识库。
- 能生成草稿。
- 高风险工单进入审核队列。
- 有 API 和评测脚本。

