NinChat:构建 AI 时代的实时新闻搜索基础设施
写在前面
在日常开发中,我们经常需要接入实时的新闻搜索能力——无论是做一个信息聚合 Bot,还是给 AI Agent 注入实时信息,又或者是搭建一个垂直领域的新闻看板。市面上的新闻 API 要么贵(NewsAPI $449/月起步),要么慢,要么数据太泛(只有标题没有正文)。
NinChat 就是为解决这些痛点而生的——一个开源的、自部署的实时新闻搜索基础设施,覆盖主流媒体源,支持全文搜索、热点新闻聚合、热搜词统计,以及面向 AI Agent 的标准 API 接口。
本文将从技术视角展开:解决哪些痛点、提供什么能力、如何使用。
一、解决哪些痛点
痛点 1:AI Agent 缺乏实时信息检索能力
当前大多数 AI Agent 的知识截止于训练数据,无法获取今天的新闻。传统的解决方案是让 Agent 直接调用搜索引擎 API(Google Custom Search、Bing API),但这些 API 返回的是网页链接,不是结构化内容。Agent 拿到一个 URL 后还得再提取正文,链路长且不稳定。
NinChat 的做法:提供一个 POST /api/search 端点,Agent 传入 query,直接返回标题 + 摘要 + 来源 + 发布时间 + 全文内容(权限允许时)。一次调用搞定,无需二次处理。
痛点 2:热点发现依赖人工编辑
传统的新闻聚合依赖编辑筛选,覆盖面有限且有时延。我们希望能基于"同一新闻在多少家媒体被报道"来判断热度,这个标准比人工编辑更客观、更及时。
NinChat 的做法:基于 SimHash + 标题 TF-IDF + 内容指纹的多层聚类算法,自动发现多源报道的同一新闻事件。一篇被 20 家媒体同时报道的新闻,必然比只有 1 家报道的新闻更"热"。
痛点 3:内容冗余,Token 损耗严重
通用搜索引擎返回的网页片段包含大量无效内容——导航栏、广告、相关推荐、页脚信息混杂在正文中。即使用 readability 算法清洗后,仍存在大量冗余段落。AI Agent 在做搜索增强生成时,这些冗余内容会被一起送入 LLM,导致 Token 大量浪费,长期运行成本极高。
NinChat 的做法:
- 结构化输出:搜索 API 返回的每条结果包含
title、snippet(摘要)、source、publish_time等结构化字段,无 HTML、无样式、无无关元素 - 分级摘要:根据权限返回不同长度的纯文本摘要(100-400 字符),Agent 可以先基于摘要判断是否需要获取全文,避免无效 Token 消耗
- 按需全文:支持
detail=true参数按需获取正文内容,而不是每次搜索都返回全文 - 内容质量过滤:搜索结果会过滤掉内容过短(≤50 字)、纯图片页面、JS 空壳页面等低质量内容,确保送入 LLM 的都是有效信息
相比通用搜索引擎 API 返回的原始网页片段,NinChat 的结构化输出在相同信息量下可节省 60-80% 的 Token 消耗。
二、提供哪些能力
2.1 全文搜索 — 三种匹配模式
POST /api/search
{
"query": "新能源汽车",
"match_mode": "all", // exact | all | fuzzy
"limit": 20,
"api_key": "sk_ninso_..."
}
| 模式 | 行为 | 适用场景 |
|---|---|---|
exact |
精确短语匹配,空格分词 | “人工智能 医疗” → 必须同时包含两个词 |
all |
所有词必须命中(AND) | 精准搜索,结果少但准确 |
fuzzy |
模糊匹配(OR),容错 1-2 字符 | 探索式搜索,结果多但可能相关 |
meilishard 的默认中文分词已经处理了大部分场景。对于更精确的需求,exact 模式会在后端用引号包裹查询词,强制 meilishard 做短语级匹配。
2.2 热点新闻 — 算法聚合而非人工筛选
GET /api/hot-news?limit=20&days=3
返回的热点列表不是人工标注的,而是算法聚合的结果。核心流程:
- 碰撞检测:相同
content_fingerprint但标题相似度 > 0.6 的文章被归为一组 - 跨域合并:基于标题 SimHash 海明距离 < 3 的组进一步合并
- 热度排序:按
source_count(覆盖媒体数)降序排列
一条被央视、新华网、澎湃、界面等 20 家媒体同时报道的新闻,自然排在前面。
2.3 热搜词统计
GET /api/hot-search?limit=20&time_range=today
基于用户搜索行为的热搜词统计。支持 today / week / month / all 四种时间窗口。统计结果包括搜索次数和排名变化趋势。
此接口不记录用户身份,仅统计搜索词频次。
2.4 Web 搜索首页 — 零门槛体验
https://ninchat.cpolar.top/
不需要登录、不需要 API Key,直接在浏览器中访问。提供:
- 🔍 大搜索框 + Logo 展示
- 🔥 前 10 条热点新闻(来源数 + 标题)
2.5 AI Agent 集成 — 标准 REST API
项目为两种主流 AI Agent 框架提供了 Skill 文件:
- OpenClaw:通过
NINCHAT_BASE_URL环境变量配置,支持 CLI / Telegram / Discord / Slack 等多平台 - Hermes Agent:通过
execute_code工具调用 Python 代码,支持 Dashboard UI 配置
Agent 调用搜索的标准流程:
import requests
def search(query, api_key, detail=False):
payload = {
"query": query,
"limit": 10,
"match_mode": "fuzzy",
"detail": detail,
"api_key": api_key
}
r = requests.post(
"https://ninchat-api.cpolar.top/api/search",
json=payload, timeout=30
)
data = r.json()
return data["results"]
Agent 拿到结果后可以直接用 LLM 进行二次处理,典型的"搜索增强生成"模式。
三、如何使用
3.1 浏览器体验(零门槛)
打开 https://ninchat.cpolar.top/,直接用。
不需要注册,不需要 API Key。首页展示实时热点新闻,搜索框输入关键词即可搜索。搜索结果包含标题、摘要、来源和时间。
3.2 获取 API Key
- 访问网站注册账号
- 在「API Key」页面创建 Key
- Key 格式为
sk_ninso_<64位hex> - 复制 Key 即可使用
3.3 基础搜索(匿名 / API Key)
curl -X POST https://ninchat-api.cpolar.top/api/search \
-H "Content-Type: application/json" \
-d '{
"query": "人工智能 医疗",
"match_mode": "all",
"limit": 10,
"api_key": "sk_ninso_你的API_KEY"
}'
返回示例:
{
"status": "ok",
"total": 86,
"search_level": "basic",
"search_time": "0.156s",
"results": [
{
"title": "AI辅助诊断系统在三甲医院落地",
"url": "https://example.com/article/123",
"snippet": "近日,多家三甲医院宣布引入AI辅助诊断系统...",
"source": "新华网",
"publish_time": "2026-07-03"
}
]
}
3.4 群组用户 — 深度搜索
群组用户(tags 含 group:xxx)可以获取全文内容:
curl -X POST https://ninchat-api.cpolar.top/api/search \
-H "Content-Type: application/json" \
-d '{
"query": "车船税 政策 调整",
"match_mode": "all",
"detail": true,
"limit": 5,
"api_key": "sk_ninso_群组KEY"
}'
detail: true 返回的每篇结果包含完整正文(最多 10000 字符),适合 AI Agent 做深度分析和摘要生成。
3.5 获取热点 / 热搜
# 热点新闻
curl "https://ninchat-api.cpolar.top/api/hot-news?limit=20&days=3"
# 热搜词
curl "https://ninchat-api.cpolar.top/api/hot-search?limit=20&time_range=today"
3.6 在 Python 项目中集成
import requests
class NinChatClient:
def __init__(self, api_key, base_url="https://ninchat-api.cpolar.top"):
self.api_key = api_key
self.base_url = base_url
def search(self, query, match_mode="fuzzy", limit=20):
r = requests.post(
f"{self.base_url}/api/search",
json={
"query": query,
"match_mode": match_mode,
"limit": limit,
"api_key": self.api_key,
},
timeout=30,
)
r.raise_for_status()
return r.json()["results"]
def hot_news(self, limit=20, days=3):
r = requests.get(
f"{self.base_url}/api/hot-news",
params={"limit": limit, "days": days},
timeout=15,
)
r.raise_for_status()
return r.json()["news"]
def hot_search(self, limit=20, time_range="today"):
r = requests.get(
f"{self.base_url}/api/hot-search",
params={"limit": limit, "time_range": time_range},
timeout=15,
)
r.raise_for_status()
return r.json()["terms"]
client = NinChatClient("sk_ninso_你的KEY")
# 精确搜索
results = client.search("新能源汽车 充电桩", "all")
# 热点新闻
news = client.hot_news(20)
# 热搜词
trending = client.hot_search(10, "today")
四、未来规划
| 方向 | 计划 |
|---|---|
| 多语言支持 | 目前以中文为主,未来计划扩展英文源站 |
| RSS/Webhook 推送 | 关注特定关键词后,有新内容自动推送 |
| 语义搜索 | 嵌入模型增强搜索召回,不仅限于关键词匹配 |
结语
NinChat 的核心理念是 “搜索即服务”——把新闻搜索抽象成一个标准的 REST API,让任何应用、任何 Agent 都能以最低的接入成本获取实时信息检索能力。
项目完全开源,欢迎 Star、Issue、PR。
GitHub: https://github.com/nineinfra/ninchat-skills
在线体验: https://ninchat.cpolar.top
更多推荐
所有评论(0)