How to Build a Personal AI Web Research Agent with Ollama and Qwen

TL;DR · AI 摘要
本文展示如何使用 Ollama 和 Qwen 构建一个本地运行的 AI 网络研究代理,实现无 API 成本、隐私保护的网页信息检索与总结。
核心要点
- 使用 Ollama 和 Qwen 可构建本地运行的 AI 研究代理,无需 API 成本。
- 代理通过 Ollama 搜索网页并提取内容,再由 Qwen 生成 Markdown 格式的总结。
- 教程适用于 macOS、Windows 和 Linux,支持选择较小的 Qwen 模型以适应低内存设备。
结构提纲
按章节快速跳转。
介绍当前使用 ChatGPT 或 Claude 查询大语言模型时可能遇到的幻觉问题,并提出使用本地 LLM 和工具调用解决此问题。
说明构建本地 AI 研究代理的动机,包括隐私保护、无 API 成本等,并描述系统架构。
指导用户安装 Ollama 并获取 API 密钥,用于后续的网络搜索功能。
介绍如何从 Ollama 拉取 Qwen 模型,并说明其作为本地 LLM 的优势。
展示如何编写代理代码,实现用户查询、网络搜索、内容提取和总结生成的完整流程。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- 构建本地 AI 网络研究代理
- 工具与技术
- Ollama
- Qwen
- Python
- 功能流程
- 网络搜索
- 内容提取
- 本地总结生成
- 优势
- 隐私保护
- 无 API 成本
- 跨平台支持
金句 / Highlights
值得收藏与分享的关键句。
Running a local LLM also means none of these queries leave my machine. My research history stays private, and there are no per-query API costs to worry about.
The extracted content from all five pages is sent to the local Qwen model along with the user's prompt and a system prompt: 'Use these web results and page contents to answer in Markdown format.'
The tutorial works on macOS, Windows, and Linux. I'm using a MacBook Pro with 32 GB of RAM, but you can run this on a lower-memory machine by choosing a smaller Qwen model from Ollama.
如何使用 Ollama 和 Qwen 构建个人 AI 网络研究代理
2026年6月26日
/
#AI
在本教程中,我将向您展示如何使用 Ollama、Qwen 和 Python 构建一个 AI 网络研究代理。该代理会搜索网络上的某个主题,获取相关页面,并使用本地 LLM 生成一个简洁的摘要。
目录
- 背景
- 动机与架构
- 步骤 1:安装 Ollama 并获取 API 密钥
- 步骤 2:拉取 Qwen 模型
- 步骤 3:安装 Python 依赖项
- 步骤 4:代理代码
- 步骤 5:运行代理
- 示例输出
- 结论
背景
我们大多数人已经使用过 ChatGPT 或 Claude 向大型语言模型发送查询。您可能也见过当模型不知道某些信息时,响应中出现的幻觉,有时是因为其知识已经过时。
随着工具调用的兴起,LLM 现在可以使用工具来搜索网络上的最新信息。然后,它们可以将这些信息带入上下文中,并使用它们来生成输出、总结结果以及从检索到的来源中提取关键点。
在本教程中,我将向您展示我是如何构建一个个人研究代理的,该代理可以搜索互联网上的任何主题,并使用本地 LLM 来总结其发现的内容。它完全在我的机器上运行,以保护隐私,并且没有任何 API 成本。因此,它是完全免费的。
要遵循本教程,您需要在自己的机器上安装 Ollama 并拥有一个免费的 Ollama 账户。本教程适用于 macOS、Windows 和 Linux。我使用的是配备 32 GB 内存的 MacBook Pro,但您可以通过从 Ollama 选择一个较小的 Qwen 模型,在内存较少的机器上运行此教程。
动机与架构
本项目的动机是让在我的机器上运行的代理能够处理日常的各种任务。我可以创建代理来生成每日的 AI 新闻摘要、呈现最新的世界事件,或寻找新的职位发布。
运行本地 LLM 还意味着这些查询不会离开我的机器。我的研究历史保持私密,并且无需担心每次查询的 API 成本。
对于本项目,我们将使用 Ollama 网络搜索进行检索,并使用本地 Qwen LLM 进行摘要(而不是依赖像 ChatGPT 或 Claude 这样的托管聊天工具)。下面的系统图示展示了代理是如何工作的。
当在终端中运行时,代理会询问用户想要研究什么。然后,它会调用 Ollama 网络搜索 API 来获取查询的前 5 个结果,下载这些页面,并提取可读文本。
从所有五个页面中提取的内容会与用户的提示和一个系统提示一起发送给本地 Qwen 模型:“使用这些网络结果和页面内容以 Markdown 格式进行回答。” 模型的响应将被保存为磁盘上的 Markdown 文件。
要在本地使用 Qwen3.5:4b,可以通过 Ollama 进行安装。在我的机器上,4b 模型的大小约为 3.4 GB。如果你的机器内存较小,可以改用 qwen3.5:0.8b 模型。
ollama pull qwen3.5:4b第 3 步:安装 Python 依赖项
python3 -m venv venv
source venv/bin/activate
pip install ollama requests beautifulsoup4第 4 步:编写代理代码
以下 Python 代码实现了四个功能:从终端获取研究提示,调用 Ollama 的网络搜索 API 获取前 5 个结果,使用 Requests 下载网页并使用 BeautifulSoup 清理每页的文本,然后将所有内容发送给本地的 Qwen 模型,并指示其以 Markdown 格式进行总结。最后,它将结果保存到一个带有时间戳的 .md 文件中。
将代码保存在你的 research_agent.py 文件中。
总结提示是故意设计得较为基础的,你可以根据需要进行调整以匹配你期望的输出格式。
import os
import json
import requests
import ollama
from bs4 import BeautifulSoup
from datetime import datetime
from pathlib import Path
API_KEY = os.getenv("OLLAMA_API_KEY")
SEARCH_URL = "https://ollama.com/api/web_search"
MODEL = "qwen3.5:4b"
# 使用 Ollama 网络搜索功能进行搜索
def search_web(query):
response = requests.post(
SEARCH_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query, "max_results": 5},
timeout=30,
)
response.raise_for_status()
return response.json().get("results", [])
# 获取完整网页内容
def fetch_text(url):
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
except requests.RequestException as e:
return ""
soup = BeautifulSoup(response.text, "html.parser")
for tag in soup(["script", "style", "nav", "footer"]):
tag.decompose()
return soup.get_text(separator="\n", strip=True)
def main():
user_prompt = input("Enter your prompt: ").strip()
if not user_prompt:
print("Prompt cannot be empty.")
return
results = search_web(user_prompt)
# 对网络搜索结果中的每个 URL 获取完整内容
pages = []
for item in results:
url = item.get("url")
if not url:
continue
print(f"Fetching: {url}")
page_text = fetch_text(url)
pages.append({
"title": item.get("title", ""),
"url": url,
"snippet": item.get("content", ""),
"page_text": page_text,
})
# 将网络数据和用户请求发送给 Qwen 模型的提示
prompt = f"""
用户请求:
{user_prompt}
使用这些网络结果和页面内容以 Markdown 格式进行回答。
数据:
{json.dumps(pages, ensure_ascii=False)}
"""
# 调用本地 Qwen 模型
response = ollama.chat(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
)
digest = response.message.content
# 使用今天的日期和时间构建唯一文件名
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = f"digest-{timestamp}.md"
# 将摘要保存到磁盘
with open(filename, "w") as f:
f.write(digest)
print(f"Saved to digest")
if __name__ == "__main__":
main()第 5 步:运行代理
python research_agent.py脚本将提示你输入想要研究的主题。
示例输出
摘要以时间戳命名的 Markdown 文件形式保存。代理在获取这些链接时,还会打印出源网址。
在信任摘要之前,先快速浏览一下,并对照原始来源验证一两个要点。本地模型比托管的前沿模型小,容易产生幻觉。因此,抽查可以帮助提高准确性。
作为一次测试,我向研究代理提问:“LLMs 有什么新进展”,它获取了以下 5 个网页:
输入你的提示:LLMs 有什么新进展
正在获取:https://openai.com/nl-NL/index/chatgpt-memory-dreaming/
正在获取:https://pub.towardsai.net/tai-210-glm-5-2-closes-most-of-the-open-weight-gap-in-ten-weeks-2f970c5f1326
正在获取:https://www.globenewswire.com/news-release/2026/06/23/3315999/0/en/Multiverse-Computing-Launches-Pulsar-16B-in-collaboration-with-NVIDIA-Frontier-Grade-Reasoning-at-Half-the-Parameters.html
正在获取:https://thenextweb.com/news/anthropic-claude-tag-slack-always-on-ai-teammate
正在获取:https://www.aidoers.io/blog/claude-mythos-5-and-fable-5-explained-what-anthropic-actually-shipped
已保存至摘要对于一个 4B 的本地模型,摘要的结构已经相当合理。它按照来源中的相关信息进行了分节整理。我对摘要进行了抽查,发现内容准确。
以下是生成的内容:
# LLMs 的最新进展(2026 年 6 月)
2026 年 6 月,大型语言模型(LLMs)的格局迅速演变,出现了记忆合成、新的前沿模型、企业集成以及市场动态方面的重大更新。
## 1. 记忆与个性化:OpenAI 的“Dreaming”更新
OpenAI 为 ChatGPT 部署了一种新的记忆架构,称为 **Dreaming V3**。
* **目的:** 改进记忆合成,以优化新鲜度、连贯性和相关性。
* **演进:**
* **2024 年:** “Saved memories”(基于手动指令)。
* **2025 年:** “Dreaming V0”(在聊天历史中整理记忆的后台进程)。
* **2026 年:** **Dreaming V3**(功能显著增强且计算效率更高的架构)。
* **影响:** 现在用户可以通过摘要页面查看记忆,并更新信息,设置需要提及的主题的指令。
* **可用性:** 今天已向美国的 ChatGPT Plus 和 Pro 用户推出,未来几周将扩展到更多国家以及 Free/Go 用户。
* **功能:** 模型现在可以记住特定用户的设置(例如摄影器材偏好)和约束(例如素食饮食、酒店空调偏好),而无需显式的“记住”提示。
## 2. 新的前沿模型与基准
### Claude Fable 5 & Mythos 5(Anthropic)
* **分类:** 属于 Mythos 级别,其原始能力高于 Opus。
* **差异化:** **Fable 5** 向公众开放。**Mythos 5** 是移除了网络安全保护措施的相同模型,仅限于 **Project Glasswing** 合作伙伴使用。
* **定价:** 每百万输入令牌 $10 / 每百万输出令牌 $50。
* **可用性:** 在 Pro、Max、Team 和企业计划中免费提供,直到 6 月 22 日。
* **功能:** 在 **知识工作**、**智能编码**、**视觉**、**法律推理** 和 **生物学** 方面有显著提升。Z.ai GLM-5.2(开源权重)
- 发布: Z.ai(Z.AI)于2026年6月16日以MIT许可证发布了GLM-5.2。
- 性能: 在十周内缩小了开源权重的差距。在人工分析智能指数中得分51。
- 上下文: 从200K扩展到100万tokens。
- 架构: 使用“IndexShare”提高长上下文效率,并使用“Compaction-aware强化学习”用于代理。
- 基准测试: 在AA-Briefcase(91个测试任务)中排名第三,落后于Fable和Opus 4.8,但领先于GPT-5.5。
- 成本: 每任务约\$0.52(相比GPT-5.5的\$0.86和Opus 4.8的\$1.80)。
Multiverse Pulsar 16B(与NVIDIA合作)
- 参数: 总共161.5亿个参数(其中31亿个为活跃参数)。
- 性能: 在参数数量减半的情况下实现了300亿级的智能。
- 验证: 在推理、编码和数学方面与300亿级架构(如Nemotron-3-Nano-30B-A3B)表现相当。
- 部署: 在Hugging Face上提供,采用Apache 2.0许可证。优化用于内存较小的GPU和单节点环境。
3. 企业集成与工具
- Claude Tag(Anthropic):
- 提供给Claude Enterprise和Team客户使用的“始终在线的AI队友”。
- 功能: 内置于Slack中,跟踪对话,学习上下文,并使用环境模式主动标记更新和任务。
- 范围: 基于身份的权限允许管理员限制AI可以访问的频道/团队。
- MCP Connectors(Anthropic):
- 推出了企业管理授权(EMA)。
- 允许IT管理员通过身份提供商(如Okta)为连接器分配访问权限,而无需单独的OAuth流程。
- Perplexity Brain(计算机代理):
- Max/Enterprise Max订阅者的研究预览。
- 自我改进的记忆系统,记住代理*做了什么*而不是用户的偏好。
- 结果显示,在重复任务中答案正确率提高了25%。
4. 行业趋势与人员变动
- 市场动态: ChatGPT的市场份额下降至50%以下(截至2026年5月为46.4%)。Claude在订阅转化率方面领先(13%)。
- 人才流动:
- Noam Shazeer: Transformer的共同发明者(Google)加入OpenAI,担任架构研究负责人。
- John Jumper: 诺贝尔奖得主(DeepMind)加入Anthropic,负责AI用于科学的基础设施。
- 企业并购:
- SpaceX以600亿美元收购Cursor(Anysphere),于2026年第三季度达成交易,以加强其AI编码部门。
- 阿里巴巴发布了Qwen-Robot Suite(Qwen-RobotNav、Manip、World),用于具身智能和机器人控制。
## 结论
在本教程中,你学习了如何构建一个个人AI网络研究代理,该代理可以搜索网络,使用本地LLM总结结果,并保存Markdown摘要。所有这些都可以在你自己的机器上运行,数据不会离开你的笔记本电脑。你可以完全控制模型和提示,而无需任何API成本。
从这里开始,你可以尝试新的提示来研究不同的主题,调整系统提示以更改输出,替换其他本地模型(如Qwen 3.6或Mistral),或者扩展脚本以适应你自己的工作流程。祝你愉快地探索!
如果你喜欢这个教程,你可以在我的博客上找到更多我的文章(最近的帖子包括系统设计论文系列),在我的个人网站上查看我的作品,以及在LinkedIn上获取更新。
https://darshshah.org/
如果这篇文章对你有帮助,请分享它。
免费学习编程。freeCodeCamp 的开源课程已帮助超过 40,000 人成为开发者。立即开始
ADVERTISEMENT