ScavioScavio
产品定价文档
登录开始使用
  1. 首页
  2. 教程
  3. 2026年浪链RAG管道如何增加搜索落地
教程

2026年浪链RAG管道如何增加搜索落地

利用来自 6 个平台的实时搜索数据为您的 LangChain RAG 管道奠定基础。减少幻觉并通过工作代码获得当前答案。

获取免费API密钥API文档

基于静态向量存储构建的 RAG 管道可以回答陈旧数据的问题。添加实时搜索基础意味着当向量存储不足时,法学硕士始终可以访问当前信息。本教程构建了一个混合检索器,它首先检查向量存储,然后在置信度较低时回退到实时搜索。搜索基础层使用 Scavio 从 Google、Reddit 和 YouTube 获取每个查询 0.005 美元的费用。

前置条件

  • 已安装 Python 3.9+
  • 安装 langchain、langchain-openai 和 faiss-cpu
  • 来自 scavio.dev 的 Scavio API 密钥
  • LLM 的 OpenAI API 密钥

操作指南

步骤 1: 构建搜索接地检索器

创建一个在网络上搜索实时上下文的检索器。与向量存储不同,它始终返回当前信息。

Python
import os, requests
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever
from typing import List

SCAVIO_KEY = os.environ['SCAVIO_API_KEY']

class SearchGroundingRetriever(BaseRetriever):
    api_key: str = ''
    num_results: int = 5

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.api_key = self.api_key or SCAVIO_KEY

    def _get_relevant_documents(self, query: str) -> List[Document]:
        resp = requests.post('https://api.scavio.dev/api/v1/search',
            headers={'x-api-key': self.api_key, 'Content-Type': 'application/json'},
            json={'query': query, 'country_code': 'us', 'num_results': self.num_results})
        resp.raise_for_status()
        return [Document(
            page_content=f"{r['title']}\n{r.get('snippet', '')}",
            metadata={'source': r['link'], 'type': 'search_grounding'}
        ) for r in resp.json().get('organic_results', [])]

grounding = SearchGroundingRetriever(num_results=5)
docs = grounding.invoke('latest LangChain features 2026')
print(f'Grounding returned {len(docs)} documents')
for d in docs:
    print(f'  {d.page_content[:60]}')

步骤 2: 构建具有后备逻辑的混合检索器

将矢量存储检索与搜索基础相结合。如果矢量存储返回低相关性结果(短片段、很少匹配),则会自动补充实时搜索。

Python
from langchain_core.retrievers import BaseRetriever

class HybridGroundedRetriever(BaseRetriever):
    vector_retriever: BaseRetriever = None
    search_retriever: BaseRetriever = None
    min_vector_results: int = 2
    min_content_length: int = 50

    def _get_relevant_documents(self, query: str) -> List[Document]:
        # Try vector store first
        vector_docs = []
        if self.vector_retriever:
            vector_docs = self.vector_retriever.invoke(query)
        # Check if vector results are sufficient
        quality_docs = [d for d in vector_docs
                       if len(d.page_content) >= self.min_content_length]
        if len(quality_docs) >= self.min_vector_results:
            return quality_docs
        # Supplement with live search grounding
        search_docs = self.search_retriever.invoke(query)
        # Merge: vector docs first, then search docs
        seen_content = set(d.page_content[:50] for d in quality_docs)
        for sd in search_docs:
            if sd.page_content[:50] not in seen_content:
                quality_docs.append(sd)
                seen_content.add(sd.page_content[:50])
        return quality_docs

# Setup
hybrid = HybridGroundedRetriever(
    search_retriever=SearchGroundingRetriever(num_results=5),
    min_vector_results=2
)
docs = hybrid.invoke('latest Python release date 2026')
print(f'Hybrid returned {len(docs)} docs')
for d in docs:
    source_type = d.metadata.get('type', 'vector')
    print(f'  [{source_type}] {d.page_content[:50]}')

步骤 3: 接入 LangChain QA 链

将混合检索器连接到 RetrievalQA 链。当向量存储缺乏当前数据时,链会自动获得可靠的答案。

Python
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model='gpt-4o-mini', temperature=0)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type='stuff',
    retriever=hybrid,
    return_source_documents=True,
    chain_type_kwargs={
        'prompt': None  # Uses default prompt
    }
)

def ask(question: str) -> dict:
    result = qa_chain.invoke({'query': question})
    sources = []
    for doc in result.get('source_documents', []):
        source_type = doc.metadata.get('type', 'vector')
        source_url = doc.metadata.get('source', 'local')
        sources.append({'type': source_type, 'url': source_url})
    grounded = any(s['type'] == 'search_grounding' for s in sources)
    return {
        'answer': result['result'],
        'grounded': grounded,
        'sources': sources,
        'cost': 0.005 if grounded else 0
    }

result = ask('What are the newest LangChain features in 2026?')
print(f'Answer: {result["answer"][:200]}')
print(f'Grounded: {result["grounded"]}')
print(f'Cost: ${result["cost"]}')
for s in result['sources'][:3]:
    print(f'  [{s["type"]}] {s["url"]}')

步骤 4: 添加接地决策和成本跟踪

跟踪何时触发接地以及需要花费多少费用。这有助于优化向量存储以减少不必要的搜索调用。

