AstrBot:集成多平台与大模型的智能体IM聊天机器人基础设施

原名: AstrBotDevs /

  AstrBot

基本信息


DeepWiki 速览(节选)

Introduction to AstrBot

Relevant source files

Purpose and Scope

This document provides a comprehensive introduction to AstrBot, an open-source multi-platform chatbot framework with agentic capabilities. It covers the system’s purpose, core features, high-level architecture, deployment options, and supported integrations.

For detailed information about specific subsystems, see:

What is AstrBot

AstrBot is an open-source multi-platform chatbot framework with AI agent capabilities, enabling deployment across 15+ instant messaging platforms including QQ, Telegram, Discord, WeChat, Slack, and more. The system provides a unified architecture for building conversational AI applications with agentic tool-calling, knowledge base integration, and multi-agent orchestration.

Architecture Characteristics:

  • Language : Python 3.12+ with async/await event loop (asyncio)
  • Web Framework : Quart (ASGI) for dashboard API, Vue 3 for frontend
  • Database : SQLite (data_v4.db) with aiosqlite for async operations
  • Plugin System : Dynamic loading with 1000+ marketplace plugins
  • Deployment : Container (Docker), package manager (uv), desktop app (Tauri), or cloud platforms

Primary Use Cases:

  • Personal AI companions with persona-based responses and emotional support
  • Multi-platform customer service with unified message handling
  • Agentic automation with Python/shell execution, web search, and file processing
  • Knowledge base Q&A with RAG (FAISS + BM25 hybrid retrieval)
  • Multi-agent orchestration with subagent handoff via transfer_to_* tools

Version : 4.19.2 (defined in astrbot/core/config/default.py8)

Sources: README.md39 pyproject.toml1-7 astrbot/core/config/default.py8

Core Capabilities

Multi-Platform Integration

AstrBot supports 15+ messaging platforms through a unified adapter architecture:

Platform CategoryPlatformsConnection Modes
Chinese IMQQ Official, OneBot v11, WeChat Work, WeChat Official Account/Customer Service, Lark (Feishu), DingTalkWebhook, WebSocket, Stream
International IMTelegram, Discord, Slack, Satori, Misskey, LINEWebhook, WebSocket, Polling
Coming SoonWhatsAppTBD
CommunityMatrix, KOOK, VoceChatPlugin-based

The platform abstraction layer at astrbot/core/platform/ converts platform-specific message formats into a unified AstrMessageEvent structure containing MessageChain components (Plain, Image, Record, File, At, Reply, Node). Each platform implements:

  • Platform subclass: Handles connection lifecycle and convert_message() method
  • AstrMessageEvent subclass: Handles send_by_session() for outgoing messages

The platform_cls_map registry at astrbot/core/platform/sources.py maintains all registered platform adapters.

Sources: README.md149-176 README_en.md161-183

AI Model Provider Support

AstrBot integrates with 20+ AI model services:

Provider TypeServicesCapabilities
Chat LLMOpenAI, Anthropic, Gemini, Moonshot, Zhipu AI, DeepSeek, Ollama, LM Studio, ModelScopeText generation, tool calling, streaming
OpenAI-CompatibleAIHubMix, CompShare (优云智算), 302.AI, TokenPony (小马算力), SiliconFlow (硅基流动), PPIO Cloud, OneAPIAPI-compatible inference
LLMOps PlatformsDify, Alibaba Cloud Bailian (阿里云百炼), Coze, DashscopePre-built agent workflows
Speech-to-TextOpenAI Whisper, SenseVoiceAudio transcription
Text-to-SpeechOpenAI TTS, Gemini TTS, GPT-Sovits-Inference, GPT-Sovits, FishAudio, Edge TTS, Alibaba Bailian TTS, Azure TTS, Minimax TTS, Volcano Engine TTSVoice synthesis
EmbeddingOpenAI, Gemini, Local modelsVector generation for RAG
RerankingVarious providersResult relevance scoring

Provider instances are configured in the provider section of the configuration, with API credentials stored separately in provider_sources. The ProviderManager at astrbot/core/provider/manager.py handles initialization, connection pooling, and request routing. Provider selection can be controlled via provider_settings.default_provider or dynamically routed using UMOP rules.

Sources: README.md177-221 README_en.md186-227

Agentic Features

Agentic Execution Architecture

Key Features:

  1. Agent Sandbox : Isolated execution environment for Pyt

[…truncated…]


导语

AstrBot 是一个基于 Python 的智能体聊天机器人基础设施,旨在为开发者提供构建 AI 聊天机器人的底层支持。该项目集成了众多主流 IM 平台、大语言模型以及丰富的插件生态,能够作为 OpenClaw 等方案的替代选择,适合需要快速搭建多平台 AI 助手的开发者。本文将介绍其核心架构、平台集成能力以及如何通过插件系统扩展功能,帮助开发者评估是否适用于自己的项目场景。


摘要

根据提供的 GitHub 仓库信息及 DeepWiki 节选,以下是关于 AstrBot 的简洁总结:

项目概况

  • 名称:AstrBot
  • 开发者:AstrBotDevs
  • 编程语言:Python
  • 热度:目前拥有超过 20,000 个 Star(今日 +337),社区活跃度较高。

核心定义

AstrBot 是一个开源的、基于代理的多平台聊天机器人基础设施。它被定位为 OpenClaw 的替代方案,旨在提供一个功能强大且可扩展的 AI 机器人框架。

主要功能与特点

  1. 多平台集成:能够整合众多的即时通讯(IM)平台,实现跨平台的统一交互。
  2. AI 与模型支持:集成了大量的大语言模型(LLMs)和 AI 功能,具备智能代理能力。
  3. 插件化架构:支持通过插件进行功能扩展,拥有丰富的插件生态。
  4. 国际化支持:从源码文件列表(README)可以看出,该项目支持包括中文(简体/繁体)、英语、法语、日语、俄语在内的多种语言,适应全球用户。

项目状态

从文件列表中可以看到大量的更新日志(如 v4.19.2, v4.18.x 等),表明该项目目前正处于积极维护和快速迭代的阶段,版本更新频繁。

总结:AstrBot 是一个使用 Python 构建的、高人气的全能型 AI 聊天机器人框架,适合需要统一管理多平台机器人并集成高级 AI 能力的开发者使用。


评论

