knot-agent-eval
When to use
当用户请求满足以下任意条件时调用本 Skill:
- 想评测 Knot 平台上的某个 Agent(IEG 服采、艺库 Agent、其他 RAG 助手等)
- 需要从知识库文档批量生成评测题目
- 需要做关键词命中率 + 文献命中率 + 归因的金标准评测
- 需要对 PARTIAL/FAIL 题做 AI 逐题语义复审
- 需要生成符合 IEG 标准模板的 Markdown / HTML 评测报告
Don't use when
- 评测对象不是 Knot 协议(用通用的
agent-evalSkill) - 仅需要单题手工 review(直接 read_file 即可)
Steps
阶段 0:配置(用户必做)
- 把
config/eval_config.example.yaml复制到工作目录改名为eval_config.yaml - 用户必须填写所有
# REQUIRED字段:agent.knot_url(如https://knot.woa.com)agent.agent_idagent.usernameagent.api_token或agent.api_token_env(指向环境变量)agent.model(如deepseek-v4-flash,必须小写)agent.temperature(建议 0.3)agent.agent_name(出现在报告标题)report.question_source(题库来源说明)agent.kb_mcp.url(MCP 端点,如http://mcp.knot.woa.com/open/mcp)agent.kb_mcp.api_token_env(MCP Token 环境变量名,启动前需 export)agent.kb_mcp.knowledge_uuid(知识库 UUID)agent.kb_mcp.search_domain(检索域,指定后可提升检索准确度)agent.llm.base_url(出题 LLM API 地址,如https://api.openai.com/v1)agent.llm.api_key_env(LLM API Key 环境变量名,启动前需 export)agent.llm.model(出题模型,如gpt-4o-mini)
- 文档目录(可选):
- 方式 A(推荐,默认):手动填写
qa_gen.doc_names文档名列表——最完整可控 - 方式 B:设置
qa_gen.auto_discover_docs: true,Skill 通过 MCP 多轮检索推断知识库文档目录 - ⚠️ MCP检索推断可能不完整,建议核对并补充遗漏
- 两种方式可互补:
doc_names中手动列出的文档 + 自动发现的文档会合并
- 方式 A(推荐,默认):手动填写
阶段 1:题目生成(可选,已有题库可跳过)
python scripts/run_pipeline.py --config eval_config.yaml --stage gen
执行流程(v3:MCP 直查 + LLM 出题):
- 文档目录获取:
- 优先使用
qa_gen.doc_names/doc_list_file中用户手动指定的文档名 - 若列表为空且
auto_discover_docs=true,通过 MCP 多轮检索推断文档目录(可能不完整) - 若列表为空且未开启自动发现,报错退出并提示两种解决方案
- 优先使用
- 按
doc_names列出的文档名,直接调 MCP knowledgebase_search 检索知识库切片 - 从 MCP 返回结果提取 KB 原始切片(chunk_title / chunk_content / doc_id / chunk_index),按 chunk_index 排序拼接全文
- 内容质量检查:仅有链接/目录索引的文档自动跳过,不出无意义的题目
- 用
prompts/qa_gen_prompt.md让 OpenAI 兼容 API(LLMClient) 为每篇有实质内容的文档生成 2-3 题 - 自动反查:每题的关键词必须能在原文档中找到,否则丢弃
- 输出
eval_questions.json
阶段 2-4:批量评测
python scripts/run_pipeline.py --config eval_config.yaml --stage eval
读 eval_questions.json → 逐题调 Knot API → 关键词命中率(5 层匹配:精确/去标点/去停用词/片段/同义短语 + 等价映射) → 文献命中率(3 路匹配) → 自动归因初判 → 写 eval_results.json(每题写盘,断点续跑)
阶段 5:AI 逐题语义复审(核心特色,不生成代码)
python scripts/run_pipeline.py --config eval_config.yaml --stage ai_review
脚本 dump 出 pending_ai_review.json(含所有 PARTIAL/FAIL 题),然后退出。
若配置了 ai_review.audit_pass.enabled=true,还会按比例抽样 PASS 题一起送审(兜底评分虚高)。
接下来由你(当前对话 AI)逐题做语义复审,按以下规则:
- 启动前先询问用户:「即将对 X 道 PARTIAL/FAIL 题做 AI 复审,是否继续?(Y/n/skip)」
- 用户确认后,逐题读取
pending_ai_review.json的 items,对每一题独立调用prompts/ai_review_prompt.md给出 13 字段的 JSON 复审结论 - 不要写新的 Python 脚本去自动判分;这一阶段必须由 AI 实时推理,每题给出推理过程
- 把所有题的复审 JSON 汇总写入
ai_review_results.json
阶段 6:合并复审 + 渲染报告 + 导出
python scripts/run_pipeline.py --config eval_config.yaml --stage merge_review,render,export
- merge_review:把
ai_review_results.json字段合并到eval_results.json(含 A3 自动修正:翻转为PASS且原归因为C4时自动修正为A3) - render:用
templates/report_template.j2渲染eval_report.md - export:用
scripts/md2html.py把 md 转成eval_report.html
一键全流程
python scripts/run_pipeline.py --config eval_config.yaml --stage all
当跑到 ai_review 时,脚本停下,等待你完成 AI 复审,再手动续跑 --stage merge_review,render,export。
Pitfalls
- 零硬编码原则:所有 Knot 接入信息必须从用户配置读取,禁止在代码中写入任何项目特定值(agent_id / token / Knot URL / MCP URL / LLM key 等)。
run_pipeline.py启动时强校验所有 REQUIRED 字段,缺失立即报错退出。 - API Token 安全:强烈推荐使用
api_token_env/api_key_env指向环境变量,而非在 yaml 中明文填写。明文凭据会随配置文件一起被 git 追踪或截图泄露。 - MCP 与 Knot Agent 是两套独立认证:MCP 用
x-knot-api-tokenheader,Knot Agent 用x-knot-api-token+x-knot-api-userheader。两者 token 可能相同也可能不同,取决于配置。 - MCP 只有切片检索能力:
knowledgebase_search是唯一可用的工具,resources/list和prompts/list均返回空。无法通过 MCP 直接列举文档目录或获取完整文档原文,只能通过多轮检索推断。 - MCP 会话需要初始化:每次
search()调用需要先initialize→ 获取Mcp-Session-Id→notifications/initialized→tools/call,完成后会话结束。不支持在同一会话中连续多次 tools/call。 - Knot API 字段易错:AG-UI 协议中文本片段字段是
delta不是content;事件类型是TEXT_MESSAGE_CONTENT不是content;THINKING_TEXT_MESSAGE_*不能进入正文(会污染答案)。 - 编码 bug:
requests.iter_lines(decode_unicode=True)偶尔把 utf-8 当 latin-1 解读 → 直接chunk.decode("utf-8")即可(requests.iter_lines()默认不做 unicode 解码)。 - 题目生成必须反查:用 AI 生成的题必须验证关键词能在原文档中找到,否则会出现"知识库不存在"的题目(IEG 项目早期最大坑)。
- AI 复审稳定性:每题独立 prompt,不要批量塞进同一上下文(避免互相干扰);输出 JSON 解析失败时要求 AI 重答而非脚本兜底。
- AI 复审不生成代码:阶段 5 必须由 AI 实时推理,禁止写脚本调 LLM API 自动判分;这是与
agent-eval通用 Skill 的关键差异。 - 手动修正归因必须同步三个字段:如果需要手动修正某题的归因(如 B1→C1),必须同时更新
auto_attribution、ai_review.recommended_attribution和final_attribution三个字段。渲染器优先读取final_attribution,漏改会导致报告仍显示旧归因。 - 文档目录 MCP 推断不完整:
auto_discover_docs=true通过 MCP 多轮检索推断文档目录,但只有被 query 命中的文档才会被发现。建议开启后仍核对并补充遗漏文档到doc_names。 - LLM 出题格式解析:LLM 返回的 JSON 可能被 Markdown 代码块包裹(
json ...),_parse_qa_response已处理此情况。若 LLM 返回格式不稳定,可调整 prompt 或换更稳定的模型。 - 关键词匹配引擎局限:含特殊符号(≤、%、#)、URL 片段、数学运算符(* vs ×)、中英文术语变体("预构建AI Agent" vs "prebuilt AI Agents")的关键词容易匹配失败,AI 复审时需重点关注此类误判。v1.1 新增 A3 归因(评分方法局限)和 synonym_phrases 第5层匹配来缓解此问题。
- A3 归因(v1.1新增):当 doc_hit=True + keyword_rate<0.15 + Agent有实质回答时,自动归因为 A3(评分方法局限)而非 C4。AI 复审翻转为 PASS 且原归因为 C4 时,merge_review 会自动修正为 A3。A3 为独占归因,不与 C2/C4 并存。
- synonym_phrases 配置:
grading.synonym_phrases字典可配置标准关键词到同义短语的映射,作为第5层匹配兜底。当 synonym 命中数 > 精确命中数时,标记scoring_method_limited=True,自动触发 A3 归因。 - search_domain 可以为空:部分知识库的 search_domain 值可能不存在或与用户预期不同(如 chutiansun-fucai 在新 UUID 下返回"知识库中暂无内容"),不传 search_domain 反而能正常检索。已将 search_domain 从 REQUIRED 移至 OPTIONAL。
- MCP 初始化必须带 x-knot-knowledge-uuids 请求头:
_headers()方法中设置了x-knot-knowledge-uuids,如果不带此头初始化 MCP,tools/list会返回 0 个工具(即使 UUID 正确)。手动测试 MCP 时务必带上此头。 - knowledge_uuid 必须确认指向正确知识库:Knot 平台可能有多个知识库共用同一 MCP 端点,用户提供的 UUID 可能指向错误的知识库。建议先用一个已知 query 做冒烟测试,确认返回内容与目标知识库一致后再正式评测。
Verification
完成 Skill 建设后,按以下步骤验证:
- 启动校验:用空
eval_config.yaml启动,必须报错列出所有缺失的 REQUIRED 字段 - 题目生成:随便给 5 个 iWiki 文档名,能产出 10-15 道格式合格的题,自动反查全部通过
- 关键词评分:用工作目录
eval_results_v2_fixed.json跑--stage render,章节结构与IEG服采智能小助手_金标准评测报告_v2_final.md一致 - AI 复审格式:每道题的复审 JSON 必须含全部 13 个字段(q_id / final_grade / flipped_from_auto / flip_reason / semantic_match_summary / missing_facts / extra_facts / hallucination / hallucination_evidence / recommended_attribution / attribution_evidence / confidence / reviewer_notes)
- 端到端:全新 Knot Agent 跑 10 题,5 分钟内出 Markdown + HTML 报告
References
- @references/attribution_taxonomy.md — 10 类归因详细定义 + 决策树(v1.1 新增 A3)
- @references/equivalent_map.json — 通用 + 项目级语义等价词典
- @references/question_schema.md — 题库 JSON 格式规范
- @references/result_schema.md — 评测结果 JSON 格式规范
- @references/benchmark_thresholds.md — 业界基准阈值
- @prompts/qa_gen_prompt.md — 题目生成 prompt 模板
- @prompts/ai_review_prompt.md — AI 复审 prompt 模板(13 字段)
- @templates/report_template.j2 — Jinja2 报告模板
- @config/eval_config.example.yaml — 配置文件模板
