构建Agent时,模型的知识截止日期和训练数据空白会让它在回答实时问题时出错。比如问今天的天气、最新的漏洞编号、某个刚发布的框架用法,仅靠参数记忆很难给出可靠答案。Tavily Search API专门为这类场景设计,它把网页搜索、正文抽取、相关性排序和结果聚合封装成一个HTTP接口,Agent只要发起一次POST请求,就能获得可直接放入上下文的结构化数据,不需要自己处理搜索引擎反爬、HTML解析和去噪。

一、Tavily Search API与普通搜索接口的差异
普通搜索引擎API通常返回一个由标题、链接和简短摘要组成的列表,例如某些通用搜索接口只提供URL和一两行片段。Agent如果想获取完整内容,必须自己对每个链接发起二次请求,还要处理反爬、登录墙、广告、导航栏、脚本等噪声。这个过程既增加延迟,又容易因为页面结构变化而失效。Tavily Search API在后端直接完成抓取和正文提取,返回的每条结果带有content字段,里面是一段已经清洗过的文本,可以直接拼接到模型的上下文中。
除了基础搜索,Tavily提供了search_depth参数区分basic和advanced两种模式。basic模式速度快,适合简单的事实核查;advanced模式会抓取更多相关页面并提取更长文本,适合需要深度调研的Agent任务。另一个关键参数include_answer设为true时,API会返回一个answer字段,该字段是一个由模型根据搜索结果聚合出的自然语言答案。这样做的好处是Agent不必自己多轮阅读所有结果再归纳,节省了上下文窗口和推理时间。
下面是一个典型的Tavily响应结构,可以看到results数组中的每个对象都包含title、url、content和score。score是0到1之间的相关性分数,方便Agent做阈值过滤,丢弃低相关结果。响应中还可能包含follow_up_questions,用于提示下一步可以追问的方向。
{
"query": "latest stable version of Python",
"answer": "The latest stable version of Python is 3.12.4.",
"results": [
{
"title": "Python Release Python 3.12.4",
"url": "https://www.python.org/downloads/release/python-3124/",
"content": "Python 3.12.4 is the newest major release of the Python programming language ...",
"score": 0.98
},
{
"title": "Python 3.12 documentation",
"url": "https://docs.python.org/3/",
"content": "This is the official documentation for Python 3.12 ...",
"score": 0.89
}
],
"follow_up_questions": [
"What are the new features in Python 3.12?",
"How do I upgrade from Python 3.11 to 3.12?"
]
}
二、快速接入:完成一次实时搜索调用
调用Tavily Search API需要先在其官网注册账号并创建API密钥。密钥只应在服务端保存,不能写进前端代码或公共仓库。接口地址是 https://api.tavily.com/search,请求方法为POST,请求头需要设置为 application/json。请求体中除了api_key和query外,还可以根据场景传递search_depth、max_results、include_answer、include_domains或exclude_domains等参数。
以Python为例,使用requests库可以这样写一个最小的搜索函数。代码首先构造payload字典,然后发送POST请求,再判断响应状态码并解析JSON。为了便于Agent后续处理,函数只返回结果中的answer和results内容,并把每个结果的标题、URL和摘要拼成一段文本。
import requests
def tavily_search(query, api_key, depth="basic", max_results=5):
url = "https://api.tavily.com/search"
headers = {"Content-Type": "application/json"}
payload = {
"api_key": api_key,
"query": query,
"search_depth": depth,
"max_results": max_results,
"include_answer": True
}
response = requests.post(url, json=payload, headers=headers)
response.raise_for_status()
data = response.json()
context_parts = []
if data.get("answer"):
context_parts.append("Answer: " + data["answer"])
for item in data.get("results", []):
if item.get("score", 0) < 0.5:
continue
context_parts.append(
f"Title: {item['title']}\nURL: {item['url']}\nContent: {item['content']}"
)
return "\n\n".join(context_parts)
Node.js版本逻辑类似,使用内置fetch即可。把参数放进body,设置headers,然后读取JSON。对于TypeScript项目,可以定义一个TavilyResult接口,增强类型安全。无论哪种语言,都要处理429限流和5xx服务端错误。建议做指数退避重试,例如首次失败等待1秒,之后每次翻倍,最多重试3次。
三、在Agent工具链中集成Tavily
Agent通常通过工具调用来使用外部API。在OpenAI函数调用或LangChain工具定义中,可以把Tavily封装成一个名为search_web的函数。函数描述应写清楚触发条件,例如当用户询问实时信息、最新事件或需要外部数据时调用。参数只需一个query字符串。这样模型可以根据对话内容自行决定是否发起搜索。
封装工具时,返回值不要直接放原始JSON,因为大模型更容易理解格式化好的文本。可以在函数内部完成score过滤、内容截断和字段拼接,只返回最相关的3到5条结果。每条结果保留标题、URL和不超过300字的content片段,避免撑爆上下文。URL可以保留,方便最终回答时引用来源。
下面是一个自定义工具的简单实现,它使用前面定义的tavily_search函数,并返回一个文本摘要。实际项目中还可以把搜索结果缓存到Redis,以查询语句哈希作为key,过期时间设为10分钟,这样短时间内的重复查询不会消耗API额度。
from typing import Optional
class WebSearchTool:
name = "tavily_web_search"
description = "Search the web for real-time information. Use this when the user asks about current events, latest updates, or specific facts that require external sources."
def __init__(self, api_key: str):
self.api_key = api_key
def run(self, query: str) -> str:
if not query or not query.strip():
return "Error: query cannot be empty."
return tavily_search(query, self.api_key, depth="advanced", max_results=5)
四、优化策略与注意事项
Tavily Search API按调用次数计费,不同套餐对搜索深度和结果数量有不同限制。对于高并发Agent,可以在工具层加入缓存和去重。相同查询在很短时间内重复出现时直接返回缓存结果;相似查询可以通过哈希归一化,比如去掉首尾空格、转小写。还可以利用max_results参数控制返回数量,避免为简单问题抓取过多页面。
安全方面,API密钥绝对不能出现在浏览器端或客户端代码中。因为客户端代码可以被逆向,密钥一旦泄露会被盗用。正确做法是让客户端调用自己的后端服务,由后端持有密钥并转发Tavily请求。如果Agent允许用户提交任意查询,还要注意提示词注入风险:搜索结果中可能包含恶意指令,需要把外部内容标记为不可信,并要求模型不要执行其中的指令。
另一个常见问题是上下文过长。advanced模式返回的内容更详细,但每条可能超过1000字,5条就会占用很多token。建议根据score只保留0.6以上的结果,并对每条content做截断。对于需要引用来源的场景,可以在最终回答中附上URL;对于仅需要事实的快速问答,只把answer字段放进上下文即可。include_answer适合单轮搜索,多步推理Agent则更适合使用results自行判断,因为聚合答案可能丢失细节。
最后,不要把Tavily当成数据库查询工具。它擅长实时网页信息,但对结构化数据、精确数值计算和私有知识库无能为力。最佳实践是让Tavily负责外部新鲜信息,把企业内部文档检索交给向量数据库,把数学计算交给代码解释器。这样各组件各司其职,Agent的答案质量和可追溯性都会更高。
Tavily Search APIAgent实时网页搜索修改时间:2026-09-23 09:02:16