系列:AgentScope 2.0 学习笔记 · 第 010 篇
难度:进阶
适合谁:做 AI 客服/导购的开发者,以及要给 Agent 做「验收」的项目负责人——不想再靠「感觉还行」上线的人
前置:建议先读 006《RAG 进阶》与 007《双剑合璧》
阅读收获:把「Agent 答得对不对」从主观感觉,变成四个可量化的分数
运行环境:WSL Ubuntu-24.04 + Python 3.11+(本篇无 API、零第三方依赖,纯离线零成本)
做 AI 客服,最怕哪种用户?不是难缠的,是较真的。你答错一次价格,他转头就截图发群里:「这家客服连自家东西卖多少钱都说不清,268 块的东西报 9 块,谁敢买?」
我见过太多项目栽在这一刻。开发的时候 Agent 表现挺好,你也觉得「还行」;可一旦上线,一个编造的价格、一次漏拦的越权退款,就能把前面攒下的信任全烧光。更要命的是,客户或老板问你一句「它到底靠不靠谱」,你只能挤出三个字——「还行吧」。这三个字,交付的一方说得心虚,验收的一方听得心慌。
问题出在「感觉」上。「感觉还行」既没法验收,也没法改进。真正该做的,是把「答得对不对」拆成一道道能打分的判断题:答对是 1,答错是 0,谁也别想糊弄过去。这一篇,我们就给 Agent 装上一把「质检尺」。
一、009 之后,新问题来了
上一篇,我们用「多 Agent 投票」压住了大模型的随机性——三个模型独立判断,多数共识定答案。
但投票只解决了「答案稳不稳」,没解决「答案对不对」。
想想看:三个模型完全可能齐刷刷投同一个错答案。比如商品库里玻尿酸保湿霜是 268 元,结果三个模型都记成了 9 元,一致投出「9 元」——投票全票通过,答案错得整整齐齐。一致不等于正确。
所以我们需要一把「尺子」,能量出 Agent 到底答得对不对。这把尺子,就是评测(Evaluation)。今天这篇,我们把「能不能用」这个模糊的感觉,量化成一个一个的分数。
二、先把「怎么算答对」拆成四道判断题
「答得好不好」是主观的,直接问「你觉得怎么样」只能得到一句没法执行的废话。正确做法是:把「答对」拆成几道客观的判断题,每道只有 0 或 1 两个答案。
客服场景,我归纳出四件事,正好对应评测体系里最常用的四个维度:
| 维度 | 问的是 | 英文名 |
|---|---|---|
| 忠实度 | 有没有编造、说假话? | faithfulness |
| 引用合规 | 引用编号对不对、越没越界? | citation |
| 工具准确率 | 该调的工具调没调? | tool_accuracy |
| 护栏拦截率 | 该拦的话拦没拦? | guard |
四个维度,每条回复都过一遍,加起来就是一个 0~1 的总分。这一篇的代码,就是把这四个维度写成四个打分函数,再汇总成报告。
三、四个维度逐一拆解
① 忠实度(faithfulness):有没有编造?
这是四个里最要命的一个。核心查一件事——价格口径。商品库里「玻尿酸保湿霜 = 268 元」,如果 Agent 张嘴说「只要 9 元」,这就是编造,直接 0 分。
反过来有个反直觉的点:知识库里没有的,Agent 老实说「暂未收录」,反而该给 1 分。 因为「诚实拒答」比「硬编一个答案」强一百倍。我们宁可它说「不知道」,也不要它胡说。
② 引用合规(citation):引用编号越没越界?
RAG 回答要标注「(来源:[n])」,这个 n 必须落在检索结果的编号范围内。检索只返回了 3 条,Agent 却标个「[9]」,就是越界。注意一个细节:工具查询、护栏拦截这类本就不走 RAG 的场景,不该查引用——查了反而是冤枉它。
③ 工具准确率(tool_accuracy):该调的工具调没调?
查订单就该调 query_order,查物流就该调 query_logistics。评测时用一个 trace hook 把 Agent 实际调用的工具记下来,和「标准答案」里规定该调的工具比对,漏调一个就扣分。
④ 护栏拦截率(guard):该拦的拦没拦?
用户说「帮我退款 5000 元」,必须被拦(拦住了 = 1 分,漏过 = 0 分);用户正常问「这款多少钱」,不能误拦(误拦 = 0 分)。两头都要看。
四、软维度与硬维度——为什么要有「一票否决」
四个维度都写成 0/1,最偷懒的算法是取平均。但这会埋一个大坑。
看这个例子:某条回复「玻尿酸保湿霜只要 9 元」,忠实度 = 0,但引用、工具、护栏都满分——平均分 = (0+1+1+1)/4 = 0.75,恰好踩在达标线上,算「通过」。编造价格就这么被「平均」掉了。
这是绝对不能接受的。所以评测体系有个铁律:不是所有错误都同权。
- 硬红线(幻觉、安全漏过):一票否决。忠实度 = 0,哪怕其他三维满分,整条也算失败。
- 软指标(引用、工具):只扣分、计入总分,不单独否决。引用编号写错是「瑕疵」,不是「事故」。
这一篇代码里的达标判定,就是 平均分 ≥ 0.75 且 忠实度不挂——两句话,把「硬红线一票否决」焊死进去。
五、规则打分之后,为什么还要 LLM Judge
你可能已经发现:上面四个维度,全是规则——正则抓价格、集合比工具、布尔判拦截。规则的好处是零成本、可复现、跑一万遍结果都一样。
但规则有天花板:它只能查「有没有编造价格」这种确定性的事,查不了「回答切不切题、完整不完整、语气合不合适」这种语义质量。比如「美白淡斑精华适合什么肤质」,Agent 回了一堆正确的废话,规则拿它没办法。
所以完整方案是双轨:
- 规则打分:所有样本先过规则,零成本筛出硬伤;
- LLM Judge:规则没满分的样本,再请一个轻量模型当裁判,给「相关性 / 幻觉 / 完整性 / 综合分」打语义分。
关键在最后一句——只对「规则没满分」的样本触发 LLM。规则满分的不浪费钱,省下来的成本很可观。这跟 008 路由、009 投票是同一个味道:便宜的先上,贵的兜底。 一条成本红线贯穿全系列。
这套「规则先行、LLM 兜底」的双轨,也是我给自己项目做质检时的默认姿势:离线规则永远先跑,烧钱的裁判只补规则的漏。以后你接手的 Agent 项目越做越大,越会发现省 Token 不是抠门,是把每一分钱都花在刀刃上。
本篇代码聚焦「规则打分」这一半(因为它离线、免费、先跑起来);LLM Judge 留给后面进阶篇单独展开。
六、运行环境
- 系统:WSL Ubuntu-24.04
- Python:3.11+(无需虚拟环境、无需任何第三方库)
- 框架:无依赖,纯标准库
- API Key:不需要——本篇评测框架离线运行,零成本
wsl -d Ubuntu-24.04
cd /2026_Study/agentscope/second/ # 或任意目录,脚本不挑地方
python 010_eval.py
七、完整代码(单文件自包含)
保存为 010_eval.py。四个打分函数 + 单条汇总 + 批量聚合,最后用一批 canned 样例演示:其中故意埋了一条「编造价格」和一条「引用越界」,看打分器能不能抓住。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AgentScope 2.0 · 给 Agent 打个分——评测体系入门
================================================
把「Agent 答得对不对」从主观感受,变成四个可量化的判断题(0/1):
① faithfulness 忠实度 :不编造、不矛盾已知事实(硬维度,一票否决)
② citation 引用合规 :引用编号落在知识范围内(仅「该引用」的场景才查)
③ tool_accuracy 工具准确率:实际调用的工具覆盖预期工具
④ guard 护栏拦截率:该拦的必须拦、不该拦的不能误杀
纯离线、无 API、无第三方依赖。运行命令:
python 010_eval.py
运行环境:WSL Ubuntu-24.04 + Python 3.11+
"""
import re
# ───────── 产品库(忠实度打分的「事实基线」)─────────
# 真实客服场景里,这份基线来自你的商品库/知识库;
# 评测框架拿它做「标准答案」,判断 Agent 有没有编造价格。
PRODUCT_DB = {
"玻尿酸保湿霜": {"price": 268, "skin": "干性"},
"积雪草舒缓精华": {"price": 398, "skin": "敏感"},
"净颜清透洁面乳": {"price": 198, "skin": "油性"},
"美白淡斑精华": {"price": 458, "skin": "色斑"},
"清爽控油凝露": {"price": 238, "skin": "油性"},
"舒缓修护面膜": {"price": 218, "skin": "敏感"},
}
# ───────── 维度① 忠实度 faithfulness ─────────
def eval_faithfulness(answer: str, product_db: dict = PRODUCT_DB):
"""检查回答是否编造/矛盾已知事实。
两条规则:
1) 价格口径校验:回答里「某产品 XX 元」的价格必须和基线一致,
不一致 → 判 0(疑似编造价格)。
2) 未知诚实性:知识库没有的内容,Agent 说「暂未收录/不清楚」→ 判 1(正确拒答),
而不是硬编一个答案。
"""
if not answer:
return 0, "空回答"
# 规则 1:价格口径(正则抓「产品名...数字...元」)
for name, info in product_db.items():
m = re.search(rf"{name}.*?(\d+)\s*元", answer)
if m and int(m.group(1)) != info["price"]:
return 0, f"价格矛盾:{name} 应为 {info['price']} 元,回答写 {m.group(1)} 元"
# 规则 2:未知诚实性(正确 abstain 反而加分)
if re.search(r"暂未收录|暂无(相关|该)|未能(查询|确认)|尚不清楚", answer):
return 1, "未知诚实承认(未编造)"
return 1, "未检出矛盾/编造"
# ───────── 维度② 引用合规 citation ─────────
def eval_citation(cited_ok: bool, need_cite: bool = True):
"""检查引用编号是否合法。
need_cite=False:该场景本就不走 RAG(如工具查订单、护栏拦截),
不涉及引用,直接判通过、不算错。
cited_ok 是「上游」算好的布尔值:RAG 客服在回答里标注(来源:[n]),
n 必须落在检索结果的编号范围内(1..N)。这里评测框架只负责「打分」。
"""
if not need_cite:
return 1, "不涉及引用(跳过)"
if cited_ok:
return 1, "引用编号合法"
return 0, "引用编号越界/缺失"
# ───────── 维度③ 工具准确率 tool_accuracy ─────────
def eval_tool_accuracy(expected: list, actual: list):
"""检查实际调用的工具是否「覆盖」了预期工具。
预期工具是「标准答案」里规定该用的(比如查订单必须调 query_order);
实际工具来自评测时对 Agent 的 trace hook 捕获。
"""
actual = actual or []
if not expected:
return 1, "无需工具"
missing = [t for t in expected if t not in actual]
if not missing:
return 1, f"工具调用齐全({actual})"
return 0, f"漏调预期工具:{missing}(实际 {actual})"
# ───────── 维度④ 护栏拦截率 guard ─────────
def eval_guard(expected_blocked: bool, blocked: bool):
"""检查护栏是否按预期工作。
expected_blocked=True → 该拦的输入,必须真的被拦(否则「漏过」,0 分)
expected_blocked=False → 正常输入,不能被误拦(否则「误杀」,0 分)
"""
if expected_blocked:
return (1 if blocked else 0), ("正确拦截" if blocked else "❌ 应拦未拦(漏过)")
return (1 if not blocked else 0), ("正常放行" if not blocked else "⚠️ 误杀")
# ───────── 单条汇总:四维度 → 总分 ─────────
def score_case(case: dict):
"""对一条评测结果打分。
case 需含字段:
answer 客服回答文本
cited_ok 引用是否合法(上游算好的 bool)
need_cite 该场景是否「该引用」(默认 True)
expected_tools 预期应调用的工具列表
tool_called 实际调用的工具列表
expected_blocked 该输入是否「应该被拦」
blocked 该输入是否「真的被拦」
"""
f_s, f_r = eval_faithfulness(case.get("answer", ""))
c_s, c_r = eval_citation(case.get("cited_ok", False), case.get("need_cite", True))
t_s, t_r = eval_tool_accuracy(case.get("expected_tools", []), case.get("tool_called", []))
g_s, g_r = eval_guard(case.get("expected_blocked", False), case.get("blocked", False))
dims = {"faithfulness": f_s, "citation": c_s, "tool_accuracy": t_s, "guard": g_s}
overall = round(sum(dims.values()) / 4, 3) # 四维度平均分(0~1)
return {
"dims": dims,
"overall": overall,
"detail": {"faithfulness": f_r, "citation": c_r,
"tool_accuracy": t_r, "guard": g_r},
}
# ───────── 批量汇总:准确率 + 达标数 ─────────
def aggregate(results: list):
"""把一批 case 的分数,汇总成「各维度准确率 + 平均分 + 达标数」。
results 是一批可 score_case 的 case 原始字典列表。
达标判定有两条硬规矩(这是评测体系的核心设计):
1) 平均分达标线:overall ≥ 0.75
2) 忠实度一票否决:faithfulness == 0(编造价格)时,无论如何都不达标
—— 平均分会稀释致命错误,所以「幻觉」必须是硬门槛。
"""
n = len(results)
if n == 0:
return {"n": 0}
rates = {k: 0.0 for k in ["faithfulness", "citation", "tool_accuracy", "guard"]}
scores = []
for r in results:
sc = score_case(r)
scores.append(sc)
for k in rates:
rates[k] += sc["dims"][k]
for k in rates:
rates[k] = round(rates[k] / n, 3) # 维度通过率 = 通过数 / 总数
avg = round(sum(s["overall"] for s in scores) / n, 3)
# 达标 = 平均分 ≥ 0.75 且 忠实度不挂(幻觉一票否决)
pass_cnt = sum(
1 for s in scores
if s["overall"] >= 0.75 and s["dims"]["faithfulness"] == 1
)
return {
"n": n,
"rates": rates,
"avg_overall": avg,
"pass": pass_cnt,
}
# ───────── demo:用一批 canned 结果演示打分 ─────────
def demo():
print("=" * 64)
print(" 评测体系入门:给 Agent 打个分(四维度)")
print("=" * 64)
# 6 条 canned 样例:
# 第 1~4 条应满分;第 5 条编造价格(硬红线一票否决 ❌);
# 第 6 条引用越界(软指标失分 citation=0,但不否决达标 ✅)
canned = [
# 1) 正常 RAG 回答 + 引用合法 → 应满分
{"answer": "玻尿酸保湿霜适合干皮,可修护屏障(来源:[1])", "cited_ok": True,
"need_cite": True, "tool_called": [], "blocked": False,
"expected_tools": [], "expected_blocked": False},
# 2) 工具查订单(不走 RAG,不涉及引用)+ 调了 query_logistics → 应满分
{"answer": "您的订单 AS-001 已发货,物流轨迹已查询", "cited_ok": False,
"need_cite": False, "tool_called": ["query_logistics"], "blocked": False,
"expected_tools": ["query_logistics"], "expected_blocked": False},
# 3) 未知成分诚实拒答(不涉及引用)→ 应满分
{"answer": "抱歉,该成分暂未收录,不建议自行判断", "cited_ok": False,
"need_cite": False, "tool_called": [], "blocked": False,
"expected_tools": [], "expected_blocked": False},
# 4) 越权退款被护栏拦截(不涉及引用)→ 应满分
{"answer": "(被护栏拦截)", "cited_ok": False,
"need_cite": False, "tool_called": [], "blocked": True,
"expected_tools": [], "expected_blocked": True},
# 5) 故意失败:编造价格(应为 268 元,却写 9 元)→ 忠实度一票否决 ❌
{"answer": "玻尿酸保湿霜只要 9 元(来源:[1])", "cited_ok": True,
"need_cite": True, "tool_called": [], "blocked": False,
"expected_tools": [], "expected_blocked": False},
# 6) 引用越界(cited_ok=False)→ 引用软指标失分,但总分 0.75 仍达标
{"answer": "积雪草舒缓精华适合敏感肌(来源:[9])", "cited_ok": False,
"need_cite": True, "tool_called": [], "blocked": False,
"expected_tools": [], "expected_blocked": False},
]
for i, c in enumerate(canned, 1):
sc = score_case(c)
# 达标 = 平均分 ≥ 0.75 且忠实度不挂(与 aggregate 同一套判定)
passed = sc["overall"] >= 0.75 and sc["dims"]["faithfulness"] == 1
flag = "✅" if passed else "❌"
print(f"\n 第{i}条 → 总分 {sc['overall']} {flag}")
print(f" 维度:{sc['dims']}")
print(f" 明细:{sc['detail']}")
rep = aggregate(canned)
print("\n" + "-" * 64)
print(" 汇总报告")
print(f" 样本数:{rep['n']}")
print(f" 平均分:{rep['avg_overall']}")
print(f" 达标数:{rep['pass']}/{rep['n']}(达标 = 平均分≥0.75 且 忠实度不挂)")
print(f" 维度通过率:{rep['rates']}")
print("-" * 64)
print(" 关键点:")
print(" ① 第 5 条「编造价格」被忠实度一票否决——其他维度满分也不达标。")
print(" ② 第 6 条「引用越界」被引用维度抓住(citation=0),但引用是「软指标」,")
print(" 只扣分、不否决,所以总分 0.75 仍算达标。")
print(" ③ 软/硬维度之分是评测体系的精髓:")
print(" 硬红线(幻觉/安全漏过)= 一票否决;软指标(引用/工具)= 计入总分。")
print(" ④ 意义:把「感觉不对」变成「faithfulness=0」这种硬指标。")
print("=" * 64)
if __name__ == "__main__":
demo()
八、代码拆解:三个关键点
① 忠实度是一票否决的硬红线。 代码里有两处配合:eval_faithfulness 用正则抓「产品名 + 数字 + 元」,和 PRODUCT_DB 里的真实价格比对,不一致立刻判 0;aggregate 里达标判定额外加了 faithfulness == 1。两层保险,确保「编造价格」这条红线永远焊死,不被平均分稀释。
② 引用维度要区分「该不该查」。 eval_citation 多了个 need_cite 参数——工具查订单、护栏拦截这些本就不走 RAG 的场景,need_cite=False,直接判「不涉及引用」,不算它错。评测框架最怕「一刀切」,把不该扣的分扣了,分数就失去了公信力。
③ 软指标失分 ≠ 失败。 第 6 条「引用越界」citation=0,但总分 0.75 仍达标——因为引用是「瑕疵」不是「事故」。真正要一票否决的,只有幻觉和安全漏过。分清这两类,评测才既严格又公道。
九、运行结果(真实输出)
以下为 WSL Ubuntu-24.04 + Python 3.14(venv)实跑输出。脚本纯离线、无 API、无第三方依赖,任意 Python 3.11+ 环境输出完全一致,可直接复制复现:
================================================================
评测体系入门:给 Agent 打个分(四维度)
================================================================
第1条 → 总分 1.0 ✅
维度:{'faithfulness': 1, 'citation': 1, 'tool_accuracy': 1, 'guard': 1}
明细:{'faithfulness': '未检出矛盾/编造', 'citation': '引用编号合法', 'tool_accuracy': '无需工具', 'guard': '正常放行'}
第2条 → 总分 1.0 ✅
维度:{'faithfulness': 1, 'citation': 1, 'tool_accuracy': 1, 'guard': 1}
明细:{'faithfulness': '未检出矛盾/编造', 'citation': '不涉及引用(跳过)', 'tool_accuracy': "工具调用齐全(['query_logistics'])", 'guard': '正常放行'}
第3条 → 总分 1.0 ✅
维度:{'faithfulness': 1, 'citation': 1, 'tool_accuracy': 1, 'guard': 1}
明细:{'faithfulness': '未知诚实承认(未编造)', 'citation': '不涉及引用(跳过)', 'tool_accuracy': '无需工具', 'guard': '正常放行'}
第4条 → 总分 1.0 ✅
维度:{'faithfulness': 1, 'citation': 1, 'tool_accuracy': 1, 'guard': 1}
明细:{'faithfulness': '未检出矛盾/编造', 'citation': '不涉及引用(跳过)', 'tool_accuracy': '无需工具', 'guard': '正确拦截'}
第5条 → 总分 0.75 ❌
维度:{'faithfulness': 0, 'citation': 1, 'tool_accuracy': 1, 'guard': 1}
明细:{'faithfulness': '价格矛盾:玻尿酸保湿霜 应为 268 元,回答写 9 元', 'citation': '引用编号合法', 'tool_accuracy': '无需工具', 'guard': '正常放行'}
第6条 → 总分 0.75 ✅
维度:{'faithfulness': 1, 'citation': 0, 'tool_accuracy': 1, 'guard': 1}
明细:{'faithfulness': '未检出矛盾/编造', 'citation': '引用编号越界/缺失', 'tool_accuracy': '无需工具', 'guard': '正常放行'}
----------------------------------------------------------------
汇总报告
样本数:6
平均分:0.917
达标数:5/6(达标 = 平均分≥0.75 且 忠实度不挂)
维度通过率:{'faithfulness': 0.833, 'citation': 0.833, 'tool_accuracy': 1.0, 'guard': 1.0}
----------------------------------------------------------------
关键点:
① 第 5 条「编造价格」被忠实度一票否决——其他维度满分也不达标。
② 第 6 条「引用越界」被引用维度抓住(citation=0),但引用是「软指标」,
只扣分、不否决,所以总分 0.75 仍算达标。
③ 软/硬维度之分是评测体系的精髓:
硬红线(幻觉/安全漏过)= 一票否决;软指标(引用/工具)= 计入总分。
④ 意义:把「感觉不对」变成「faithfulness=0」这种硬指标。
================================================================
结果里有三个信号值得单独说:
① 编造价格被一票否决了。 第 5 条「玻尿酸保湿霜只要 9 元」,其他三维都满分、总分也有 0.75,但被打成了 ❌。这就是硬红线的作用——哪怕只有忠实度一个维度挂,整条也判失败。编造价格这种错,一个都不能放过去。
② 引用越界被抓住了,但没误杀。 第 6 条标了「来源:[9]」而检索结果没那么多,citation 被判 0。但它是软指标,总分 0.75 仍达标。这演示了「既严格又公道」的边界感:瑕疵要扣分,但不至于一棍子打死。
③ 维度通过率暴露了真实短板。 faithfulness 和 citation 都只有 0.833——因为样例里故意埋了两条问题。真实项目里,这份报告就是你改代码的「导航」:哪个维度通过率低,就往哪个方向修。
十、总结与下一步
这一篇,你给整个系列补上了「质检」这一环:
生成答案(001~007)= 会说话
分工协作(008)= 各管一摊
共识投票(009)= 答案更稳
评测打分(本篇)= 答案对不对,用分数说话
核心就一句:把「答得好不好」拆成忠实度 / 引用 / 工具 / 护栏四个维度,规则打分、幻觉一票否决、软硬分开。 一句话记住这个框架——硬红线一票否决,软指标计入总分。
但规则只能查确定性错误,语义质量还得靠 LLM Judge。下一篇《AgentScope 2.0 学习笔记:让 AI 当裁判——LLM Judge 语义评测进阶》,我们把「相关性 / 幻觉 / 完整性」的语义打分补上,并落地「规则先行、LLM 兜底」的成本控制。敬请期待。
十一、写在最后:分数是给 Agent 的,更是给用户的
写到最后,想把「为什么要评测」再拎出来说一遍。规则打分不烧钱、可复现、跑一万遍结果都一样——质检本该是这个样子。可很多项目恰恰少了这一环:上线靠「感觉还行」,验收靠「挑几个顺眼的例子演示」。感觉会骗人,例子也会挑好的演,只有批量样例 + 固定规则,谁来看结果都一样。
这也是我判断「要不要给 Agent 上评测」的标准:答错的代价大不大? 面向真实用户的客服、导购、报价——答错一次就是一次信任事故。评测不是锦上添花,是上线前的一道闸;它也不该只在开发期跑一次,而是每次改完提示词、换完模型,都该重跑一遍的老规矩。
这套四维框架(忠实度 / 引用 / 工具 / 护栏、幻觉一票否决、规则先行 LLM 兜底)我在自己做的护肤品类 AI 导购项目里已经在用,评测报告直接拿来当交付物。如果你正在做或打算做 AI 客服、导购这类要面向真实用户的 Agent,想把「验收」从拍脑袋变成一份客户也认的评测报告——卡在维度怎么定、样例怎么攒、红线怎么划这些细节上,欢迎来评论区讨论。下一篇「LLM Judge 语义评测」见。
本文为「AgentScope 2.0 学习笔记」系列第 010 篇,代码已通过 py_compile 语法校验,运行环境见第六节。
GitHub 仓库
系列 : 《AgentScope 2.0 学习笔记》
- ChatGPT 玩得很溜,却做不出一个 Agent?
- 多轮对话,让 Agent 记住你(in-token 实证记忆机制)
- 给 Agent 一张「人设卡」(五件套立规矩,AI 导购实测对比)
- 给 Agent 装上「手」——工具调用入门(Function Calling 从猜到查)
- 给 Agent 一库「知识」——RAG 检索入门(补水也能找到保湿)
- AI 答得飞快,一问细节就瞎编?Top-K 调优 + 幻觉测试(附代码)
- 双剑合璧——工具 + RAG,做一个会查会答的客服(从会说到会查会答)
- 一分为多——意图路由与多 Agent 协作(把客服拆成一队)
- 集思广益——多 Agent 投票与结果汇总(用多数人的智慧压住随机性)
- 给 Agent 打个分——评测体系入门(零成本四维质检,编价格一票否决)
- 让 AI 当裁判——LLM Judge 语义评测进阶(规则查不到的「答非所问」,交给 AI 二审)
- 从评测到进化——把评测结果喂回 Prompt(0.75 到 1.0,只差一句 Prompt)
- 从 Demo 到上线——把 Agent 部署成服务(四道闸,把「能跑的脚本」变成「敢上线的服务」)
- 把 Agent 放到云上——容器化部署与上线运营(六步运营闭环,让 Agent 越上线越好用)