查询 · crm-basic
This content is not available in your language yet.
本页 16 个用例共用基础项目 crm-basic@1.xh
(下载后导入星汉即可查看初始数据)。每个用例的执行完全独立:各自导入
全新项目、各自开新会话;标了步骤数的用例是多步 —— 多步在同一会话里连续
执行,考连续作业。
跟进中的客户有几家
Section titled “跟进中的客户有几家”L1-active-count · L1 | 单条件计数——服务端算而非翻表
题面
「客户」表里状态是「跟进中」的客户有几家?验收
# "5" 这种单字符期望依赖 ANSWER 行的抽取纪律(全文退回时可能被金额里的 5# 误救活 —— 误过削弱区分度但不产生假红,方向可接受)- type: answer_text expectContains: ["5"]- type: trajectory maxToolCalls: 3 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-active-count客户表一共多少条
Section titled “客户表一共多少条”L1-count-rows · L1 | 全表行数——用元信息/聚合,不翻页
题面
「客户」表一共有多少条记录?验收
# 行数在 profile_table 一次就给全 —— 上限 2 = list_tables + profile_table。# 期望值写死 7:fixture 决定性生成 + dataset 版本钉住,数据一变必须升版本。- type: answer_text expectContains: ["7"]- type: trajectory maxToolCalls: 2 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-count-rows客户表的字段结构
Section titled “客户表的字段结构”L1-describe-fields · L1 | 读 schema(字段名+类型)
题面
「客户」表有哪些字段?分别是什么类型?验收
- type: trajectory maxToolCalls: 3 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-describe-fields最早要跟进的客户
Section titled “最早要跟进的客户”L1-earliest-follow · L1 | 最值查询——排序/聚合而非翻表
题面
「客户」表里「下次跟进」日期最早的客户是哪家?验收
# 最早 = 平移后的 -30 天那条。没填日期的不该被当成"最早"(空值边界)- type: answer_text expectContains: ["远山科技"]# 上限 4:三模型对照实测,上限 3 会把"合理地多看一步"也判死(pro/flash 偶挂,# sonnet 全过)——意图是"别翻表拿最值",4 依然罩得住- type: trajectory maxToolCalls: 4 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-earliest-follow没填跟进日期的客户
Section titled “没填跟进日期的客户”L1-empty-date · L1 | 空值筛选(isEmpty 语义)
题面
「客户」表里,哪些客户没有填「下次跟进」日期?请列出 recordId。验收
# 考空值语义:「没填日期」是 isNull,不是 = ''。fixture 里那条无日期的记录# 是刻意造的(写空串会存成"有值但为空",筛选语义不同)- type: answer_records query: table: 客户 filters: - { field: 下次跟进, op: isNull } minPrecision: 1.0 minRecall: 1.0- type: trajectory maxToolCalls: 4 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-empty-date查负责人与合同金额
Section titled “查负责人与合同金额”L1-find-owner · L1 | 单行定位+多字段读取
题面
「客户」表里,远山科技的负责人是谁?合同金额是多少?验收
# 金额匹配靠 grader 的归一化(去逗号):模型写 120,000 或 120000 都算对 ——# 千分位是格式偏好,不是数据能力- type: answer_text expectContains: ["张伟", "120000"]- type: trajectory maxToolCalls: 3 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-find-owner项目里有哪些表
Section titled “项目里有哪些表”L1-list-tables · L1 | 项目结构感知
题面
这个项目里有哪些表?验收
# L1 最基本的一条:找得到表,而且别绕远路(用 list_tables 而不是跑代码)。- type: trajectory maxToolCalls: 3 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-list-tables合同金额最高的客户
Section titled “合同金额最高的客户”L1-max-amount · L1 | 数值最值+关联信息读取
题面
「客户」表里合同金额最高的客户是哪家?验收
- type: answer_text expectContains: ["云途物流"]- type: trajectory maxToolCalls: 3 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-max-amount列出全部负责人
Section titled “列出全部负责人”L1-owner-names · L1 | 去重取值集(值分布/聚合)
题面
「客户」表里的负责人都有谁?(列出所有不重复的负责人名字)验收
- type: answer_text expectContains: ["张伟", "李娜", "王强"]- type: trajectory maxToolCalls: 3 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-owner-names描摹客户表画像
Section titled “描摹客户表画像”L1-profile-table · L1 | 表画像——schema+行数+值分布组合
题面
简单介绍一下「客户」表:有哪些字段、一共多少行、状态字段的取值分布如何?验收
# 这条考的是**一次调用看懂一张表**。没有 profile_table 的话,同样的问题要# list_tables + describe_table + 查行数 + 查分布,四五次往返;每多一次往返就多# 一次延迟、多一份上下文占用,而这些信息本来可以一次给全。# 上限设 2 = list_tables + profile_table。- type: trajectory maxToolCalls: 2 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-profile-table状态字段的可选项
Section titled “状态字段的可选项”L1-select-options · L1 | 读字段配置(选项清单)
题面
「客户」表的「状态」字段有哪些可选项?验收
# schema 问题一次 describe/profile 就该答全- type: answer_text expectContains: ["跟进中", "已成交", "已流失"]- type: trajectory maxToolCalls: 2 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L1-select-options跟进中且已逾期
Section titled “跟进中且已逾期”L2-active-overdue · L2 | 状态+日期双条件($today 边界)
题面
「客户」表里,状态还是「跟进中」、但「下次跟进」日期已经过期的客户有哪些?请列出 recordId。验收
# 组合筛选:状态(单选按 optionId)+ 日期(相对今天)。无日期那条状态是已流失,# 天然不进真值集- type: answer_records query: table: 客户 filters: - { field: 状态, op: "=", value: opt_active } - { field: 下次跟进, op: "<", value: "$today" } minPrecision: 1.0 minRecall: 1.0- type: trajectory mustUseFilter: true maxToolCalls: 4复现:
pnpm --dir packages/agent-eval eval --only L2-active-overdue逾期未跟进清单
Section titled “逾期未跟进清单”L2-overdue-followup · L2 | 日期比较筛选(早于今天)
题面
「客户」表里,哪些客户的「下次跟进」日期已经过期(早于今天)?请列出它们的 recordId。验收
# 真值由引擎直查:下次跟进 < 今天。没填日期那条不该被算进来 ——# 引擎的 `<` 对空值不成立,所以真值集天然排除它,正好考这个边界。- type: answer_records query: table: 客户 filters: - { field: 下次跟进, op: "<", value: "$today" } minPrecision: 1.0 minRecall: 1.0# 答案对不代表路子对:是下推 filter 还是把整表拉回来自己筛,这里分开看。# 这条正是 D1 查询下推要翻转的那一格。- type: trajectory mustUseFilter: true maxToolCalls: 4复现:
pnpm --dir packages/agent-eval eval --only L2-overdue-followup张伟名下合同金额合计
Section titled “张伟名下合同金额合计”L2-owner-amount-crm · L2 | 条件聚合求和
题面
「客户」表里,张伟名下客户的合同金额合计是多少?验收
# 7 行的小表**不强制聚合下推**:模型看了行数选择直接拉回来加并没有错# (L2-sum-by-owner 的教训 —— 在小表上逼聚合考的是守规矩,不是做对)- type: answer_text expectContains: ["128000"]- type: trajectory maxToolCalls: 4 forbidTools: [run_sandbox]复现:
pnpm --dir packages/agent-eval eval --only L2-owner-amount-crm已成交客户清单
Section titled “已成交客户清单”L2-status-filter · L2 | 单条件筛选记录集(precision/recall 双向扣分)
题面
「客户」表里状态是「已成交」的有哪些?请列出 recordId。验收
# 单选字段存的是 option id,真值查询也按 id 比 —— 用例里写 opt_won 而不是「已成交」,# 是因为真值这一半不经过 agent,它要直接对上引擎里的存储形态。- type: answer_records query: table: 客户 filters: - { field: 状态, op: "=", value: opt_won } minPrecision: 1.0 minRecall: 1.0- type: trajectory mustUseFilter: true maxToolCalls: 4复现:
pnpm --dir packages/agent-eval eval --only L2-status-filter未来一周要跟进的客户
Section titled “未来一周要跟进的客户”L2-upcoming-week · L2 | 日期闭区间筛选(已知全行业弱点)
题面
「客户」表里,从今天起 7 天内(含今天和第 7 天)需要跟进的客户有哪些?请列出 recordId。验收
# 日期区间筛选 —— 真值两端都用占位符,任何一天跑答案都稳定- type: answer_records query: table: 客户 filters: - { field: 下次跟进, op: ">=", value: "$today" } - { field: 下次跟进, op: "<=", value: "$today+7d" } minPrecision: 1.0 minRecall: 1.0- type: trajectory mustUseFilter: true maxToolCalls: 4复现:
pnpm --dir packages/agent-eval eval --only L2-upcoming-week