实战工单 Agent 02:实现工具调用和知识检索

先理解:工具让 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

结果应包含:

  • triage
  • tool_results
  • evidence
  • draft
  • handoff

高风险工单不生成草稿,并返回 handoff: True

实战工单 Agent 03:加入护栏、人工审核和证据链
实战工单 Agent 01:定义工单 Schema 和处理流程