diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index ecf7f69..136a3b2 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,14 +11,13 @@ "id": "9a5781991bf94030", "type": "leaf", "state": { - "type": "markdown", + "type": "bases", "state": { - "file": "docs/dify/用户注册及添加成员.md", - "mode": "source", - "source": false + "file": "未命名 1.base", + "viewName": "表格" }, - "icon": "lucide-file", - "title": "用户注册及添加成员" + "icon": "lucide-table", + "title": "未命名 1" } }, { @@ -27,30 +26,44 @@ "state": { "type": "markdown", "state": { - "file": "docs/Obsidian笔记体系/Projects/aitsc/ai提示词常用命令.md", + "file": "docs/Obsidian笔记体系/Daily/2026-01-13.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "ai提示词常用命令" + "title": "2026-01-13" } }, { - "id": "efa2dc303e8e694d", + "id": "59894255df52f532", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "docs/cursor/cursor.md", + "file": "docs/Obsidian笔记体系/Projects/知你-调测/知你--调测.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "cursor" + "title": "知你--调测" + } + }, + { + "id": "c40cc65d2419fc22", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "docs/学习笔记/Android WindowManagerService (WMS) 架构深度解析(第一次提示词).md", + "mode": "source", + "source": false + }, + "icon": "lucide-file", + "title": "Android WindowManagerService (WMS) 架构深度解析(第一次提示词)" } } ], - "currentTab": 2 + "currentTab": 3 } ], "direction": "vertical" @@ -82,7 +95,7 @@ "state": { "type": "search", "state": { - "query": "计算云", + "query": "path:\"docs/Obsidian笔记体系/Config/\" ", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -107,7 +120,7 @@ } ], "direction": "horizontal", - "width": 300 + "width": 457.5 }, "right": { "id": "1e41a867da6b7f39", @@ -203,46 +216,47 @@ }, "left-ribbon": { "hiddenItems": { + "bases:新建数据库": false, "switcher:打开快速切换": false, "graph:查看关系图谱": false, "canvas:新建白板": false, "daily-notes:打开/创建今天的日记": false, "templates:插入模板": false, - "command-palette:打开命令面板": false, - "bases:新建数据库": false + "command-palette:打开命令面板": false } }, - "active": "efa2dc303e8e694d", + "active": "c40cc65d2419fc22", "lastOpenFiles": [ - "docs/cursor/cursor使用技巧.md", - "docs/学习笔记/php/云服务器龙虾.md", - "docs/学习笔记/龙虾能力.md", - "docs/Obsidian笔记体系/Projects/aitsc/ai提示词常用命令.md", - "docs/学习笔记/龙虾配置.md", - "docs/学习笔记/腾讯云相关账户.md", - "docs/学习笔记/腾讯云龙虾.md", - "docs/学习笔记/php/php学习目录.md", - "docs/cursor/cursor.md", - "docs/学习笔记/Android整机性能分析与问题定位实战指南.md", - "未命名 1.base", - "docs/Obsidian笔记体系/Projects/提示词大师/提示词大师.md", - "docs/Obsidian笔记体系/Projects/提示词大师", - "docs/学习笔记/Android WindowManagerService (WMS) 架构深度解析(第一次提示词).md", "docs/学习笔记/Android WindowManagerService核心原理深度解析(专家第二次提示词).md", - "docs/学习笔记/两份提示词对比.md", - "docs/学习笔记/前端学习.md", - "docs/学习笔记/效率提升.md", "docs/学习笔记/Android性能分析标准化操作手册.md", - "docs/Obsidian笔记体系/Daily/2026-01-13.md", "docs/学习笔记/Android游戏整机性能卡顿与丢帧根因分析与优化指南.md", - "docs/# Android WindowManagerService (WMS) 架构深度解析(专家第一次提示词).md", - "docs/Obsidian笔记体系/Projects/知你-调测/知你--调测.md", + "docs/学习笔记/Android整机性能分析与问题定位实战指南.md", + "docs/学习笔记/DevOps学习.md", + "docs/cursor/cursor使用技巧.md", + "docs/Obsidian/高频命令.md", + "docs/cursor/cursor.md", + "docs/Obsidian笔记体系/Projects/聊天平台/测试用例.md", + "docs/Obsidian笔记体系/Projects/聊天平台/知你客服 6 号(检索增强记忆).md", + "docs/Obsidian笔记体系/Projects/聊天平台/聊天模型记忆解解方案.md", + "docs/Obsidian笔记体系/Projects/聊天平台/未命名.md", + "docs/Obsidian笔记体系/Projects/聊天平台/知你客服5号的设计.md", + "docs/Obsidian笔记体系/Projects/聊天平台/agent智能体性能调测.md", + "docs/Obsidian笔记体系/Projects/聊天平台/接入方式.md", + "docs/Obsidian笔记体系/Projects/聊天平台/聊天平台.md", + "docs/adb调试命令/adb常用命令.md", + "docs/Obsidian笔记体系/Projects/聊天平台/app.md", + "docs/Obsidian笔记体系/Projects/聊天平台/数据库配置.md", + "docs/Obsidian笔记体系/Projects/saars开发/数据库配置.md", + "docs/Obsidian笔记体系/Projects/saars开发/aiapply/智能配置助手功能已完成.md", + "docs/Obsidian笔记体系/Projects/saars开发/aiapply/聊天智能机器人(苏苏).md", + "docs/Obsidian笔记体系/Projects/saars开发/aiapply/电商系统用户订单处理流程设计方案.md", + "docs/Obsidian笔记体系/Projects/saars开发/aiapply/个人简历.md", + "docs/Obsidian笔记体系/Projects/saars开发/aiapply/# 创建Agent经验总结.md", + "docs/Obsidian笔记体系/Projects/aitsc/ai提示词常用命令.md", + "docs/Obsidian笔记体系/Projects/聊天平台", "docs/Obsidian笔记体系/Projects/aitsc", - "docs/Obsidian笔记体系/Daily/2026-01-14.md", - "docs/Obsidian笔记体系/Daily/2024-06-02.md", - "docs/Obsidian笔记体系/Daily/2026-01-15.md", - "docs/Obsidian笔记体系/Daily/2026-01-20.md", - "docs/学习笔记/高级性能问题分析.md", + "未命名 1.base", + "docs/Obsidian笔记体系/Projects/提示词大师", "docs/学习笔记/产品经理", "Pasted image 20260129111501.png", "Pasted image 20260129111451.png", @@ -258,7 +272,6 @@ "docs/Obsidian笔记体系/Projects/女童生长激素项目", "docs/学习笔记/php", "docs/cursor/php", - "com.xiaomi.appstore.appclaim.signature.verification.apk", - "docs/android面试/系统原理/DPMS常见面试题" + "com.xiaomi.appstore.appclaim.signature.verification.apk" ] } \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/agent智能体性能调测.md b/docs/Obsidian笔记体系/Projects/聊天平台/agent智能体性能调测.md new file mode 100644 index 0000000..a2698cf --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/agent智能体性能调测.md @@ -0,0 +1,13 @@ +编写脚本:向知你客服发送测试消息、拉取执行性能数据并生成分析报告。 + + +完整节点耗时表与上述优化说明已写入 知你客服-节点耗时分析与优化方案.md,可直接打开查看;脚本在 backend/scripts/test_agent_and_analyze_performance.py,需要时可再次运行以复测或对比优化前后耗时。 + + + + + + + +下一步: +若需要和之前完全一致的对外格式,可在 SAARS 或 8037 的 end 后增加一层轻量转换(只做字段映射,不再调 LLM)。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/app.md b/docs/Obsidian笔记体系/Projects/聊天平台/app.md new file mode 100644 index 0000000..f9942d5 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/app.md @@ -0,0 +1 @@ +你可以直接说:要“先能登录+看会话+发一条消息”即可,我就按这个范围写;若要加上 Room 离线、Socket.IO、FCM,也可以一起排进去。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/接入方式.md b/docs/Obsidian笔记体系/Projects/聊天平台/接入方式.md new file mode 100644 index 0000000..d544dee --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/接入方式.md @@ -0,0 +1,319 @@ +# 知你客服 Agent 智能聊天 App 接入方案 + + + +## 一、结论 + + + +**可以接入。**「知你客服」是平台上的已发布聊天智能体,支持记忆管理、意图识别与多轮对话,通过平台提供的 **执行 API** 即可在智能聊天 App 中调用,由 App 后端或前端携带平台用户 Token 调用即可。 + + + +--- + + + +## 二、接入方式概览 + + + +| 方式 | 适用场景 | 说明 | + +|------|----------|------| + +| **方式一:App 后端代理** | 推荐,移动端/多端 App | App 后端用平台账号拿 Token,代用户调执行 API,再把结果返回给 App | + +| **方式二:前端直连** | Web 版聊天、用户已在平台登录 | 前端拿到平台 Token 后直接调执行 API(同域名或配置 CORS) | + +| **方式三:内嵌平台对话页** | 快速上线 | 用 iframe 或 H5 打开平台「使用」页的对话界面,无需对接 API | + + + +--- + + + +## 三、方式一:App 后端代理(推荐) + + + +### 3.1 流程 + + + +1. 在平台为「对接用」创建一个账号(如 `app-service@yourcompany.com`),并登录拿到 **access_token**。 + +2. 在平台 **Agent 管理** 中打开「知你客服」,复制其 **Agent ID**(或通过「获取 Agent 列表」接口查到)。 + +3. App 用户发消息时,App 后端: + +   - 用上述 token 调「创建执行」接口,传入 `agent_id` 和 `input_data`(见下)。 + +   - 轮询「执行状态」或「执行详情」,直到 `status` 为 `completed`。 + +   - 从 `output_data` 中取出回复内容返回给 App 用户。 + + + +### 3.2 接口说明(与知你客服约定) + + + +- **Base URL**:`http(s)://你的平台域名:8037`(如 `http://101.43.95.130:8037`) + + + +**1)登录拿 Token** + + + +```http + +POST /api/v1/auth/login + +Content-Type: application/x-www-form-urlencoded + + + +username=app-service&password=xxx + +``` + + + +响应示例: + + + +```json + +{ "access_token": "eyJ...", "token_type": "bearer" } + +``` + + + +**2)创建执行(发用户消息给知你客服)** + + + +```http + +POST /api/v1/executions + +Authorization: Bearer + +Content-Type: application/json + + + +{ + +  "agent_id": "知你客服的Agent ID", + +  "input_data": { + +    "query": "用户当前这句话", + +    "user_id": "app侧用户唯一ID" + +  } + +} + +``` + + + +- `query`:必填,用户本轮输入。 + +- `user_id`:建议传。知你客服工作流里用「缓存」做记忆时,key 一般为 `user_memory_{user_id}`,传了才能按用户隔离多轮记忆。 + + + +响应示例: + + + +```json + +{ + +  "id": "execution_uuid", + +  "agent_id": "...", + +  "status": "pending", + +  "task_id": "celery_task_id", + +  "created_at": "2026-01-22T..." + +} + +``` + + + +**3)轮询执行结果** + + + +```http + +GET /api/v1/executions/{execution_id}/status + +Authorization: Bearer + +``` + + + +返回中有 `status`:`pending` / `running` / `completed` / `failed`。为 `completed` 后再取详情。 + + + +```http + +GET /api/v1/executions/{execution_id} + +Authorization: Bearer + +``` + + + +响应中的 `output_data` 即为工作流输出,其中会包含客服回复内容(具体字段以知你客服工作流 End 节点输出为准,常见为 `reply`、`content`、`output` 等)。 + + + +### 3.3 App 后端实现要点 + + + +- Token 管理:登录一次,将 `access_token` 缓存在服务端(注意过期时间,过期前重新登录或使用 refresh 若平台支持)。 + +- 每个 App 用户建议固定一个 `user_id`(如 open_id、user_uuid),保证多轮对话记忆正确。 + +- 轮询间隔建议 0.5~1 秒,最多轮询约 30~60 秒,超时可按「请求超时」处理。 + + + +--- + + + +## 四、方式二:前端直连 + + + +适用于「用户已在低代码平台登录」的 Web 聊天场景: + + + +1. 前端从平台登录接口拿到 `access_token`。 + +2. 用户发消息时,前端直接: + +   - `POST /api/v1/executions`,body 同上(`agent_id` + `input_data`)。 + +   - 轮询 `GET /api/v1/executions/{id}/status` 和 `GET /api/v1/executions/{id}`。 + +3. 将 `output_data` 中的回复展示在聊天界面。 + + + +注意:需保证前端请求能带 Cookie/Header 到 8037 端口,且平台 CORS 已放行该前端域名(当前配置见 `docker-compose.dev.yml` 中 `CORS_ORIGINS`)。 + + + +--- + + + +## 五、方式三:内嵌平台对话页 + + + +- 在 Agent 管理中对「知你客服」点击 **「使用」**,会打开平台自带的对话页。 + +- 在智能聊天 App 内用 **WebView / iframe** 打开该对话页 URL,即可在 App 内使用知你客服,无需对接执行 API。 + +- 优点:零开发量;缺点:界面与账号体系受平台限制,且无法深度定制 UI 与用户标识(多端统一记忆需平台支持「使用」页传 user_id 等参数,若当前不支持可向平台侧确认是否可扩展)。 + + + +--- + + + +## 六、知你客服输入输出约定(建议在平台上确认) + + + +- **输入**(`input_data`): + +  - `query`(必填):用户当前轮次文本。 + +  - `user_id`(建议):App 侧用户唯一 ID,用于记忆 key。 + +- **输出**(`output_data`): + +  - 以实际工作流 End 节点输出为准,可在平台「执行历史」中跑一轮对话,查看该执行详情中的 `output_data` 结构,再在 App 中解析展示。 + + + +--- + + + +## 七、获取 Agent ID + + + +- 方式 A:在 Agent 管理列表中,用浏览器开发者工具查看「知你客服」对应行的接口或 DOM,可看到 `id`。 + +- 方式 B:调用平台接口(需登录): + + + +```http + +GET /api/v1/agents?search=知你客服 + +Authorization: Bearer + +``` + + + +在返回列表中找到名称为「知你客服」的项,取其 `id` 作为上述 `agent_id`。 + + + +--- + + + +## 八、小结 + + + +| 项目 | 说明 | + +|------|------| + +| 是否可接入 | 可以,通过执行 API 或内嵌「使用」页 | + +| 推荐方式 | 智能聊天 App 用 **App 后端代理**(方式一) | + +| 认证 | 使用平台账号登录得到的 Bearer Token | + +| 多轮记忆 | 在 `input_data` 中传稳定 `user_id` | + +| 文档与调试 | 可访问 `http(s)://域名:8037/docs` 查看并调试执行、状态、详情等接口 | + + + +若后续需要「无登录、仅用 API Key 调用知你客服」,需在平台侧为 Agent 增加 API Key 鉴权接口,再在 App 后端用 Key 替代 Token 调用即可;当前版本按上述 Token 方式即可完成接入。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/数据库配置.md b/docs/Obsidian笔记体系/Projects/聊天平台/数据库配置.md new file mode 100644 index 0000000..04f1d29 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/数据库配置.md @@ -0,0 +1,3 @@ +# 数据库配置 - 腾讯云数据库 + +DATABASE_URL=mysql+pymysql://root:!Rjb12191@gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com:24936/liaotian_db?charset=utf8mb4 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/未命名.md b/docs/Obsidian笔记体系/Projects/聊天平台/未命名.md new file mode 100644 index 0000000..e5d5106 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/未命名.md @@ -0,0 +1,57 @@ +## 一、在 8037 平台里优化(编辑 / 设计) + +你截图里的「知你客服」有 记忆管理(缓存节点) 和 意图识别(LLM 节点),这两块对延迟影响最大。 + +### 1. 意图识别 / LLM 节点(优先做) + +- 换更快或更小的模型 + +在「编辑」或「设计」里找到意图识别的 LLM 节点,看能否切换模型(例如从大模型改为小一号或“快速”模型),优先保证意图识别快。 + +- 降低生成长度 + +若有 max_tokens / 最大生成长度,适当调小,能明显缩短首字返回时间和总耗时。 + +- 按需调 temperature + +若当前偏高且不要求创意,可略降低,有时能减少采样时间。 + +### 2. 记忆管理 / 缓存节点 + +- 在「设计」里看缓存节点的配置:容量、过期时间、查询条件。 + +- 避免过大或过长的历史被每次都查一遍;能缩短「最近 N 轮」或「只查当前会话」会更好。 + +- 若平台支持「缓存后端」选择(如内存 vs 外存),优先内存,减少 I/O 延迟。 + +### 3. 流程设计(设计里看) + +- 看是否有不必每次请求都走的节点(例如多余的重试、二次 LLM 调用),能省则省。 + +- 把最轻、最快的逻辑(如简单规则、缓存命中)尽量放在前面,LLM 调用尽量靠后、且只调用必要次数。 + +--- + +## 二、SAARS 后端与 8037 的部署/网络(不改业务代码) + +- 8052 访问 8037 的地址 + +若 8052 和 8037 在同一台机(如都在 101.43.95.130),确认用的是 http://127.0.0.1:8037 或本机内网 IP,避免绕公网,减少网络延迟。 + +- 8037 所在机器资源 + +若 8037 跑在同一台机,保证该机 CPU/内存充足;若 LLM 是远程 API,则优化到该 API 的网络(同区、专线等),这些都会直接影响「知你客服」的响应时间。 + +--- + +## 三、可做的检查清单(先不做代码改动) + +| 位置 | 检查项 | 预期效果 | +| ------- | -------------------- | -------- | +| 8037 编辑 | 意图识别 LLM:换更快/更小模型 | 明显缩短首包时间 | +| 8037 编辑 | LLM:max_tokens 调小 | 减少总生成时间 | +| 8037 设计 | 缓存节点:容量与查询范围 | 减少记忆查询耗时 | +| 8037 设计 | 流程:去掉多余节点、顺序优化 | 减少无效等待 | +| 部署/网络 | 8052 调 8037 用本机或内网地址 | 降低网络 RTT | + +建议先在 8037 里点「编辑」或「设计」,把意图识别的 LLM 模型和 max_tokens 调一档,再测一次「知你客服」的回复速度;若仍慢,再按上面逐项排查缓存和流程。若你愿意后续再通过改 SAARS 的轮询间隔等做优化,可以再说,我们再针对代码给一版最小改动方案。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/测试用例.md b/docs/Obsidian笔记体系/Projects/聊天平台/测试用例.md new file mode 100644 index 0000000..5558675 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/测试用例.md @@ -0,0 +1 @@ +写个脚本开始测试知你客服6号,要求第一次告诉它:我叫小七,爱吃苹果。第二轮问西安有啥玩的,第三轮问题北京有啥玩的,第四轮问他中国有多少个省,第五轮问它陕西有多少市。第六轮问他我叫什么名字? \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/知你客服 6 号(检索增强记忆).md b/docs/Obsidian笔记体系/Projects/聊天平台/知你客服 6 号(检索增强记忆).md new file mode 100644 index 0000000..6955dd4 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/知你客服 6 号(检索增强记忆).md @@ -0,0 +1,81 @@ +知你客服 6 号(检索增强记忆)已按「检索 + 最近几轮」混合方案做完,并完成引擎扩展与导入。摘要如下。 + +--- + +## 1. 引擎新增/改动 + +### 新增 embedding 节点 + +- 类型:embedding + +- 作用:调用 OpenAI 兼容的 Embedding API(默认 DeepSeek),把文本变成向量。 + +- 输入:从 text / content / query / user_input 中取第一个非空作为待向量化文本。 + +- 输出:{ embedding: number[], text: string } + +- 配置:provider(默认 deepseek)、model(默认 deepseek-embedding) + +### vector_db 节点:按 user 持久化 + +- 当 collection = user_memory 且输入里带 user_id 时: + +- 从 Redis 读写:key = vector_memory:{user_id},TTL 7 天。 + +- search:先从 Redis 拉取该 user 的向量列表再算相似度、取 top_k。 + +- upsert:先加载该 user 列表,插入/更新后再写回 Redis。 + +### get_node_input:补充 user_id + +- 若某节点输入里没有 user_id,会从 start 节点(执行入参)里补上,供按 user 的向量检索/写入使用。 + +--- + +## 2. 知你客服 6 号流程(检索 + 最近几轮) + +1. start → cache-query → transform-merge + +与 5 号一致,拿到当前用户输入、记忆(含 conversation_history、user_profile)、user_id。 + +1. 检索分支 + +- embedding-query:对当前 user_input 做向量化。 + +- merge-retrieve:合并「merge 的完整输出」与「embedding 结果」。 + +- transform-prepare-search:拼出 embedding、user_id、memory、user_input 等,供检索和后续用。 + +- vector-search:collection=user_memory,top_k=5,用 Redis 里该 user 的向量做相似度检索。 + +- merge-context:合并「prepare-search 输出」与「检索结果列表」。 + +- code-build-context: + +- 检索结果 → 拼成「相关历史(检索)」字符串。 + +- memory.conversation_history 取最近 4 条 → 拼成「最近几轮」字符串。 + +- 输出:user_input、memory.user_profile、memory.relevant_from_retrieval、memory.recent_turns。 + +1. llm-unified + +使用上面构造的「相关历史」+「最近几轮」+ 用户信息生成回复(格式同 5 号,含 intent、reply、user_profile)。 + +1. 解析与提取 + +json 解析 → transform-extract-reply-and-profile 得到 right(回复)、user_profile_update。 + +1. 写入向量库(每轮一次) + +- code-build-turn-for-vector:用当前 query + right 拼成本轮文本(如「用户:xxx\n助手:yyy」),并生成 id、带出 user_id(依赖引擎注入)。 + +- embedding-turn:对本轮文本做向量化。 + +- merge-for-upsert → transform-for-vector-upsert:拼出 embedding、text、user_id、id。 + +- vector-upsert:collection=user_memory,按 user_id 写入 Redis,供之后检索。 + +1. 记忆与输出 + +与 5 号相同:transform-cache-input → code-add-count → condition-need-summary → 摘要分支 / 追加分支 → cache-update-* → transform-output-format → end。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/知你客服5号的设计.md b/docs/Obsidian笔记体系/Projects/聊天平台/知你客服5号的设计.md new file mode 100644 index 0000000..590034d --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/知你客服5号的设计.md @@ -0,0 +1,75 @@ +## 1. 引擎改动(不改架构) + +- 条件节点透传 + +条件节点在返回 branch 的同时,把整份 input_data 写入 output,分支内节点可继续使用 memory、user_input、right、user_id 等。 + +- Cache 写入支持 memory_value + +当 cache 节点 operation=set 且输入里带有 memory_value(dict)时,直接用它作为要写入的值,不再走模板求值;仍会对其中的 conversation_history 做相邻去重并截断到最近 8 条。 + +- 去重与截断统一 + +对 conversation_history 的相邻去重和「保留最近 8 条」统一放在「存储前」一步,无论 value 来自模板还是 memory_value。 + +--- + +## 2. 知你客服 5 号设计 + +- 记忆结构 + +在 4 号基础上增加 conversation_summary(字符串): + +{ conversation_summary, conversation_history, user_profile, context }。 + +cache-query 的 default_value 已包含 conversation_summary: ""。 + +- 主 LLM 输入 + +主 LLM 同时看「对话摘要」和「最近几轮」: + +对话摘要(之前聊过的要点):{{memory.conversation_summary}}\n最近几轮:{{memory.conversation_history}}。 + +- 何时做摘要 + +用 code 节点 算 history_count = len(memory.conversation_history),条件节点 判断 {history_count} >= 4: + +- ≥4 条(true):走摘要分支 + +- 透传 + 摘要 LLM(deepseek-chat,max_tokens=150)把当前历史压成一段 ≤100 字摘要; + +- merge 合并「透传数据」与「摘要文本」; + +- code 拼出 memory_value:conversation_summary = 新摘要,conversation_history = 仅当前 1 轮(当前用户句 + 当前助手句); + +- cache-update-summary 用 memory_value 写入(不写 value 模板)。 + +- <4 条(false):走追加分支 + +- transform 拼好要追加的数据; + +- cache-update-append 用原有 value 模板追加一轮,并保留 conversation_summary(沿用已有或空)。 + +- 无需新节点类型 + +全部用现有节点:start、cache、transform、llm、json、condition、code、merge、end。 + +--- + +## 3. 文件与使用 + +- 脚本:backend/scripts/create_zhini_customer_service_v5.py + +- 导出 JSON:知你客服5号-导入用.json + +- 已通过 API 创建:知你客服5号,ID: 20e76481-5186-46f7-bd85-f0719151b785 + +使用方式: + +- 只生成 JSON:python backend/scripts/create_zhini_customer_service_v5.py + +- 生成并导入 8037:python backend/scripts/create_zhini_customer_service_v5.py --import + +- 更新已有 5 号:python backend/scripts/create_zhini_customer_service_v5.py --update + +在前端 Agent 管理 里发布「知你客服5号」后即可测试。长对话时(例如先聊几轮再问「刚才我说了什么」),5 号会通过「摘要 + 最近几轮」保留更多上下文,记忆能力优于只保留最近 8 条的 4 号。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/聊天平台.md b/docs/Obsidian笔记体系/Projects/聊天平台/聊天平台.md new file mode 100644 index 0000000..56ec655 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/聊天平台.md @@ -0,0 +1,121 @@ +已在项目根目录下创建 saars 聊天平台骨架,并按你提供的《全栈聊天助手平台开发技术规范》做了对齐,摘要如下。 + +--- + +## 1. 目录结构(aiagent/saars/) + +saars/ + +├── backend/                    # Flask 后端 + +│   ├── app/ + +│   │   ├── api/               # REST:auth, chat, files, admin_api + +│   │   ├── models/            # User, Role, Conversation, Message + +│   │   ├── services/          # ChatEngineService, FileService + +│   │   ├── admin/             # Flask-Admin(RBAC) + +│   │   ├── utils/             # 密码哈希 + +│   │   ├── config.py + +│   │   └── socket_events.py   # WebSocket(SocketIO) + +│   ├── tests/                 # pytest(含 test_auth) + +│   ├── requirements.txt + +│   ├── run.py + +│   └── Dockerfile + +├── android-app/               # Android 客户端(Java) + +│   ├── app/ + +│   │   ├── src/main/java/com/saars/chatplatform/ + +│   │   │   ├── data/remote/   # ApiService (Retrofit) + +│   │   │   ├── domain/repository/ + +│   │   │   └── presentation/  # MainActivity + +│   │   └── build.gradle       # Retrofit, OkHttp, Socket.IO, Room, Material3 + +│   ├── build.gradle + +│   └── settings.gradle + +├── docker-compose.yml         # backend + PostgreSQL 14 + Redis 7 + +└── README.md + +--- + +## 2. 后端(Flask)已实现要点 + +- Flask 2.3+:REST 风格 API,CORS、Limiter。 + +- Flask-SocketIO + eventlet:实时连接与房间(connect / join_conversation / new_message)。 + +- PostgreSQL + SQLAlchemy:User、Role、Conversation、Message;Flask-Migrate 预留(需在本地执行 flask db init / flask db migrate / flask db upgrade)。 + +- JWT:Flask-JWT-Extended,登录、刷新、/me。 + +- Redis:在 config 中配置 REDIS_URL,用于会话/扩展(当前逻辑可接 Redis)。 + +- 聊天引擎:ChatEngineService — 会话列表、发消息、拉取消息、撤回、消息状态。 + +- 文件上传:FileService + /api/v1/files/upload,限制 10MB,允许图片和文档扩展名。 + +- 管理端:Flask-Admin(Bootstrap4),User/Role/Conversation/Message 的 ModelView;/api/v1/admin 下用户列表、更新用户、会话列表、统计,需 admin 角色(RBAC)。 + +--- + +## 3. Android(Java)骨架 + +- minSdk 30,targetSdk 34,Java(未使用 Kotlin)。 + +- MVVM 结构:data/remote/ApiService(Retrofit)、domain/repository/ChatRepository、presentation/MainActivity。 + +- 依赖:Retrofit 2.9、OkHttp、Socket.IO-Client、Room、Material、Lifecycle/ViewModel。 + +- 资源:strings、themes、colors、activity_main 布局;需自行补充 mipmap 图标(或使用默认)。 + +--- + +## 4. 运行与后续步骤 + +后端(本地): + +cd saars/backend + +python -m venv venv && source venv/bin/activate  # Windows: venv\Scripts\activate + +pip install -r requirements.txt + +export FLASK_ENV=development + +export DATABASE_URL=postgresql://postgres:postgres@localhost:5432/chat_platform + +export REDIS_URL=redis://localhost:6379/0 + +flask db init && flask db migrate -m "init" && flask db upgrade + +python run.py + +Docker: + +cd saars && docker-compose up -d + +# 首次在 backend 容器内执行上述 flask db init/migrate/upgrade + +Android: + +cd saars/android-app && ./gradlew assembleDebug + +规范中其余项(OAuth 2.0 占位、FCM、Room 实体与 DAO、Chart.js 管理端图表、端到端加密、CI/CD 配置等)可在该骨架基础上按文档逐步补齐。若你希望先做某一块(例如先打通登录+一条消息流,或先做管理端 RBAC),说明优先级即可继续细化实现。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/聊天平台/聊天模型记忆解解方案.md b/docs/Obsidian笔记体系/Projects/聊天平台/聊天模型记忆解解方案.md new file mode 100644 index 0000000..a53881c --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/聊天平台/聊天模型记忆解解方案.md @@ -0,0 +1,106 @@ +业内在做聊天机器人时,通常用下面几类方式应对「历史太长、存不下、模型也吃不下」的问题,你可以对照知你客服当前做法做取舍。 + +--- + +## 1. 滑动窗口(Sliding Window) + +——你已经在用 + +只保留最近 N 轮/最近 N token 的原始对话发给模型,更早的直接丢掉。 + +- 优点:实现简单、延迟可控、不超上下文。 + +- 缺点:早期重要信息会丢。 + +- 适用:短对话、客服/问答、对「很久以前说过什么」不敏感的场景。 + +知你客服的「最近 8 条 + 截断」就是这一种。 + +--- + +## 2. summarization / 对话压缩(Summarization) + +不直接传全部历史,而是定期把旧对话压缩成一段摘要,和最近几轮一起发给模型。 + +- 做法举例:每 5~10 轮或每 N token,用一个小模型/规则把「之前聊了什么、结论是什么」压成几句话(例如:「用户咨询了陕西地市数量,已告知 10 个地级市;随后问了西安天气。」),再和最近 2~3 轮原始对话一起进 prompt。 + +- 优点:在有限 token 里保留更长时间的语义,长对话也能「记得梗概」。 + +- 缺点:要额外做摘要(成本/延迟),摘要质量会影响后续回复。 + +- 业内:很多带「长期记忆」的对话系统都会用「摘要 + 最近几轮」的组合。 + +--- + +## 3. 分层 / 长短记忆(Hierarchical Memory) + +把记忆拆成「短期」和「长期」: + +- 短期:最近几轮原始对话(滑动窗口),保证当前话题连贯。 + +- 长期:结构化信息(用户偏好、关键事实、已解决事项等),用紧凑格式存(键值、列表、几句话描述),每次只取和当前 query 最相关的几条塞进 prompt。 + +这样存可以很多,但发给模型的只是一小段「短期 + 精选长期」,既克服「存不下」也克服「模型吃不下」。 + +--- + +## 4. 检索增强记忆(Retrieval-Augmented Memory) + +不按「时间顺序」截断,而是按「相关性」选要传给模型的历史: + +- 把所有历史(或摘要)存进向量库/检索系统(按句或按轮做 embedding)。 + +- 每次请求时:用当前用户输入做 query,检索出最相关的 K 条历史(或 K 段摘要),只把这 K 条放进 prompt。 + +- 优点:长对话里「很久以前但和当前问题相关」的内容仍能被用上;token 用在「有用」的句子上。 + +- 缺点:需要向量存储与检索、延迟和成本略高。 + +- 业内:不少智能客服、带「记忆」的对话产品会采用「检索 + 最近几轮」混合。 + +--- + +## 5. 结构化记忆(Structured Memory) + +不存整段对话,而是抽成结构化信息再喂给模型: + +- 例如:用户画像(地区、偏好)、已澄清的实体(产品名、订单号)、意图/槽位、关键结论(「用户已接受方案 A」)。 + +- 存成 JSON/键值或固定模板的「记忆卡片」,每次只把和当前话题相关的几条拼成一小段文字进 prompt。 + +- 优点:token 利用率高、可控、可解释;模型输入长度稳定。 + +- 缺点:要设计 schema 和抽取逻辑(规则或小模型)。 + +--- + +## 6. 大上下文模型 + 预算控制(Long Context + Budget) + +用超长上下文模型(如 128K、1M token)多塞一些原始历史,同时做显式 token 预算: + +- 例如:系统提示 500、当前输入 300、历史 4000、预留回复 1000;在「历史」预算内用滑动窗口或「摘要 + 最近几轮」填充。 + +- 优点:能带更多轮原始对话,体验更连贯。 + +- 缺点:长上下文贵、慢,且模型对「中间部分」的利用往往不如开头/结尾,所以业内仍会配合截断或摘要。 + +--- + +## 7. 小结:如何「克服」这个问题 + +|思路|本质|典型场景| +|---|---|---| +|滑动窗口|只保留最近 N 轮/ N token|客服、简单问答(你当前做法)| +|摘要/压缩|旧对话压成短文,和最近几轮一起送|长对话、需要「记得之前聊过什么」| +|分层记忆|短期原始 + 长期结构化/摘要|带用户画像、多轮任务的对话| +|检索增强|按相关性取历史,不按时间全塞|知识型、支持「很久以前提到过」的机器人| +|结构化记忆|只存和传递关键事实/槽位|任务型、表单填写、强可控回复| +|长上下文+预算|用大 context 但控制每部分 token|高端对话产品,配合上述手段| + +所以业内并不是单靠「存更多轮」或「无脑塞长历史」,而是: + +- 存储:可以多存(DB/向量库/摘要), + +- 送给模型:通过截断、摘要、检索、结构化把「该让模型看到什么」控制在 token 预算内。 + +知你客服目前是「存储有限 + 只传最近 8 条」的滑动窗口;若以后要「记更多、用更久」,可以在不改大模型的前提下,加上摘要或检索/结构化记忆中的一种或两种,就能在同样 token 限制下明显提升「记忆」能力。 \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index a31a8f6..1a6d647 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -251,6 +251,16 @@ nav: - Obsidian笔记体系/Projects/女童生长激素项目/项目目录位置.md - Obsidian笔记体系/Projects/提示词大师/提示词大师.md - Obsidian笔记体系/Projects/aitsc/ai提示词常用命令.md + - Obsidian笔记体系/Projects/聊天平台/agent智能体性能调测.md + - Obsidian笔记体系/Projects/聊天平台/app.md + - Obsidian笔记体系/Projects/聊天平台/接入方式.md + - Obsidian笔记体系/Projects/聊天平台/数据库配置.md + - Obsidian笔记体系/Projects/聊天平台/未命名.md + - Obsidian笔记体系/Projects/聊天平台/测试用例.md + - Obsidian笔记体系/Projects/聊天平台/知你客服 6 号(检索增强记忆).md + - Obsidian笔记体系/Projects/聊天平台/知你客服5号的设计.md + - Obsidian笔记体系/Projects/聊天平台/聊天平台.md + - Obsidian笔记体系/Projects/聊天平台/聊天模型记忆解解方案.md - gerrit: - gerrit/gerrit上传代码详细指南.md - gerrit/gerrit分支规范.md