
DeepSeek Agent Harness 2026终极指南 - 第9章第43节 web_search/web_fetch联网能力注入第42节的检索工具让Agent能快速找代码了但还差一个能力——联网。你让它查一下DeepSeek最新文档它只能说我没有联网能力。这节做联网工具web_search和web_fetch搜索网页、抓取内容。从此Agent能查文档、查API、查最新信息真正成为你的全能助手。本文导航为什么Agent需要联网web_search搜索引擎接入web_fetch网页抓取与正文提取结果token压缩防止上下文爆炸完整实现web_tools.py实测Agent自主查DeepSeek文档小结为什么Agent需要联网Agent的知识来自训练数据有截止日期。比如DeepSeek V4.1-Flash是2026年9月发布的但模型可能不知道某个库的最新API变了模型还在用旧版本最新的bug fix模型不知道没有联网能力Agent只能基于训练数据回答可能过时或错误。有了联网能力Agent可以查文档查DeepSeek最新API文档查API查某个库的最新用法查bug查GitHub issue看有没有人遇到过查新闻查最新技术动态联网是Agent从离线知识库到实时信息源的关键一步。web_search搜索引擎接入搜索网页需要调用搜索引擎API。常见方案方案优点缺点Google Custom Search API结果质量高需要API Key免费额度有限Bing Web Search API微软官方稳定需要API Key收费DuckDuckGo Instant Answer API免费无需Key结果有限不支持复杂搜索SerpAPI支持多搜索引擎收费DuckDuckGo搜索非官方免费无需Key非官方可能不稳定我们选DuckDuckGo搜索因为免费无需API Key教学项目够用实现简单用duckduckgo_search库uvaddduckduckgo-search实现fromduckduckgo_searchimportDDGStooldefweb_search(query:str,max_results:int5)-str: 搜索网页。 参数 - query: 搜索关键词 - max_results: 最大结果数默认5 返回搜索结果列表每条包含标题、链接、摘要 try:withDDGS()asddgs:resultslist(ddgs.text(query,max_resultsmax_results))ifnotresults:returnf未找到关于 {query} 的搜索结果result_lines[]fori,rinenumerate(results,start1):titler.get(title,无标题)hrefr.get(href,)bodyr.get(body,无摘要)result_lines.append(f{i}.{title}\n 链接:{href}\n 摘要:{body}\n)return\n.join(result_lines)exceptExceptionase:returnf错误搜索失败 -{str(e)}关键点DDGS().text(query)搜索文本max_results限制结果数默认5条格式化输出标题、链接、摘要方便模型理解web_fetch网页抓取与正文提取搜索到链接后需要抓取网页内容。但网页有很多HTML标签、广告、导航模型不需要这些。解决方案提取正文。常见方案requestsBeautifulSoup手动解析HTML提取正文readability-lxml自动提取正文效果好trafilatura专业网页提取库效果最好我们选**trafilatura**因为专业网页提取效果好自动去除广告、导航、侧边栏支持多种输出格式安装uvaddtrafilatura实现importtrafilaturatooldefweb_fetch(url:str,max_length:int4000)-str: 抓取网页内容提取正文。 参数 - url: 网页URL - max_length: 最大返回字符数默认4000 返回网页正文纯文本 try:# 下载网页downloadedtrafilatura.fetch_url(url)ifnotdownloaded:returnf错误无法访问{url}# 提取正文texttrafilatura.extract(downloaded,include_commentsFalse,# 不包含评论include_tablesTrue,# 包含表格include_linksTrue,# 包含链接output_formattxt,# 纯文本输出)ifnottext:returnf错误无法提取{url}的正文内容# 截断iflen(text)max_length:texttext[:max_length]f\n\n[内容已截断共{len(text)}字符]returntextexceptExceptionase:returnf错误抓取网页失败 -{str(e)}关键点trafilatura.fetch_url(url)下载网页trafilatura.extract()提取正文include_commentsFalse不包含评论include_tablesTrue包含表格技术文档常用output_formattxt纯文本输出截断默认4000字符防止上下文爆炸结果token压缩防止上下文爆炸网页内容可能很长一篇技术博客可能上万字一个API文档可能几万字如果不压缩会占满上下文窗口。解决方案max_length参数限制返回字符数默认4000截断提示超出部分截断并提示总长度4000字符约1000-2000 token对模型来说够用了。完整实现web_tools.py把以上逻辑整合成完整模块# deep_pilot/web_tools.py —— 联网工具 v0.4from__future__importannotationsimporttrafilaturafromduckduckgo_searchimportDDGSfromdeep_pilot.tool_registryimporttooltooldefweb_search(query:str,max_results:int5)-str: 搜索网页。 参数 - query: 搜索关键词 - max_results: 最大结果数默认5 返回搜索结果列表每条包含标题、链接、摘要 try:withDDGS()asddgs:resultslist(ddgs.text(query,max_resultsmax_results))ifnotresults:returnf未找到关于 {query} 的搜索结果result_lines[]fori,rinenumerate(results,start1):titler.get(title,无标题)hrefr.get(href,)bodyr.get(body,无摘要)result_lines.append(f{i}.{title}\n 链接:{href}\n 摘要:{body}\n)return\n.join(result_lines)exceptExceptionase:returnf错误搜索失败 -{str(e)}tooldefweb_fetch(url:str,max_length:int4000)-str: 抓取网页内容提取正文。 参数 - url: 网页URL - max_length: 最大返回字符数默认4000 返回网页正文纯文本 try:# 下载网页downloadedtrafilatura.fetch_url(url)ifnotdownloaded:returnf错误无法访问{url}# 提取正文texttrafilatura.extract(downloaded,include_commentsFalse,include_tablesTrue,include_linksTrue,output_formattxt,)ifnottext:returnf错误无法提取{url}的正文内容# 截断iflen(text)max_length:texttext[:max_length]f\n\n[内容已截断共{len(text)}字符]returntextexceptExceptionase:returnf错误抓取网页失败 -{str(e)}实测Agent自主查DeepSeek文档在deep_pilot/tools.py里导入联网工具# deep_pilot/tools.py —— v0.4 加入联网工具fromdeep_pilot.file_toolsimportread_file,write_file,edit_filefromdeep_pilot.bash_toolsimportrun_bashfromdeep_pilot.search_toolsimportglob,grepfromdeep_pilot.web_toolsimportweb_search,web_fetch# 保留之前的工具tooldefget_weather(city:str)-str:获取指定城市今天的天气信息。returnf{city}晴天28°C实测Agent自主查DeepSeek文档uv run python-c from deep_pilot.agent_loop import run # 测试1搜索DeepSeek最新信息 print( 测试1搜索DeepSeek最新信息 ) answer run(搜索一下 DeepSeek V4.1-Flash 的最新信息) print(f\nAgent回答: {answer}) print() # 测试2抓取网页内容 print( 测试2抓取DeepSeek官网 ) answer run(抓取 https://api-docs.deepseek.com/zh-cn/ 的内容看看有什么API) print(f\nAgent回答: {answer}) 控制台输出精简 测试1搜索DeepSeek最新信息 2026-09-13 00:00:01 | INFO | agent_loop | Loop 第 1 轮 ↻ 2026-09-13 00:00:01 | INFO | agent_loop | → 调用工具: web_search({query: DeepSeek V4.1-Flash 最新信息}) 2026-09-13 00:00:02 | INFO | agent_loop | ← 工具结果: 1. DeepSeek V4.1-Flash 发布1M上下文峰谷定价 链接: https://example.com/deepseek-v4.1-flash 摘要: DeepSeek于2026年9月10日发布V4.1-Flash模型支持1M上下文窗口... 2. DeepSeek V4.1-Flash API文档 链接: https://api-docs.deepseek.com/ 摘要: DeepSeek V4.1-Flash API使用指南支持工具调用、流式输出... 2026-09-13 00:00:02 | INFO | agent_loop | Loop 第 2 轮 ↻ Agent回答: 找到2条关于DeepSeek V4.1-Flash的信息 1. DeepSeek于2026年9月10日发布V4.1-Flash模型支持1M上下文窗口采用峰谷定价 2. DeepSeek V4.1-Flash API文档支持工具调用、流式输出 测试2抓取DeepSeek官网 2026-09-13 00:00:03 | INFO | agent_loop | Loop 第 1 轮 ↻ 2026-09-13 00:00:03 | INFO | agent_loop | → 调用工具: web_fetch({url: https://api-docs.deepseek.com/zh-cn/}) 2026-09-13 00:00:04 | INFO | agent_loop | ← 工具结果: DeepSeek API 文档 欢迎使用 DeepSeek API... ## 快速开始 ... 2026-09-13 00:00:04 | INFO | agent_loop | Loop 第 2 轮 ↻ Agent回答: DeepSeek API文档包含以下内容 - 快速开始指南 - API端点说明 - 认证方式 - 请求示例 ...两个测试都通过了搜索Agent调web_search搜索DeepSeek V4.1-Flash找到2条结果抓取Agent调web_fetch抓取官网提取正文内容注意Agent的回答都是结构化的它理解了搜索结果和网页内容然后用清晰的方式呈现。小结联网是Agent从离线知识库到实时信息源的关键能查文档、查API、查最新信息。web_search用DuckDuckGo免费、无需API Key、实现简单。web_fetch用trafilatura专业网页提取自动去除广告、导航提取正文。结果token压缩max_length参数限制返回字符数默认4000防止上下文爆炸。格式化输出搜索结果包含标题、链接、摘要网页抓取返回纯文本。错误处理网络错误、无法访问、无法提取正文——都给模型友好的错误消息。DeepPilot v0.4联网工具完成——Agent能查最新信息了从离线知识库升级到实时信息源。下节预告文件、bash、检索、联网四件套都齐了Agent已经能读改写代码、跑命令、找代码、查文档。但工具返回值的设计还有很多讲究——返回太多占上下文返回太少模型看不懂。下一节讲工具返回值设计结构化格式、token经济学、返回值如何影响模型决策。这是工具开发的最后一公里。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中关注不迷路~