在 LangChain 里给问答 Agent 加联网搜索,本质是把一个"搜索 API"封装成 Tool,再绑给 Agent 执行循环——Agent 自己决定什么时候搜、搜什么、搜完怎么综合。下面这套能直接落地的方案,从选型到代码到生产避坑。

一、整体架构:三个组件就够了

用户提问 → LLM 推理 → 判断需要实时信息 → 调用搜索 Tool
         → 拿到网页结果 → LLM 综合生成 → 带引用的回答
  • LLM:负责推理和决定是否调用搜索
  • 搜索 Tool:封装某个搜索 API,返回结构化结果(标题/URL/摘要/正文)
  • Agent 执行循环:LangChain 0.2+ 推荐用 create_react_agent(简单场景)或 LangGraph 的 create_react_agent(复杂多步)替代已弃用的 AgentExecutor

💡 Agent 执行搜索的核心价值:LLM 有知识截止日期,问"上周的漏洞"“当前版本号”"实时股价"都会瞎编,搜索 Tool 补齐这块。

二、搜索 API 怎么选(关键决策)

不同 API 优化的点不一样,选错了要么贵一倍要么答案质量差:

API 适用场景 特点
Tavily AI Agent 专用 返回预提取的网页正文,省去二次爬取;每月 1000 次免费
SerpAPI / SearchApi 需要 Google 原生排名结构 返回完整 SERP JSON(排名位置、AI Overview 等)
Serper.dev 只要 Google 结果且要快 p95 < 1.5s,便宜
Perplexity 想要"搜索+生成"一体 自带引用来源,支持 Pro Search 多步推理
SearxNG 自建、隐私、免费 需要自己部署实例
Bocha 博查 中文场景 国产 API,对中文网页覆盖好

经验法则

  • 做 RAG / 知识问答 Agent → Tavily(直接返回提取后的正文,LLM 好消化)
  • 需要知道排名、SERP 特性 → SerpAPI
  • 中文生产环境 → Bocha 或 Tavily + 中文域名限定
  • 想完全免费自建 → SearxNG

三、最小可运行:Tavily + LangChain Agent

这是 2026 年最主流的组合,代码直接能跑:

pip install langchain langchain-openai langchain-tavily
export TAVILY_API_KEY="你的key"
export OPENAI_API_KEY="你的key"
from langchain_tavily import TavilySearch
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain import hub

# 1. 初始化搜索工具
search_tool = TavilySearch(
    max_results=5,
    topic="general",      # general / news / finance
    search_depth="advanced"  # basic 快,advanced 会爬取目标页摘要
)

# 2. 初始化 LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 3. 拉取 ReAct 提示模板
prompt = hub.pull("hwchase17/react")

# 4. 创建 Agent 和执行器
agent = create_react_agent(llm, [search_tool], prompt)
executor = AgentExecutor(
    agent=agent,
    tools=[search_tool],
    verbose=True,           # 打印 Thought/Action/Observation 过程
    handle_parsing_errors=True,
    max_iterations=10       # 防止死循环
)

# 5. 运行
result = executor.invoke({
    "input": "2026 年大模型技术趋势有哪些?"
})
print(result["output"])

TavilySearch 的关键参数:

  • topicgeneral / news / finance,决定搜索域
  • time_rangeday / week / month / year,时效性过滤
  • include_domains / exclude_domains:限定或排除特定站点
  • include_raw_content:是否返回清洗后的完整 HTML

四、中文场景备选:Bocha 博查

如果目标用户主要查中文内容,Bocha 的覆盖更好。封装成一个 @tool 即可挂到任意 Agent:

import os, requests
from langchain.tools import tool
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI

