先理解:工具让 Agent 能做事,知识让 Agent 知道怎么做
一个工单 Agent 至少需要两类能力:查知识、调用工具。知识告诉它流程和规则,工具让它查询订单、创建备注、流转工单。
本篇会实现最小工具集和知识检索。重点不是工具数量,而是工具边界清楚、参数稳定、返回可解释。
工具设计原则
每个工具只做一件事,返回结构化结果,失败时给出明确错误。不要设计一个万能工具让 Agent 随便传自然语言命令,那会很难审计,也很难加权限。
知识检索的作用
同样是退款工单,不同产品、不同时间、不同原因可能处理规则不同。Agent 不能只靠常识,必须检索当前规则,并把依据写进处理建议。
本篇给工单 Agent 增加工具。先使用模拟 API,保证可以直接跑通。
知识库
data/kb.json:
json
[
{"topic":"shipping","text":"已付款订单超过 72 小时未发货,需要查询仓库状态并向客户说明预计处理时间。"},
{"topic":"invoice","text":"电子发票可在订单完成后从订单详情页申请,通常 24 小时内开具。"},
{"topic":"complaint","text":"涉及赔偿、法律威胁、投诉升级的问题必须转人工处理。"}
]工具
src/tools.py:
python
import json
from pathlib import Path
def get_order_status(ticket_id: str) -> dict:
return {
"ticket_id": ticket_id,
"paid": True,
"shipped": False,
"warehouse_status": "pending_pickup",
}
def search_kb(topic: str) -> list[dict]:
rows = json.loads(Path("data/kb.json").read_text(encoding="utf-8"))
return [r for r in rows if r["topic"] == topic]
def create_reply_draft(summary: str, evidence: list[str]) -> dict:
return {
"draft": f"{summary}\n\n处理依据:{';'.join(evidence)}",
"status": "waiting_for_review",
}Agent 编排
src/agent.py:
python
from src.schema import Ticket
from src.workflow import triage
from src.tools import get_order_status, search_kb, create_reply_draft
def handle_ticket(ticket: Ticket) -> dict:
triage_result = triage(ticket)
evidence = []
tool_results = {}
if triage_result.category == "shipping":
order = get_order_status(ticket.ticket_id)
tool_results["order"] = order
evidence.append(f"订单发货状态:{order['shipped']}")
kb_docs = search_kb(triage_result.category)
evidence.extend(doc["text"] for doc in kb_docs)
if triage_result.risk_level == "high":
return {
"triage": triage_result.model_dump(),
"tool_results": tool_results,
"evidence": evidence,
"draft": None,
"handoff": True,
}
draft = create_reply_draft("建议客服根据以下信息回复用户。", evidence)
return {
"triage": triage_result.model_dump(),
"tool_results": tool_results,
"evidence": evidence,
"draft": draft,
"handoff": False,
}验收
bash
python - <<'PY'
from src.schema import Ticket
from src.agent import handle_ticket
t = Ticket(ticket_id="T001", title="付款后一直没发货", body="等了 5 天", customer_level="vip")
print(handle_ticket(t))
PY结果应包含:
triagetool_resultsevidencedrafthandoff
高风险工单不生成草稿,并返回 handoff: True。

