サポート用の AI を最初に社内デモした日のことは、たいてい鮮明に覚えているものです。用意した質問にすらすら答え、口調も丁寧で、「これで一次対応は任せられる」と誰もが感じます。問題が起きるのは、その手応えを信じて本番に出した後です。
私自身、個人開発で複数のブログとアプリの問い合わせ対応を半自動で回すなかで、最も肝を冷やしたのは AI が実在しないキャンペーンの条件を、堂々と数字つきで答えてしまったケースでした。ユーザーはそれを信じて行動し、後から「書いてあった通りにしたのに」という連絡が来ます。技術的にはエラーは一件も出ていません。レスポンスは 200 で返り、文章は流暢で、丁寧語まで整っている。それでも内容だけが間違っている。
このうち誤自信率が群を抜いて重要です。自動解決率は下げようと思えばいくらでも下げられますが、誤自信率が高い AI は、信頼そのものを毀損します。私は誤自信率を週次で追い、しきい値や根拠範囲を調整する判断材料にしています。計測自体は難しくありません。
def confident_wrong_rate(logs: list[dict]) -> float: """断言(根拠タグ付き・人に渡していない)かつ誤りだった割合。""" confident = [x for x in logs if x["grounded"] and not x["escalated"]] if not confident: return 0.0 wrong = [x for x in confident if x.get("verdict") == "incorrect"] return len(wrong) / len(confident)
def escalation_scores(logs: list[dict]) -> dict: # 人手が必要だった案件を正しく人へ渡せたか tp = sum(1 for x in logs if x["needed_human"] and x["escalated"]) fp = sum(1 for x in logs if not x["needed_human"] and x["escalated"]) fn = sum(1 for x in logs if x["needed_human"] and not x["escalated"]) precision = tp / (tp + fp) if (tp + fp) else 0.0 recall = tp / (tp + fn) if (tp + fn) else 0.0 f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0.0 return {"precision": round(precision, 3), "recall": round(recall, 3), "f1": round(f1, 3)}
もし今、サポート AI の断言ミスに悩んでいるなら、最初に手を入れるのは検索段階の「答えない」分岐です。生成のプロンプトをいくら磨いても、根拠が揃っていない質問に答えてしまう構造が残っていれば、誤自信は消えません。検索の確信度を一つのしきい値で測り、割ったら人へ渡す。それだけを今日入れて、一週間ログを取ってみてください。しきい値を本番の正誤分布で調整する準備が、そこから自然に始められます。