GioGio 的 Blog

(DSH插件)怎么让DeepSeek API拥有同一套人格和记忆

2026-10-30dsh,deepseek harness,插件,ai,开源,教程
# 让你的 AI 记住你:dsh-persona-gateway 使用文章

> 项目地址:<https://github.com/1292858901/dsh-persona-gateway>
> 它是 DeepSeek Harness 的一个插件,在你电脑上开一个"小门",任何 AI 客户端从这个门进,都会带着**同一套人格和同一本记忆**。

---

## 一、解决你有几个 AI,就有几个"陌生人"

用 AI 的人大概都经历过这个场面:

- 在 AstrBot 里聊了半天,它知道你是做外贸的、讨厌长篇大论、代码只写 Python;
- 换个 Cline 写代码,它像第一天认识你,又给你来一段"作为一个 AI 语言模型……";
- 再打开 Continue,又是全新的一张白纸。

每个客户端都在自己的设置里塞一段 system prompt,各写各的,改一处要改五处;记忆更是各存各的,谁也不认谁。**你的人格和记忆,被锁在了软件里,而不是跟着你走。**

`dsh-persona-gateway` 要解决的就是这件事。

---

## 二、它到底做了什么:把"你"搬到网关层

不做新客户端,也不改别人的代码,而是**在所有客户端和 DeepSeek 服务器之间,插一层自己的中转站**。

```
   AstrBot ─┐
   Cline  ──┼──► 127.0.0.1:8787/v1 ──► api.deepseek.com
  Continue ─┘         │
                      └── ~/.dsh/persona/
                            ├── persona.md    你的人格(纯文本,可 diff)
                            ├── memory.jsonl  你的记忆(一行一条)
                            └── config.json   配置与 Key
```

客户端那边只改一个东西:**base URL**。从 `https://api.deepseek.com/v1` 改成 `http://127.0.0.1:8787/v1`,再填一个网关发给你的 Key。就这些,客户端一行代码都不用动。

于是:

- 人格只有一份,改一次,所有客户端同时生效;
- 记忆只有一本,在 AstrBot 里说过的偏好,Cline 那边也知道;
- 整套"你"就是一个目录,拷到另一台机器,AI 还是那个 AI。

这就是它要实现的东西:**把人格和记忆,从"某个软件的设置项"变成"你自己的一层基础设施"。**

---

## 三、一次对话流程

理解了下面这条流水线,你就理解了它全部的原理。

**第 1 步:客户端敲门。**
客户端发来一个标准的 OpenAI 请求:`POST /v1/chat/completions`,携带 `Authorization: Bearer sk-l2-xxxx`。

**第 2 步:门卫验票。**
网关先看二级 Key。你创建过 Key,就必须带对;一个都没创建时,只允许本机调用(方便你第一次配置)。Key 在磁盘上只存 SHA-256 哈希,面板里也只看得到前缀和尾号,原文只在创建那一次显示。

**第 3 步:翻出人格和记忆。**
读 `persona.md`,读 `memory.jsonl`,然后用**关键词打分**挑出跟这次提问最相关的几条记忆——不是把整本记忆都塞进去。

打分规则很朴素:把提问切成中文二元组和英文词,和每条记忆比对,命中越多分越高;再给新记忆一点"新鲜度加分",给你置顶的记忆一个固定加分。最后取前 **4 条**、总长不超过 **900 字符**。

**第 4 步:改写请求(这是全篇最巧的一步)。**
- **人格**塞进 system 消息的**最前面**,用 `---` 和客户端自带的提示词隔开——是**叠加,不是覆盖**。客户端原本的人设还在,只是你的排在它前面。
- **记忆 + 当前时间**塞在**最后一条 user 消息的前面**,而不是 system 里。

为什么这么放?因为大模型的 prefix cache 是按"前缀不变"来命中的。system 和历史消息保持原样,只有最后那一小段每次变化,缓存命中率最高,又快又省钱。这个小设计,是"能用"和"好用"的分界线。

**第 5 步:转发上游。**
用你的 DeepSeek 凭证转发给 `api.deepseek.com`,流式就原样流式回传,非流式就原样返回。客户端断开时,网关会顺手掐掉上游请求,不浪费额度。

**第 6 步:边聊边记。**
回答结束后,后台悄悄再发一次请求给模型,让它当"记忆整理员":这一轮里有没有值得长期记住的稳定信息?

**第 7 步:写进本子。**
判定为"值得记"的,去重后追加到 `memory.jsonl`。下一轮对话,它就参与第 3 步的挑选。

整个过程中,客户端完全无感——它以为自己只是在跟 DeepSeek 聊天。

---

## 四、记忆是怎么"长"出来的:四道闸门

很多人对"AI 记忆"的想象是"把所有聊天记录都存下来"。这个插件恰恰相反,它**宁可少记**,一路设了四道闸门:

**闸门一:值不值得记,模型说了算。**
每轮对话交给模型判断,输出 `remember: true/false` 加一句理由。身份、长期偏好、明确决定、正在做的项目 → 记;寒暄、一次性任务、临时状态、代码细节 → 不记。面板日志里能看到"记住:……"和"不记:……(理由)"。

**闸门二:太短的不抽。**
回答不到 40 字、提问不到 8 字,直接跳过——"好的""嗯嗯"这种对话没有记忆价值。

**闸门三:一分钟最多抽一次。**
连续快速对话时不会每轮都去调模型,省额度也省时间。

**闸门四:重复的不记。**
文本归一化后相同,或者词重合度超过 0.85,判定为重复,直接丢掉。

