乐于分享
好东西不私藏

通过本地AI访问DeepSeek网页应用,实现本地AI聊天创作工具的信息闭环

通过本地AI访问DeepSeek网页应用,实现本地AI聊天创作工具的信息闭环

本地 AIllama.cppDeepSeek

本地大模型做决策 + 网络搜索获取实时信息 + 本地模型综合分析——既快又准,既私密又全面。

为什么需要"信息闭环"?

最近在做本地 AI 创作 Agent 聊天工具,已经跑通了 llama.cpp + ComfyUI 的本地创作链路。

但有一个核心痛点:本地大模型的知识截止问题

Qwen3.6-27B 的训练数据有截止日期,最新的新闻、技术文档、市场信息,本地模型一概不知。

解决方案:让本地 Agent 能够调用网络搜索能力,获取实时信息,再结合本地知识综合分析。

全程可控,数据流清晰,隐私有保障。

本地 AI 的优势很明显:

  • 隐私
    :数据不出本机
  • 自由
    :无 Token 限制,无 API 调用次数限制
  • 稳定
    :不依赖网络,随时可用

但劣势同样明显:

  • 知识截止
    :模型训练数据有截止日期,最新信息不知道
  • 事实核查
    :遇到不确定的事实,无法实时查证
  • 时效性
    :新闻、股价、天气等动态数据需要实时获取

我的目标是做一个完整的本地 AI Agent,既能发挥本地模型的优势,又能弥补信息盲区。

核心思路:本地大模型做决策 + 网络搜索获取实时信息 + 本地模型综合分析

架构设计

用户提问本地 LLM (llama.cpp + Qwen3.6-27B)↓ 判断是否需要网络信息├─ 不需要 → 直接回答(纯本地知识)└─ 需要 → 调用 DeepSeek 搜索工具网络搜索 / API 调用获取实时信息返回本地 LLM综合分析 + 结合本地知识输出最终答案

关键设计原则:

  1. 本地优先
    :能本地回答的,不调网络
  2. 按需调用
    :只有本地模型判断需要时,才触发网络搜索
  3. 信息融合
    :网络信息返回后,由本地模型综合分析,不是简单拼接
  4. 用户可见
    :整个信息获取过程对用户透明

工具层设计:DeepSeek 搜索工具

核心思路

设计一个 deepseek_ask 工具,作为本地 Agent 的网络信息获取接口

这个工具的职责:

  • 接收本地 LLM 发出的搜索请求(具体问题)
  • 调用网络 API 获取信息
  • 将结果结构化返回给本地 LLM

工具定义

{"name""deepseek_ask","description""Ask DeepSeek research assistant for fact-checking, current events, technical documentation, external data, or any factual information that requires up-to-date internet research.","parameters": {"type""object","properties": {"question": {"type""string","description""The clear, specific question to ask DeepSeek for research"      }    }  },"required": ["question"]}

本地 LLM 的工具调用流程

当用户提问时,本地 LLM 的工作流程:

用户:"今天 A 股大盘怎么样?"本地 LLM 判断:- 这个问题需要实时数据- 本地知识可能过时- 调用 deepseek_ask 工具deepseek_ask(question="2026年6月17日 A股大盘行情")网络返回:今日上证指数、涨跌幅、成交量等数据本地 LLM 综合分析:- 结合网络返回的实时数据- 结合本地存储的历史数据或个人分析- 输出完整回答

实现方案:Playwright 网页浏览器自动化

为什么要用 Playwright?

纯 API 调用有局限性:

  • 不是所有信息都有 API
  • 有些网站需要登录、交互才能获取数据
  • JavaScript 渲染的页面,简单的 HTTP 请求抓不到内容

Playwright 的优势:

  • 真实浏览器
    :可以渲染 JavaScript,处理动态内容
  • 自动化操作
    :点击、滚动、输入、等待,模拟真实用户行为
  • 可见性
    :非 headless 模式下,用户可以看到 Agent 如何操作网页
  • 跨站点
    :可以访问任何网页,不受 API 限制

架构

本地 Agent↓ 调用 playwright_browser 工具Playwright 浏览器(非 headless,用户可见)↓ 自动浏览网页- 打开目标网址- 执行预设操作(搜索、点击、滚动)- 等待页面加载- 提取页面数据结构化数据返回本地 Agent 分析处理

Python 代码示例

