12.5 搜索场景与最佳实践

何时使用搜索

判断标准

Agent 需要根据问题类型智能判断是否使用搜索:

明确需要搜索的场景:

  1. 时间敏感

    • “今天天气怎么样?”
    • “现在的比特币价格?”
    • “昨晚的比赛结果?”
  2. 版本相关

    • “React 19 有什么新特性?”
    • “最新版本的 Python 有哪些改进?”
  3. 事实验证

    • “GPT-5 发布了吗?”
    • “iPhone 16 什么时候发布?”
  4. 价格查询

    • “RTX 5090 多少钱?”
    • “特斯拉 Model 3 当前价格?”

不需要搜索的场景:

  1. 编程概念

    • “什么是闭包?”
    • “解释 TypeScript 泛型”
  2. 历史知识

    • “二战是什么时候结束的?”
    • “牛顿发现了什么?”
  3. 本地操作

    • “读取当前目录的文件”
    • “运行测试”

系统提示词引导

在系统提示词中指导 LLM 何时使用搜索:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// src/config.ts

const SEARCH_SYSTEM_PROMPT = `
你是一个有用的 AI 助手,具有联网搜索能力 🔍

## 搜索能力

当用户询问以下类型的问题时,请使用 search 工具:

1. **实时信息** 📰
- 时事新闻、最新动态
- 天气、股票价格等实时数据
- 产品价格、活动状态

2. **最新文档** 📚
- 技术文档、API 参考
- 软件版本更新信息
- 教程和指南

3. **事实查询** 🔍
- 产品发布信息
- 人物/公司动态
- 验证不确定的信息

## 搜索技巧

- 使用简洁明确的搜索关键词
- 对于新闻,添加 topic: "news" 参数
- 对于深度信息,使用 search_depth: "advanced"
- 对于时间范围,添加 days 参数

## 示例

用户: "今天北京天气"
→ 使用 search: {"query": "北京今天天气"}

用户: "React 19 新特性"
→ 使用 search: {"query": "React 19 新特性", "search_depth": "advanced"}

用户: "比特币价格"
→ 使用 search: {"query": "比特币当前价格", "topic": "finance"}
`;

搜索参数调优

search_depth 参数

响应时间 数据量 适用场景
basic ~2-3秒 标题+摘要 快速查询、一般信息
advanced ~5-10秒 包含正文 深度分析、技术细节

使用建议:

1
2
3
4
5
// 快速查询
{ query: "北京天气", searchDepth: "basic" }

// 技术深入分析
{ query: "TypeScript 高级类型", searchDepth: "advanced" }

num_results 参数

适用场景
3 快速浏览、简单问题
5 默认值,平衡选择
10 全面调研、对比分析

使用建议:

1
2
3
4
5
// 简单查询
{ query: "Python 官网", numResults: 3 }

// 全面调研
{ query: "前端框架对比", numResults: 10 }

days 参数

限制搜索结果的时间范围:

1
2
3
4
5
6
7
8
// 最近 3 天的新闻
{ query: "AI 突破", topic: "news", days: 3 }

// 最近一周的产品更新
{ query: "Chrome 更新", days: 7 }

// 一个月内的技术文章
{ query: "WebAssembly 教程", days: 30 }

topic 参数

topic 描述 使用场景
general 通用搜索 默认选项
news 新闻搜索 时事、动态
finance 财经搜索 股票、价格

使用示例:

1
2
3
4
5
// 查询科技新闻
{ query: "AI 最新进展", topic: "news" }

// 查询股票信息
{ query: "特斯拉股价", topic: "finance" }

查询优化技巧

关键词精简

1
2
3
4
5
// ❌ 冗长的查询
"请帮我搜索一下 React 19 版本都有哪些新的特性和改进"

// ✅ 精简的查询
"React 19 新特性"

使用特定术语

1
2
3
4
5
// ❌ 模糊的查询
"怎么让网页更快"

// ✅ 具体的术语
"网站性能优化 best practices"

组合关键词

1
2
3
4
5
6
7
8
// 添加技术限定词
"TypeScript 5.0 装饰器"

// 添加版本限定
"React 19 Server Components"

// 添加用途限定
"Python 数据可视化 库"

排除法

1
2
3
// 使用排除符号(某些搜索引擎支持)
"JavaScript framework -Angular"
// 搜索 JavaScript 框架,排除 Angular

错误处理

常见错误及处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 1. API Key 未配置
if (!tavilyClient.isAvailable()) {
console.warn('搜索服务不可用,使用内置知识回答');
return await answerWithoutSearch(query);
}