总体判断 AstrBot 是一个高完成度的跨平台 AI 代理基础设施,它成功地将多端即时通讯(IM)适配、大模型(LLM)编排与插件生态融合在统一的 Python 架构中。对于寻求构建私有化或高度定制化 AI 助手的开发者而言,这是一个兼顾了部署便捷性与扩展深度的生产级方案。

深入评价依据

1. 技术创新性:基于管道的抽象与统一配置

  • 事实:项目定位为 “Agentic IM Chatbot infrastructure”,支持 “lots of IM platforms” 和 “plugins”。
  • 推断:AstrBot 的核心差异化在于其中间件式的抽象设计。不同于简单的 ChatGPT 机器人,它构建了一个通用的消息处理管道。通过统一的适配层,将 Telegram、微信、QQ 等异构 IM 协议转化为标准事件,再分发至 LLM 或插件系统。这种解耦使得开发者无需关注底层 IM 协议的繁琐差异,即可专注于业务逻辑(Agent 行为),实现了“一次开发,多端运行”的技术愿景。

2. 实用价值:OpenClaw 的强有力替代者

  • 事实:描述中明确提到可以 “be your openclaw alternative”,且星标数达 2 万+。
  • 推断:这表明 AstrBot 填补了中文社区及跨平台群管/助手领域的巨大空缺。它解决的关键问题是AI 机器人落地的高昂成本。传统方案需要针对每个平台写代码,AstrBot 提供了开箱即用的 WebUI 配置界面(从 astrbot/cli 推断)和完善的 Docker/本地部署支持。其应用场景极广,从个人 AI 助手、企业级智能客服到社群管理的自动化 Agent,均可直接复用。

3. 代码质量与架构:模块化与多语言支持

  • 事实:仓库包含 README_fr.md, README_ja.md, README_ru.md 等多语言文档,且有规范的 changelogs 目录及 core/config 结构。
  • 推断:详尽的文档记录了从 v3 到 v4 的迭代历程,显示出项目具备严谨的版本管理工程化思维。Python 代码结构清晰,将核心逻辑、配置默认值和 CLI 入口分离,符合高内聚低耦合的原则。多语言 README 的存在不仅证明了其国际化野心,也侧面反映了社区维护的活跃度与文档的完整性,降低了新上手的门槛。

4. 社区活跃度:高频迭代与用户反馈

  • 事实:Changelogs 显示版本迭代频繁(如 v3.5.x 到 v4.18.x),星标数高达 20,564。
  • 推断:版本号的快速跃升和密集的日志更新证明了项目处于活跃开发状态,能够快速响应 LLM 技术的变革(如支持 GPT-4, Claude 等新模型)。高星标数在 Python 机器人领域属于头部项目,意味着经过了大量用户的验证,Bug 修复速度快,周边插件生态丰富,降低了“烂尾”风险。

5. 学习价值:Agent 编排的最佳实践

  • 事实:项目集成了 “plugins and AI feature”。
  • 推断:对于开发者,AstrBot 是一个学习Agent 编排的优秀案例。它展示了如何处理上下文记忆、如何设计插件系统以动态扩展 AI 能力(如联网搜索、图像生成),以及如何处理异步并发消息。其代码展示了如何将复杂的 LLM API 调用封装为简单的配置项,对设计智能体框架极具参考意义。

6. 潜在问题与改进建议

  • 事实:基于 Python 开发,且涉及大量 IM 平台对接。
  • 推断:Python 的异步性能虽然足够处理文本,但在处理高并发群消息(如万人群消息轰炸)时可能面临性能瓶颈(GIL 锁限制)。此外,IM 平台的协议更新频繁(如 Telegram API 变动或第三方协议被封),可能导致适配器失效。建议引入 Rust 或 Go 编写的高性能消息队列核心,或提供基于 Sidecar 模式的部署方案以隔离协议风险。

7. 对比优势

  • 事实:对比 LobeChat(纯前端/TypeScript 为主)或 NoneBot(仅 Python 但需手写插件)。
  • 推断:AstrBot 的优势在于全栈能力的整合。它比 LobeChat 更易于集成系统级插件(Python 生态丰富),比 NoneBot 提供了更现成的 UI 和多平台支持。它不仅是一个聊天框架,更是一个可管理的 AI 应用平台。

边界条件与验证清单

边界条件/不适用场景

  • 不适用:对延迟极度敏感(毫秒级)的高频交易场景。
  • 不适用:需要极低资源占用(如 < 50MB RAM)的嵌入式设备。
  • 不适用:完全无法联网或受严格防火墙限制导致无法调用 LLM API 的内网环境(除非本地部署小模型)。

快速验证清单

  1. 部署测试:在本地 Docker 环境中启动,检查是否能成功加载 WebUI 并连接至少一个 IM 平台(如终端模拟)。
  2. 模型连通性:配置 OpenAI 或兼容 API,发送一条测试消息,验证响应延迟是否

技术分析

AstrBot 技术深度分析报告

基于对 AstrBotDevs/AstrBot 仓库的深入剖析,该仓库作为一个高星标(20k+)的 Python 项目,代表了现代智能体聊天机器人基础设施的先进水平。它不仅仅是一个简单的复读机或脚本,而是一个融合了多平台适配、大语言模型(LLM)集成、插件化架构和 AI 功能的综合性框架。

以下是从八个维度进行的详细技术分析。


1. 技术架构深度剖析

技术栈与架构模式

AstrBot 采用了 Python 作为核心开发语言,这使其能够极其便捷地利用丰富的 AI 生态库。其架构遵循典型的 分层架构 结合 事件驱动 模式:

  • 接入层: 负责对接各大 IM 平台(如 QQ, Telegram, Discord, Kaiheila 等)。这一层抽象了不同平台的协议差异,将消息统一转化为内部事件。
  • 核心层: 处理消息路由、权限管理、会话状态机和任务调度。它是连接上层应用和底层适配的枢纽。
  • 应用与插件层: 基于 依赖注入钩子 机制。业务逻辑不硬编码在核心中,而是通过动态加载的插件实现。
  • AI 接口层: 对接各大 LLM 提供商(OpenAI, Claude, 本地模型等),处理流式输出、上下文管理和 Token 计数。

