记忆与调度:智能体的持久化能力(nanobot架构分析)

基于Docker与Telegram的AI智能体Nanobot部署与调优指南 AI智能体(AI Agent)作为人工智能技术的重要分支,其核心原理在于通过大语言模型(LLM)理解用户意图并执行任务。这项技术的价值在于将复杂的AI能力封装为可交互的服务,显著降低了智能应用开发门槛。在实际工程实践中,容器化部署成为关键环节,Docker技术通过将应用及其依赖打包成标准单元,实现了环境一致性与快速部署。结合即时通讯平台如Telegram,开发者能够快速构建具备自然语言对话能力的聊天机器人,应用于客服、个人助手、社群管理等多种场景。本文以Nanobot项目为例,详细解析如何通过Docker 阅读详情

玄同 765

大语言模型 (LLM) 开发工程师 | 中国传媒大学 · 数字媒体技术(智能交互与游戏设计)

优快云 · 个人主页 | GitHub · Follow


关于作者

  • 深耕领域:大语言模型开发 / RAG 知识库 / AI Agent 落地 / 模型微调
  • 技术栈:Python | RAG (LangChain / Dify + Milvus) | FastAPI + Docker
  • 工程能力:专注模型工程化部署、知识库构建与优化,擅长全流程解决方案

「让 AI 交互更智能,让技术落地更高效」
欢迎技术探讨与项目合作,解锁大模型与智能交互的无限可能!


记忆与调度:智能体的持久化能力

通过记忆系统保存重要信息,通过调度系统实现定时任务,nanobot 具备了超越即时对话的持久化能力。

概述

一个真正有用的 AI Agent 不仅需要能够即时响应用户请求,还需要具备记忆和调度能力。nanobot 通过 MemoryStore 实现了长期记忆和每日笔记,通过 CronService 实现了定时任务调度。本文将深入剖析记忆与调度系统的设计与实现。

问题背景

持久化能力的核心挑战

构建 Agent 的持久化能力需要解决以下问题:

挑战描述nanobot 的解决方案
记忆存储如何保存重要信息MemoryStore + Markdown 文件
记忆检索如何获取相关记忆时间范围查询 + 长期记忆
定时任务如何实现周期性任务CronService + croniter
任务持久化如何保存任务状态JSON 文件存储
错误恢复任务失败如何处理状态记录 + 重试机制

持久化设计目标

设计目标

简单可靠

易于理解

灵活扩展

文件存储

无数据库依赖

Markdown格式

人类可读

多种调度方式

可配置回调

记忆系统

MemoryStore 设计

MemoryStore 提供了简单但有效的记忆存储:

class MemoryStore:
    """
    Memory system for the agent.
  
    Supports daily notes (memory/YYYY-MM-DD.md) and long-term memory (MEMORY.md).
    """
  
    def __init__(self, workspace: Path):
        self.workspace = workspace
        self.memory_dir = ensure_dir(workspace / "memory")
        self.memory_file = self.memory_dir / "MEMORY.md"

记忆文件结构

workspace/
└── memory/
    ├── MEMORY.md           # 长期记忆
    ├── 2026-02-20.md       # 每日笔记
    ├── 2026-02-19.md
    └── 2026-02-18.md

核心方法

今日笔记
def get_today_file(self) -> Path:
    """Get path to today's memory file."""
    return self.memory_dir / f"{today_date()}.md"

def read_today(self) -> str:
    """Read today's memory notes."""
    today_file = self.get_today_file()
    if today_file.exists():
        return today_file.read_text(encoding="utf-8")
    return ""

def append_today(self, content: str) -> None:
    """Append content to today's memory notes."""
    today_file = self.get_today_file()
  
    if today_file.exists():
        existing = today_file.read_text(encoding="utf-8")
        content = existing + "\n" + content
    else:
        # Add header for new day
        header = f"# {today_date()}\n\n"
        content = header + content
  
    today_file.write_text(content, encoding="utf-8")
长期记忆
def read_long_term(self) -> str:
    """Read long-term memory (MEMORY.md)."""
    if self.memory_file.exists():
        return self.memory_file.read_text(encoding="utf-8")
    return ""

