用途
build-entity-list 用于根据一段自然语言描述,在网络上查找所有匹配的实体,并返回一份结构化、去重的清单,而不是一堆需要自行阅读和整理的搜索结果。它适合你还没有起始清单、需要从零收集匹配项的场景。
典型示例包括:
- “2026 年完成 A 轮融资的 AI 初创公司”
- “今年通过数据隐私法的美国州”
- “X 的开源替代品”
不适用的情况:
- 你已经有清单,只想为每行补充字段 → 使用 fill-missing-fields
- 你想针对一个已知实体生成一份详尽报告 → 使用 tavily-research
主要能力
该技能与 fill-missing-fields 使用相同底层原语(tavily-research 的 --output-schema),但输出形状是列表而非单个对象,并结合多个搜索角度以最大化覆盖范围,最后进行去重。
工作流程:
- 将用户的条件转化为研究查询,并定义一个数组形式的 schema。
- 运行 tvly research(通常使用 --model pro,因为“找出所有匹配”需要比单次窄查询更彻底的多源搜索)。
- 可选地运行几个不同措辞的查询以扩大覆盖范围,然后按名称/URL 合并去重。
- 以表格形式返回列表(可选写入 CSV/JSON)。
使用方式
运行任何命令之前:如果 PATH 中找不到 tvly,请参阅 https://github.com/tavily-ai/tavily-cli 获取安装说明。
已知问题:--output-schema 目前需要 API-key 认证,而非 OAuth。截至 2026-08,当 CLI 通过 tvly login(OAuth)认证时,--output-schema 会失败——该路径经由 Tavily 的 MCP 服务器(mcp.tavily.com),其 tavily_research 工具尚不接受 output_schema 参数,尽管直接 REST API/SDK 支持。如果看到 Unexpected keyword argument / Internal error... call[tavily_research],原因即此。
修复方法:在使用此技能前,使用原始 API key 而非 OAuth 认证:
tvly login --api-key tvly-YOUR_KEY
或:export TAVILY_API_KEY=tvly-YOUR_KEY
快速开始
- 编写数组形式的 schema:
{ "properties": { "results": { "type": "array", "description": "Every distinct entity found that matches the criteria", "items": { "type": "object", "properties": { "name": {"type": "string", "description": "Name of the matching entity"}, "evidence": {"type": "string", "description": "One-sentence reason it matches the criteria"}, "source_url": {"type": "string", "description": "URL supporting this match"} }, "required": ["name", "evidence", "source_url"] } } }, "required": ["results"] }
- 运行研究调用:
tvly research "Find AI startups that publicly announced a Series A funding round in 2026.
List each distinct company once, with a one-sentence reason and a supporting source URL."
--model pro --output-schema schema.json --json -o findall_results.json
- (可选)用第二个角度的查询扩大覆盖范围并合并/去重:
python3 << 'PYEOF' import json
with open('findall_results.json') as f: result = json.load(f) content = result.get('content', {}) r1 = json.loads(content) if isinstance(content, str) else content
Run a second, differently-worded query the same way, save it, and load it here as r2,
then merge both result sets before deduplicating.
all_entries = r1['results'] # + r2['results'] once you have a second angle
seen, merged = set(), [] for entry in all_entries: key = entry['name'].strip().lower() if key not in seen: seen.add(key) merged.append(entry)
for m in merged: print(f"- {m['name']}: {m['evidence']} ({m['source_url']})") PYEOF
选项
与 tavily-research 使用相同的底层标志:
- --model:默认推荐 pro——“找出所有”需要比窄查询更广泛的多角度搜索;仅在条件范围很窄时才降到 mini。
- --output-schema:带有顶层数组字段的 schema——这正是让输出成为列表而非报告的关键。
- --json:以编程方式解析数组所必需。
- --citation-format:当你需要为每个实体提供格式化引用而非原始 URL 时使用。
适用场景
- 需要从零构建一份匹配某描述的实体清单,且没有现成起始列表。
- 需要覆盖多个来源、多个角度,以尽量不遗漏匹配项。
- 需要每条记录都附带来源 URL,以便验证。
限制与注意事项
- 已知问题:--output-schema 目前需要 API-key 认证,而非 OAuth(详见上文)。
- 一次研究调用覆盖良好,但不保证完整覆盖。对于要依赖的“找出所有”结论,建议运行 2-3 个不同措辞的查询并去重。
- 在查询中明确要求“distinct”/“each once”。否则结果可能以略有不同的措辞重复同一实体。
- 始终要求每条记录附带来源 URL。没有来源的发现无法验证——应将 evidence/source_url 等 schema 字段视为必填。
- 对于广度需求,pro 优于 mini。这是 pro 额外耗时通常值得的场景——重点就是不遗漏匹配项。
- 告知用户哪些内容未被覆盖。如果搜索被限定在特定来源/时间范围,应说明——静默收窄会看起来像完整覆盖,实则不然。
相关技能
- tavily-research——此技能所包装的底层结构化输出能力
- fill-missing-fields——用于补全已有列表,而非构建列表
- tavily-dynamic-search——此技能借用的“多角度搜索后去重”模式