- 🧠 持久化记忆 - 跨会话记住用户偏好、事实和任务进度
- 🔍 智能检索 - 基于 SeekDB 的混合向量搜索(关键词 + 语义)
- 🤖 AI 驱动 - 阿里云百炼 Qwen 模型,支持中文优化
- 🛠️ MCP 工具调用 - 可扩展的外部系统集成能力
- 📦 Skills 编排 - 复杂任务的多步骤自动化执行
- 🔒 多租户隔离 - 企业级数据安全与隐私保护
┌─────────────────┐
│ Next.js UI │
│ (流式对话界面) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ /api/chat │
│ (Node.js 运行时) │
└────────┬────────┘
│
▼
┌─────────────────────────────────────┐
│ LangGraph 工作流引擎 │
│ ┌──────────┐ ┌──────────┐ │
│ │ 意图识别 │→ │ 记忆检索 │ │
│ └──────────┘ └──────────┘ │
│ ↓ ↓ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 响应生成 │← │ MCP/Skills│ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────┘
│
├─────────────┐
▼ ▼
┌────────────────┐ ┌──────────────┐
│ SeekDB │ │ 阿里云百炼 │
│ (记忆存储) │ │ (Qwen 模型) │
└────────────────┘ └──────────────┘
| 层级 | 技术选型 | 说明 |
|---|---|---|
| 前端 | Next.js 16 + React | SSR/ISR 支持,流式输出 |
| 编排 | LangGraph | 状态机驱动的多节点工作流 |
| 记忆 | SeekDB (OceanBase) | 向量数据库,支持混合检索 |
| 模型 | 阿里云百炼 Qwen | qwen-plus 对话 + text-embedding-v4 |
| 部署 | Vercel | Serverless + Cron 定时任务 |
| 扩展 | MCP Protocol | 外部工具/资源统一接入 |
# 克隆项目
git clone https://github.com/kejun/eywa-chat.git
cd eywa-chat
# 安装依赖
npm install
# 复制环境变量
cp .env.example .env.local编辑 .env.local:
# 阿里云百炼 (DashScope)
DASHSCOPE_API_KEY=sk-your-api-key
DASHSCOPE_MODEL=qwen-plus
DASHSCOPE_BASE_URL=https://dashscope-intl.aliyuncs.com/compatible-mode/v1
# SeekDB 配置
SEEKDB_HOST=localhost
SEEKDB_PORT=2881
SEEKDB_USER=root
SEEKDB_PASSWORD=
SEEKDB_DATABASE=chatbot_memory
# 认证配置
AUTH_JWT_SECRET=your-jwt-secret
AUTH_TENANT_CLAIM=tenantId
AUTH_USER_CLAIM=userIddocker run -d --name seekdb \
--restart unless-stopped \
-p 2881:2881 \
-v ~/seekdb/data:/var/lib/seekdb \
-e SEEKDB_ADMIN_PASSWORD= \
oceanbase/seekdb:latestnpm run dev| 类型 | 说明 | 示例 |
|---|---|---|
profile |
用户基本信息 | "我叫张三"、"我是工程师" |
preference |
个人偏好 | "喜欢打篮球"、"偏好高铁" |
fact |
客观事实 | "下周去上海出差" |
task |
待办任务 | "帮我记得买咖啡" |
summary |
对话摘要 | 每 N 轮自动压缩生成 |
interface MemoryMetadata {
tenantId: string; // 租户 ID(多租户隔离)
userId: string; // 用户 ID
threadId?: string; // 线程 ID(可选,用于线程级记忆)
memoryType: MemoryType; // 记忆类型
importance: number; // 重要度 1-5
createdAt: number; // 创建时间戳
lastAccessAt: number; // 最后访问时间
expiresAt?: number; // 过期时间(TTL)
sourceMessageId: string; // 来源消息 ID
version: number; // 版本号
tags: string[]; // 标签
}采用 混合检索(Hybrid Search) 提升准确率:
- 关键词匹配 - 处理显式实体(产品名、日期、术语)
- 向量语义 - 处理同义表达、隐含意图
- RRF 融合 - Reciprocal Rank Fusion 提升稳定性
- 元数据过滤 - 强制
tenantId + userId隔离
// 检索示例
const memories = await repository.retrieveMemories({
tenantId: "t1",
userId: "u1",
queryText: "我喜欢的运动",
nResults: 8,
});集成外部系统(日历、CRM、工单等):
// MCP 工具调用示例
const result = await mcpClient.callTool({
server: "google-calendar",
tool: "create-event",
args: {
title: "团队会议",
time: "2026-02-22T14:00:00Z",
},
});封装复杂任务流程:
// Skill 定义示例
const createTravelPlanSkill: SkillDefinition = {
name: "create-travel-plan",
description: "创建出差旅行计划",
inputSchema: { /* JSON Schema */ },
run: async (ctx) => {
// 多步骤执行逻辑
// 1. 查询航班
// 2. 预订酒店
// 3. 创建日历事件
// 4. 保存偏好到记忆
},
};流式对话接口。
请求:
{
"threadId": "thread-001",
"message": "我下周去上海出差,帮我记住我偏好高铁"
}响应(SSE 流式):
event: meta
data: {"traceId":"abc123"}
event: token
data: {"text":"好的,我已经记住了"}
event: done
data: {"retrievedCount":2,"persistedCount":1}
查看当前用户的记忆列表。
查询参数:
limit- 返回数量(默认 20)memoryType- 按类型过滤
删除指定记忆(��规要求)。
- 连接 GitHub 仓库到 Vercel
- 配置环境变量(见
.env.example) - 部署生产版本:
npx vercel deploy --prod详细步骤见:SeekDB Docker 部署指南
关键配置:
- 云服务器开放端口
2881(安全组入站规则) - 使用空密码或强密码认证
- 定期备份数据卷
~/seekdb/data
在 Vercel Project Settings → Environment Variables 中配置:
| 变量名 | 生产值 | 说明 |
|---|---|---|
DASHSCOPE_API_KEY |
sk-xxx |
阿里云百炼 API Key |
DASHSCOPE_BASE_URL |
https://dashscope-intl.aliyuncs.com/compatible-mode/v1 |
国际版 endpoint |
SEEKDB_HOST |
43.160.241.135 |
云服务器公网 IP |
SEEKDB_PORT |
2881 |
SeekDB 端口 |
SEEKDB_USER |
root |
数据库用户 |
SEEKDB_PASSWORD |
`` | 空密码(或设置强密码) |
SEEKDB_DATABASE |
chatbot_memory |
数据库名 |
- ✅ 多租户强隔离 - 所有查询强制
tenantId + userId过滤 - ✅ 记忆可删除 - 用户可查看、删除个人记忆(GDPR 合规)
- ✅ 数据最小化 - 仅存储有价值的记忆,不存完整对话
- ✅ 敏感信息检测 - 入库前脱敏或拒绝存储(身份证、银行卡等)
- ✅ TTL 策略 - 支持记忆自动过期清理
- 响应延迟 - P50/P95 时延
- 记忆命中率 - 检索到的记忆被正确引用的比例
- 写回成功率 - 记忆持久化成功率
- Token 成本 - 输入/输出 token 统计
# Vercel 日志
npx vercel logs <deployment-url> --follow
# SeekDB 诊断
curl <vercel-url>/api/debug/seekdb- 单租户 MVP
- 混合检索 + 记忆写回
- Vercel + SeekDB 生产部署
- 阿里云百炼集成
- 记忆去重与冲突解决
- 重要度打分 + recency 衰减
- 可视化调试页面
- 多租户完善
- MCP 市场(预置工具库)
- A/B 测试框架
- 成本优化(分层模型 + 缓存)
| 文档 | 说明 |
|---|---|
| 技术规格 | 完整技术设计文档 |
| SeekDB 部署 | Docker 部署指南 ⭐ |
| 实施计划 | 里程碑与验收标准 |
| 运行手册 | 上线运维指南 |
| 性能报告 | 压测结果模板 |
欢迎提交 Issue 和 Pull Request!
主要贡献方向:
- 🐛 Bug 修复
- ✨ 新功能(MCP 工具、Skills)
- 📝 文档改进
- 🧪 测试用例
MIT License