def write_long_term(self, content: str) -> None:
    """Write to long-term memory (MEMORY.md)."""
    self.memory_file.write_text(content, encoding="utf-8")
近期记忆检索
def get_recent_memories(self, days: int = 7) -> str:
    """
    Get memories from the last N days.
  
    Args:
        days: Number of days to look back.
  
    Returns:
        Combined memory content.
    """
    from datetime import timedelta
  
    memories = []
    today = datetime.now().date()
  
    for i in range(days):
        date = today - timedelta(days=i)
        date_str = date.strftime("%Y-%m-%d")
        file_path = self.memory_dir / f"{date_str}.md"
      
        if file_path.exists():
            content = file_path.read_text(encoding="utf-8")
            memories.append(content)
  
    return "\n\n---\n\n".join(memories)

记忆上下文构建

def get_memory_context(self) -> str:
    """
    Get memory context for the agent.
  
    Returns:
        Formatted memory context including long-term and recent memories.
    """
    parts = []
  
    # Long-term memory
    long_term = self.read_long_term()
    if long_term:
        parts.append("## Long-term Memory\n" + long_term)
  
    # Today's notes
    today = self.read_today()
    if today:
        parts.append("## Today's Notes\n" + today)
  
    return "\n\n".join(parts) if parts else ""

记忆系统架构

AgentLoop

ContextBuilder

MemoryStore

Write

Append

Long-term Memory
MEMORY.md

Daily Notes
YYYY-MM-DD.md

Recent Memories
Last N days

Build Memory Context

Context for LLM

会话管理

Session 数据结构

@dataclass
class Session:
    """
    A conversation session.
  
    Stores messages in JSONL format for easy reading and persistence.
    """
  
    key: str  # channel:chat_id
    messages: list[dict[str, Any]] = field(default_factory=list)
    created_at: datetime = field(default_factory=datetime.now)
    updated_at: datetime = field(default_factory=datetime.now)
    metadata: dict[str, Any] = field(default_factory=dict)
  
    def add_message(self, role: str, content: str, **kwargs: Any) -> None:
        """Add a message to the session."""
        msg = {
            "role": role,
            "content": content,
            "timestamp": datetime.now().isoformat(),
            **kwargs
        }
        self.messages.append(msg)
        self.updated_at = datetime.now()
  
    def get_history(self, max_messages: int = 50) -> list[dict[str, Any]]:
        """Get message history for LLM context."""
        recent = self.messages[-max_messages:] if len(self.messages) > max_messages else self.messages
        return [{"role": m["role"], "content": m["content"]} for m in recent]
  
    def clear(self) -> None:
        """Clear all messages in the session."""
        self.messages = []
        self.updated_at = datetime.now()

SessionManager 实现

class SessionManager:
    """Manages conversation sessions."""
  
    def __init__(self, workspace: Path):
        self.workspace = workspace
        self.sessions_dir = ensure_dir(Path.home() / ".nanobot" / "sessions")
        self._cache: dict[str, Session] = {}
  
    def _get_session_path(self, key: str) -> Path:
        """Get the file path for a session."""
        safe_key = safe_filename(key.replace(":", "_"))
        return self.sessions_dir / f"{safe_key}.jsonl"
  
    def get_or_create(self, key: str) -> Session:
        """Get an existing session or create a new one."""
        # Check cache
        if key in self._cache:
            return self._cache[key]
      
        # Try to load from disk
        session = self._load(key)
        if session is None:
            session = Session(key=key)
      
        self._cache[key] = session
        return session
  
    def save(self, session: Session) -> None:
        """Save a session to disk."""
        path = self._get_session_path(session.key)
      
        with open(path, "w") as f:
            # Write metadata first
            metadata_line = {
                "_type": "metadata",
                "created_at": session.created_at.isoformat(),
                "updated_at": session.updated_at.isoformat(),
                "metadata": session.metadata
            }
            f.write(json.dumps(metadata_line) + "\n")
          
            # Write messages
            for msg in session.messages:
                f.write(json.dumps(msg) + "\n")

会话文件格式

