1. 项目概述:从OpenClaw到小龙虾的进化之路
去年夏天,当我第一次接触OpenClaw框架时,就被它强大的工具调用能力和灵活的提示词架构所震撼。作为一个长期从事AI应用开发的工程师,我深知构建一个可靠的AI助手系统有多复杂——需要处理工具调度、上下文管理、记忆检索等众多难题。OpenClaw确实提供了一个优秀的解决方案,但在实际使用过程中,我发现了一些痛点:
首先是插件生态的不稳定性。QQ插件经常出现消息丢失,飞书插件则时不时卡死,严重影响工作效率。其次是框架本身的复杂度,OpenClaw为了支持各种企业级场景,引入了大量我并不需要的功能模块,导致学习曲线陡峭。最让我头疼的是那个"伪指令"问题——AI有时会返回看似正确的工具调用代码,但实际上并未真正执行。
基于这些痛点,我决定开发一个轻量级的替代方案,这就是"小龙虾"项目的由来。它保留了OpenClaw的核心架构,但做了以下关键改进:
- 精简架构:去除了企业级功能,专注核心的对话、工具调用和技能管理
- 稳定通信:采用SSE(Server-Sent Events)实现前后端实时交互,避免插件不稳定性
- 严格的消息协议:重新设计工具调用流程,彻底解决伪指令问题
- 模块化提示词系统:动态组装提示词,支持热更新而无需重启服务
经过三个月的迭代,小龙虾已经成长为一个功能完备的AI助手框架。它特别适合个人开发者和小团队使用,你可以在几小时内完成部署,而不是像OpenClaw那样需要数天的配置。下面我将详细介绍这个系统的技术实现细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计解析
2.1 整体架构设计
小龙虾采用经典的前后端分离架构,但与传统Web应用不同,它的设计更注重实时性和工具调度能力。整个系统可以分为四个主要层次:
通信层:基于HTTP/SSE的混合协议
- 普通API请求使用HTTP RESTful接口
- 实时消息推送采用SSE长连接
- 二进制数据传输(如图片)使用WebSocket
核心服务层:
- 对话引擎:处理消息路由、上下文管理
- 工具调度器:管理工具注册、执行和生命周期
- 技能加载器:支持技能的热插拔
- 记忆系统:实现短期对话记忆和长期知识存储
数据持久层:
- 文件系统:用于存储技能配置、记忆文件等
- 内存缓存:使用Redis加速频繁访问的数据
- 向量数据库(未来扩展):用于高效记忆检索
客户端层:
- 桌面客户端:基于PySide6的跨平台应用
- 命令行界面:适合开发者调试
- Web界面(规划中):基于Vue.js的管理控制台
这种分层架构带来了几个关键优势:
- 可扩展性:每层都可以独立扩展,比如通信层可以替换为gRPC
- 可靠性:核心服务无状态设计,故障恢复快
- 灵活性:客户端可以根据需求定制,不影响核心逻辑
2.2 关键技术选型
后端技术栈:
- 运行时:Node.js 18+ (ES Modules)
- Web框架:Express风格的轻量级HTTP服务器
- 进程管理:PM2 (生产环境)
- API规范:OpenAPI 3.0
前端技术栈:
- 语言:Python 3.10+
- GUI框架:PySide6 (Qt for Python)
- 打包工具:PyInstaller
AI相关组件:
- 大模型API:千问3.5+
- 嵌入模型:bge-small-zh-v1.5 (用于记忆检索)
- 工具调用:兼容OpenAI Function Calling标准
选择这些技术主要基于以下考虑:
- 开发效率:Node.js和Python都有丰富的生态,能快速实现原型
- 性能平衡:JavaScript适合IO密集型任务,Python适合快速开发客户端
- 兼容性:使用行业标准协议(如Function Calling)便于集成其他系统
2.3 核心模块交互流程
让我们通过一个典型工具调用场景,看看各模块如何协同工作:
-
用户发起请求:
mermaid复制sequenceDiagram participant User participant Client participant Server participant AI participant Tool User->>Client: 输入"查看/data/report.md内容" Client->>Server: POST /api/chat {message: "查看..."} -
服务端处理:
javascript复制// 伪代码展示核心处理逻辑 async function handleChatRequest(request) { // 1. 验证并解析请求 const { message, taskId } = validateRequest(request); // 2. 构建对话历史 const messages = [ { role: 'system', content: systemPrompt }, { role: 'user', content: message } ]; // 3. 调用AI获取响应 const aiResponse = await callAI(messages); // 4. 处理工具调用 if (aiResponse.tool_calls) { const toolResults = []; for (const toolCall of aiResponse.tool_calls) { // 执行实际工具调用 const result = await executeTool(toolCall); toolResults.push(result); } // 更新消息历史 messages.push({ role: 'assistant', content: null, tool_calls: aiResponse.tool_calls }); for (let i = 0; i < toolResults.length; i++) { messages.push({ role: 'tool', tool_call_id: aiResponse.tool_calls[i].id, content: toolResults[i] }); } // 二次调用AI生成最终回复 return await callAI(messages); } return aiResponse.content; } -
客户端展示:
- 通过SSE接收进度更新
- 实时显示工具执行状态
- 最终渲染AI回复
这个流程体现了小龙虾的核心设计理念:严格的协议遵循和透明的执行过程。每个步骤都有明确的输入输出规范,确保系统行为可预测。
3. 提示词工程实践
3.1 动态提示词架构
小龙虾的提示词系统是其最核心的创新之一。与静态提示词不同,它采用动态组装的方式,根据上下文实时构建最适合当前任务的提示。这种设计带