核心模块设计

  • 消息管道: 消息从平台进入后,经过一个中间件管道。开发者可以在此插入鉴权、敏感词过滤、日志记录等逻辑,实现了 AOP(面向切面编程)的思想。
  • 配置管理:astrbot/core/config/default.py 可以看出,项目采用了声明式配置,支持热重载或动态更新,允许在运行时调整 LLM 参数或插件开关。
  • Agent 机制: 不同于传统的指令触发,AstrBot 引入了 Agentic 概念,具备一定的自主规划、工具调用和长对话记忆能力。

架构优势

  • 解耦性: 平台适配与业务逻辑完全分离。更换 IM 平台只需更换适配器,无需修改插件代码。
  • 高扩展性: 插件系统允许第三方开发者无缝扩展功能,无需触碰核心代码。
  • 统一接口: 屏蔽了不同 LLM API 的差异,提供统一的调用接口,便于模型切换。

2. 核心功能详细解读

主要功能

  1. 多平台聚合: 同时支持多个账号在多个平台登录,统一管理。
  2. 智能对话: 集成 LLM,支持多模态(图片、文件处理)、流式回复和上下文记忆。
  3. 工具调用: 允许 LLM 调用预定义的工具,如搜索网页、查询天气、执行代码等。
  4. 插件生态: 支持动态安装、卸载 Python 插件,拥有丰富的社区插件库。
  5. Web 控制台: 提供可视化的管理界面,用于配置机器人、查看日志和管理会话。

解决的关键问题

  • 碎片化问题: 解决了开发者需要针对 QQ、Telegram 等不同协议写不同代码的痛点。
  • AI 落地门槛: 极大降低了将私有 LLM 或商业 LLM 接入聊天应用的难度。
  • 长期维护: 提供了标准化的开发框架,避免了“屎山”代码的堆积。

与同类工具对比

  • 对比 NoneBot2: NoneBot2 专注于协议适配和异步 IO,本身不包含 AI 能力,需要手写 LLM 接口。AstrBot 则是“开箱即用”的 AI 原生框架,内置了 LLM 处理逻辑。
  • 对比 OpenClaw (作为替代品): AstrBot 在 Python 生态的亲和力、插件热加载以及现代化的 Web UI 上可能更具优势,且对 Agentic 模式的支持更为完善。

3. 技术实现细节

关键技术方案

  • 异步 I/O (Asyncio): 利用 Python 的 asyncio 库处理高并发消息。这是 IM 机器人的标配,确保在处理耗时操作(如等待 LLM 响应)时不会阻塞新消息的接收。
  • 会话管理: 实现了基于 Session ID 的上下文隔离。通过内存数据库或持久化存储(如 SQLite/Redis)保存对话历史,确保多用户并发对话不串号。
  • 流式传输: 实现了 SSE (Server-Sent Events) 或 WebSocket 机制,将 LLM 的生成过程实时推送到客户端,提升用户体验。

代码组织与设计模式

  • 仓库结构分析:
    • astrbot/cli/: 命令行接口,用于启动、安装依赖、更新等。
    • astrbot/core/: 核心业务逻辑,包含平台接口定义、消息处理链。
    • changelogs/: 详尽的版本日志,显示了项目处于活跃的高速迭代期(从 v3 到 v4 的跨越)。
  • 设计模式:
    • 工厂模式: 用于创建不同平台的适配器实例。
    • 观察者模式: 消息事件的分发机制。
    • 策略模式: 不同的 LLM 提供商采用不同的调用策略。

性能与扩展性

  • 资源池化: 对 HTTP 连接和数据库连接进行池化管理。
  • CORS 与反向代理支持: 内置 Web 服务器支持配置 CORS,便于配合 Nginx 进行生产环境部署。

4. 适用场景分析

最适合的场景

  • 个人 AI 助手: 部署在个人服务器或本地,接入家庭群组,提供日程管理、信息查询服务。
  • 企业客服/知识库: 接入公司内部 IM(如 Lark/钉钉),结合 RAG (检索增强生成) 插件,作为智能客服回答员工或客户问题。
  • 社区管理: 在 Discord 或 QQ 群中自动审核、生成内容、活跃气氛。
  • MCP (Model Context Protocol) 客户端: 作为连接 AI 模型与本地操作系统的中间件。

不适合的场景

  • 超大规模并发 (百万级 QPS): Python 的 GIL 锁和单机架构限制使其不适合直接作为巨型公网的入口,需要配合消息队列(如 Kafka)和横向扩容方案。
  • 极度轻量级需求: 如果只需要一个简单的“echo”机器人,AstrBot 的架构显得过于厚重。

5. 发展趋势展望

技术演进方向

  • 更强的 Agentic 能力: 从“对话”转向“行动”。未来将更深入地集成多步推理、自我修正和自主任务调度。
  • 多模态原生: 更好地处理语音输入输出、视频流分析,而不仅仅是文本和图片。
  • 边缘计算支持: 优化对本地小模型(如 Llama 3)的支持,使其能在低配置设备(如树莓派)上流畅运行,保护隐私。

社区与生态

  • 插件市场标准化:可能会引入类似 VS Code 的插件市场 ID 系统,实现一键安装。
  • 安全性增强: 随着 AI 捆绑程度加深,提示词注入防御和权限沙箱将成为重点。

6. 学习建议

适合人群

  • 中级 Python 开发者: 需要理解 Asyncio、面向对象编程和基本的网络协议。
  • AI 应用爱好者: 想要亲手将 LLM 接入实际应用的开发者。

学习路径

  1. 阅读配置: 先看 astrbot/core/config/default.py,理解它提供了哪些功能开关和配置项。
  2. 跑通 Hello World: 部署一个最小实例,发送消息并观察日志流转。
  3. 插件开发: 阅读官方文档的插件编写章节,尝试写一个简单的复读机或查询插件。
  4. 源码阅读:cli/__init__.py 入口开始,追踪消息如何从平台进入到触发 LLM 的全过程。

7. 最佳实践建议

部署与使用

  • 容器化部署: 强烈建议使用 Docker 部署。Python 环境依赖复杂,容器能避免“在我电脑上能跑”的问题。
  • 反向代理: 不要直接将 Web 控制台暴露在公网,应使用 Nginx 配置 SSL 和 Basic Auth。
  • API Key 管理: 切勿将 API Key 硬编码在代码中,应使用环境变量或 AstrBot 提供的配置管理界面注入。