{"_type": "metadata", "created_at": "2026-02-20T10:00:00", "updated_at": "2026-02-20T10:30:00", "metadata": {}}
{"role": "user", "content": "Hello!", "timestamp": "2026-02-20T10:00:05"}
{"role": "assistant", "content": "Hi! How can I help you?", "timestamp": "2026-02-20T10:00:10"}
{"role": "user", "content": "What's the weather?", "timestamp": "2026-02-20T10:01:00"}
{"role": "assistant", "content": "Let me check...", "timestamp": "2026-02-20T10:01:05"}

定时任务系统

CronService 设计

class CronService:
    """Service for managing and executing scheduled jobs."""
  
    def __init__(
        self,
        store_path: Path,
        on_job: Callable[[CronJob], Coroutine[Any, Any, str | None]] | None = None
    ):
        self.store_path = store_path
        self.on_job = on_job  # Callback to execute job
        self._store: CronStore | None = None
        self._timer_task: asyncio.Task | None = None
        self._running = False

调度类型

@dataclass
class CronSchedule:
    """Schedule for a cron job."""
    kind: str  # "at", "every", "cron"
    at_ms: int | None = None      # One-shot at timestamp
    every_ms: int | None = None   # Repeat every N ms
    expr: str | None = None       # Cron expression
    tz: str | None = None         # Timezone

任务数据结构

@dataclass
class CronJob:
    """A scheduled job."""
    id: str
    name: str
    enabled: bool
    schedule: CronSchedule
    payload: CronPayload
    state: CronJobState
    created_at_ms: int
    updated_at_ms: int
    delete_after_run: bool = False

@dataclass
class CronPayload:
    """Payload for a cron job."""
    kind: str = "agent_turn"      # Type of job
    message: str = ""             # Message to send
    deliver: bool = False         # Deliver to channel
    channel: str | None = None    # Target channel
    to: str | None = None         # Target chat_id

@dataclass
class CronJobState:
    """State of a cron job."""
    next_run_at_ms: int | None = None
    last_run_at_ms: int | None = None
    last_status: str | None = None  # "ok", "error"
    last_error: str | None = None

调度计算

def _compute_next_run(schedule: CronSchedule, now_ms: int) -> int | None:
    """Compute next run time in ms."""
    if schedule.kind == "at":
        return schedule.at_ms if schedule.at_ms and schedule.at_ms > now_ms else None
  
    if schedule.kind == "every":
        if not schedule.every_ms or schedule.every_ms <= 0:
            return None
        return now_ms + schedule.every_ms
  
    if schedule.kind == "cron" and schedule.expr:
        try:
            from croniter import croniter
            cron = croniter(schedule.expr, time.time())
            next_time = cron.get_next()
            return int(next_time * 1000)
        except Exception:
            return None
  
    return None

定时器机制

async def start(self) -> None:
    """Start the cron service."""
    self._running = True
    self._load_store()
    self._recompute_next_runs()
    self._save_store()
    self._arm_timer()
    logger.info(f"Cron service started with {len(self._store.jobs)} jobs")

def _arm_timer(self) -> None:
    """Schedule the next timer tick."""
    if self._timer_task:
        self._timer_task.cancel()
  
    next_wake = self._get_next_wake_ms()
    if not next_wake or not self._running:
        return
  
    delay_ms = max(0, next_wake - _now_ms())
    delay_s = delay_ms / 1000
  
    async def tick():
        await asyncio.sleep(delay_s)
        if self._running:
            await self._on_timer()
  
    self._timer_task = asyncio.create_task(tick())

async def _on_timer(self) -> None:
    """Handle timer tick - run due jobs."""
    if not self._store:
        return
  
    now = _now_ms()
    due_jobs = [
        j for j in self._store.jobs
        if j.enabled and j.state.next_run_at_ms and now >= j.state.next_run_at_ms
    ]
  
    for job in due_jobs:
        await self._execute_job(job)
  
    self._save_store()
    self._arm_timer()

任务执行