from playwright.sync_api import sync_playwrightimport jsondefplaywright_browse(url, actions=None, extract_selector=None):"""    使用 Playwright 非 headless 模式浏览网页,用户可见操作过程    Args:        url: 目标网址        actions: 可选的操作列表,如 [{"type": "click", "selector": "#search-btn"}]        extract_selector: 要提取数据的 CSS 选择器    Returns:        提取的页面数据(文本或结构化数据)    """with sync_playwright() as p:# 非 headless 模式,用户可以看到浏览器操作        browser = p.chromium.launch(headless=False)        page = browser.new_page(viewport={"width"1280"height"800})# 打开网页print(f"正在打开: {url}")        page.goto(url, wait_until="networkidle")# 执行预设操作if actions:for action in actions:if action["type"] == "click":                    page.click(action["selector"])                    page.wait_for_load_state("networkidle")elif action["type"] == "type":                    page.fill(action["selector"], action["text"])elif action["type"] == "wait":                    page.wait_for_timeout(action["milliseconds"])# 提取数据if extract_selector:            data = page.locator(extract_selector).all_text_contents()else:# 默认提取正文内容            data = page.locator("body").inner_text()# 截图保存(可选,用于调试和记录)        screenshot_path = f"browse_{int(time.time())}.png"        page.screenshot(path=screenshot_path)        browser.close()return {"url": url,"content": data,"screenshot": screenshot_path        }# 使用示例:搜索新闻result = playwright_browse(    url="https://www.baidu.com",    actions=[        {"type""type""selector""#kw""text""A股大盘 今日行情"},        {"type""click""selector""#su"},        {"type""wait""milliseconds"3000}    ],    extract_selector="#content_left")print(json.dumps(result, ensure_ascii=False, indent=2))

工具封装

将 Playwright 浏览器操作封装为 Agent 可调用的工具:

{"name""playwright_browser","description""使用 Playwright 非 headless 浏览器自动浏览网页,用户可见操作过程。适合需要 JavaScript 渲染、登录交互的网页数据获取。","parameters": {"type""object","properties": {"url": {"type""string","description""要访问的网页 URL"      },"actions": {"type""array","description""浏览器操作序列(点击、输入、等待等)","items": {"type""object"        }      },"extract_selector": {"type""string","description""要提取数据的 CSS 选择器"      }    },"required": ["url"]  }}

两种网络获取方式的对比

维度
deepseek_ask(API)
playwright_browser(浏览器)
适用场景
事实查询、技术文档、新闻摘要
需要交互的网页、JS 渲染页面、特定网站数据
速度
快(API 直接返回)
较慢(需要浏览器加载)
覆盖范围
通用搜索
任意网页
用户可见
不可见(后台调用)
可见(非 headless 浏览器窗口)
数据质量
结构化摘要
原始页面内容,需后处理
资源消耗
较高(需要浏览器进程)
推荐用法
优先使用,覆盖大部分场景
补充使用,API 不够时启用

推荐策略

用户提问本地 LLM 判断是否需要网络信息优先调用 deepseek_ask(快速、结构化)如果结果不够 → 调用 playwright_browser(精细、灵活)本地 LLM 综合分析所有信息输出最终答案

实际应用场景

场景一:技术文档查询

用户:"React 19 的新特性有哪些?"本地 LLM:Qwen3.6 训练数据可能不包含 React 19 完整信息调用 deepseek_ask("React 19 新特性完整列表")网络返回:React 19 的 Server Components、Actions、use() Hook 等新特性本地 LLM 结合本地前端开发经验,输出结构化回答

场景二:股票行情分析

用户:"今天茅台股价怎么样?"本地 LLM:需要实时数据调用 deepseek_ask("2026年6月17日 贵州茅台 股价 行情")网络返回:当前股价、涨跌幅、成交量本地 LLM 结合本地存储的历史分析数据,输出综合判断

场景三:特定网站数据抓取

用户:"帮我看看 GitHub 上 llama.cpp 最新的 release 版本"本地 LLM:需要访问 GitHub 网页调用 playwright_browser(url="https://github.com/ggerganov/llama.cpp/releases",extract_selector=".release-title")浏览器打开 GitHub,提取最新版本信息本地 LLM 整理输出

信息闭环的价值

1. 本地知识的延伸

本地大模型不再是"信息孤岛"。通过工具调用,可以按需获取网络信息,相当于给本地模型装上了"搜索引擎"。