性能优化

  • 数据库选择: 如果消息量巨大,建议将默认的 SQLite 切换为 PostgreSQL 或 MySQL,并定期归档历史聊天记录。
  • 上下文裁剪: 在 LLM 调用中,合理设置 max_tokens 和历史消息截断策略,避免 Token 消耗过快。

8. 哲学与方法论:第一性原理与权衡

抽象层的转移

AstrBot 在抽象层上做了一件**“暴力统一”**的事情。它将以下复杂性转移给了自身:

  1. 协议异构性: 它把 QQ 的 Protobuf、Telegram 的 MTProto、Discord 的 WebSocket 全部抹平,转化为统一的 Message 对象。
  2. 模型异构性: 它把 OpenAI 的格式、Anthropic 的格式、本地 Ollama 的格式统一封装。

代价: 这种抽象带来了“漏桶抽象”的风险。如果某个平台推出了独有特性(如 QQ 的某个特殊 Ark 消息),AstrBot 的通用接口可能无法完美表达,开发者不得不等待框架更新或绕过抽象层直接操作底层对象。

价值取向

  • 易用性 > 极致性能: 选择 Python 和高度封装的架构,意味着牺牲了执行效率,换取了开发速度和生态兼容性。
  • 功能丰富 > 极简主义: 它倾向于做大而全的“瑞士军刀”,而非 Unix 哲学中的“做好一件事”。

工程哲学

AstrBot 的范式是**“事件驱动的中间件”。它把自己定位为连接“人(IM)”与“智能”的管道。 误用风险: 最容易误用的地方在于阻塞主线程**。开发者若在插件中编写同步的、耗时的 I/O 操作(如 time.sleep 或同步的 requests 请求),会导致整个机器人假死。这违背了其异步架构的初衷。

可证伪的判断

为了验证上述分析,可以提出以下三个可证伪的实验:

  1. 异步压力测试:

    • 假设: 如果架构健壮,在处理一个耗时 10 秒的 LLM 请求时,机器人应仍能响应其他用户的简单指令(如“ping”)。
    • 验证: 编写一个插件,故意阻塞事件循环 10 秒。观察期间其他消息是否被延迟。如果延迟,说明其插件隔离机制存在缺陷或开发者误用了同步代码。
  2. 协议抽象泄漏测试:


代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 示例1:基础机器人回复功能
def bot_reply(message: str) -> str:
    """
    模拟机器人回复消息的功能
    :param message: 用户输入的消息
    :return: 机器人的回复内容
    """
    # 简单的关键词匹配逻辑
    if "你好" in message:
        return "你好!我是AstrBot,很高兴为你服务。"
    elif "时间" in message:
        from datetime import datetime
        return f"当前时间是:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
    else:
        return "抱歉,我没有理解你的意思,请尝试其他问题。"

# 测试用例
if __name__ == "__main__":
    print(bot_reply("你好"))  # 输出:你好!我是AstrBot,很高兴为你服务。
    print(bot_reply("现在几点了"))  # 输出:当前时间是:2023-11-15 14:30:00
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 示例2:命令解析与处理系统
class CommandHandler:
    """机器人命令处理器"""
    
    def __init__(self):
        self.commands = {
            "帮助": self.show_help,
            "状态": self.show_status,
            "清理": self.clear_cache
        }
    
    def handle(self, user_input: str) -> str:
        """处理用户输入的命令"""
        parts = user_input.strip().split(maxsplit=1)
        cmd = parts[0] if parts else ""
        args = parts[1] if len(parts) > 1 else ""
        
        if cmd in self.commands:
            return self.commands[cmd](args)
        return "未知命令,输入'帮助'查看可用命令"
    
    def show_help(self, _) -> str:
        return """可用命令:
        - 帮助:显示此帮助信息
        - 状态:查看机器人运行状态
        - 清理:清理缓存数据"""
    
    def show_status(self, _) -> str:
        return "机器人运行正常,CPU使用率:45%"
    
    def clear_cache(self, args: str) -> str:
        if args == "确认":
            return "缓存已清理完成"
        return "请输入'清理 确认'来执行清理操作"

# 测试用例
if __name__ == "__main__":
    handler = CommandHandler()
    print(handler.handle("帮助"))  # 输出帮助信息
    print(handler.handle("清理 确认"))  # 输出:缓存已清理完成
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 示例3:异步消息处理框架
import asyncio
from datetime import datetime

class AsyncBot:
    """异步机器人框架"""
    
    def __init__(self):
        self.message_queue = asyncio.Queue()
        self.running = False
    
    async def start(self):
        """启动机器人"""
        self.running = True
        print(f"[{datetime.now()}] 机器人已启动")
        
        # 创建消费者任务
        consumer = asyncio.create_task(self.message_consumer())
        
        # 模拟生产者
        await self.message_producer()
        
        # 等待队列处理完成
        await self.message_queue.join()
        self.running = False
        await consumer
    
    async def message_producer(self):
        """消息生产者"""
        messages = ["用户A: 你好", "用户B: 状态", "用户C: 帮助"]
        for msg in messages:
            await self.message_queue.put(msg)
            await asyncio.sleep(0.5)  # 模拟消息间隔
    
    async def message_consumer(self):
        """消息消费者"""
        while self.running or not self.message_queue.empty():
            msg = await self.message_queue.get()
            print(f"[{datetime.now()}] 处理消息: {msg}")
            await asyncio.sleep(1)  # 模拟处理耗时
            self.message_queue.task_done()

# 测试用例
if __name__ == "__main__":
    bot = AsyncBot()
    asyncio.run(bot.start())

案例研究

1:大学校园 Discord 社区管理

1:大学校园 Discord 社区管理

背景: 某知名高校的计算机学院 Discord 服务器拥有超过 3000 名成员,主要用于课程讨论、作业互助和社团活动通知。随着用户量增加,管理员团队面临巨大的维护压力,需要全天候监控聊天秩序,并定期同步教务处的通知。

问题: 人工管理导致响应滞后,深夜时段无人值守时容易出现垃圾广告或违规言论。同时,教务系统的课程提醒需要人工复制粘贴到 Discord,效率低下且容易遗漏。管理员希望能有一种方式自动化处理这些繁琐事务。

