Статический RAG не может ответить на вопрос «что случилось на этой неделе». Добавление шага живого веб-поиска через Google Search API заземляет вашу LLM на актуальных, цитируемых источниках. Вот этот паттерн на примере serp.cheap.
Архитектура
user query
→ SERP API search (top N results) ← live, fresh
→ fetch the result pages
→ chunk + embed on the fly
→ retrieve most relevant chunks
→ LLM answers, citing the source URLs
Шаг 1 — получаем свежие источники
import requests
def web_sources(query, n=5, gl="us"):
data = requests.post(
"https://api.serp.cheap/v1/search",
headers={"X-API-Key": "YOUR_KEY"},
json={"q": query, "gl": gl},
timeout=30,
).json()
return [
{"title": r["title"], "url": r["link"], "snippet": r.get("snippet", "")}
for r in data["organic"][:n]
]
Шаг 2 — загрузка и разбивка
Загрузите каждый url, извлеките основной текст, разбейте на фрагменты по ~500 токенов. (Используйте свой существующий загрузчик/сплиттер — например, trafilatura + текстовый сплиттер.)
Шаг 3 — встраивание, извлечение, генерация
Встройте фрагменты, извлеките top-k для запроса и передайте их модели с инструкцией цитировать исходные URL. Поскольку источники взяты из живой SERP, ответ отражает то, что сейчас говорят авторитетные страницы.
Почему здесь важен дешёвый SERP API
RAG запускает поиск на каждый запрос. При $0.0006 за свежий поиск (вдвое дешевле из кэша) serp.cheap делает стоимость извлечения на один ответ ничтожной — а повторяющиеся одинаковые запросы автоматически попадают в кэш.
Быстрый путь только по сниппетам
Для лёгкого заземления вы можете пропустить загрузку страниц и передать модели заголовки + сниппеты из SERP напрямую — один вызов API, без обхода страниц. Это дешевле и часто достаточно для быстрых фактических ответов.