async def _execute_job(self, job: CronJob) -> None:
    """Execute a single job."""
    start_ms = _now_ms()
    logger.info(f"Cron: executing job '{job.name}' ({job.id})")
  
    try:
        response = None
        if self.on_job:
            response = await self.on_job(job)
      
        job.state.last_status = "ok"
        job.state.last_error = None
        logger.info(f"Cron: job '{job.name}' completed")
      
    except Exception as e:
        job.state.last_status = "error"
        job.state.last_error = str(e)
        logger.error(f"Cron: job '{job.name}' failed: {e}")
  
    job.state.last_run_at_ms = start_ms
    job.updated_at_ms = _now_ms()
  
    # Handle one-shot jobs
    if job.schedule.kind == "at":
        if job.delete_after_run:
            self._store.jobs = [j for j in self._store.jobs if j.id != job.id]
        else:
            job.enabled = False
            job.state.next_run_at_ms = None
    else:
        # Compute next run
        job.state.next_run_at_ms = _compute_next_run(job.schedule, _now_ms())

定时任务流程

AgentLoop CronJob Timer CronService CLI AgentLoop CronJob Timer CronService CLI loop [定时器循环] add_job(name, schedule, message) _compute_next_run() _arm_timer() _on_timer() Find due jobs Execute job on_job callback Response Update state _save_store() _arm_timer()

公共 API

添加任务

def add_job(
    self,
    name: str,
    schedule: CronSchedule,
    message: str,
    deliver: bool = False,
    channel: str | None = None,
    to: str | None = None,
    delete_after_run: bool = False,
) -> CronJob:
    """Add a new job."""
    store = self._load_store()
    now = _now_ms()
  
    job = CronJob(
        id=str(uuid.uuid4())[:8],
        name=name,
        enabled=True,
        schedule=schedule,
        payload=CronPayload(
            kind="agent_turn",
            message=message,
            deliver=deliver,
            channel=channel,
            to=to,
        ),
        state=CronJobState(next_run_at_ms=_compute_next_run(schedule, now)),
        created_at_ms=now,
        updated_at_ms=now,
        delete_after_run=delete_after_run,
    )
  
    store.jobs.append(job)
    self._save_store()
    self._arm_timer()
  
    return job

CLI 使用示例

# 添加定时任务
nanobot cron add --name "daily" --message "Good morning!" --cron "0 9 * * *"

# 添加间隔任务
nanobot cron add --name "hourly" --message "Check status" --every 3600

# 列出所有任务
nanobot cron list

# 删除任务
nanobot cron remove <job_id>

技能系统

SkillsLoader 设计

class SkillsLoader:
    """
    Loader for agent skills.
  
    Skills are markdown files (SKILL.md) that teach the agent how to use
    specific tools or perform certain tasks.
    """
  
    def __init__(self, workspace: Path, builtin_skills_dir: Path | None = None):
        self.workspace = workspace
        self.workspace_skills = workspace / "skills"
        self.builtin_skills = builtin_skills_dir or BUILTIN_SKILLS_DIR

技能目录结构

skills/
├── github/
│   └── SKILL.md
├── weather/
│   └── SKILL.md
├── tmux/
│   ├── SKILL.md
│   └── scripts/
│       ├── find-sessions.sh
│       └── wait-for-text.sh
└── summarize/
    └── SKILL.md

技能加载

def load_skill(self, name: str) -> str | None:
    """Load a skill by name."""
    # Check workspace first
    workspace_skill = self.workspace_skills / name / "SKILL.md"
    if workspace_skill.exists():
        return workspace_skill.read_text(encoding="utf-8")
  
    # Check built-in
    if self.builtin_skills:
        builtin_skill = self.builtin_skills / name / "SKILL.md"
        if builtin_skill.exists():
            return builtin_skill.read_text(encoding="utf-8")
  
    return None

渐进式加载