解决方案: 管理员部署了 AstrBot 作为服务器内的全天候智能助手。利用 AstrBot 的跨平台适配能力和插件系统,接入了自动审核模块和 RSS 订阅模块。机器人被配置为自动检测并删除违规信息,并每小时抓取一次学校教务网的 RSS 更新,自动推送到指定的公告频道。

效果: 部署后,社区违规信息的处理时间从平均 30 分钟缩短至秒级,无需人工干预。教务通知的覆盖率达到了 100%,学生不再错过重要课程变动。管理员每周节省了约 15 小时的巡查时间,能够专注于组织线上技术分享活动,社区活跃度提升了 20%。


2:小型科技团队的内部知识库助手

2:小型科技团队的内部知识库助手

背景: 一个分布式的远程技术创业团队(约 20 人),使用 Telegram 进行日常沟通和开发进度同步。团队积累了大量的技术文档和开发日志,散落在不同的聊天记录中,检索非常困难。

问题: 新成员入职时,经常重复询问相同的环境配置问题或 API 密钥获取方式。资深开发者不得不频繁停下手中的工作去回答这些重复性问题,严重影响了开发效率。团队需要一种能“记住”历史对话并能快速检索的工具。

解决方案: 团队在 Telegram 群组中引入了 AstrBot,并配置了其内置的“关键词记录”和“问答”插件。每当有人解答了问题,管理员会标记该消息,AstrBot 自动将其存入本地数据库。当成员输入特定指令(如 /query 部署流程)时,Bot 会立即从数据库中调取相关的历史回答。

效果: 重复性咨询的回复时间从等待数小时变成了即时获取。资深开发者的被打扰次数显著减少,团队协作更加流畅。该 Bot 还被扩展用于记录每日站会内容,成为了一个轻量级的团队知识中枢,极大地降低了信息流转的成本。


3:米游社游戏社区自动化运营

3:米游社游戏社区自动化运营

背景: 一个基于 QQ 群的《原神》游戏攻略交流群,拥有 5000+ 群友。群主希望提升群组的活跃度,并为群友提供便捷的游戏数据查询服务,如实时树脂查询、角色伤害计算器等。

问题: 依靠人工去游戏内截图或查询第三方网站来回答群友问题极不现实。群内缺乏互动点,导致除了新版本更新时外,平时活跃度较低,群友容易流失。

解决方案: 群主使用 AstrBot 接入了米游社的开放 API 接口(通过插件)。Bot 被设定为自动响应群友的指令,例如输入“#查询树脂”,Bot 即通过后台抓取数据返回用户的当前体力状态;同时配置了每日签到提醒和深渊重置提醒功能。

效果: 群组的日活跃用户数(DAU)提升了 35%。Bot 成为了群内不可或缺的工具,每天处理上千次查询请求。自动化的提醒功能让群友养成了每天打开群组的习惯,极大地增强了用户粘性,群主也通过 Bot 的插件市场轻松扩展了抽卡模拟器等娱乐功能。


对比分析

与同类方案对比

维度AstrBotNapCatQQLagrange.Core
核心定位综合性 Bot 框架NTQQ 协议端实现原生 C# QQ 协议库
性能轻量级,资源占用低依赖 NTQQ 客户端,资源占用中等高性能,内存占用低
易用性提供完整控制台,开箱即用需配置 NTQQ 环境需自行开发上层逻辑
扩展性插件系统完善依赖第三方框架原生支持扩展开发
兼容性支持 OneBot 适配仅支持 NTQQ 协议支持多种 QQ 协议
维护成本中等较高较低

优势分析

  • 优势1:完整的 Web 控制台管理界面,降低运维复杂度
  • 优势2:内置插件市场和依赖管理,生态整合度高
  • 优势3:采用 Python 开发,二次开发门槛相对较低
  • 优势4:支持跨平台部署,不依赖特定客户端环境

不足分析

  • 不足1:性能上限受 Python 解释器限制
  • 不足2:协议适配依赖第三方实现,可能存在兼容性问题
  • 不足3:高级功能实现需要依赖插件生态
  • 不足4:文档完善度不如成熟框架

最佳实践

最佳实践指南

实践 1:插件化架构设计

说明:
AstrBot 采用插件化架构,所有功能通过插件实现。这种设计允许用户根据需求灵活扩展功能,同时保持核心系统的稳定性。插件可以独立开发、测试和部署,降低了维护成本。

实施步骤:

  1. 熟悉 AstrBot 提供的插件开发文档和 API 接口。
  2. 使用 Python 或支持的语言编写插件逻辑,遵循插件规范。
  3. 在本地测试插件功能,确保与核心系统兼容。
  4. 将插件打包并提交到 AstrBot 插件市场或私有仓库。

注意事项:

  • 插件开发需遵循 AstrBot 的命名和结构规范。
  • 避免插件间直接依赖,保持独立性。
  • 定期更新插件以适配核心系统版本变更。

实践 2:配置文件管理

说明:
AstrBot 的核心配置和插件配置均通过 YAML 文件管理。合理的配置管理可以提升系统的可维护性和灵活性,便于在不同环境中部署。

实施步骤:

  1. 复制默认配置文件 config.example.yamlconfig.yaml
  2. 根据需求修改核心配置,如数据库连接、日志级别等。
  3. 为插件创建独立的配置文件,避免与核心配置冲突。
  4. 使用版本控制工具管理配置文件变更。

注意事项:

  • 敏感信息(如 API 密钥)应使用环境变量或加密存储。
  • 配置文件修改后需重启服务生效。
  • 定期备份配置文件,防止误操作导致丢失。

实践 3:日志与监控

说明:
完善的日志和监控机制可以帮助快速定位问题并优化性能。AstrBot 内置日志功能,支持自定义日志级别和输出方式。

实施步骤:

  1. 在配置文件中设置日志级别(如 DEBUG、INFO、WARNING)。
  2. 配置日志输出路径,确保日志文件可访问。
  3. 集成第三方监控工具(如 Prometheus)采集性能指标。
  4. 定期分析日志,优化系统性能。

注意事项:

  • 生产环境建议使用 INFO 或 WARNING 级别,避免日志过多。
  • 日志文件需定期清理或归档,防止占用过多磁盘空间。
  • 监控指标应包括 CPU、内存、响应时间等关键数据。

实践 4:数据库优化

说明:
AstrBot 默认使用 SQLite 数据库,适合中小规模部署。对于高并发或大数据量场景,建议切换到 PostgreSQL 或 MySQL 以提升性能。

