VC Finder - 风险投资发现器 是做什么的?
输入产品 URL 或描述。自动检测行业和阶段。找到 5 家可比已融资公司。运行两条研究路线:谁投资了这些可比公司(A 路线),以及哪些风险投资公司在此领域发表投资主题(B 路线)。返回有来源、排名的投资者列表,并附上跟进切入点。
零幻觉政策: 输出中的每个事实都必须可追溯到特定的 Tavily 搜索结果或抓取的产品页面。这适用于:
- 可比公司名称:必须出现在 Tavily 搜索结果中,而非 AI 训练知识
- 风险投资基金名称:必须原样出现在 Tavily 搜索结果中
- 支票规模、阶段重点、投资组合公司:必须来自搜索片段,而非 AI 知识
- 基金概览和主题总结:仅从搜索片段中提取。如果某个细节不在搜索数据中,请写“搜索数据中未找到” —— 不要从训练知识中填充。
常见错误
| 代理可能会... | 为什么这是错的 |
|---|---|
| 添加 a16z 或 Sequoia,因为它们很有名 | 没有证据的名牌风险投资公司只是噪音。仅包含在 Tavily 搜索结果为该特定产品出现的 VC。点名浪费创始人时间。 |
| 从训练知识生成可比公司 | 可比公司必须来自 Tavily 搜索结果(步骤 6)。AI 关于公司的知识不是证据 —— 从记忆中提出的公司可能融资状态有误或不具备可比性。 |
| 当所有 5 个 A 路线搜索返回 0 个结果时继续 | 零个 A 路线结果意味着可比公司错误或过于小众。停止,使用更广泛的搜索查询重新运行步骤 6,然后重试。 |
| 在未引用文章或帖子的情况下包含 B 路线 VC | 没有来源的主题与幻觉无法区分。创始人无法验证它,列表将失去所有可信度。 |
| 从训练知识填充基金概览 | 基金概览必须仅从 Tavily 片段文本获取。如果片段未描述该基金,请写“搜索数据中未找到”。 |
| 从网站美学检测阶段 | 阶段必须来自步骤 4 中检测到的特定 CTA 信号。 |
| 编写通用跟进切入点 | 每个跟进切入点必须命名此特定产品的差异化特性以及来自搜索数据的具体 VC 投资组合信号或主题引用。 |
| 当用户也提供描述时跳过 URL 抓取 | 始终抓取 URL。实时页面通常会揭示用户描述中忽略的阶段信号。 |
步骤 1:设置检查
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:+set}"
echo "FIRECRAWL_API_KEY: ${FIRECRAWL_API_KEY:-not set, Tavily extract will be used as fallback}"
如果缺少 TAVILY_API_KEY: 停止。告诉用户:“需要 TAVILY_API_KEY 来研究风险投资和主题。没有备用方案。在 app.tavily.com 获取——免费层:1000 积分/月(约 125 次完整运行)。将其添加到您的 .env 文件中。”
如果仅缺少 FIRECRAWL_API_KEY: 静默继续。Tavily extract 将用于 URL 抓取。
步骤 2:收集输入
您需要:
- 产品 URL(必需,除非用户直接粘贴产品描述)
- 可选:目标阶段提示(pre-seed、seed、series-a、series-b)—— 如果提供,使用它并跳过阶段检测
- 可选:地域偏好(美国、欧洲、全球)—— 如果未指定,默认为美国
如果用户仅提供粘贴的描述(无 URL): 跳过步骤 3-4。直接进入步骤 5,使用粘贴的文本作为 product_content。将 stage_source 设置为 user_description。
如果既未提供 URL 也未提供描述: 询问:“您的产品或初创公司的 URL 是什么?或粘贴简短描述:它做什么、面向谁、以及您所处的阶段(pre-seed、seed、Series A)。”
从 URL 派生产品 slug 用于输出文件名:
PRODUCT_SLUG=$(python3 -c "
from urllib.parse import urlparse
url = 'URL_HERE'
host = urlparse(url).netloc.replace('www.', '')
print(host.split('.')[0])
")
步骤 3:抓取产品页面
主要:Firecrawl(如果设置了 FIRECRAWL_API_KEY)
curl -s -X POST https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "URL_HERE", "formats": ["markdown"], "onlyMainContent": true}' \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('data', {}).get('markdown', '') or d.get('markdown', '')
print(f'Fetched: {len(content)} characters')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
备用:Tavily extract(如果未设置 FIRECRAWL_API_KEY)
curl -s -X POST https://api.tavily.com/extract \
-H "Content-Type: application/json" \
-d "{\"api_key\": \"$TAVILY_API_KEY\", \"urls\": [\"URL_HERE\"]}" \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
content = d.get('results', [{}])[0].get('raw_content', '')
print(f'Fetched via Tavily extract: {len(content)} characters')
open('/tmp/vc-product-raw.md', 'w').write(content)
"
步骤级检查点:
python3 -c "
content = open('/tmp/vc-product-raw.md').read()
if len(content) < 200:
print('ERROR: Page returned fewer than 200 characters.')
else:
print(f'Content OK: {len(content)} characters')
"
如果内容 < 200 个字符: 停止抓取。告诉用户:“产品页面返回了不可读内容。这通常意味着网站是 JavaScript 渲染的,需要浏览器。请直接粘贴您的产品描述:它做什么、面向谁、以及您所处的阶段。”
使用粘贴的描述作为 product_content 进入步骤 5。
步骤 4:本地检测阶段信号(无需 API)
在分析步骤之前,使用正则表达式解析抓取的 markdown。
python3 << 'PYEOF'
import re, json
content = open('/tmp/vc-product-raw.md').read().lower()
stage_signals = []
if re.search(r'join\s+(the\s+)?waitlist|sign\s+up\s+for\s+beta|early\s+access|request\s+(an?\s+)?invite|get\s+notified', content):
stage_signals.append({'signal': 'waitlist or beta CTA', 'stage_hint': 'pre-seed'})
if re.search(r'start\s+(your\s+)?free\s+trial|try\s+(it\s+)?for\s+free|request\s+a?\s+demo|book\s+a?\s+demo|schedule\s+a?\s+demo', content):
stage_signals.append({'signal': 'free trial or demo CTA', 'stage_hint': 'seed'})
if re.search(r'contact\s+sales|talk\s+to\s+(our\s+)?sales|see\s+pricing|view\s+pricing|plans\s+and\s+pricing', content):
stage_signals.append({'signal': 'pricing or sales CTA', 'stage_hint': 'series-a'})
if re.search(r'case\s+stud(y|ies)|customer\s+stor(y|ies)|trusted\s+by\s+[\d,]+|used\s+by\s+[\d,]+', content):
stage_signals.append({'signal': 'case studies or customer count', 'stage_hint': 'series-a'})
if re.search(r'enterprise\s+(plan|pricing|tier)|we.?re\s+hiring|join\s+our\s+team|open\s+positions', content):
stage_signals.append({'signal': 'enterprise tier or job openings', 'stage_hint': 'series-a-or-b'})
funding_match = re.search(
r'raised\s+\$[\d,.]+\s*[mk]?|series\s+[abc]\s+round|seed\s+round|(\$[\d,.]+\s*[mk]?\s+(?:seed|series\s+[abc]))',
content
)
if funding_match:
stage_signals.append({'signal': f'funding text: {funding_match.group(0).strip()}', 'stage_hint': 'announced'})
if not stage_signals:
dominant = 'unknown'
elif any(s['stage_hint'] == 'announced' for s in stage_signals):
dominant = 'announced'
elif any(s['stage_hint'] == 'series-a-or-b' for s in stage_signals):
dominant = 'series-a'
elif any(s['stage_hint'] == 'series-a' for s in stage_signals):
dominant = 'series-a'
elif any(s['stage_hint'] == 'seed' for s in stage_signals):
dominant = 'seed'
else:
dominant = 'pre-seed'
confidence = 'high' if len(stage_signals) >= 2 else ('medium' if len(stage_signals) == 1 else 'low')
result = {'signals': stage_signals, 'dominant_stage': dominant, 'confidence': confidence}
json.dump(result, open('/tmp/vc-stage-signals.json', 'w'), indent=2)
print(f'Stage: {dominant} ({confidence} confidence) from {len(stage_signals)} signal(s)')
for s in stage_signals:
print(f' - {s["signal"]} -> {s["stage_hint"]}')
PYEOF
步骤 5:产品分析(分类、阶段、ICP)
打印产品内容和阶段信号:
python3 -c "
import json
content = open('/tmp/vc-product-raw.md').read()[:6000]
signals = json.load(open('/tmp/vc-stage-signals.json'))
print('=== PRODUCT PAGE (first 6000 chars) ===')
print(content)
print()
print('=== DETECTED STAGE SIGNALS ===')
print(json.dumps(signals, indent=2))
"
AI 指令: 分析上面的产品页面内容。仅生成分类、ICP 和阶段分类 —— 不要生成可比公司(将在步骤 6 中通过实时搜索完成)。
写入 /tmp/vc-product-analysis.json:
product_name:来自页面one_line_description:它做什么、面向谁、核心价值主张。少于 20 个单词。无营销语言。industry_taxonomy:l1(顶层:fintech / healthtech / developer tools / consumer 等)、l2(领域:sales technology / logistics software 等)、l3(特定细分:outbound prospecting / last-mile routing 等)。仅使用像“technology”或“software”这样的模糊标签不可接受。icp:buyer_persona(职位)、company_type、company_sizedetected_stage:pre-seed / seed / series-a / series-b / unknownstage_confidence:high / medium / lowstage_evidence:一句话引用页面上驱动此判断的具体 CTA 或文本。如果未知,写“未找到明确信号”。geography_bias:US / Europe / global / unclearcomparable_companies:保留为空数组[]—— 将在步骤 6 中填充
python3 << 'PYEOF'
import json
analysis = {
# FILL from your analysis above
"comparable_companies": []
}
json.dump(analysis, open('/tmp/vc-product-analysis.json', 'w'), indent=2)
print('Product analysis written.')
PYEOF
验证:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Product:', a['product_name'])
print('Industry:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Stage:', a['detected_stage'], '(' + a['stage_confidence'] + ' confidence)')
"
步骤 5b:针对验证基金数据集的策划预匹配
将产品分类与包含 25 个验证风险投资基金的数据集进行匹配(来源:基金网站)。生成零幻觉基金匹配和 A 路线的种子可比公司 —— 不消耗 Tavily 积分。
打印产品分析以进行标签映射:
python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print('Taxonomy:', a['industry_taxonomy']['l1'], '>', a['industry_taxonomy']['l2'], '>', a['industry_taxonomy']['l3'])
print('Stage:', a['detected_stage'])
print('Geography:', a['geography_bias'])
"
AI 指令: 将产品分类映射到基金数据集中使用的标准标签。可用标签:
DevTools、Infrastructure、Open Source、B2B SaaS、AI、Data、FinTech、HealthTech、Enterprise、Consumer、Marketplaces、E-commerce、Crypto、DeepTech、Cybersecurity、Generalist
选择 2-4 个描述此产品的标签。将 detected_stage 映射为:Pre-seed、Seed、Series A 或 Growth。将 geography_bias 映射为:US、Europe、India 或 Global。
写入产品上下文:
python3 << 'PYEOF'
import json
# FILL based on taxonomy analysis above
context = {
"extracted_tags": ["TagA", "TagB"], # 2-4 tags from the list above
"stage_hint": "Seed", # Pre-seed / Seed / Series A / Growth
"geography_hint": "US" # US / Europe / India / Global
}
json.dump(context, open('/tmp/vc-product-context.json', 'w'), indent=2)
print('Product context:', context)
PYEOF
针对嵌入的策划数据集运行评分:
python3 << 'PYEOF'
import json
context = json.load(open('/tmp/vc-product-context.json'))
VC_FUNDS = [
{"fund_name":"Y Combinator","thesis":"We provide seed funding for startups. We invest in deeply technical teams building massive companies across all domains.","check_size":"$500k","stage_focus":["Pre-seed","Seed"],"industry_tags":["Generalist","B2B SaaS","DevTools","AI"],"geography_focus":["Global"],"notable_portfolio":["Stripe","Airbnb","GitLab"],"website":"https://www.ycombinator.com"},
{"fund_name":"boldstart ventures","thesis":"Day one partner for developer first, crypto, and SaaS founders. We love deeply technical founders solving hard infrastructure problems.","check_size":"$1M - $3M","stage_focus":["Pre-seed","Seed"],"industry_tags":["DevTools","Infrastructure","Crypto"],"geography_focus":["Global","US"],"notable_portfolio":["Snyk","Blockdaemon","Superhuman"],"website":"https://boldstart.vc"},
{"fund_name":"Heavybit","thesis":"The leading investor in developer-first startups. We help technical founders launch, gain traction, and build enterprise-ready companies.","check_size":"$1M - $5M","stage_focus":["Seed","Series A"],"industry_tags":["DevTools","Infrastructure","Open Source"],"geography_focus":["Global","US"],"notable_portfolio":["PagerDuty","Sanity","Netlify"],"website":"https://www.heavybit.com"},
{"fund_name":"Amplify Partners","thesis":"We invest in technical founders building the next generation of IT infrastructure, developer tools, and data platforms.","check_size":"$2M - $8M","stage_focus":["Seed","Series A"],"industry_tags":["DevTools","Infrastructure","AI","Data"],"geography_focus":["US"],"notable_portfolio":["Datadog","OCTO","dbt Labs"],"website":"https://www.amplifypartners.com"},
{"fund_name":"OSS Capital","thesis":"We exclusively back early-stage founders building Commercial Open Source Software (COSS) companies.","check_size":"$500k - $2M","stage_focus":["Pre-seed","Seed","Series A"],"industry_tags":["Open Source","DevTools"],"geography_focus":["Global"],"notable_portfolio":["Cal.com","Appsmith","Hoppscotch"],"website":"https://oss.capital"}
]
scored = []
for fund in VC_FUNDS:
score = 0
tag_matches = [t for t in fund["industry_tags"] if t in context["extracted_tags"]]
score += len(tag_matches) * 20
if context["stage_hint"] in fund["stage_focus"]:
score += 15
if context["geography_hint"] in fund["geography_focus"] or "Global" in fund["geography_focus"]:
score += 10
scored.append({"fund_name": fund["fund_name"], "score": score, "tag_matches": tag_matches, "details": fund})
scored.sort(key=lambda x: x["score"], reverse=True)
top_matches = [s for s in scored if s["score"] >= 20][:5]
result = {
"matched_funds": [{"name": m["details"]["fund_name"], "score": m["score"], "tag_matches": m["tag_matches"], "details": m["details"]} for m in top_matches],
"score_explanation": "Tag match = +20 per match, Stage match = +15, Geography match = +10. Minimum match score: 20."
}
json.dump(result, open('/tmp/vc-curated-matches.json', 'w'), indent=2, ensure_ascii=False)
print(f"Found {len(top_matches)} curated fund matches (score >= 20)")
for m in top_matches:
print(f" {m['details']['fund_name']}: score {m['score']} (tags: {', '.join(m['tag_matches'])})")
PYEOF
步骤 6:查找可比公司(Tavily 搜索)
在 Tavily 中搜索此产品空间中的可比初创公司。搜索查询必须基于行业分类和产品描述。搜索需要返回已融资的初创公司(种子轮或更高)。
export PRODUCT_DESCRIPTION="从产品分析中获取单行描述"
export L1="从分析中获取行业 L1 分类"
export L2="从分析中获取行业 L2 分类"
python3 << 'PYEOF'
import json, os
desc = os.environ.get('PRODUCT_DESCRIPTION', '')
l1 = os.environ.get('L1', '')
l2 = os.environ.get('L2', '')
searches = [
{"query": f"funded startups similar to {desc}", "reason": "基于产品描述的通用可比搜索"},
{"query": f"top funded companies in {l1} {l2} 2024 2025", "reason": "基于分类的行业特定搜索"},
{"query": f"series A funded startups in {l1} {l2}", "reason": "目标阶段可比公司"}
]
json.dump(searches, open('/tmp/vc-comparable-searches.json', 'w'), indent=2)
for s in searches:
print(f"Search: {s['query']}")
PYEOF
# 对每个搜索运行 Tavily 搜索
for row in $(python3 -c "
import json
searches = json.load(open('/tmp/vc-comparable-searches.json'))
for i, s in enumerate(searches):
print(f'{i}|{s[\"query\"]}')
"); do
IFS='|' read -r idx query <<< "$row"
echo "--- Search $idx: $query ---"
curl -s -X POST https://api.tavily.com/search \
-H "Content-Type: application/json" \
-d "{\"api_key\": \"$TAVILY_API_KEY\", \"query\": \"$query\", \"search_depth\": \"advanced\", \"max_results\": 10}" \
> /tmp/vc-search-$idx.json
python3 -c "
import json
data = json.load(open('/tmp/vc-search-$idx.json'))
results = data.get('results', [])
print(f'Results: {len(results)}')
for r in results:
print(f\" - {r.get('title', '')}: {r.get('content', '')[:200]}...\")
"
sleep 0.5
done
AI 指令: 分析上面所有搜索的结果。识别 5 家在此空间中已融资的可比初创公司。对于每家,提供:
- 公司名称
- 单行描述
- 融资阶段(如果提及)
- 来源 URL
约束: 每家公司必须显示在至少一个 Tavily 结果中。不要从 AI 训练知识中添加公司。如果搜索返回少于 5 家,请使用更广泛的查询(如“startups in ...”或“YC companies in ...”)重新运行步骤 6。
将可比公司写入临时文件:
python3 << 'PYEOF'
import json
comparables = [
# FILL with 5 companies from search results
]
json.dump(comparables, open('/tmp/vc-comparables.json', 'w'), indent=2)
print(f"Found {len(comparables)} comparable companies")
PYEOF
步骤 7:A 路线 — 查找可比公司的投资者
对于步骤 6 中的每家可比公司,搜索其投资者。使用 2-3 个查询,包括公司名称、行业和“funding”或“raised”等术语。
python3 << 'PYEOF'
import json
comparables = json.load(open('/tmp/vc-comparables.json'))
searches = []
for i, comp in enumerate(comparables):
name = comp.get('name', '')
desc = comp.get('description', '')
searches.append({"query": f"{name} {desc} funding investors raised", "reason": f"查找 {name} 的投资者"})
searches.append({"query": f"who invested in {name}", "reason": f"查找 {name} 投资者的备用查询"})
json.dump(searches, open('/tmp/vc-investor-searches.json', 'w'), indent=2)
print(f"Generated {len(searches)} investor searches for {len(comparables)} comparables")
PYEOF
# 对每个投资者搜索运行 Tavily 搜索
for row in $(python3 -c "
import json
searches = json.load(open('/tmp/vc-investor-searches.json'))
for i, s in enumerate(searches):
print(f'{i}|{s[\"query\"]}')
"); do
IFS='|' read -r idx query <<< "$row"
echo "--- Investor Search $idx: $query ---"
curl -s -X POST https://api.tavily.com/search \
-H "Content-Type: application/json" \
-d "{\"api_key\": \"$TAVILY_API_KEY\", \"query\": \"$query\", \"search_depth\": \"advanced\", \"max_results\": 10}" \
> /tmp/vc-investor-search-$idx.json
python3 -c "
import json
data = json.load(open('/tmp/vc-investor-search-$idx.json'))
results = data.get('results', [])
print(f'Results: {len(results)}')
for r in results:
print(f\" - {r.get('title', '')}: {r.get('content', '')[:200]}...\")
"
sleep 0.5
done
AI 指令: 提取在搜索片段中出现的特定风险投资基金名称。对于每个基金,记录其来源的可比公司名称以及出现该基金的搜索结果。将所有提取的基金写入临时文件。
步骤 8:B 路线 — 查找在此领域发表投资主题的 VC
搜索专注于此行业并发表投资主题的风险投资公司。
export L1="从分析中获取行业 L1 分类"
export L2="从分析中获取行业 L2 分类"
python3 << 'PYEOF'
import json, os
l1 = os.environ.get('L1', '')
l2 = os.environ.get('L2', '')
searches = [
{"query": f"VC investment thesis {l1} {l2} 2024 2025", "reason": "查找此空间投资主题的直接查询"},
{"query": f"venture capital investing in {l1} {l2}", "reason": "查找此领域普通 VC 的查询"},
{"query": f"top VCs in {l1} {l2} portfolio", "reason": "查找投资组合包含此类型公司的 VC"},
{"query": f"{l1} {l2} sector map investors", "reason": "查找行业分析和活跃投资者的备用查询"}
]
json.dump(searches, open('/tmp/vc-thesis-searches.json', 'w'), indent=2)
for s in searches:
print(f"Search: {s['query']}")
PYEOF
# 对每个主题搜索运行 Tavily 搜索
for row in $(python3 -c "
import json
searches = json.load(open('/tmp/vc-thesis-searches.json'))
for i, s in enumerate(searches):
print(f'{i}|{s[\"query\"]}')
"); do
IFS='|' read -r idx query <<< "$row"
echo "--- Thesis Search $idx: $query ---"
curl -s -X POST https://api.tavily.com/search \
-H "Content-Type: application/json" \
-d "{\"api_key\": \"$TAVILY_API_KEY\", \"query\": \"$query\", \"search_depth\": \"advanced\", \"max_results\": 10}" \
> /tmp/vc-thesis-search-$idx.json
python3 -c "
import json
data = json.load(open('/tmp/vc-thesis-search-$idx.json'))
results = data.get('results', [])
print(f'Results: {len(results)}')
for r in results:
print(f\" - {r.get('title', '')}: {r.get('content', '')[:200]}...\")
"
sleep 0.5
done
AI 指令: 从结果中提取风险投资公司,这些公司(a)明确在此行业投资,并且(b)公开写了投资主题或投资论文的帖子。对于每个匹配的 VC,记录:基金名称、主题来源 URL、主题片段(1-2 句)。将所有提取的 VC 写入临时文件。
步骤 9:合并、去重和评分
合并来自 A 路线、B 路线和策划匹配(步骤 5b)的所有风险投资公司。去除重复项。使用以下标准对它们进行评分:
优先级:
- 直接投资相关性(+3):基金投资了可比公司(A 路线)
- 主题匹配(+2):基金写了此空间的投资主题(B 路线)
- 策划匹配(+1):基金出现在策划数据集中(步骤 5b)
- 阶段一致性(+2):基金的阶段重点与产品的检测阶段匹配
使用分数对投资者进行排名,分数越高表示相关性越高。如果有平局,通过引用来源数量打破平局。
将合并的排名列表写入 /tmp/vc-ranked-investors.json。
python3 << 'PYEOF'
import json
# AI: Merge here using data from:
# - /tmp/vc-investor-searches.json outputs (Track A)
# - /tmp/vc-thesis-searches.json outputs (Track B)
# - /tmp/vc-curated-matches.json (Step 5b)
# - /tmp/vc-product-analysis.json (for stage)
analysis = json.load(open('/tmp/vc-product-analysis.json'))
curated = json.load(open('/tmp/vc-curated-matches.json'))
investors = [
{
"name": "Fund Name",
"source": "Track A / Track B / Curated",
"source_url": "https://example.com/article",
"rationale": "Why this fund is relevant",
"score": 0,
"score_breakdown": {"direct_investment": 0, "thesis_match": 0, "curated_match": 0, "stage_alignment": 0}
}
]
json.dump(investors, open('/tmp/vc-ranked-investors.json', 'w'), indent=2)
print(f"Ranked {len(investors)} investors")
PYEOF
步骤 10:深度挖掘(可选但强烈推荐)
对于排名前 3-5 的投资者,执行额外搜索以收集:
- 基金概览:从 Tavily 片段中提取
- 投资组合公司:在此空间中的其他投资
- 投资主题:关于此空间的投资论文的扩展引用
约束: 所有信息必须来自 Tavily 搜索结果。不要从 AI 知识库填充。如果片段中找不到,请写入“搜索数据中未找到”。
for investor in $(python3 -c "
import json
investors = json.load(open('/tmp/vc-ranked-investors.json'))
for i in investors[:5]:
print(i['name'].replace(' ', '_'))
"); do
echo "--- Deep Dive: $investor ---"
curl -s -X POST https://api.tavily.com/search \
-H "Content-Type: application/json" \
-d "{\"api_key\": \"$TAVILY_API_KEY\", \"query\": \"$investor venture capital fund overview portfolio\", \"search_depth\": \"advanced\", \"max_results\": 10}" \
> /tmp/vc-deepdive-$(echo $investor | tr '[:upper:]' '[:lower:]').json
python3 -c "
import json
data = json.load(open('/tmp/vc-deepdive-$(echo $investor | tr '[:upper:]' '[:lower:]').json'))
results = data.get('results', [])
print(f'Results: {len(results)}')
for r in results[:5]:
print(f\" - {r.get('title', '')}\")
"
sleep 0.5
done
步骤 11:生成输出
写入带有投资者排名列表和深度分析的最终 JSON 输出文件:
python3 << 'PYEOF'
import json
analysis = json.load(open('/tmp/vc-product-analysis.json'))
investors = json.load(open('/tmp/vc-ranked-investors.json'))
stage = json.load(open('/tmp/vc-stage-signals.json'))
output = {
"product": analysis,
"stage_signals": stage,
"ranked_investors": investors,
"metadata": {
"tavily_searches_used": 12,
"disclaimer": "This report was generated using Tavily search results. All investor names, check sizes, stage focuses, and portfolio companies are sourced from search snippets. Any field marked 'not found in search data' indicates the information was not available in the search results."
}
}
json.dump(output, open('/tmp/vc-final-output.json', 'w'), indent=2, ensure_ascii=False)
print(f"Output written: {len(investors)} ranked investors")
PYEOF
输出文件名
export PRODUCT_SLUG=$(python3 -c "
import json
a = json.load(open('/tmp/vc-product-analysis.json'))
print(a.get('product_name', 'unknown').lower().replace(' ', '-')[:30])
")
export OUTPUT_FILE="vc-investors-${PRODUCT_SLUG}.json"
cp /tmp/vc-final-output.json "$OUTPUT_FILE"
echo "Output saved to: $OUTPUT_FILE"
常见失败模式
没有 Tavily 结果
- 检查 URL。 有时产品描述太模糊。要求用户提供更具体的描述。
- 尝试更广的分类。 如果“AI Sales Assistant”没有结果,尝试“sales technology startups”或“conversational AI for sales”。
- 失败时,回退到 YC 批次搜索。 使用“YC W24 list”或“YC S24 batch companies in...”等查询。
产品页面不可读
- 页面可能是 JavaScript 单页应用。要求用户粘贴描述。
所有 A 路线搜索结果为空
- 可比公司可能是错误的。重新运行步骤 6 使用更广的查询。
- 检查步骤 6 中的公司是否确实已融资。用“funding”或“series X”搜索它们。
最终质量检查
零幻觉检查: 对于输出中的每个事实,您必须回答:"这个事实是否出现在 Tavily 搜索结果或抓取的产品页面中?" 如果否,则将其删除。
来源检查: 每个:
- 基金名称 → 必须出现在至少一个 Tavily 结果中
- 可比公司 → 必须出现在至少一个 Tavily 结果中
- 主题引用 → 必须附有 Tavily 结果 URL
- 投资组合公司 → 必须出现在与基金相关的 Tavily 结果中
完整性检查:
- 至少有 5 个投资者
- 每个投资者有来源 URL
- 每个投资者有跟进切入点
- 输出包括可比公司的完整列表
引用每个来源: 输出中的每条信息都需要一个来源(URL + 片段)。使用引用,以便创始人可以验证每个事实。