def build_skills_summary(self) -> str:
    """
    Build a summary of all skills (name, description, path, availability).
  
    This is used for progressive loading - the agent can read the full
    skill content using read_file when needed.
    """
    all_skills = self.list_skills(filter_unavailable=False)
    if not all_skills:
        return ""
  
    lines = ["<skills>"]
    for s in all_skills:
        name = s["name"]
        desc = self._get_skill_description(s["name"])
        available = self._check_requirements(self._get_skill_meta(s["name"]))
      
        lines.append(f'  <skill available="{str(available).lower()}">')
        lines.append(f"    <name>{name}</name>")
        lines.append(f"    <description>{desc}</description>")
        lines.append(f"    <location>{s['path']}</location>")
        lines.append(f"  </skill>")
    lines.append("</skills>")
  
    return "\n".join(lines)

技能元数据

---
name: weather
description: Get weather information for any location
nanobot:
  requires:
    bins:
      - curl
    env:
      - WEATHER_API_KEY
  always: false
---

# Weather Skill

This skill allows you to get weather information...

系统集成

记忆系统集成到上下文

def build_system_prompt(self, skill_names: list[str] | None = None) -> str:
    """Build the system prompt from bootstrap files, memory, and skills."""
    parts = []
  
    # Core identity
    parts.append(self._get_identity())
  
    # Bootstrap files
    bootstrap = self._load_bootstrap_files()
    if bootstrap:
        parts.append(bootstrap)
  
    # Memory context
    memory = self.memory.get_memory_context()
    if memory:
        parts.append(f"# Memory\n\n{memory}")
  
    # Skills
    # ...
  
    return "\n\n---\n\n".join(parts)

定时任务集成到 Agent

# 在 AgentLoop 初始化时
if self.cron_service:
    self.tools.register(CronTool(self.cron_service))

# 在 gateway 启动时
cron_service = CronService(
    store_path=workspace / "cron.json",
    on_job=lambda job: agent_loop.process_direct(job.payload.message)
)
await cron_service.start()

总结

nanobot 的记忆与调度系统提供了完整的持久化能力:

系统功能实现
MemoryStore长期记忆 + 每日笔记Markdown 文件存储
SessionManager对话历史管理JSONL 文件存储 + 缓存
CronService定时任务调度croniter + asyncio Timer
SkillsLoader技能按需加载Markdown + YAML 元数据

这些系统共同构成了 nanobot 的持久化能力,使其不仅能即时响应用户请求,还能记住重要信息、执行定时任务、动态扩展能力。


超轻量级AI智能体框架nanobot:从核心原理到实战部署 AI智能体(AI Agent)作为人工智能领域的重要发展方向,其核心原理在于通过大语言模型(LLM)驱动的自主决策与工具调用循环,实现感知、规划与执行。这种架构赋予了AI与环境交互、执行复杂任务的能力,技术价值在于将通用语言理解转化为具体行动,极大地拓展了自动化边界。在实际应用场景中,AI智能体可广泛应用于智能客服、个人助手、自动化工作流等。本文聚焦的nanobot框架,正是这一理念的工程实践典范,它通过模块化设计,将通道(Channel)、技能(Skills)和记忆(Memory)等核心组件解耦,实现了超 阅读详情

相关推荐

从OpenClaw到Nanobot:轻量级AI Agent核心原理与实现解析

AI Agent(智能体)作为连接大语言模型与现实世界的关键技术,其核心在于实现自主推理与工具调用。其底层原理通常围绕一个简洁的“消息循环”架构展开:Agent接收用户指令,通过精心设计的提示工程引导大模型进行思考与规划,解析出结构化的工具调用指令,随后在安全的执行环境中调用注册的工具函数,并将结果反馈至上下文,循环往复直至任务完成。这种设计模式在工程上实现了逻辑的清晰解耦与高效调度,是构建自动化助手、智能客服等应用的基础。本文聚焦于轻量级Agent框架Nanobot,它正是对这一核心原理的极致简化实践,旨

weixin_34248487的博客 465

nanobot的多渠道通信:统一的消息总线

nanobot 的多渠道通信系统采用"消息总线 + Channel 抽象"的设计模式,实现了渠道与 Agent 核心的完全解耦。每个通信渠道(如 Telegram、Discord)只需实现统一的 BaseChannel 接口,就能无缝接入系统。本文将深入剖析多渠道通信系统的设计与实现。

玄同765的AI应用开发博客 1065