实施步骤:

  1. 评估当前数据量和并发需求,确定是否需要切换数据库。
  2. 安装并配置目标数据库服务。
  3. 修改 AstrBot 配置文件中的数据库连接参数。
  4. 迁移现有数据并验证功能正常。

注意事项:

  • 切换数据库前需备份现有数据。
  • 确保数据库服务与 AstrBot 版本兼容。
  • 定期优化数据库索引和查询语句。

实践 5:安全加固

说明:
保护 AstrBot 及其运行环境的安全至关重要。通过限制访问权限、加密通信等方式,可以有效降低安全风险。

实施步骤:

  1. 为 AstrBot 管理后台设置强密码,并启用双因素认证(如支持)。
  2. 配置防火墙规则,限制非必要端口访问。
  3. 使用 HTTPS 加密 Web 接口通信。
  4. 定期更新 AstrBot 和依赖库以修复已知漏洞。

注意事项:

  • 避免使用默认端口或弱密码。
  • 定期审计系统日志,检测异常行为。
  • 在生产环境中禁用调试模式。

实践 6:自动化部署

说明:
通过自动化部署工具(如 Docker 或 CI/CD 流水线)可以简化 AstrBot 的部署和更新流程,提高效率。

实施步骤:

  1. 编写 Dockerfile,定义 AstrBot 的运行环境。
  2. 使用 Docker Compose 编排服务依赖(如数据库、缓存)。
  3. 配置 CI/CD 流水线,实现代码提交后自动构建和部署。
  4. 测试自动化部署流程,确保稳定性。

注意事项:

  • 确保镜像中不包含敏感信息。
  • 定期更新基础镜像和依赖库。
  • 在测试环境验证部署流程后再应用到生产环境。

实践 7:社区参与与贡献

说明:
积极参与 AstrBot 社区可以获取最新动态、解决问题并贡献代码。通过提交 Issue、PR 或分享插件,可以促进项目发展。

实施步骤:

  1. 加入 AstrBot 官方社区(如 Discord、GitHub Discussions)。
  2. 阅读贡献指南,了解代码规范和流程。
  3. 提交 Bug 报告或功能建议时,提供详细信息和复现步骤。
  4. 参与代码审查,提升项目质量。

注意事项:

  • 遵守社区规则,保持友好沟通。
  • 提交代码前需通过本地测试。
  • 关注项目公告,及时了解重要更新

性能优化建议

性能优化建议

优化 1:异步化插件系统与事件处理

说明:
AstrBot 作为一个高度模块化的机器人框架,其插件系统通常是性能瓶颈所在。如果插件处理逻辑(如消息解析、API调用)是同步阻塞的,会导致整个消息处理队列停滞,影响并发处理能力。将非核心逻辑异步化可以显著提升吞吐量。

实施方法:

  1. 使用 asyncio (Python) 或协程机制重构插件的主入口函数(如 handle_message)。
  2. 确保所有涉及网络 I/O(调用 LLM API、数据库查询、HTTP 请求)的操作均使用异步库(如 aiohttp, aiosqlite)。
  3. 在消息分发器中维护一个异步任务队列,防止某个插件的长时间运行阻塞其他插件的触发。

预期效果:
在高并发场景下,消息处理响应延迟降低约 30%-50%,系统吞吐量提升 2 倍以上。


优化 2:实现智能消息队列与限流机制

说明:
当机器人接入多个平台或处于活跃群组时,瞬时消息量可能激增,导致 CPU 或内存打满。引入队列与限流可以平滑流量尖峰,保护下游服务(如 LLM API)不被突发流量冲垮。

实施方法:

  1. 在消息接收端与处理逻辑之间引入内存队列(如 Python 的 asyncio.Queue)或消息中间件。
  2. 实现令牌桶或漏桶算法,对单一用户或群组的请求频率进行限制。
  3. 对于非实时性要求的任务(如日志记录、数据分析),将其剥离至独立的低优先级队列中异步处理。

预期效果:
内存占用峰值降低 20%-40%,有效防止因流量激增导致的程序崩溃(OOM)。


优化 3:优化 LLM 上下文管理与 Token 消耗

说明:
AstrBot 核心功能依赖 LLM。如果不加限制地向 LLM 发送完整的聊天记录,Token 消耗将呈指数级增长,导致响应缓慢和成本高昂。优化上下文窗口管理是提升性能的关键。

实施方法:

  1. 实现滑动窗口机制,仅保留最近 N 条消息或基于语义相似度保留历史摘要。
  2. 对发送给 LLM 的文本进行预处理,去除无意义的引用符、表情包或冗余字符。
  3. 缓存常见问题的回复,对于简单的指令(如“查询状态”)直接通过规则引擎响应,绕过 LLM 调用。

预期效果:
API 调用延迟减少 40%-60%(取决于 Token 裁剪幅度),Token 使用成本降低 30% 以上。


优化 4:数据库连接池与查询缓存

说明:
频繁的数据库连接建立和断开是非常耗时的操作。如果 AstrBot 频繁读写用户配置、插件数据或日志,未优化的数据库访问将成为主要延迟来源。

实施方法:

  1. 配置数据库连接池(如 SQLAlchemy 的 Poolaiomysqlcreate_pool),复用长连接。
  2. 针对热点数据(如用户权限、插件开关),在内存中建立缓存层(如 Python 的 functools.lru_cache 或 Redis),设置合理的 TTL(过期时间)。
  3. 对数据库索引进行优化,确保 WHEREJOIN 操作的字段已建立索引。

预期效果:
数据读写操作延迟降低 50%-70%,数据库负载显著下降。


优化 5:静态资源与插件热加载优化

说明:
虽然热加载方便开发,但在生产环境中,频繁的文件 I/O 监控和模块重载会消耗资源。同时,前端静态资源的加载速度影响用户体验。

实施方法:

  1. 在生产模式下关闭文件监控热加载,改为一次性预加载所有插件。
  2. 对前端静态资源(WebUI 面板)进行压缩,并启用 HTTP 缓存头或 CDN 加速。
  3. 使用 PyPy 或编译为 Cython 扩展来运行核心计算密集

