本页内容
设想一个能够完成以下任务的 AI 研究助手:
- 在网络上搜索相关来源
- 从多个网站提取并核实信息
- 交叉比对事实以确保准确性
- 将研究结果综合成一份带引用的连贯摘要
借助 Claude、Model Context Protocol (MCP) 和 CrawlForge,你可以在一个下午就把它构建出来。本指南将带你了解其架构、实现方式以及生产环境中的注意事项。
愿景:像人类一样做研究
传统 LLM 受限于其训练数据。当你向 GPT-4 或 Claude 提问时,它们只能回忆起此前见过的内容。但人类并非如此——我们会搜索、阅读、核实并综合新的信息。
一个 AI 研究助手应当能够:
- 理解意图 - 将复杂的查询拆解为可搜索的主题
- 发现来源 - 找到相关的网页、文档和文章
- 提取信息 - 提炼出关键事实、引述和数据
- 核实准确性 - 在多个来源之间交叉验证信息
- 综合结果 - 将研究结果整合成一份清晰、带引用的答案
让我们开始构建。
架构概览
我们的研究助手分为三层:
┌─────────────────────────────────────────────────┐
│ LLM Layer (Claude/GPT-4) │
│ - Query understanding │
│ - Source relevance scoring │
│ - Information synthesis │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ MCP Server (CrawlForge) │
│ - search_web (5 credits) │
│ - extract_content (2 credits) │
│ - deep_research (10 credits) │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ Web Data Layer │
│ - Google Search results │
│ - Website content │
│ - Structured data │
└─────────────────────────────────────────────────┘
数据流:
- 用户提交一个研究查询
- LLM 将查询扩展为搜索词
- CrawlForge 在网络上搜索并提取内容
- LLM 核实并综合信息
- 返回带引用的结构化答案
搭建项目
我们将使用 TypeScript、Claude 的 API(或 OpenAI)以及 CrawlForge MCP server。
前置条件
node -v # 18+ required
npm -v # 9+ required初始化项目
mkdir ai-research-assistant
cd ai-research-assistant
npm init -y
npm install @anthropic-ai/sdk dotenv
npm install --save-dev typescript @types/node tsx
npx tsc --init环境配置
创建 .env:
# Claude API (or use OPENAI_API_KEY)
ANTHROPIC_API_KEY=sk-ant-xxxxx
# CrawlForge API
CRAWLFORGE_API_KEY=cf_live_xxxxx在 crawlforge.dev/signup 获取你的 CrawlForge API key(赠送 1,000 个免费 credits)。
实现研究流程
1. 理解查询
首先,我们需要将用户查询扩展为有效的搜索词。
// src/research/query-processor.ts
import Anthropic from '@anthropic-ai/sdk';
interface QueryExpansion {
original: string;
searchTerms: string[];
intent: 'factual' | 'comparative' | 'tutorial' | 'news';
depth: 'shallow' | 'moderate' | 'deep';
}
export async function expandQuery(
query: string,
anthropic: Anthropic
): Promise<QueryExpansion> {
const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 500,
messages: [{
role: 'user',
content: `Analyze this research query and return JSON:
Query: "${query}"
Return:
{
"searchTerms": ["term1", "term2", "term3"],
"intent": "factual|comparative|tutorial|news",
"depth": "shallow|moderate|deep"
}
Search terms should be optimized for web search.`
}]
});
const content = response.content[0];
if (content.type !== 'text') throw new Error('Unexpected response');
const parsed = JSON.parse(content.text);
return {
original: query,
searchTerms: parsed.searchTerms,
intent: parsed.intent,
depth: parsed.depth
};
}2. 网络搜索与内容提取
接下来,我们搜索相关来源并提取其内容。
// src/research/web-scraper.ts
interface Source {
url: string;
title: string;
snippet: string;
content: string;
extractedAt: Date;
}
export async function findSources(
searchTerms: string[],
apiKey: string
): Promise<Source[]> {
const sources: Source[] = [];
for (const term of searchTerms) {
// Use search_web tool (5 credits per search)
const searchResponse = await fetch('https://crawlforge.dev/api/v1/tools/search_web', {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
query: term,
limit: 5 // Top 5 results per term
})
});
const searchData = await searchResponse.json();
const results = searchData.results || [];
// Extract content from each result (2 credits per URL)
for (const result of results) {
const contentResponse = await fetch('https://crawlforge.dev/api/v1/tools/extract_content', {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: result.url
})
});
const contentData = await contentResponse.json();
sources.push({
url: result.url,
title: result.title,
snippet: result.snippet,
content: contentData.content || '',
extractedAt: new Date()
});
}
}
return sources;
}credits 成本:
- 3 个搜索词 × 5 credits = 15 credits
- 15 个来源 × 2 credits = 30 credits
- 合计:每次研究查询 45 credits
3. 信息核实
在各来源之间交叉比对事实以核实准确性。
// src/research/verifier.ts
interface VerifiedFact {
claim: string;
confidence: 'high' | 'medium' | 'low';
sources: string[];
conflicts?: string[];
}
export async function verifyInformation(
sources: Source[],
anthropic: Anthropic
): Promise<VerifiedFact[]> {
const sourceTexts = sources.map((s, i) =>
`[Source ${i + 1}: ${s.url}]
${s.content.slice(0, 1000)}`
).join('
');
const response = await anthropic.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 2000,
messages: [{
role: 'user',
content: `Extract and verify key facts from these sources. Return JSON:
${sourceTexts}
Return:
{
"facts": [
{
"claim": "factual claim",
"confidence": "high|medium|low",
"sources": [1, 2], // Source indices that support this
"conflicts": ["conflicting information if any"]
}
]
}`
}]
});
const content = response.content[0];
if (content.type !== 'text') throw new Error('Unexpected response');
const parsed = JSON.parse(content.text);
return parsed.facts.map((fact: any) => ({
claim: fact.claim,
confidence: fact.confidence,
sources: fact.sources.map((i: number) => sources[i - 1]?.url || ''),
conflicts: fact.conflicts
}));
}接下来呢?
现在你已经构建了一个基础的研究助手,接下来你可以:
- 添加流式输出 - 在找到结果时实时流式返回,以改善用户体验
- 存储结果 - 将研究保存到数据库以便日后检索
- 构建界面 - 用 Next.js 或 React 创建一个 Web 界面
- 添加 webhooks - 在研究完成时收到通知
- 微调 prompt - 针对你的具体使用场景进行优化
资源
开始构建: 在 crawlforge.dev/signup 获取 1,000 个免费 credits。
亲自试一试——无需注册
在 Playground 中运行 CrawlForge 的 27 个抓取与提取工具中的任意一个,然后免费开始,获取 1,000 credits。
1,000 免费 credits • 每月补充 • 无需信用卡
标签
及时获取最新洞察
将教程、产品更新与 Web 抓取技巧直接发送到你的收件箱。
拒绝垃圾邮件,随时可取消订阅。