2. 隐私可控

  • 用户提问先经过本地模型判断
  • 只有需要时才发送问题到网络
  • 返回的信息由本地模型处理,不是直接展示原始数据
  • 敏感信息可以本地过滤

3. 个性化融合

网络信息返回后,本地模型可以结合:

  • 用户的历史偏好
  • 本地存储的个人数据
  • 项目上下文信息

输出的是个性化的答案,不是千篇一律的搜索结果。

4. 可追溯

每一步都有记录:

  • 用户问了什么
  • 本地模型做了什么判断
  • 调用了哪些工具
  • 获取了什么信息
  • 最终输出了什么

深度思考:可见性、隐私边界与免费 AI 搜索的商业价值

用户可见的 AI 思考过程

通过 Playwright 操作浏览器访问 DeepSeek,默认采用非 headless 模式,用户可以看到完整的交互过程:

  • 输入可见
    :用户可以看到 Agent 向 DeepSeek 输入了什么查询信息
  • 思路可见
    :用户能了解到 AI 的思考路径和分析思路
  • 输出可见
    :用户可以看到 DeepSeek 的联网搜索结果和输出内容

这种可见性非常重要。本质上,用户需要看到 DeepSeek 的网页信息并理解其来源,然后系统再返回数据,结合本地数据和 DeepSeek 返回的信息一起进行本地处理。整个过程透明可信,用户知道信息从哪来、经过怎样的处理。

隐私边界:什么出本地,什么不出本地

在这个架构中,隐私边界非常清晰:

出本地的信息

  • 只有必须联网的请求信息才会离开本地环境
  • 这些请求是经过本地 LLM 判断后认为需要实时数据的问题
  • 请求内容通常是公开的事实性问题(新闻、股价、技术文档等)

不出本地的信息

  • 用户的个人信息、历史偏好、本地数据
  • 项目的私有代码和文档
  • 用户的私人对话和敏感信息
  • 本地 LLM 的综合分析过程和最终决策

这种设计确保了核心隐私数据永远留在本地,只有必要的查询请求才会发送到网络。

DeepSeek 的视角:信息链路的掌控

从 DeepSeek 的角度来看,这个架构中它扮演的角色是信息检索推理引擎

  • 用户请求 → DeepSeek 回答,整个链接和信息来源由 DeepSeek 掌控
  • DeepSeek 提供的是广泛的信息搜索能力,连接世界的知识推理网络
  • 它不接触用户的本地数据和隐私信息,只提供公开信息的检索推理服务

这种分工很清晰:DeepSeek 负责"连接世界",本地 AI 负责"理解个人"。

免费 AI 搜索的巨大商业价值

虽然目前这种免费搜索 AI 的直接盈利模式不佳,但其间接商业价值正在巨大地体现出来。我已经亲身感受到了 DeepSeek 这种免费 AI 搜索带来的巨大商业价值——它能直接影响我的信息商业决策

为什么这么说?

  1. 信息决策价值
    :免费 AI 搜索提供的信息,会影响用户的工作决策、投资决策、学习方向等。这些决策背后蕴含着巨大的商业价值。
  2. 信息入口价值
    :谁掌握了信息搜索入口,谁就掌握了影响用户决策的能力。即使搜索本身免费,但通过影响决策产生的商业价值是巨大的。
  3. 数据反馈价值
    :用户的搜索行为本身就是一种高价值数据,反映了市场需求、热点趋势、用户意图等。

为什么免费 AI 搜索模式会一直持续?

我认为,各种免费信息 AI 问问题的模式将一直免费下去,原因如下:

对 DeepSeek 等 AI 搜索推理平台而言

  • 免费搜索推理是获取用户、建立信息入口的最佳方式
  • 通过免费搜索推理积累的用户规模和搜索数据,本身就是巨大的商业资产
  • 一旦收费,用户会流向其他免费替代品,信息入口地位将丧失

对豆包等日常 AI 助手而言

  • 豆包也不可能把日常问题收费
  • 因为一旦收费,会将自己重要的"普通问题信息决策能力"拱手让人
  • 日常问题的搜索和行为数据,是构建商业闭环的重要基础
  • 失去这些数据,就等于失去了理解用户需求和市场趋势的能力

核心逻辑:免费 AI 搜索的本质不是靠搜索本身赚钱,而是通过搜索获取影响商业决策的信息能力和用户行为数据。这种能力一旦丧失,损失远大于收费带来的收入。

