写在前面

在日常开发中,我们经常需要接入实时的新闻搜索能力——无论是做一个信息聚合 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 的做法

  1. 结构化输出:搜索 API 返回的每条结果包含 titlesnippet(摘要)、sourcepublish_time 等结构化字段,无 HTML、无样式、无无关元素
  2. 分级摘要:根据权限返回不同长度的纯文本摘要(100-400 字符),Agent 可以先基于摘要判断是否需要获取全文,避免无效 Token 消耗
  3. 按需全文:支持 detail=true 参数按需获取正文内容,而不是每次搜索都返回全文
  4. 内容质量过滤:搜索结果会过滤掉内容过短(≤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

返回的热点列表不是人工标注的,而是算法聚合的结果。核心流程:

  1. 碰撞检测:相同 content_fingerprint 但标题相似度 > 0.6 的文章被归为一组
  2. 跨域合并:基于标题 SimHash 海明距离 < 3 的组进一步合并
  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

  1. 访问网站注册账号
  2. 在「API Key」页面创建 Key
  3. Key 格式为 sk_ninso_<64位hex>
  4. 复制 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

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