【花雕学编程】OpenClaw 热潮下的轻量化 AI 智能体替代方案:四大流派与典型代表

其中,极限轻量派实现了智能体向单片机级别的下沉,具有较强的颠覆性;NanoClaw 的 500 行极简代码与容器隔离设计,以及 IronClaw 的本地优先理念,标志着未来智能体框架将彻底改变“先功能、后安全”的传统模式,将可审计性、最小权限、隐私保护作为核心设计原则,安全性能将成为轻量化智能体的必备属性。从 OpenClaw 的爆发式崛起,到轻量化替代方案的批量涌现,AI 智能体正逐步从“臃肿全能”向“精准适配”转型,四大技术流派的形成,标志着 AI 智能体领域进入规范化、场景化的发展新阶段。

雕爷学编程 431

深入解析nanobot的原理与架构

用户输入 → 构建上下文 → LLM 推理 → 决定调用工具 / 直接回答 → 执行工具 → 把结果当作新观察 → 再次推理,直到任务完成。对于想学习 Agent 原理、搭建个人/团队 AI 助手的开发者来说,nanobot 是一个非常好的“教材级项目”。一个功能完整的 AI Agent,不需要几十万行代码,也不需要复杂的“平台化”设计。,按官方文档填写 Telegram / 飞书 / Discord 的凭证。下面是几个比较典型的应用方向,你可以结合自己公司的场景改写。nanobot 的核心是一个典型的。

weixin_53961451的博客 3743

普冉PY32F003定时器实战:从HSE时钟配置到500ms精准闪烁LED(附完整代码)

本文详细解析了普冉PY32F003单片机定时器的实战应用,从HSE时钟配置到实现500ms精准LED闪烁。通过完整的代码示例和深入的技术分析,帮助开发者掌握定时器参数计算、中断优先级管理及调试技巧,适用于各类嵌入式开发项目。

weixin_30608503的博客 450

别再搞混了!MATLAB通信仿真中EbN0转SNR的保姆级公式推导与避坑指南

本文深入解析MATLAB通信仿真中EbN0与SNR转换的核心公式,揭示数字仿真与理论系统的关键差异。通过真实案例展示错误参数设置导致的隐蔽问题,并提供完整的参数自查清单和正确实现代码,帮助工程师和学生避免常见错误,确保仿真结果准确可靠。

weixin_28746223的博客 348

项目分享|nanobot:超轻量级个人AI助手,4000行代码实现核心智能体能力

本文介绍了HKUDS团队开源的超轻量级个人AI助手nanobot,该项目核心代码仅3935行,较同类项目缩小99%,基于MIT协议开源,支持20+LLM提供商和10+聊天平台对接,兼具轻量、高效、易扩展的特性。文章解析了其多端兼容、低资源消耗、易二次开发等核心优势及个人助手、开发辅助、自动化办公等应用场景,并提供了多种安装方式和Telegram、Docker的部署实践代码,为用户快速上手提供参考。

AladdinEdu,你的AI学习实践工作坊。让想法落地,让研究加速。助力高校AI人才成长,点亮创新未来。 1382

SAP交货单增强字段更新实战:手把手教你用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数

本文详细解析了如何使用BAPI_OUTB_DELIVERY_CHANGE和EXTENSION2参数实现SAP交货单增强字段的更新。从增强点SMOD_V50B0001的定位到字段落表的全流程,提供了ABAP代码示例和常见问题排查方法,帮助开发者高效完成交货单自定义字段的集成开发。

weixin_42525637的博客 452

nanobot-技能与工具调用机制详解

nanobot智能体采用模块化技能系统与工具调用机制实现功能扩展。技能通过标准Markdown文件定义,包含YAML元数据和详细指令,支持渐进式加载策略。工具调用遵循OpenAI标准格式,包含完整的注册、模式生成、执行循环流程。系统优先加载工作区技能,自动检查依赖条件,并生成XML摘要供智能体按需调用。核心实现位于skills.py和tool_call.py,提供从技能发现到工具执行的完整工作流。

Fzuim的博客 1706

手把手教你学Simulink——机器人力控场景实例:基于Simulink的永磁同步电机重力补偿力矩控制仿真