// 2. 搜索结果为空
if (result.results.length === 0) {
console.log('未找到搜索结果,尝试调整查询词');
return await retryWithRefinedQuery(query);
}

// 3. API 限流
if (error.message.includes('rate limit')) {
console.log('API 请求次数超限,等待后重试');
return await retryAfterDelay(query, 60000);
}

优雅降级策略

1
2
3
4
5
6
7
8
9
10
11
12
async function searchWithFallback(query: string): Promise<string> {
try {
// 尝试搜索
const result = await searchTool.execute({ query });
return result.output;
} catch (error) {
console.warn(`搜索失败: ${error.message}`);

// 降级到内置知识
return await answerFromKnowledge(query);
}
}

性能优化

批量查询

1
2
3
// 合并多个相关查询
const queries = ["React 18", "React 19", "React 新版本"];
const combinedQuery = "React 版本历史 18 19 新功能";

并发搜索

1
2
3
4
5
// 并发执行多个搜索
const results = await Promise.all([
searchTool.execute({ query: "前端框架性能对比" }),
searchTool.execute({ query: "backend 性能优化" })
]);

缓存预热

1
2
3
4
5
6
7
8
9
10
// 预先缓存常见查询
const commonQueries = [
"React 最新版本",
"TypeScript 新特性",
"JavaScript ES2024"
];

for (const query of commonQueries) {
searchTool.execute({ query });
}

使用示例

示例 1:实时信息查询

1
2
3
4
5
6
7
8
9
10
用户: 今天北京天气怎么样?
Agent: [调用 search 工具]
🔍 搜索结果: "今天北京天气怎么样"

💡 AI 摘要:
根据搜索结果,北京今天天气晴朗,气温 15-25°C,
东南风 3-4 级,空气质量良好。

根据天气预报,北京今天天气晴朗,气温在 15 到 25 度之间,
东南风 3 到 4 级。适合外出活动,建议穿着轻薄外套。

示例 2:技术文档查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
用户: React 19 有什么新特性?
Agent: [调用 search 工具,search_depth: "advanced"]
🔍 搜索结果: "React 19 新特性"

💡 AI 摘要:
React 19 引入了服务器组件的稳定版本、新的 Actions API、
改进的表单处理、use() hook 用于 Context 和 refs...

React 19 主要新特性包括:

1. **服务器组件** - 正式稳定版本
2. **Actions** - 简化表单和异步操作
3. **use() hook** - 替代 useContext 和 useRef
4. **并发渲染改进** - 更好的性能
5. **新组件** - <form>、<input> 等

示例 3:价格查询

1
2
3
4
5
6
7
8
9
10
11
12
13
用户: iPhone 15 Pro Max 当前价格是多少?
Agent: [调用 search 工具,topic: "finance"]
🔍 搜索结果: "iPhone 15 Pro Max 价格"

💡 AI 摘要:
根据搜索结果,iPhone 15 Pro Max 在中国的起售价为 9999 元(256GB)。

根据苹果官网和授权经销商的信息:
- 256GB: 9999 元
- 512GB: 11999 元
- 1TB: 13999 元

价格可能因促销活动和渠道有所不同。

小结与最佳实践总结

搜索最佳实践清单

  • 判断必要性:确认问题需要最新信息
  • 精简查询:使用简洁明确的关键词
  • 选择参数:根据场景选择合适的参数
  • 处理错误:优雅处理 API 失败情况
  • 利用缓存:合理设置 TTL 避免重复请求
  • 控制成本:注意 API 调用次数限制

性能指标

指标 建议值
基础搜索响应时间 ~2-3 秒
深度搜索响应时间 ~5-10 秒
缓存响应时间 < 100ms
缓存命中率 > 50%

第十二章总结

本章详细介绍了联网搜索功能的实现:

12.1 搜索能力的重要性

  • LLM 知识截止问题
  • 实时信息获取场景
  • 搜索与推理的结合

12.2 Tavily API 集成

  • Tavily 服务介绍
  • API 注册和配置
  • SDK 集成方法

12.3 搜索工具实现

  • SearchTool 类设计
  • execute 方法实现
  • LLM 函数调用集成

12.4 结果缓存机制

  • 缓存设计原理
  • TTL 管理
  • 缓存统计和监控

12.5 搜索场景与最佳实践

  • 何时使用搜索
  • 参数调优技巧
  • 查询优化方法
  • 错误处理和性能优化

通过本章的学习,你已经掌握了如何在 AI Agent 中集成联网搜索能力,使 Agent 能够获取实时信息,提供更准确的回答。

下一章: 第十三章:MCP 集成

导航

上一篇: 12.4 结果缓存机制

下一篇: 13.1 MCP 协议概述