学习要点

  • 基于提供的 GitHub 趋势项目 AstrBot,以下是关键要点总结:
  • AstrBot 是一个基于 Python 的异步 QQ/Telegram 机器人框架,支持跨平台部署与插件化扩展。
  • 项目采用现代化异步架构(Asyncio),确保在高并发消息处理场景下保持高性能与低资源占用。
  • 内置完善的插件系统,允许用户通过编写 Python 脚本轻松实现自定义功能,无需修改核心代码。
  • 提供了开箱即用的管理面板,用户可通过 Web 界面直观地管理插件、查看日志及配置机器人参数。
  • 支持适配 OneBot 11 及原生 Telegram 协议,实现了不同生态平台之间的统一管理与消息互通。
  • 框架具备高度的可配置性,支持沙箱隔离运行,有效防止恶意插件影响主程序稳定性。

学习路径

学习路径

阶段 1:环境准备与基础运行

学习内容:

  • Python 基础语法复习(特别是异步编程 asyncio 基础)
  • Git 基本操作(克隆、拉取、切换分支)
  • 依赖管理工具的使用
  • AstrBot 的项目结构解读(目录分布、核心文件)
  • 本地开发环境的搭建与配置

学习时间: 3-5天

学习资源:

  • AstrBot 官方文档(安装与部署章节)
  • Python 官方文档(异步编程概述)
  • Git 简易指南

学习建议: 不要急于修改代码,首先确保能够成功在本地运行项目。遇到报错优先查看项目的 Issues 板块或 Wiki,常见问题通常都有记录。建议使用虚拟环境(如 venv 或 conda)来隔离项目依赖,避免污染系统环境。


阶段 2:核心架构与插件机制

学习内容:

  • AstrBot 核心架构理解(事件循环、消息处理流程)
  • 适配器 的概念与工作原理
  • 指令处理与事件分发机制
  • 插件开发基础(Hook 点、生命周期)
  • 配置文件的编写与读取

学习时间: 1-2周

学习资源:

  • AstrBot 插件开发指南
  • 项目源码中的 core 目录
  • 社区现有的简单插件案例

学习建议: 阅读源码时,建议从入口文件开始,跟踪一条消息的完整生命周期。尝试编写一个简单的“Hello World”插件,能够响应特定指令并回复消息。理解 AstrBot 如何通过适配器兼容不同平台(如 QQ、Telegram 等)是进阶的关键。


阶段 3:插件开发实战

学习内容:

  • 复杂插件逻辑编写(数据库交互、API 调用)
  • AstrBot API 的深入使用(消息链构建、权限控制)
  • 定时任务与后台任务的实现
  • 插件资源管理(静态资源、配置项热更新)
  • 错误处理与日志记录规范

学习时间: 2-3周

学习资源:

  • AstrBot API 参考手册
  • Python aiohttp / httpx 异步请求库文档
  • SQLite / MySQL 异步驱动文档

学习建议: 动手实践是这一阶段的核心。尝试开发一个具有实际功能的插件,例如“每日签到”或“新闻查询”。注意代码的健壮性,学会使用 try-except 捕获异步任务中的异常,避免因为网络波动导致机器人崩溃。学习如何优雅地管理插件配置,方便用户修改。


阶段 4:高级定制与源码贡献

学习内容:

  • AstrBot 源码深度定制(修改核心逻辑、自定义适配器)
  • 前端面板的修改与适配(如涉及 WebUI)
  • 自动化测试与 CI/CD 流程
  • 性能优化与内存管理
  • 向上游项目提交 Pull Request (PR)

学习时间: 4周以上(持续学习)

学习资源:

  • AstrBot 源码(src 及核心组件目录)
  • GitHub Flow 标准工作流文档
  • Python 性能分析工具

学习建议: 在决定修改核心源码前,务必深入理解现有设计模式,以免引入难以排查的 Bug。如果你计划为社区贡献代码,请先阅读项目的贡献指南,遵循代码规范。关注项目的 Release Note,及时跟进框架的更新与变动,保持你的插件或分支与主版本兼容。


常见问题

1: AstrBot 是什么?它主要用来做什么?

1: AstrBot 是什么?它主要用来做什么?

A: AstrBot 是一个基于 Python 开发的多功能异步 QQ 机器人框架。它旨在为用户提供一个轻量级、高性能且易于扩展的机器人解决方案。AstrBot 的主要功能包括对接 OneBot 标准(如 NapCat、LLOneBot 等),支持通过插件系统来扩展功能,例如群管、娱乐、抽卡、查询等。它的架构设计注重稳定性和低资源占用,适合用于搭建个人或小团体的 QQ 群助手。


2: 如何在本地或服务器上部署 AstrBot?

2: 如何在本地或服务器上部署 AstrBot?

A: 部署 AstrBot 通常需要以下步骤:

  1. 环境准备:确保你的设备安装了 Python 3.10 或更高版本。建议使用 Linux 或 Windows Server 系统。
  2. 获取项目:通过 Git 克隆项目仓库或从 Release 页面下载最新的源码压缩包。
  3. 安装依赖:进入项目目录,运行 pip install -r requirements.txt 来安装必要的 Python 库。
  4. 配置连接:修改配置文件(通常是 config.yml 或通过 Web UI 设置),填写你的 OneBot 实现端(如 NapCat、go-cqhttp 等)的反向 WebSocket 地址或正向 WebSocket 地址。
  5. 启动运行:运行主程序(通常是 main.pystart.py)。首次启动时,系统可能会引导你进行初始化设置或生成默认配置。

3: AstrBot 支持哪些消息协议?需要配合什么客户端使用?

3: AstrBot 支持哪些消息协议?需要配合什么客户端使用?

A: AstrBot 遵循 OneBot 11 标准(原 CQHTTP 协议)。这意味着它不能直接连接 QQ 官方客户端,而是需要配合能够将 QQ 协议转换为 OneBot 协议的“实现端”使用。常见的支持工具包括:

  • NapCat / LLOneBot:基于 NTQQ 的实现,目前主流推荐。
  • Lagrange:基于 OneBot 12 的实现(可能需要适配器)。
  • go-cqhttp:老牌实现端(目前维护较少,不推荐新项目使用)。 你需要先配置好这些实现端,并让 AstrBot 通过 WebSocket(正向或反向)与其建立连接。

4: 如何为 AstrBot 安装和管理插件?

4: 如何为 AstrBot 安装和管理插件?