本文介绍了基于Simulink的机器人重力补偿力矩控制仿真方法。针对机器人悬停时电机发热、抖动等问题,提出通过前馈补偿重力转矩的解决方案。文章详细阐述了从机器人动力学建模、重力补偿计算、PMSM转矩控制到系统集成的完整实现流程,并以2-DOF机械臂为例验证了补偿效果。结果表明,重力补偿能显著降低电机电流和拖拽力,提高系统柔顺性。文中还提供了高级功能扩展方向,如参数辨识、摩擦补偿等,为实际工程应用提供了参考框架。

MHD0815的博客 154

YOLOv8改进,YOLOv8添加可变性卷积DCNv2

DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的ConvNets更接近于对象结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为了解决这个问题,我们提出了一种可变形卷积网的重新表述,通过提高建模能力和更强的训练,提高了其专注于相关图像区域的能力。通过更全面地集成网络中的可变形卷积,并引入扩展变形建模范围的调制机制,增强了建模能力。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3606

深入剖析 nanobot:轻量级 AI Agent 框架的架构之道

nanobot 并没有发明新的算法,它的高明之处在于工程实现的克制与优雅极简的接口设计:让接入一个新的 IM 渠道变得异常简单。巧妙的 Prompt 工程:利用虚拟工具解决了结构化输出的难题。务实的记忆管理:通过分层存储,在 Token 消耗和记忆持久性之间找到了平衡。

tho7Dy7M3的博客 699

芒果YOLOv7改进04:Loss篇:原创改进损失函数Repulsion:独家首发最新改进Repulsion Loss解决目标遮挡场景下检测,为解决密集人群检测中遮挡设计的损失函数,打造高效检测器涨点

YOLOv7原创改进Repulsion|首发最新改进为解决密集人群检测中遮挡设计的损失函数

包括YOLOv5、YOLOv7、YOLOv8等模型改进 3251

【nanobot 技术解析]:超轻量级多智能体框架与智能体协作机制深度剖析

当前大多数 AI 智能体框架动辄数万行代码,配置复杂、依赖繁重,让开发者望而却步。**nanobot** 反其道而行之——以约 **5000 行核心代码** 实现企业级 AI 智能体能力,支持 **15+ 通讯渠道**、**30+ LLM 提供商**、**持久化长期记忆** 和 **多智能体后台协作**。它的设计哲学是:**最小的代码复杂度,最大的生产可用性**

独立思考,明辨是非 967

华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】

如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。

MISAYAONE的博客 1万+

8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术

NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。

烟云的计算 4262

极简AI框架nanobot:4000行代码实现高效智能体

在AI工程领域,轻量级框架设计正成为应对复杂场景的关键技术。通过模块化架构和精准功能裁剪,开发者可以在有限资源下实现感知-决策-执行闭环。nanobot框架采用LRU缓存+SQLite的混合存储方案,配合动态权重融合算法,在50MB内存内完成智能决策。这种极简主义工程哲学特别适合边缘计算和物联网场景,其TF-IDF改进算法和协程调度系统在客服对话和自动化测试中展现出20倍于BERT的推理速度。对于需要快速部署的AI应用,此类框架提供了比OpenClaw更优的冷启动和内存表现。

weixin_34293911的博客 466

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

超轻量级AI Agent运行时Nanobot架构解析与实战集成指南

AI Agent作为连接大语言模型(LLM)推理能力与现实世界任务执行的关键技术,其核心在于构建一个稳定、可控的执行环境。其工作原理通常基于事件驱动与任务规划,通过将自然语言指令分解为可执行的步骤序列,并协调工具调用与状态管理来完成复杂目标。这一架构的价值在于将LLM的认知能力转化为可编程、可集成的自动化工作流,从而在智能客服、自动化数据清洗、个人助理等场景中实现效率的显著提升。本文聚焦的Nanobot项目,正是一个为解决上述工程化痛点而设计的超轻量级、可嵌入的AI Agent运行时。它通过极简的层次化设计

weixin_30411819的博客 400

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

第十一篇:他山之石 —— nanobot 架构设计哲学与未来展望