我的软件定位:本地 AI + 免费网络 API 的双引擎

基于以上分析,我对自己的软件定位更加清晰:

免费网络 API 的可持续性

  • 我这种"本地总结网络信息,并结合自身数据再次做出决策"的软件,所依赖的免费网络 API 将一直能够使用
  • 因为 AI 搜索平台需要保持免费来维持其信息入口地位
  • 只要它们免费,我的软件就能持续利用这种能力

双重价值模型

维度
DeepSeek 类远程 API
本地 AI(我的软件)
核心价值
连接世界广泛信息的智能搜索能力
结合个人数据的个性化隐私 AI 服务
商业价值
提供联系世界广泛信息的智能商业价值
为用户提供个性化、隐私保护的 AI 信息服务
信息范围
全球公开信息、实时数据、事实核查
个人数据、本地文件、私有项目、历史偏好
隐私保护
不接触用户隐私数据
核心数据不出本地
互补关系
提供"广度"——连接世界
提供"深度"——理解个人

两种模式都有不可替代的价值

  • DeepSeek 这类信息搜索远程 API,能够提供联系世界广泛信息的智能商业价值。没有它,本地 AI 就是信息孤岛。
  • 而我这种本地 AI,结合自己的数据,能最终为用户提供个性化、隐私保护的 AI 信息服务。没有它,用户只能得到千篇一律的通用搜索结果。

两者的结合,才是真正的"智能闭环"——既有全球信息的广度,又有个人数据的深度。

当前局限

1. 网络依赖

虽然核心在本地,但信息获取环节仍然需要网络连接。断网时退化为纯本地模式。

2. 信息时效性

deepseek_ask 的搜索结果有延迟,不是真正的"实时"。对于秒级时效要求的场景(如高频交易),需要更直接的 API。

3. Playwright 资源消耗

非 headless 模式下,每个浏览器实例占用较多内存。批量任务需要考虑资源管理。

4. 网页结构变化

基于 CSS 选择器的数据提取,依赖网页结构。网站改版后需要更新选择器。

下一步方向

1. 智能路由

让本地 LLM 更精准地判断何时调用网络工具,减少不必要的 API 调用:

简单事实 → 本地回答最新新闻 → deepseek_ask特定网站 → playwright_browser综合分析 → deepseek_ask + 本地知识

2. 缓存机制

对频繁查询的信息建立本地缓存,减少重复网络请求:

# 伪代码cache = {}defget_info(question, ttl=3600):if question in cache and not cache[question].expired(ttl):return cache[question].data    result = deepseek_ask(question)    cache[question] = {"data": result, "time": time.time()}return result

3. 多源信息融合

同时调用多个信息源,交叉验证:

deepseek_ask → 搜索结果 Aplaywright_browser → 网页数据 B本地知识库 → 历史数据 C本地 LLM 综合 A + B + C → 最终答案

4. Agent 编排层

用更高级的 Agent 框架(如 LangChain、AutoGen)来编排整个流程,实现:

  • 自动重试
  • 错误处理
  • 多轮对话上下文管理
  • 工具调用链

写在最后

本地 AI + 网络搜索的组合,不是"二选一",而是互补

本地模型负责决策、分析、个性化输出。

网络搜索负责实时信息、事实核查、数据获取。

两者结合,才能真正做到既快又准,既私密又全面

这条信息闭环链路跑通后,本地 AI Agent 的能力边界将大幅扩展。

下一个目标:把这条链路集成到创作 Agent 中,实现"一句话创作"的完整闭环——从灵感获取,到内容生成,到配图配音视频,全部自动化。

本地 AI 负责"理解个人",网络搜索负责"连接世界"。两者的结合,才是真正的智能闭环。

参考资料

核心项目

  • llama.cpp — 本地大模型推理引擎(C/C++,支持 GGUF 量化模型)
  • Playwright — 浏览器自动化框架(支持 Chromium/Firefox/WebKit)
  • DeepSeek — 深度求索大模型(用于网络信息检索)
  • LangChain — Agent 编排框架
  • AutoGen — 多 Agent 对话框架

相关资源

  • Playwright Python 文档 — 浏览器自动化 API 参考
  • llama.cpp Tool Calling — 工具调用指南
  • LangChain Tools — Agent 工具开发指南