Llama 3 和 Mistral 等本地法学硕士无需将数据发送到云端即可运行,但缺乏实时知识。通过多平台搜索数据为它们提供基础可以解决这个问题:您的法学硕士可以获取 Google 结果以获取事实答案、Reddit 帖子以获取社区意见,以及 YouTube 元数据以获取视频上下文。 Scavio 通过一个 POST 端点提供所有三个平台,每个请求 0.005 美元。本教程构建了一个基础层,可根据意图将查询路由到正确的平台。
前置条件
- Ollama 或 llama.cpp 在本地运行
- 已安装 Python 3.9+
- 请求已安装库
- 来自 scavio.dev 的 Scavio API 密钥
操作指南
步骤 1: 设置特定于平台的搜索功能
为 Google、Reddit 和 YouTube 创建搜索功能。每个都将结果标准化为具有特定于平台的元数据的通用格式。
import os, requests
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
URL = 'https://api.scavio.dev/api/v1/search'
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def search_google(query: str, num: int = 5) -> list:
resp = requests.post(URL, headers=H,
json={'query': query, 'country_code': 'us', 'num_results': num})
return [{'source': 'google', 'title': r['title'], 'snippet': r.get('snippet', ''),
'url': r['link']} for r in resp.json().get('organic_results', [])]
def search_reddit(query: str, num: int = 5) -> list:
resp = requests.post(URL, headers=H,
json={'query': f'site:reddit.com {query}', 'country_code': 'us', 'num_results': num})
return [{'source': 'reddit', 'title': r['title'], 'snippet': r.get('snippet', ''),
'url': r['link']} for r in resp.json().get('organic_results', [])]
def search_youtube(query: str, num: int = 3) -> list:
resp = requests.post(URL, headers=H,
json={'query': f'site:youtube.com {query}', 'country_code': 'us', 'num_results': num})
return [{'source': 'youtube', 'title': r['title'].replace(' - YouTube', ''),
'snippet': r.get('snippet', ''), 'url': r['link']}
for r in resp.json().get('organic_results', [])]
print('Multi-platform search ready')步骤 2: 构建意图路由器
按意图对查询进行分类,以选择要搜索的平台。谷歌上出现了事实问题,Reddit 上出现了意见问题,YouTube 上出现了操作方法查询。
def classify_intent(query: str) -> list[str]:
q = query.lower()
platforms = []
# Always include Google for factual grounding
platforms.append('google')
# Opinion and discussion queries -> Reddit
opinion_words = ['best', 'worst', 'recommend', 'opinion', 'experience',
'worth it', 'vs', 'alternative', 'should i']
if any(w in q for w in opinion_words):
platforms.append('reddit')
# Tutorial and how-to queries -> YouTube
howto_words = ['how to', 'tutorial', 'guide', 'setup', 'install',
'configure', 'build', 'demo', 'walkthrough']
if any(w in q for w in howto_words):
platforms.append('youtube')
return platforms
# Test intent classification
for q in ['what is the capital of France',
'best laptop for programming 2026',
'how to deploy fastapi on railway']:
print(f'{q} -> {classify_intent(q)}')步骤 3: 创建多平台上下文构建器
从所有相关平台收集结果并将其格式化为 LLM 背景。每个来源都有明确的标签,因此法学硕士可以在其答案中引用平台。
import time
def build_context(query: str) -> str:
platforms = classify_intent(query)
all_results = []
for p in platforms:
if p == 'google':
all_results.extend(search_google(query))
elif p == 'reddit':
all_results.extend(search_reddit(query))
elif p == 'youtube':
all_results.extend(search_youtube(query))
time.sleep(0.2)
# Format for LLM consumption
lines = [f'Search results for: {query}', f'Platforms searched: {", ".join(platforms)}', '']
for i, r in enumerate(all_results, 1):
lines.append(f'[{i}] ({r["source"].upper()}) {r["title"]}')
if r['snippet']:
lines.append(f' {r["snippet"][:200]}')
lines.append(f' URL: {r["url"]}')
lines.append('')
context = '\n'.join(lines)
print(f'Built context: {len(all_results)} results from {len(platforms)} platforms')
return context
ctx = build_context('best python web framework 2026')
print(ctx[:500])步骤 4: 连接到本地 LLM
将搜索上下文和用户问题发送给 Ollama。系统提示指示法学硕士仅从搜索结果中回答并按编号和平台引用来源。
LLM_URL = 'http://localhost:11434/v1/chat/completions'
def ask_local_llm(context: str, question: str) -> str:
messages = [
{'role': 'system', 'content': (
'You are a helpful assistant. Answer based on the search results provided. '
'Cite sources as [1], [2] etc. Mention which platform (Google, Reddit, YouTube) '
'the information comes from. If results are insufficient, say so.'
)},
{'role': 'user', 'content': f'{context}\n\nQuestion: {question}'}
]
resp = requests.post(LLM_URL, json={
'model': 'llama3', 'messages': messages, 'max_tokens': 512
})
return resp.json()['choices'][0]['message']['content']
def grounded_answer(question: str) -> dict:
context = build_context(question)
answer = ask_local_llm(context, question)
platforms = classify_intent(question)
return {'question': question, 'answer': answer,
'platforms': platforms, 'cost': len(platforms) * 0.005}
result = grounded_answer('best python web framework 2026')
print(f'Q: {result["question"]}')
print(f'A: {result["answer"]}')
print(f'Platforms: {result["platforms"]}, Cost: ${result["cost"]}')Python 示例
import os, requests, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
URL = 'https://api.scavio.dev/api/v1/search'
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
LLM = 'http://localhost:11434/v1/chat/completions'
def multi_search(query):
results = []
for prefix in ['', 'site:reddit.com ', 'site:youtube.com ']:
resp = requests.post(URL, headers=H,
json={'query': f'{prefix}{query}', 'country_code': 'us', 'num_results': 3})
results.extend(resp.json().get('organic_results', []))
time.sleep(0.2)
return results
def grounded_ask(question):
results = multi_search(question)
ctx = '\n'.join(f'[{i+1}] {r["title"]}: {r.get("snippet","")}' for i, r in enumerate(results))
resp = requests.post(LLM, json={'model': 'llama3', 'messages': [
{'role': 'system', 'content': 'Answer from search results. Cite [1],[2] etc.'},
{'role': 'user', 'content': f'{ctx}\n\nQ: {question}'}], 'max_tokens': 512})
return resp.json()['choices'][0]['message']['content']
print(grounded_ask('best python framework for APIs 2026'))JavaScript 示例
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
const URL = 'https://api.scavio.dev/api/v1/search';
async function multiSearch(query) {
const results = [];
for (const prefix of ['', 'site:reddit.com ', 'site:youtube.com ']) {
const resp = await fetch(URL, {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `${prefix}${query}`, country_code: 'us', num_results: 3 })
});
results.push(...((await resp.json()).organic_results || []));
}
return results;
}
async function groundedAsk(question) {
const results = await multiSearch(question);
const ctx = results.map((r, i) => `[${i+1}] ${r.title}: ${r.snippet || ''}`).join('\n');
const resp = await fetch('http://localhost:11434/v1/chat/completions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ model: 'llama3', messages: [
{ role: 'system', content: 'Answer from search results. Cite [1],[2].' },
{ role: 'user', content: `${ctx}\n\nQ: ${question}` }], max_tokens: 512 })
});
return (await resp.json()).choices[0].message.content;
}
groundedAsk('best python framework for APIs 2026').then(console.log);预期输出
Built context: 9 results from 3 platforms
Q: best python web framework 2026
A: Based on the search results across multiple platforms:
Google sources indicate FastAPI and Django remain the top choices [1][2].
Reddit discussions show strong community preference for FastAPI for new
API projects [4][5]. YouTube tutorials are heavily focused on FastAPI
deployment [7][8].
Platforms: ['google', 'reddit', 'youtube'], Cost: $0.015