大模型开发 - 手写Manus之Tavily搜索工具:04 让AI Agent接入互联网
本文介绍了如何为Java实现的AI Agent集成Tavily搜索引擎,使其具备互联网实时信息检索能力。通过langchain4j的Tavily封装,开发者只需添加依赖并实现搜索工具类,即可为Agent添加网页搜索功能。文章详细展示了TavilySearchTool的实现过程,包括参数定义、搜索执行和结果格式化,并演示了从搜索到信息提取再到文件存储的完整流程。Tavily相比传统搜索引擎API更适
文章目录
Pre
大模型开发 - 用纯Java手写一个多功能AI Agent:01 从零实现类Manus智能体
大模型开发 - 手写Manus之基础架构:02 用纯Java从零搭建AI Agent骨架
大模型开发 - 手写Manus之Sandbox执行代码:03 用Docker为AI Agent打造安全沙箱
引言
前两篇文章中,我们的Agent已经具备了文件读写和Docker沙箱代码执行能力。但它仍然是一个"闭环"系统——无法获取互联网上的实时信息。
当用户问"阿里巴巴最新股价是多少"时,大模型的训练数据有截止日期,无法回答实时问题。我们需要给Agent一双"眼睛",让它能够搜索互联网获取最新信息。
本文将集成Tavily搜索引擎,为Agent添加网页搜索能力。Tavily是一个专为AI Agent设计的搜索API,返回结构化的搜索结果,非常适合程序化处理。
一、新增依赖
通过langchain4j提供的Tavily封装,几行代码即可集成:
<!-- Tavily搜索引擎 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-web-search-engine-tavily</artifactId>
<version>0.36.2</version>
</dependency>
二、TavilySearchTool实现
2.1 工具定义
public class TavilySearchTool extends BaseTool {
private final WebSearchEngine searchEngine;
public TavilySearchTool() {
super("tavily_search", "Search the web for information using Tavily search engine");
// 从环境变量获取API Key
String apiKey = System.getenv("TAVILY_API_KEY");
if (apiKey == null || apiKey.trim().isEmpty()) {
throw new IllegalStateException("TAVILY_API_KEY environment variable is required");
}
this.searchEngine = TavilyWebSearchEngine.builder()
.apiKey(apiKey)
.build();
}
@Override
public Map<String, Object> getParametersSchema() {
Map<String, Map<String, Object>> properties = new HashMap<>();
properties.put("query", stringParam("The search query to execute"));
properties.put("max_results",
intParam("Maximum number of search results to return (default: 5, max: 20)"));
return buildSchema(properties, List.of("query"));
}
}
参数设计只需两个字段:
query(必填):搜索关键词max_results(可选):返回结果数量上限
2.2 执行搜索并格式化结果
@Override
public ToolResult execute(Map<String, Object> parameters) {
try {
String query = getString(parameters, "query");
if (query == null || query.trim().isEmpty()) {
return ToolResult.error("Query parameter is required");
}
// 执行搜索
WebSearchResults results = searchEngine.search(query);
// 格式化结果
Map<String, Object> response = new HashMap<>();
response.put("query", query);
response.put("total_results", results.results().size());
List<Map<String, Object>> searchResults = results.results().stream()
.map(result -> {
Map<String, Object> item = new HashMap<>();
item.put("title", result.title());
item.put("url", result.url());
item.put("snippet", result.snippet());
return item;
})
.toList();
response.put("results", searchResults);
return ToolResult.success(response);
} catch (Exception e) {
return ToolResult.error("Search failed: " + e.getMessage());
}
}
每条搜索结果包含三个字段:
title:网页标题url:网页链接snippet:内容摘要
这些结构化数据会被传回大模型,大模型可以从中提取关键信息回答用户问题。
三、注册到Agent
在ManusAgent中一行代码完成注册:
toolCollection.addTool(new TavilySearchTool());
四、执行流程示例
用户输入:“搜索阿里巴巴最新股价,并写入到文件中”
Step 1: LLM推理 → 调用tavily_search工具
query: "阿里巴巴最新股价 2025"
→ 返回搜索结果:
[{title: "阿里巴巴(BABA)股票价格...", url: "...", snippet: "..."},
{title: "阿里巴巴集团今日股价...", url: "...", snippet: "..."}]
Step 2: LLM推理 → 从搜索结果中提取信息,调用write_file工具
file_path: "workspace/alibaba_stock_price.txt"
content: "阿里巴巴(BABA)最新股价: ..."
→ 文件写入成功
Step 3: LLM推理 → finish_reason="stop"
→ 任务完成
五、设计思考
5.1 为什么选Tavily而不是Google/Bing API?
Tavily专为AI Agent场景设计,有几个优势:
- 返回结构化数据:直接提供title/url/snippet,无需解析HTML
- 内容摘要质量高:snippet包含与查询最相关的内容片段
- API简洁:一个方法调用即可,不需要复杂的配置
5.2 搜索结果如何流入Agent决策链?
搜索结果 → ToolResult → toolMessage → Memory → 下一轮LLM输入
搜索结果被封装为toolMessage存入Memory后,大模型在下一轮推理时可以看到完整的搜索结果,并据此做出决策——比如提取关键信息、综合多个来源、或者发起更精确的二次搜索。
5.3 环境变量管理
项目使用环境变量管理API Key,避免硬编码:
export DASHSCOPE_API_KEY=your_dashscope_key
export TAVILY_API_KEY=your_tavily_key
总结
通过集成Tavily搜索引擎,Agent获得了访问互联网实时信息的能力。这是从"封闭系统"到"开放系统"的关键一步。
现在Agent的工具箱中有三个工具:
- write_file / read_file — 文件操作
- sandbox — 代码执行
- tavily_search — 网页搜索
Agent可以搜索信息、编写代码处理数据、将结果保存到文件——工具之间的组合使用让Agent的能力远超单个工具的简单叠加。

更多推荐



所有评论(0)