nanobot 以 4000 行代码 践行 “少即是多” 的 Unix 哲学,通过极简的分层架构、文件即接口的持久化设计以及装饰器即插件的扩展方式,实现了高可读、易修改、低依赖的 Agent 框架。与 LangChain、CrewAI、OpenClaw 等主流框架相比,它舍弃了复杂抽象,专注于核心的“感知-决策-行动-记忆”闭环。展望未来,AI Agent 正朝着 可信智能体、MCP/A2A 协议标准化、Skill 化编排 演进,nanobot 已通过 MCP 集成、轻量多 Agent 协作等方向积极适配

weixin_53961451的博客 1106

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

DeepCode:重新定义多智能体AI编程的未来

在当今AI技术飞速发展的时代,代码生成工具已经从简单的代码补全演变为能够理解复杂需求并生成完整项目的智能系统。DeepCode作为开源的多智能体AI编程框架,正在引领这一技术革命,将学术论文、自然语言描述转化为生产就绪的代码实现。本文将深入探讨DeepCode的技术架构、核心优势以及如何在实际开发中应用这一创新工具。 ## 智能体协作:从单点智能到群体智能的范式转变 传统的代码生成工具往往局限

gitblog_01141的博客 470

【OpenClaw】通过Nanobot源码学习架构---(1)总体

OpenRouter、Anthropic (Claude)、OpenAI (GPT)、DeepSeek、Groq、Gemini、MiniMax、AiHubMix、SiliconFlow、VolcEngine、通义千问 (Dashscope)、Moonshot (Kimi)、智谱 (Zhipu)、vLLM、OpenAI Codex、GitHub Copilot。或者说,OpenClaw 是 Agent 中"不是 AI 的部分",而 Agent 的实际"聪明程度"完全取决于背后接入的语言模型。

el81fJoly的博客 219

【OpenClaw】通过 Nanobot 源码学习架构---(1)总体

通过on_job回调 → MessageBus.publish_inbound() → AgentLoop 处理 → MessageBus.publish_outbound() → ChannelManager 分发:通过on_execute回调 → AgentLoop.process_direct()(内部处理),然后通过on_notify回调 → MessageBus.publish_outbound() → ChannelManager 分发。

罗西的思考 490

通过Nanobot源码学习架构---(1)总体

注:本系列借鉴的文章过多,可能在参考文献中有遗漏的文章,如果有,还请大家指出。

QI1CJQKbm的博客 172

前沿重器[83] | nanobot:万字长文解读OpenClaw平替项目源码

在大部分情况下他的确有些好处,但在有些情况下,有比较恶心,例如一个服务经常要重启,此时,每次重启后的第一个需要用到jieba的请求,才会触发加载词典的请求,对单条请求耗时要求高的场景,此时就很容易超时了,因此jieba还给了我们一个主动加载的函数,这样能确保在启动服务的过程就把内容给加载出来。MEMORY的维护,在这个系统里,是存在本地的,这个无疑是不友好的,对多机器并发,A机器的记忆B机器自然读不到,会有很多问题,因此肯定是要上数据库解决。Tools和Skills的维护,也是要用数据库来处理。

baidu_25854831的博客 674

OpenClaw的爆发:OpenClaw如何催生了整个开源AI智能体生态系统

在边缘位置是网关(Gateway)——一个纯粹的流量控制器,它将异构的消息传递协议(通过Baileys的WhatsApp、通过grammY的Telegram、Slack、Discord)标准化为规范的事件格式。其概念看似简单:一个在你的机器上运行的本地网关进程,它连接到你已经使用的消息应用程序(WhatsApp、Telegram、Slack、Signal等),并让大语言模型(LLM)代表你采取现实世界的行动——执行shell命令、自动化浏览器操作、处理电子邮件、管理日历、进行文件操作等等。

Anspire的博客 1214
上一篇: nanobot的多渠道通信:统一的消息总线
下一篇: LLM Provider:统一的多模型接入层
玄同765
玄同765 新星创作者: 人工智能技术领域 新星创作者: 人工智能技术领域
博客等级 码龄6年 1万+粉丝 262原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值