LangChain开发Agent联网搜索实现
在 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 的关键参数:
topic:general/news/finance,决定搜索域time_range:day/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 免费额度最快验证;中文生产用 Bocha 或 Tavily + 中文域名限定;要 Google 原生排名用 SerpAPI;大规模部署一定加 缓存 + 超时 + token 预算,否则账单会让你怀疑人生。
更多推荐



所有评论(0)