极简AI助手noclaw:C语言实现,内存仅324KB,支持工具调用与记忆

news2026/5/9 16:05:16
1. 项目概述noclaw一个极简主义的AI助手基础设施如果你和我一样对现在动辄几个GB内存、启动慢如蜗牛的AI应用感到厌倦那么noclaw的出现绝对会让你眼前一亮。这是一个用纯C语言编写的、完全自主的AI助手基础设施。它的核心哲学是“极简”没有运行时开销没有外部依赖只有一个不到100KB的二进制文件却能提供完整的AI对话、工具调用和记忆功能。我第一次看到它的基准测试数据时着实吃了一惊——峰值内存占用324KB比一张网页上的小图标favicon占用的内存还要少。这意味着你几乎可以在任何还能通电的设备上运行它从老旧的树莓派Zero到那些被遗忘在角落里的嵌入式开发板。noclaw并不是另一个试图用庞大模型和复杂框架堆砌功能的项目。它的目标非常明确在资源极度受限的环境下提供一个可靠、安全、可扩展的AI助手核心。它脱胎于clawdbot、moltbot乃至openclaw等项目的思想但通过回归C语言和极致的工程优化将“轻量”这个概念推向了新的高度。对于嵌入式开发者、边缘计算爱好者或者任何希望将AI能力集成到资源紧张环境中的工程师来说noclaw提供了一个近乎完美的起点和参考实现。2. 架构设计与核心思想拆解noclaw的卓越性能并非偶然而是其底层架构设计哲学的直接体现。整个项目摒弃了现代软件中常见的“重量级抽象”转而采用了一种近乎于硬件编程的直白和高效策略。2.1 基于函数指针表VTable的模块化设计这是noclaw架构的基石。与面向对象语言中的接口Interface或特质Trait类似noclaw为每一个核心子系统定义了一个由函数指针组成的结构体即VTable。以AI模型提供商Provider为例在nc.h头文件中你会找到一个nc_provider结构体它大致长这样typedef struct nc_provider { const char *name; int (*chat)(struct nc_arena *arena, const char *model, float temperature, struct nc_message *messages, size_t n_messages, char **out_response, struct nc_error *error); // 可能还有其他函数指针如 list_models } nc_provider;项目内置了针对OpenAI兼容API如OpenRouter和Anthropic Claude的两种Provider实现。当你在配置中指定”default_provider”: “openrouter”时程序内部就会将nc_provider_openai这个结构体的地址赋给当前活动的Provider。这种设计的精妙之处在于零成本抽象在运行时调用provider-chat(...)就是一次简单的指针解引用和函数跳转没有任何虚函数表查找或动态分发的开销这与直接调用一个硬编码的函数几乎没有区别。极致的可扩展性如果你想增加对Google Gemini或本地Ollama的支持你不需要修改任何核心的agent.c或gateway.c。只需新建一个provider_gemini.c实现相同的nc_provider结构体并在初始化时注册它即可。这种“插件化”能力在保持核心极度精简的同时提供了强大的灵活性。同样的模式贯穿所有子系统通道Channelnc_channelVTable定义了如何从不同平台CLI, Telegram, Discord, Slack接收和发送消息。这使得同一个AI大脑可以同时服务于命令行用户和多个聊天群组。工具Toolnc_toolVTable定义了AI可以执行的动作如运行shell命令、读写文件、存取记忆。增加一个新工具比如“发送网络请求”或“查询数据库”就是实现一个新的VTable实例。记忆Memorync_memoryVTable定义了如何存储和检索过去的对话与信息。当前内置的“flat-file”后端是一个教科书级的极简设计。注意这种基于纯C的VTable设计要求开发者对函数指针和内存布局有清晰的认识。一个常见的“坑”是确保你的VTable结构体在定义和初始化时每个函数指针的签名必须完全一致否则会导致未定义行为通常表现为神秘的段错误Segmentation Fault。2.2 扁平文件记忆与关键词搜索拒绝向量数据库在AI应用领域“记忆”或“上下文检索”几乎已经成了“向量数据库”和“嵌入模型”的同义词。但noclaw对此说“不”。它采用了一种返璞归真的方法扁平文件存储 关键词搜索 LLM作为排序器。工作原理如下存储每次需要记忆的对话片段或信息会被追加写入一个简单的文本文件例如memory.txt并可能附带一些人工标注或自动提取的关键词。检索当AI需要回忆相关信息时memory.c中的检索函数会 a. 读取整个记忆文件。 b. 基于用户当前查询进行简单的关键词匹配例如查找包含“配置”、“API密钥”等词的段落。 c. 将匹配到的所有候选记忆片段连同当前的用户问题一起发送给LLM。 d. 在提示词Prompt中要求LLM扮演“信息检索排序器”的角色从这些候选片段中选出最相关的一条或几条并直接引用它们来组织答案。为什么这样做复杂度与依赖为零完全不需要SQLite、ChromaDB、PgVector也不需要sentence-transformers等嵌入模型。依赖链为零。资源消耗极低没有创建向量索引的内存和CPU开销对于只有几百KB记忆的小型助手来说线性扫描文本文件的成本可以忽略不计。LLM的理解能力更强关键词匹配是粗糙的但LLM对语义的理解是精确的。让LLM自己来判断哪段记忆最相关往往比单纯计算余弦相似度更准确尤其对于复杂、多义的查询。实操心得这种模式非常适合记忆量不大例如几千到几万字、且记忆内容高度结构化或围绕特定主题的场景。对于需要海量、细粒度记忆的应用这确实不是最佳选择。但noclaw的定位很清晰它不是一个通用知识库而是一个会话工作记忆的延伸。你可以通过实现新的nc_memoryVTable比如基于SQLite的简单全文检索来扩展它核心架构完全支持。2.3 内存管理竞技场分配器Arena Allocator在资源如此紧张的环境中传统malloc/free的频繁调用及其产生的内存碎片是不可接受的。noclaw实现了自定义的竞技场分配器Arena Allocator位于arena.c。它的工作方式就像一卷“记忆胶带”初始化时分配一大块连续内存例如32KB作为一个“块Chunk”。每次程序需要内存比如解析JSON、组装HTTP请求时分配器只是简单地将这块内存的“当前指针”向后移动所需的大小并返回移动前的地址。这被称为“指针碰撞Bump Pointer”。没有单独的free操作。当一次完整的AI交互循环结束例如处理完用户的一条消息并返回响应后调用nc_arena_reset()。这个函数不会释放任何内存给操作系统而是简单地将所有竞技场的“当前指针”重置回起始位置。下一轮交互将直接覆盖使用上一轮的内存空间。这种设计带来了巨大优势速度极快分配操作就是指针加法比通用内存分配器快几个数量级。零内存碎片因为从不释放单个对象所以不存在碎片化问题。生命周期管理简单一次对话回合内的所有临时数据都存在于同一个竞技场中回合结束数据集体“失效”通过重置来复用内存。完全避免了use-after-free或内存泄漏的错误。踩过的坑项目作者提到早期版本使用realloc来扩展一个单一的缓冲区。在glibc上工作良好因为glibc的realloc经常能在原地扩展但在musl libc上却会导致段错误因为musl更可能将内存重新分配到另一个地址。这生动地说明了在追求极致可移植性和确定性的嵌入式/系统编程中依赖特定库实现的未定义行为是多么危险。自定义的、行为明确的分配器才是王道。3. 从零开始编译、配置与核心工作流实操让我们暂时抛开理论动手让noclaw运行起来。你将看到它的“零依赖”承诺是如何实现的。3.1 编译静态链接与尺寸优化获取代码和编译非常简单git clone https://github.com/angristan/noclaw.git cd noclaw接下来你有几个编译选项1. 标准动态链接发布版推荐用于开发和大多数Linux/macOS系统make release这会产生一个约88KB在macOS ARM64上的动态链接二进制文件。它依赖系统上的libc和BearSSL库。你可以用ldd ./noclaw命令查看动态依赖。2. 静态musl链接版用于生产环境或极简Linux系统make musl这是noclaw的“完全体”。这个命令会下载并静态链接musl libc一个极其轻量、标准的C库替代品。静态链接BearSSL一个轻量级TLS库。最终生成一个约270KB的完全静态二进制文件。你可以用file ./noclaw查看它会显示statically linked。核心技巧make musl是noclaw能在任何老旧Linux机器上“scp过去就能跑”的关键。因为它不依赖目标系统上任何特定版本的glibc或其他库。你甚至可以在x86_64的电脑上编译然后scp到一个ARMv5的嵌入式设备上运行。3. 理解尺寸优化BearSSL的定制链接项目文档中提到一个关键优化默认的BearSSL会链接所有45种密码套件。noclaw编写了一个自定义的ssl_client_init_minimal函数只启用4种最常用、最安全的套件如ECDHEAES-GCM。然后在链接时使用-ffunction-sections -fdata-sections和-Wl,--gc-sections编译器/链接器选项。-ffunction-sections -fdata-sections将每个函数和数据段都放到独立的“节section”中。-Wl,--gc-sections告诉链接器进行“垃圾回收”移除那些未被任何代码引用的“节”。 由于只调用了那4种密码套件的相关函数链接器就能“证明”其他41种套件的代码是“死代码”并将其从最终二进制文件中剔除从而节省了约64KB的空间。这是嵌入式开发中控制二进制大小的经典手法。3.2 初始配置与密钥管理编译完成后第一步是进行初始配置。noclaw提供了一个非常便捷的onboard命令./noclaw onboard --api-key sk-your-actual-openrouter-key-here --provider openrouter执行这个命令会在~/.noclaw/目录下创建配置文件config.json。将你提供的API密钥和默认提供商写入配置。你可以使用OpenAI的密钥但更推荐使用OpenRouter作为提供商。OpenRouter是一个聚合网关让你可以用同一个API密钥访问数十种模型包括Claude、GPT、Gemini等且通常费率更灵活。在配置中”default_model”: “anthropic/claude-3.5-sonnet”这样的值就是OpenRouter的模型标识符。安全须知onboard命令不会在终端回显你的API密钥但历史命令可能记录它。更安全的做法是通过环境变量设置export NOCLAW_API_KEYsk-... ./noclaw onboard --provider openrouter或者直接手动编辑~/.noclaw/config.json。配置文件还包含网关、记忆、自主性等级等设置后面会详细解读。3.3 核心工作流交互、单次查询与网关服务配置好后你可以通过三种主要方式与noclaw交互1. 交互式聊天模式最常用./noclaw agent这将启动一个类似ChatGPT的REPL读取-求值-打印循环环境。你可以直接输入问题例如“列出当前目录下的文件。” noclaw的AI会理解你的意图调用shell工具执行ls -la命令并将结果返回给你。对话历史会保存在上下文中。2. 单次命令模式./noclaw agent -m 请用一句话总结noclaw项目的核心优势。这非常适合集成到脚本或自动化流程中。程序执行完单次查询后立即退出。3. 启动HTTP网关服务./noclaw gateway默认情况下网关会监听127.0.0.1:3000。启动后你就拥有了一个轻量级的AI API服务器。它提供了三个端点GET /health健康检查无需认证。POST /pair使用启动时在日志中生成的6位配对码换取一个长期有效的Bearer Token。POST /webhook使用Bearer Token认证向AI发送消息并获取响应。网关使用示例# 1. 查看启动日志获取配对码 ./noclaw gateway # 输出中会包含Pairing code: ABC123 (示例) # 2. 使用配对码换取Token curl -X POST http://127.0.0.1:3000/pair \ -H X-Pairing-Code: ABC123 \ -H Content-Type: application/json \ -d {} # 响应: {token:eyJhbGciOiJ...} # 3. 使用Token与AI对话 curl -X POST http://127.0.0.1:3000/webhook \ -H Authorization: Bearer eyJhbGciOiJ... \ -H Content-Type: application/json \ -d {message: Hello, noclaw!}这种设计使得其他本地应用如Obsidian插件、Raycast脚本、自定义仪表盘可以轻松地与noclaw集成。4. 安全模型与生产环境考量noclaw继承并强化了其前身项目的安全理念默认采用“安全优先”的配置这对于一个能执行shell命令的AI助手至关重要。4.1 多层防御策略解析让我们对照项目文档中的安全清单深入每一层安全层实现方式与原理实操影响与配置1. 网关非公开暴露默认绑定127.0.0.1本地回环地址。这意味着只有本机上的进程能访问网关。0.0.0.0监听所有接口绑定需要显式在配置中启用”allow_public_bind”: true。生产环境建议永远不要在生产服务器上启用allow_public_bind。如果你需要从外部访问应在noclaw前部署一个反向代理如Nginx、Caddy并在代理层配置严格的防火墙规则和HTTPS。noclaw本身只处理HTTP。2. 强制配对认证启动网关时会生成一个随机的6字符配对码如ABC123。任何客户端必须先通过/pair端点用此码换取一个JWT或类似Bearer Token后续所有/webhook请求都必须携带此Token。防止未授权访问即使某人偶然发现了你的网关端口没有配对码也无法获取有效Token。配对码仅在启动时打印一次且程序不会存储它降低了泄露风险。3. 文件系统访问隔离核心配置”workspace_only”: true。当启用时所有文件操作工具file_read,file_write都被限制在当前工作目录或其子目录下。任何包含..上级目录或试图访问绝对路径如/etc/passwd的请求都会被拒绝。工作区概念在启动noclaw agent或gateway前先cd到一个专用于AI工作的目录。例如~/ai_workspace。这样AI就只能在这个“沙箱”内活动。这是最重要的安全屏障。4. Shell命令注入防护Shell工具在执行命令前会对命令和参数进行严格的验证和转义。同时它同样受workspace_only限制任何试图cd到工作区之外的命令也会被拦截。最小权限原则永远不要以root用户身份运行noclaw。应该创建一个专用的、权限受限的系统用户来运行它进一步限制潜在损害。4.2 配置文件深度解读与调优~/.noclaw/config.json是控制noclaw行为的中枢。理解每个字段至关重要{ “api_key”: “sk-...”, “default_provider”: “openrouter”, “default_model”: “anthropic/claude-3.5-sonnet”, // 根据提供商选择模型 “default_temperature”: 0.7, // 创造性0.0更确定1.0更随机 “gateway”: { “port”: 3000, “host”: “127.0.0.1”, “require_pairing”: true, // 强烈建议保持true “allow_public_bind”: false // 除非你知道在做什么否则永远false }, “memory”: { “backend”: “flat”, // 目前唯一内置后端 “auto_save”: true // 每次交互后自动保存记忆到文件 }, “autonomy”: { // **关键安全配置区** “level”: “supervised”, // 模式”supervised”需用户确认每个动作”autonomous”AI自主决定 “workspace_only”: true, // **核心安全开关** “max_actions_per_hour”: 20 // 速率限制防止AI陷入循环或滥用 }, “heartbeat”: { // 健康报告功能 “enabled”: false, “interval_minutes”: 30, // “url”: “https://your-monitor.com/heartbeat” // 如果启用可配置上报URL } }关键配置建议autonomy.level对于生产环境或处理敏感操作务必设置为”supervised”。在此模式下当AI试图执行一个工具调用如运行rm -rf *时会在终端或聊天通道中暂停并询问“我计划执行rm -rf *是否继续(y/N)”。这给了你最后一道人工审核防线。max_actions_per_hour这是一个重要的安全熔断机制。即使AI逻辑出错或被恶意提示词诱导试图无限循环执行某些操作这个限制也会在达到阈值后强制停止会话防止资源耗尽或产生意外费用如果动作是调用付费API。环境变量覆盖所有配置都可以通过环境变量覆盖这便于容器化部署如Docker。例如NOCLAW_WORKSPACE/app/data可以强制设定工作区。5. 扩展开发指南添加新的工具与通道noclaw的VTable架构使得扩展变得异常清晰。这里以添加一个“获取天气”的工具为例演示扩展流程。5.1 添加一个新的工具Tool假设我们想增加一个weather工具让AI能查询指定城市的天气。步骤1在src/tools.c中定义工具函数和VTable实例首先在文件末尾或在逻辑上合适的位置添加新工具的执行函数// 假设我们需要一个简单的HTTP客户端功能但noclaw的http.c是内部使用的。 // 为了简化我们假设调用一个外部命令 curl 来获取天气注意这仅是示例生产环境应使用内置http.c。 static int tool_weather_execute(struct nc_arena *arena, const char *args_json, char **out_result, struct nc_error *error) { // 1. 解析传入的JSON参数。例如{“city”: “Beijing”} // 这里需要用到 json.c 中的解析函数为简化示例我们跳过解析假设城市名直接传递。 // 实际实现应使用 nc_json_parse 等函数。 const char *city “Beijing”; // 示例应从args_json解析 // 2. 构造命令注意生产环境应对city进行严格的shell转义此处仅为演示 char command[256]; snprintf(command, sizeof(command), “curl -s ‘http://wttr.in/%s?format%%C%%t’“, city); // 3. 调用shell工具执行命令。我们可以复用现有的shell工具逻辑。 // 但更优雅的方式是工具之间不应直接调用。我们可以抽象一个安全的命令执行函数。 // 这里为了演示我们直接使用popen不推荐在生产工具中直接使用应使用封装好的安全函数。 FILE *fp popen(command, “r”); if (!fp) { nc_error_set(error, NC_ERR_TOOL, “Failed to execute weather command”); return -1; } // 4. 读取结果 char buffer[512]; size_t len fread(buffer, 1, sizeof(buffer) - 1, fp); buffer[len] ‘\0’; pclose(fp); // 5. 将结果输出AI会看到这个字符串 *out_result nc_arena_strdup(arena, buffer); return 0; // 成功 } // 然后在工具注册数组中找到 g_tools添加新条目 static const struct nc_tool g_tools[] { {“shell”, “Execute a shell command”, tool_shell_execute}, {“file_read”, “Read a file”, tool_file_read_execute}, {“file_write”, “Write to a file”, tool_file_write_execute}, {“memory_store”, “Store information in memory”, tool_memory_store_execute}, {“memory_recall”, “Recall information from memory”, tool_memory_recall_execute}, // 添加我们新的天气工具 {“weather”, “Get current weather for a city”, tool_weather_execute}, {NULL, NULL, NULL} // 哨兵结尾 };步骤2更新工具描述列表供AI知晓AI需要知道它有哪些工具可用。这通常在tools.c的某个初始化函数中通过一个JSON数组提供给LLM。你需要找到构建这个工具列表的地方可能是一个返回工具描述JSON字符串的函数将{“name”: “weather”, “description”: “Get current weather for a city. Input: {\”city\”: \”CityName\”}”}添加进去。步骤3重新编译执行make release或make musl重新编译项目。步骤4测试启动./noclaw agent然后输入“使用weather工具查询一下北京的天气。” AI应该能识别出新工具并调用它。重要警告上面的示例直接使用了popen和未转义的字符串构造命令这在真实工具中是极其危险的会引入严重的命令注入漏洞。在实际开发中你必须使用nc_json_parse安全地解析args_json。对city参数进行严格的验证和过滤例如只允许字母、空格和连字符。最好使用noclaw内部已有的、经过安全加固的进程执行函数如果存在或者自己实现一个不通过shell、直接传递参数给execvp的安全执行函数。5.2 添加一个新的通道Channel添加通道例如支持Matrix或IRC的流程与添加工具类似在src/channel.c中参照cli_channel或telegram_channel的结构实现一个新的struct nc_channel。实现其poll检查新消息、send发送回复等函数指针。将该通道注册到全局通道列表。在main.c或配置解析中允许用户通过--channel matrix这样的参数启用它。6. 性能剖析、问题排查与实战心得6.1 性能数据解读与对比让我们再仔细看看那个令人印象深刻的基准测试表。noclaw的324 KB 峰值RSS常驻内存集是什么概念一个典型的现代文本编辑器如VS Code的一个空白标签页可能占用300MB以上。一个Python解释器空进程可能占用30MB。noclaw的整个AI助手包括HTTP服务器、JSON解析器、TLS栈和AI交互逻辑只占用了0.3 MB。“idk man”的启动时间作者幽默地表示没有0.8GHz的CPU测试但我们可以推断。一个纯C、静态链接、无复杂初始化的程序其启动时间主要花在操作系统加载二进制文件到内存。对于88KB-270KB的文件这通常是毫秒级甚至可能是亚毫秒级。相比之下基于Node.js或Python的项目启动时需要加载解释器、解析成千上万的模块耗时几秒到几十秒是常态。与NullClawZig的对比NullClaw声称~1MB RAM但注释指出其TLS内存未计入因为它通过调用外部curl进程来处理HTTP。noclaw将TLSBearSSL集成在进程内其报告的324KB是包含所有功能的完整内存占用。这种“零进程”架构减少了进程间通信的开销和复杂性是更纯粹、更自包含的设计。6.2 常见问题与排查实录在实际部署和开发中你可能会遇到以下问题问题1编译make musl失败提示找不到musl-gcc。原因你的系统上没有安装musl交叉编译工具链。解决在Ubuntu/Debian上sudo apt install musl-tools。在macOS上可以通过Homebrew安装brew install filosottile/musl-cross/musl-cross。然后你可能需要修改Makefile中的CC_musl变量指向正确的musl-gcc路径。问题2运行./noclaw gateway后curl /pair返回错误或超时。排查步骤检查绑定地址确认网关是否成功启动并绑定在127.0.0.1:3000。使用netstat -tlnp | grep 3000或ss -tlnp | grep 3000查看。检查防火墙本地环回接口通常不受防火墙限制但某些严格的安全策略可能例外。查看日志运行./noclaw gateway时确保没有错误输出。配对码是否正常打印确认配对码配对码是大小写敏感的且有时容易混淆字符如0和O1和I。仔细核对。检查请求格式确保curl命令的头部和JSON体格式正确。可以使用-v参数查看详细请求/响应。问题3AI工具调用失败例如file_read返回“权限被拒绝”或“路径不允许”。原因几乎肯定是workspace_only安全规则在起作用。解决确保你是在一个特定的工作目录下启动noclaw。检查你要读写的文件路径是否在工作目录内。绝对路径如/home/user/file.txt会被拒绝。应使用相对路径如file.txt或subdir/file.txt。路径中不能包含..。问题4内存使用随着对话增长而缓慢增加但nc_arena_reset()似乎没完全释放。理解这是竞技场分配器的设计使然。reset只是重置指针并不将内存归还给操作系统。因此从操作系统的角度看通过top或htop的RES列内存占用不会下降。但这不是内存泄漏。只要程序的生命周期内内存占用稳定在峰值水平即单个对话回合所需的最大内存就是正常的。监控真正的内存泄漏是指这个峰值会无限制地增长。你可以长时间运行noclaw处理大量请求观察其RSS是否稳定在一个水平。noclaw的架构设计使其很难发生传统意义上的泄漏因为所有临时数据都来自竞技场而竞技场在每轮结束时被整体重置。问题5HTTP请求长时间挂起无响应。原因项目文档中提到了一个关键点br_sslio_write是带缓冲的。如果你在使用BearSSL时写完请求体后没有调用br_sslio_flush()就去读取响应那么数据可能还在缓冲区里没有发送到网络。解决检查src/http.c中基于BearSSL的实现确保在发送请求后、开始接收响应前有刷新缓冲区的操作。这是底层网络编程中一个非常典型的“坑”。6.3 生产环境部署建议使用系统服务管理不要直接在前台运行./noclaw gateway。使用systemdLinux或launchdmacOS将其作为守护进程运行。这能保证服务在崩溃后重启并方便管理日志。# 示例 systemd 服务文件 (/etc/systemd/system/noclaw.service) [Unit] DescriptionNoClaw AI Assistant Afternetwork.target [Service] Typesimple Usernoclaw WorkingDirectory/home/noclaw/workspace Environment”NOCLAW_API_KEYsk-...” ExecStart/usr/local/bin/noclaw gateway Restarton-failure RestartSec5 [Install] WantedBymulti-user.target日志与监控noclaw的输出到标准输出/错误。通过systemd的Journal或重定向到文件来收集日志。可以启用heartbeat功能如果实现向监控系统发送存活信号。反向代理与HTTPS如前所述使用Nginx或Caddy作为反向代理。在代理层配置SSL/TLS证书例如使用Let‘s Encrypt将HTTPS流量解密后转发到本地的127.0.0.1:3000。同时在代理层可以添加速率限制、IP白名单等额外安全措施。资源限制使用ulimit或 systemd的LimitCPU,LimitMEMORY等指令对noclaw进程可以使用的内存和CPU进行限制防止其因意外消耗过多资源。noclaw展示了一种可能性强大的AI功能未必需要庞大的软件栈。通过极致的工程优化、清晰抽象的架构和对底层资源的精细控制我们可以在指甲盖大小的资源上构建出实用、安全且可扩展的智能系统。它更像是一个精心打造的工具箱或一套乐高积木而不是一个封闭的黑盒应用。你可以直接使用它也可以深入其仅14个源文件、约5000行代码的核心学习其设计思想并将其裁剪、改造嵌入到你自己的硬件或软件产品中。在这个AI日益复杂和臃肿的时代noclaw的极简主义如同一股清流提醒着我们有时候少即是多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2598037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…