关于 agentforce-offline-experimentation-run
用于评估不同 LLM 模型处理现有 Agentforce 对话效果的技能,涵盖从 Data Cloud 会话轨迹到提示词重放、评分及 CSV 和 HTML 报告的流程;部分后续操作仍属提案。
主要功能
- 01发现 Agentforce Agent 和会话
- 02通过 SFAP AI Gateway 重放提示词
- 03评估主题与函数调用
- 04判定参数和文本回复质量
- 05生成 CSV 和 HTML 报告
适用场景
- 01将目标模型与 Agentforce 历史会话对比
- 02检查主题与函数调用准确度
- 03评估生成的文本回复
- 04为实验结果生成判定报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ forcedotcom/ sf-skills --skill agentforce-offline-experimentation-run安装后在 Claude Code 中输入/agentforce-offline-experimentation-run确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/build_report.pyresolve-token.shsfap_replay.py详细介绍
管理 Agentforce 离线实验
何时使用此技能
当用户想要测试不同的 LLM 模型会如何处理现有的 Agentforce Agent 对话时,执行此工作流。从 Data Cloud STDM 获取会话轨迹,通过 SFAP AI Gateway REST API 使用结构化工具调用重放提示词,按四项指标进行评分(主题一致性、函数名称准确性、通过 LLM 评判的函数参数准确性、通过 LLM 评判的文本回复质量),并生成带有 SAFE/REVIEW/UNSAFE 结论徽章的 CSV 和 HTML 报告。需要启用 Agentforce Activity 数据流的 Data Cloud、已通过身份验证的组织,以及目标模型 ID(用于 SFAP 重放时需带有 llmgateway__ 前缀)。10 个会话的预计运行时间:10-30 分钟。
工作流
discover-data-space → verify-stdm-availability → discover-agents → list-available-models(用户需要帮助选择时)→ find-sessions → get-conversation-details → get-llm-step-details → obtain-sfap-token → replay-turn-prompts → [score-exact-matches, judge-function-args, judge-text-responses] → generate-csv-report → generate-html-report。 工作流门槛:在确认组织别名(从已通过身份验证的组织中自动发现)、Agent API 名称(从 STDM 自动发现)和目标模型 ID(询问用户)之前,不要进入阶段 0 之后的步骤。 SFAP JWT 会在约 2 小时后过期。重放 20 个或更多会话时,请在批次之间刷新令牌。每次 SFAP 重放调用耗时约 1-3 秒;建议少于 20 个会话,以确保合理的实际运行时间(约 10-30 分钟)。 重放完成后,评分和评判步骤(阶段 3)可以并行运行。精确匹配评分会立即完成;LLM 评判调用每轮会额外耗时约 1-2 秒。
关键约束
前提条件:
- 已在组织中配置并启用 Data Cloud(检查:
DataCloudProvisioned) - 已在组织中配置 Einstein LLM / GenAI Gateway(检查:
EinsteinLlmEnabled) - 用户已登录目标组织并通过身份验证(检查:
OrgAuthenticated)
操作参考
按用途分组的操作。使用这些操作作为上述工作流的构建模块。
摘要
| 操作 | 用途 | 状态 | 调用 | 依赖项 |
|---|---|---|---|---|
discover-data-space | 读取 | 已实现 | getDataSpaces | — |
verify-stdm-availability | 验证 | 已实现 | queryCdpAnsiSqlV2 | discover-data-space |
discover-agents | 读取 | 已实现 | queryCdpAnsiSqlV2 | verify-stdm-availability |
list-available-models | 读取 | 已实现 | queryAiModel | — |
find-sessions | 读取 | 已实现 | queryCdpAnsiSqlV2 | verify-stdm-availability、discover-agents |
get-conversation-details | 读取 | 拟议 | queryCdpAnsiSqlV2 | find-sessions |
get-llm-step-details | 读取 | 拟议 | queryCdpAnsiSqlV2 | get-conversation-details |
obtain-sfap-token | 验证 | 拟议 | — | — |
replay-turn-prompts | 读取 | 拟议 | — | get-llm-step-details、obtain-sfap-token |
score-exact-matches | 读取 | 拟议 | — | replay-turn-prompts |
judge-function-args | 读取 | 拟议 | — | score-exact-matches、obtain-sfap-token |
judge-text-responses | 读取 | 拟议 | — | replay-turn-prompts、obtain-sfap-token |
generate-csv-report | 写入 | 拟议 | — | score-exact-matches、judge-function-args、judge-text-responses |
generate-html-report | 写入 | 拟议 | — | generate-csv-report |
依赖关系图
graph TD
discover_data_space["discover-data-space (read)"]
verify_stdm_availability["verify-stdm-availability (validate)"]
discover_agents["discover-agents (read)"]
list_available_models["list-available-models (read)"]
find_sessions["find-sessions (read)"]
get_conversation_details["get-conversation-details (read)"]
get_llm_step_details["get-llm-step-details (read)"]
obtain_sfap_token["obtain-sfap-token (validate)"]
replay_turn_prompts["replay-turn-prompts (read)"]
score_exact_matches["score-exact-matches (read)"]
judge_function_args["judge-function-args (read)"]
judge_text_responses["judge-text-responses (read)"]
generate_csv_report["generate-csv-report (write)"]
generate_html_report["generate-html-report (write)"]
discover_data_space --> verify_stdm_availability
verify_stdm_availability --> discover_agents
verify_stdm_availability --> find_sessions
discover_agents --> find_sessions
find_sessions --> get_conversation_details
get_conversation_details --> get_llm_step_details
get_llm_step_details --> replay_turn_prompts
obtain_sfap_token --> replay_turn_prompts
replay_turn_prompts --> score_exact_matches
score_exact_matches --> judge_function_args
obtain_sfap_token --> judge_function_args
replay_turn_prompts --> judge_text_responses
obtain_sfap_token --> judge_text_responses
score_exact_matches --> generate_csv_report
judge_function_args --> generate_csv_report
judge_text_responses --> generate_csv_report
generate_csv_report --> generate_html_report
读取操作
discover-data-space
发现组织中处于活动状态的 Data Cloud 数据空间
调用: getDataSpaces — 状态:implemented
discover-agents
查询 STDM,查找具有会话轨迹的不同 Agent + 版本组合
调用: queryCdpAnsiSqlV2 — 状态:implemented
依赖项: verify-stdm-availability
list-available-models
列出组织中配置的 Einstein LLM 模型,以帮助用户选择目标模型
调用: queryAiModel — 状态:implemented
find-sessions
按 Agent API 名称、版本和日期范围筛选 STDM 中最近的 Agentforce 会话
调用: queryCdpAnsiSqlV2 — 状态:implemented
输入:
agent_api_name(String) — 在 discover-agents 中选择的 Agent API 名称agent_version_api_name(String) — 在 discover-agents 中选择的 Agent 版本 API 名称start_date(String)end_date(String)max_sessions(Integer)
依赖: verify-stdm-availability、discover-agents
get-conversation-details
从 STDM Interaction DMO 获取每个会话的交互(轮次)
调用: queryCdpAnsiSqlV2 — 状态:proposed
依赖: find-sessions
get-llm-step-details
获取每次交互的步骤,包括大模型输入和输出
调用: queryCdpAnsiSqlV2 — 状态:proposed
依赖: get-conversation-details
replay-turn-prompts
从 STDM 大模型步骤输入中提取结构化消息(system/assistant/user),转换为 OpenAI 格式的消息数组并保留角色位置,从 gen_ai.request.tools 动态提取工具定义,根据工具签名将每个步骤归类为路由器(主题)或操作,并通过 SFAP REST API POST /ai/gpt/v1/chat/generations 使用 tool_choice=required 重放
状态: proposed
输入:
target_model(String) — 目标模型 ID(llmgateway__ 前缀,例如 llmgateway__OpenAIGPT41)
依赖: get-llm-step-details、obtain-sfap-token
score-exact-matches
计算主题一致性和函数名称准确率的精确匹配分数
状态: proposed
依赖: replay-turn-prompts
judge-function-args
当函数名称匹配(精确或宽松匹配)时,使用大模型作为评判器对函数参数进行评分
状态: proposed
依赖: score-exact-matches、obtain-sfap-token
judge-text-responses
使用大模型作为评判器,对以文本输出结束的轮次中的文本回复进行评分
状态: proposed
依赖: replay-turn-prompts、obtain-sfap-token
写入操作
generate-csv-report
生成 CSV 报告,其中包含每轮重放结果和汇总评分
状态: proposed
输入:
output_csv(String)
依赖: score-exact-matches、judge-function-args、judge-text-responses
generate-html-report
构建独立的 HTML 分析报告,包含判定徽章、评分卡和失败情况细分
状态: proposed
输入:
html_output(String)
依赖: generate-csv-report
其他操作
verify-stdm-availability
验证 Data Cloud 中是否可查询 STDM(Session Trace Data Model)
调用: queryCdpAnsiSqlV2 — 状态:implemented
依赖: discover-data-space
obtain-sfap-token
通过组织会话身份验证和 /ide/auth 端点获取 SFAP JWT 令牌
状态: proposed
输入:
org_alias(String) — 用于解析令牌的已通过身份验证的组织别名