A: AstrBot 拥有灵活的插件系统。安装插件通常有以下几种方式:

  1. 插件商店:如果 AstrBot 内置了插件商店功能,你可以通过指令(如 /plugin install)或 Web 界面直接搜索并安装官方收录的插件。
  2. 手动安装:将插件的源代码文件夹下载并放置在 AstrBot 指定的 plugins 目录下。然后重启机器人或在控制台加载插件。
  3. 依赖管理:部分复杂的插件可能需要额外的 Python 库,安装插件后请务必检查其 requirements.txt 或说明文档,安装缺失的依赖以防止报错。

5: 启动时出现 “ModuleNotFoundError” 或连接失败报错怎么办?

5: 启动时出现 “ModuleNotFoundError” 或连接失败报错怎么办?

A: 这是两个不同层面的问题:

  1. ModuleNotFoundError (缺少模块):这通常是因为没有正确安装项目依赖。请确保在项目根目录下执行了 pip install -r requirements.txt。如果你使用的是虚拟环境,请确保已激活该环境。如果提示缺少特定第三方库(如 numpyhttpx),请手动使用 pip 安装该库。
  2. 连接失败:这通常是因为 AstrBot 无法连接到 OneBot 实现端。请检查配置文件中的 IP 地址和端口号是否正确。如果使用反向 WebSocket,请确保 OneBot 端配置了正确的 AstrBot 地址。同时检查防火墙设置,确保相应端口未被拦截。

6: AstrBot 是否支持 Docker 部署?

6: AstrBot 是否支持 Docker 部署?

A: 是的,AstrBot 通常支持 Docker 部署,这也是推荐的方式之一,因为它能隔离环境并避免依赖冲突。你可以参考项目官方文档中提供的 Dockerfiledocker-compose.yml 文件。通常的流程是:使用 Docker 构建镜像,在运行容器时将配置文件夹挂载到宿主机,以便于修改配置和持久化数据。具体的启动命令请参考项目 GitHub 仓库中的 README 或 Wiki 说明。


思考题

## 挑战与思考题

### 挑战 1: [简单]

问题**: 在本地成功运行 AstrBot 后,尝试通过配置文件修改机器人的管理员权限。请描述如何在不重启整个程序的情况下,仅通过修改配置或使用指令来赋予特定用户管理员权限。

提示**: 查阅项目文档中关于 data 目录结构或权限管理(Permission)的部分,关注 config.yaml 或数据库中的权限表结构。


实践建议

基于 AstrBot 作为“可替代 OpenClaw”的 Agent 型 IM 聊天机器人基础设施的定位,以下是 6 条针对实际部署、开发与维护的实践建议:

1. 实施严格的渠道隔离与消息清洗

由于 AstrBot 集成了多个 IM 平台(如 Telegram, QQ, Discord 等),不同平台的用户习惯和消息格式差异巨大。

  • 实践建议:在编写插件或处理 Prompt 时,务必在接入层做好消息格式的标准化。在将用户消息发送给 LLM 之前,去除纯噪音数据(如大量的 @符号、图片链接、平台特有的 XML 标签)。
  • 常见陷阱:直接将原始消息丢给 LLM,导致 Token 消耗过快,或因平台特殊格式导致 LLM 理解偏差(例如将 <message>...</message> 当作指令执行)。

2. 采用“能力路由”而非单一模型调用

AstrBot 的核心在于“Agentic”(智能体),这意味着它不仅仅是聊天,还需要执行任务。

  • 实践建议:不要把所有请求都发给同一个高参数量的 LLM(如 GPT-4)。建议配置路由逻辑:简单对话(如闲聊)路由到低成本/本地小模型(如 Llama 3 8B 或 Qwen);复杂推理、代码生成或工具调用才路由到高智模型。
  • 最佳实践:利用 AstrBot 的插件系统预设“工具描述”,让 LLM 自主决定何时调用插件,而不是硬编码指令关键词。

3. 上下文管理的“滑动窗口”策略

长对话在 IM 场景下非常常见,极易导致上下文溢出或费用失控。

  • 实践建议:配置合理的上下文截断策略。不要无限制地发送全量历史记录。建议实施“滑动窗口”或“摘要记忆”机制——即保留最近 N 条原始消息,并将更早的对话总结为一段摘要作为 System Prompt 发送给 LLM。
  • 常见陷阱:在群聊场景下,未过滤其他人的对话就全量发送,导致 Token 瞬间爆炸,且干扰了机器人的注意力。

4. 插件开发中的幂等性与超时控制

作为基础设施,AstrBot 依赖插件扩展功能,但外部 API 调用往往不稳定。

  • 实践建议:在开发插件时,确保所有具备“副作用”的操作(如发送邮件、修改数据库、控制 IoT 设备)是幂等的,或者至少在 LLM 发出重复指令时能够去重。同时,必须为每个插件调用设置严格的超时时间(建议 10-30 秒),防止因外部 API 挂起导致整个 Bot 进程阻塞。
  • 最佳实践:对于耗时操作(如绘图、长文生成),应先回复用户一个“正在处理中”的状态消息,避免用户因等待而重复刷屏触发。

5. 敏感操作的双重验证机制

既然是“Agentic”且能执行操作,安全性就至关重要,尤其是在群聊环境中。

  • 实践建议:对于高风险操作(如删除文件、重启服务、修改配置),不要让 LLM 直接执行。建议设计一个“确认机制”:Bot 生成操作计划 -> 询问用户是否确认 -> 收到肯定指令后才执行。
  • 常见陷阱:忽略了“越狱”攻击。恶意用户可能通过 Prompt 注入诱导 Bot 执行系统命令,务必在 System Prompt 层面做好权限校验和敏感词过滤。

6. 结构化日志与可观测性

在多平台、多插件的复杂环境下,排查问题非常困难。

  • 实践建议:开启 AstrBot 的详细日志,并使用外部工具(如 Loki, ELK, 或简单的文件轮转)进行存储。不要仅仅把日志打印在控制台。特别关注“请求耗时”和“Token 使用量”这两个指标。
  • 最佳实践:为每一个用户的每一次交互生成一个唯一的 Trace ID,并将其贯穿于从接收到消息、调用 LLM 到执行插件的全过程,以便在出问题时快速定位是网络问题、模型问题

引用

注:文中事实性信息以以上引用为准;观点与推断为 AI Stack 的分析。



站内链接

相关文章