Python
class GroundingTracker:
    def __init__(self):
        self.total_queries = 0
        self.grounded_queries = 0
        self.total_cost = 0
        self.grounding_triggers = []

    def record(self, query: str, grounded: bool, cost: float):
        self.total_queries += 1
        if grounded:
            self.grounded_queries += 1
            self.total_cost += cost
            self.grounding_triggers.append(query)

    def report(self) -> str:
        pct = (self.grounded_queries / self.total_queries * 100) if self.total_queries else 0
        lines = [
            f'Grounding Report',
            f'Total queries: {self.total_queries}',
            f'Grounded: {self.grounded_queries} ({pct:.0f}%)',
            f'Vector-only: {self.total_queries - self.grounded_queries}',
            f'Search cost: ${self.total_cost:.3f}',
            f'',
            f'Recent grounding triggers:'
        ]
        for q in self.grounding_triggers[-5:]:
            lines.append(f'  - {q}')
        return '\n'.join(lines)

tracker = GroundingTracker()
test_queries = [
    'What is a Python decorator?',  # Vector store likely has this
    'Latest Python 3.15 release date',  # Needs grounding
    'LangChain v0.4 breaking changes 2026',  # Needs grounding
]
for q in test_queries:
    result = ask(q)
    tracker.record(q, result['grounded'], result['cost'])

print(tracker.report())

Python 示例

Python
import os, requests
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever
from typing import List

SCAVIO_KEY = os.environ['SCAVIO_API_KEY']

class SearchGroundingRetriever(BaseRetriever):
    api_key: str = ''
    num_results: int = 5
    def __init__(self, **kw):
        super().__init__(**kw)
        self.api_key = self.api_key or SCAVIO_KEY
    def _get_relevant_documents(self, query: str) -> List[Document]:
        resp = requests.post('https://api.scavio.dev/api/v1/search',
            headers={'x-api-key': self.api_key, 'Content-Type': 'application/json'},
            json={'query': query, 'country_code': 'us', 'num_results': self.num_results})
        return [Document(page_content=f"{r['title']}\n{r.get('snippet','')}",
                metadata={'source': r['link']}) for r in resp.json().get('organic_results', [])]

retriever = SearchGroundingRetriever()
docs = retriever.invoke('LangChain RAG grounding 2026')
for d in docs:
    print(f"{d.page_content[:60]}\n  {d.metadata['source']}")

JavaScript 示例

JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;

async function searchGrounding(query, num = 5) {
  const resp = await fetch('https://api.scavio.dev/api/v1/search', {
    method: 'POST',
    headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
    body: JSON.stringify({ query, country_code: 'us', num_results: num })
  });
  return (await resp.json()).organic_results?.map(r => ({
    pageContent: `${r.title}\n${r.snippet || ''}`,
    metadata: { source: r.link, type: 'search_grounding' }
  })) || [];
}

async function hybridRetrieve(query, vectorDocs = []) {
  if (vectorDocs.length >= 2) return vectorDocs;
  const searchDocs = await searchGrounding(query);
  return [...vectorDocs, ...searchDocs];
}

hybridRetrieve('LangChain features 2026').then(docs => {
  docs.forEach(d => console.log(`[${d.metadata.type}] ${d.pageContent.slice(0, 50)}`));
});

预期输出

JSON
Grounding returned 5 documents
  Latest LangChain Features and Updates 2026
  LangChain v0.4 Release Notes

Hybrid returned 5 docs
  [search_grounding] Latest Python 3.15 Released October

Grounding Report
Total queries: 3
Grounded: 2 (67%)
Vector-only: 1
Search cost: $0.010

Recent grounding triggers:
  - Latest Python 3.15 release date
  - LangChain v0.4 breaking changes 2026

相关教程

  • 如何在 LangChain RAG 管道中从 Tavily 切换到 Scavio
  • 如何对搜索 API 进行 RAG 质量基准测试
  • 如何使用langchain-scavio向LangChain添加实时搜索
  • 如何使用 LangChain 和 Scavio 构建 RAG 代理

常见问题

大多数开发者在15到30分钟内完成本教程。您需要一个Scavio API密钥(免费套餐即可)和可用的Python或JavaScript环境。

已安装 Python 3.9+. 安装 langchain、langchain-openai 和 faiss-cpu. 来自 scavio.dev 的 Scavio API 密钥. LLM 的 OpenAI API 密钥. Scavio API密钥注册即送50个免费积分。

可以。免费套餐注册即送50个积分,完全足够完成本教程并构建一个可运行的原型解决方案。

Scavio提供原生LangChain包(langchain-scavio)、MCP服务器以及适用于任何HTTP客户端的REST API。本教程使用 LangChain, 但您可以根据需要适配您选择的框架。

相关资源

Best Of

2026年5月LangChain RAG流水线最佳搜索API

Read more
Best Of

2026 年 RAG 应用程序最佳搜索 API

Read more
Glossary

搜索 API 供应商格局(2026)

Read more
Solution

用搜索支撑提升RAG回答质量

Read more
Glossary

RAG 搜索 Grounding(2026)

Read more
Comparison

Local Search Index vs Search API (Scavio)

Read more

开始构建

利用来自 6 个平台的实时搜索数据为您的 LangChain RAG 管道奠定基础。减少幻觉并通过工作代码获得当前答案。

获取免费API密钥阅读文档
ScavioScavio

面向AI智能体的实时搜索API。搜索所有平台,不仅仅是Google。

产品

  • 功能
  • 定价
  • 控制台
  • 联盟计划

开发者

  • 文档
  • API参考
  • 快速开始
  • MCP集成
  • Python SDK

替代方案

  • Tavily替代方案
  • SerpAPI替代方案
  • Firecrawl替代方案
  • Exa替代方案

工具

  • JSON格式化
  • cURL转代码
  • Token计数器
  • 全部工具

© 2026 Scavio. 保留所有权利。

Featured on TAAFT
服务条款隐私政策