记忆攒到上限(默认 300 条)会触发**自动压缩**:让模型把重复的合并、被否定的删掉、仍然有效的留下,目标是压到六成左右(压不动就保持原样)。你置顶的条目**不参与压缩**,原样带过去,永远不会被模型动;万一压完还是超标,才会淘汰最旧的、没置顶的那几条。

你也可以在面板里手动加、删、置顶,或者点"压缩"立刻整理一次。整个记忆库就是一个 `.jsonl` 文件,一行一条 JSON,用记事本都能改,删一条就是删一行。

---

## 五、为什么值得单独做一层"网关"

**因为它把"数据"和"软件"解耦了。**

| | 传统做法 | 网关做法 |
| --- | --- | --- |
| 人格在哪 | 每个客户端的设置里各一份 | `persona.md` 一份 |
| 记忆在哪 | 客户端私有格式,导不出来 | `memory.jsonl`,明文可读 |
| 换客户端 | 重新调教一遍 | 改个 base URL |
| 换电脑 | 从头再来 | 拷一个目录 |
| 备份/对比 | 基本没法做 | git 一把梭 |

还有两个现实好处:

1. **任何 OpenAI 兼容的客户端都能接**——AstrBot、Cline、Roo、Continue、iShellPro,甚至你自己写的小脚本。以后出新工具,你也不用重新"养"一个 AI。
2. **它是个 DSH 插件,不是另起一个网页服务**。装好之后,设置页里多一个「人格网关」,配置、人格、记忆、日志都在里面,不用再开一个浏览器标签页去管它。

---

## 六、上手:五步,十分钟

**前提**:DSH 0.2.0 及以上。

### 1. 安装

```bash
dsh plugin --profile desktop add github:1292858901/dsh-persona-gateway
```

装完打开 **设置 → 人格网关**。

### 2. 填一个官方 Key

网关最终要调 `api.deepseek.com`,所以需要一个 DeepSeek API Key。点「测试连通性」确认能通。

> 为什么不直接用 DSH 的登录状态?代码里确实留了这条后备通道(会尝试用 DSH 已登录账号的凭证),但实测经常被上游 401 打回来。所以文档的建议是:老老实实填一个官方 Key,最省事。

### 3. 创建一个二级 Key

这是给客户端用的,形如 `sk-l2-…`,**只显示一次**,记得当场复制。它和你的官方 Key 是两回事:官方 Key 是网关去敲 DeepSeek 的门,二级 Key 是客户端来敲网关的门。

### 4. 改一个客户端

以 Cline 为例,Provider 选 OpenAI Compatible:

- Base URL:面板上显示的「客户端地址」,本机就是 `http://127.0.0.1:8787/v1`
- API Key:第 3 步的 `sk-l2-…`
- 模型:填 `persona`(推荐,会走网关配置的模型),或者直接填真实模型名

### 5. 验证

随便发一句话,然后回面板看日志:

```
request deepseek-flash · 注入 2 条(137 字符)· 凭证 配置 · 流式
```

看到"注入 N 条",说明整条链路已经通了。聊几轮之后,记忆页会自己长出条目来。

---

## 七、几个容易踩的坑

**① 局域网连不上。**
默认只监听 `127.0.0.1`,别的设备访问不到。要把监听地址改成 `0.0.0.0`,同时放行防火墙端口(默认 8787)。**改成 0.0.0.0 后一定要建二级 Key**,否则等于把入口敞开。

**② Claude Code 用不了。**
它走的是 Anthropic 的 `/v1/messages` 协议,而这个网关目前只实现了 OpenAI 的 Chat Completions。这不是配置问题,是还没做。

**③ 401。**
两种可能:客户端那边的二级 Key 填错了;或者上游凭证失效。面板日志会写清楚是哪一种。

**④ 记忆是明文。**
`~/.dsh/persona/` 下的文件都是明文,可能包含服务器地址、项目名之类的信息。导出分享给别人之前,自己过一眼。

**⑤ 它不是"云同步"。**
换设备靠导出/导入,或者直接拷目录。想做多设备自动合并,目前没有。

---

## 八、它不做什么(边界很重要)

- **不是多用户系统**:它是"单用户"网关,假设这台机器只有你一个人用。
- **不是向量数据库**:检索靠关键词打分(中文二元组 + 英文词),记忆上千条以后准确率会下降——作者的想法是"到那时候再说"。
- **不是加密存储**:为了方便 diff 和手改,选择了明文。
- **不是协议转换器**:只做 OpenAI 兼容,Anthropic 协议不在范围内。

这些"不做",恰恰是它轻的原因:整个插件零外部依赖,就是一个 Node 文件加一套前端面板,不装数据库、不装向量库、不占内存。

---

## 九、适合谁

- **同时用好几个 AI 工具的人**:一个大脑,多个入口。
- **在意"AI 越用越懂我"的人**:人格和记忆是可积累的资产,不是用完就丢的会话。
- **喜欢自己掌控数据的人**:纯文本、本地存、可 diff、可备份、可迁移。
- **折腾 DSH 插件生态的人**:这是个小而完整的样板——一个 host 半、一个 client 半、一个控制面路由。

**不太适合**:多人共用一台机器、需要团队共享人格、或者依赖 Claude Code 的人。

---

## 十、最后,一句话总结

> 以前是你去适应每个 AI 客户端的脾气;
> 现在是把你的脾气,做成一个所有 AI 都必须经过的关口。

人格是一个文件,记忆是一行行 JSON,换工具像换件衣服——**AI 还是那个认识你的 AI。**

---

*本文基于 v0.7.1 的代码与文档整理。项目采用 MIT 协议。*

相关文章