@tool
def bocha_web_search(query: str, count: int = 8) -> str:
    """使用Bocha Web Search API进行联网搜索。
    参数: query 搜索关键词, count 返回结果数量"""
    resp = requests.post(
        "https://api.bochaai.com/v1/web-search",
        headers={"Authorization": f"Bearer {os.getenv('BOCHA_API_KEY')}"},
        json={"query": query, "freshness": "noLimit", "summary": True, "count": count}
    )
    return str(resp.json())

llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com/v1"
)

agent = create_agent(
    model=llm,
    tools=[bocha_web_search],
    system_prompt="你是一个严谨的中文助手。需要联网时请优先调用bocha_web_search工具,并基于搜索结果回答。"
)
result = agent.invoke({"messages": [{"role": "user", "content": "2026年有什么值得关注的新技术?"}]})

📌 Tool 的 docstring 极其重要——LLM 靠它判断什么时候调用这个工具。写得越清楚(“用于查最新信息/时事/当前数据”),误调用越少。

五、如果要更"智能":多工具 + 查询重写

生产级搜索 Agent 的典型流程:

用户查询 → 查询重写 → 判断类型 → 路由到不同搜索源
                              ├─ Tavily(综合/新闻)
                              ├─ SerpAPI(Google 排名)
                              └─ Bocha(中文)
                           ↓
                    多源结果融合 → 质量排序/Rerank → 引用标注 → LLM 生成

多个 Tool 同时挂给 Agent 就行,LLM 自己路由:

tools = [
    TavilySearch(max_results=5, topic="general"),
    TavilySearch(max_results=3, topic="news"),  # 同一个 API 不同 topic
    bocha_web_search,
]
agent = create_react_agent(llm, tools, prompt)

六、生产环境必须做的几件事

这部分直接决定 Agent 能不能扛住真实流量:

1. 缓存搜索结果
相同查询在 24 小时内重复调用很常见,按 SHA256(query + 国家 + 日期) 做 Key,TTL 24h,搜索成本能降 40-70%

from functools import lru_cache

@lru_cache(maxsize=10000)
def cached_search(query: str) -> str:
    return search_tool.invoke(query)

跨进程用 Redis 或 SQLite,别只用内存缓存。

2. 超时和错误处理
搜索 API 网络请求必须设超时(5-15 秒区间),加 try-except 兜底:

search_tool = SearchAPITool(api_key="...", timeout=10.0)

3. Token 预算管理
Agent 每轮推理通常消耗 5K-50K token,加上搜索结果回填,重查询一次能烧 50K token。控制 max_results、用 search_depth="basic"、截断过长的网页正文。

4. 多源交叉验证
防止单一来源的错误信息注入答案,关键事实至少 2 个独立来源印证。

5. 引用标注
让 LLM 在答案里带上 url 格式的引用,用户能溯源,也方便排查幻觉。

七、完整生产骨架

from langchain_tavily import TavilySearch
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain import hub
from functools import lru_cache

# 带缓存的搜索工具
@lru_cache(maxsize=10000)
def cached_tavily(query: str) -> str:
    tool = TavilySearch(max_results=5, search_depth="basic")
    return tool.invoke({"query": query})

class CachedTavilyTool:
    name = "web_search"
    description = "搜索实时信息,用于回答时效性问题和最新事实。输入:搜索关键词"
    def _run(self, query: str) -> str:
        try:
            return cached_tavily(query)
        except Exception as e:
            return f"搜索失败: {e}"

# LLM
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# Agent
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, [CachedTavilyTool()], prompt)
executor = AgentExecutor(
    agent=agent,
    tools=[CachedTavilyTool()],
    verbose=True,
    max_iterations=10,
    handle_parsing_errors=True
)

# 使用
executor.invoke({"input": "今天有什么 AI 领域的重要新闻?"})

选型建议一句话总结:原型阶段用 Tavily 免费额度最快验证;中文生产用 BochaTavily + 中文域名限定;要 Google 原生排名用 SerpAPI;大规模部署一定加 缓存 + 超时 + token 预算,否则账单会让你怀疑人生。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