内容
# 从未重复询问

**记得的支援.**
企业支援记忆代理,基于千问云







客户不希望更智能的聊天机器人,如果他们每次回来都必须重复提供 SLA、设置、开启问题和升级联系人。
从未重复询问是一款生产就绪的 B2B 支援记忆代理,记住跨会话的客户上下文,仅检索重要的记忆,安全地遗忘过时的事实,并通过确定性的记忆开启/关闭评估框架和实时千问云 API 路径证明改进。
演示代理是 **Nat**。Nat 由 **NATE** 驱动 - 从未重复询问引擎 - 一个作用域记忆层,将支援对话转化为持久、可审计的客户上下文。
为千问云全球 AI 黑客马拉松而建 - 赛道:记忆代理。
## 品牌资产
官方徽标文件和使用规则位于 [`docs/assets/brand`](docs/assets/brand)。公共口号是 **记得的支援.** 描述:**企业支援记忆代理.**
## 状态
| 领域 | 状态 | 备注 |
| --- | --- | --- |
| 公共干净室仓库 | 完成 | 仅合成数据;包含边界扫描。 |
| 本地 Postgres + pgvector 设置 | 完成 | `docker compose up -d` 绑定 Postgres 到 `localhost:5433`。 |
| 确定性评估框架 | 完成 | `pnpm eval` 打印记忆开启/关闭重新询问、召回和幻觉指标。 |
| 记忆服务 | 完成 | 工作、事件、语义、遗忘和预算召回路径已实现。 |
| MCP 标准输入表面 | 完成 | 四个记忆工具通过 `pnpm mcp:list-tools` 暴露。 |
| 千问云支持的实时路径 | 进行中 | 需要 `DASHSCOPE_API_KEY`;本地安全模式无需该密钥即可运行。 |
| 阿里云函数计算部署 | 进行中 | `s.yaml` 和部署说明存在;仍需要最终的实时证明。 |
| 演示视频 | 待定 | 应使用冻结的 Acme 场景和评估输出行。 |
## 评估路径
1. 阅读记忆模型:[`docs/memory-model.md`](docs/memory-model.md)。
2. 运行消融:
```bash
pnpm eval
```
3. 检查遗忘行为:[`docs/forgetting-policy.md`](docs/forgetting-policy.md)。
4. 阅读系统架构:[`docs/architecture.md`](docs/architecture.md)。
5. 列出 MCP 工具:
```bash
pnpm build
pnpm mcp:list-tools
```
6. 查看部署说明和证明占位符:[`deploy/alibaba-fc.md`](deploy/alibaba-fc.md)。
## 可衡量的结果
运行:
```bash
pnpm eval
```
预期确定性固定输出:
```text
memory-on 重新询问率:0.00
memory-on 召回准确率:1.00
memory-on 幻觉次数:0
memory-off 重新询问率:1.00
memory-off 召回准确率:0.00
memory-off 幻觉次数:0
重新询问率:0.00(记忆)vs 1.00(无记忆)
```
评估路径故意设计为确定性,以实现可重复的评分。它使用固定的合成固定数据和模拟千问云客户端。实时 API 路径在配置 `DASHSCOPE_API_KEY` 时使用千问云。
## 使其成为记忆代理
从未重复询问实现显式记忆层级:
- **工作记忆** - 当前会话上下文,可在会话关闭蒸馏前使用。
- **事件记忆** - 原始支援事件,带有千问云嵌入和出处。
- **语义记忆** - 蒸馏的客户事实,带有置信度、有效性窗口和来源链接。
- **遗忘策略** - TTL 过期、取代、过时记忆排除和审计安全出处。
- **预算召回** - 仅相关记忆,限制在严格的上下文预算内。
- **MCP 表面** - 记忆工具通过代理互操作性暴露。
这不是转录日志记录。它是具有检索纪律、出处、遗忘和可衡量的跨会话改进的结构化记忆。
## 架构
```text
客户聊天 / MCP
|
v
Hono API on 阿里云函数计算
|
v
记忆服务
|-- 工作记忆:当前会话事实
|-- 事件记忆:回合事件 + 千问云嵌入
|-- 语义记忆:蒸馏的持久事实
|-- 遗忘:TTL + 取代 + 范围召回
|
+--> 千问云 via DashScope-compatible OpenAI API
+--> Postgres + pgvector
+--> MCP 标准输入工具
```
更多详情:[`docs/architecture.md`](docs/architecture.md)。
## 入门指南
### 1. 克隆和安装
```bash
git clone https://github.com/marcelle-labs/never-ask-twice.git
cd never-ask-twice
pnpm install
```
### 2. 配置环境
```bash
cp .env.example .env
```
编辑 `.env` 并设置您的 `DASHSCOPE_API_KEY` 以获取实时千问云支持的嵌入、蒸馏和裁决。示例已预填充本地 Postgres 在端口 5433 上。
```env
DATABASE_URL=postgresql://neverasktwice:neverasktwice@localhost:5433/neverasktwice
DASHSCOPE_API_KEY=your-key-here
QWEN_BASE_URL=https://dashscope-intl.aliyuncs.com/compatible-mode/v1
QWEN_CHAT_MODEL=qwen-plus
QWEN_EMBEDDING_MODEL=text-embedding-v3
QWEN_EMBEDDING_DIM=1024
MEMORY_TOKEN_BUDGET=1200
```
如果没有 `DASHSCOPE_API_KEY`,API 将以本地安全模式启动。本地安全模式使用零向量嵌入和空蒸馏响应,以便服务器可以在没有密钥的情况下运行;它不会执行实际的千问云工作。使用 `pnpm eval` 进行确定性本地评分,无需密钥。
### 3. 启动 Postgres
```bash
docker compose up -d
```
本地数据库绑定到 `localhost:5433`,以便与其他 Postgres 服务在 `5432` 上不冲突。
### 4. 运行迁移
```bash
pnpm migrate
```
### 5. 运行评估框架
```bash
pnpm eval
```
### 6. 运行边界扫描
```bash
pnpm boundary-scan
```
### 7. 启动本地 API
```bash
pnpm dev
```
API 将在 `http://localhost:3000` 上可用,带有以下端点:
- `GET /health` - 健康和能力状态。
- `POST /turn` - 追加客户/代理回合。
- `POST /sessions/:id/close` - 关闭会话并将事件记忆蒸馏成语义记忆。
- `POST /recall` - 召回有界记忆包。
### 8. 运行 MCP 服务器
```bash
pnpm build
node dist/src/mcp/server.js
```
MCP 服务器暴露四个工具:`recall_memory`、`write_memory`、`distill_session` 和 `forget`。
## 项目结构
- `apps/api` - Hono API、本地服务器和函数计算处理程序。
- `src/agent` - 评估框架使用的确定性支援代理策略。
- `src/contracts.ts` - 记忆谓词枚举、Zod 契约和共享类型。
- `src/db` - Drizzle 模式和 SQL 迁移字符串。
- `src/memory` - 记忆服务、存储、检索、取代和遗忘行为。
- `src/mcp` - 共享记忆服务的标准输入 MCP 表面。
- `src/qwen` - 单个千问云客户端模块。
- `src/testing` - 评估框架的确定性模拟千问云客户端。
- `eval` - 冻结的三会话场景、基本事实、预期输出和运行器。
- `scripts` - 边界扫描、迁移、MCP 列表工具和演示脚本检查。
- `docs` - 面向裁判的架构、记忆模型、评估和遗忘文档。
- `deploy` - 阿里云函数计算部署说明和证明占位符。
## 关键命令
| 命令 | 目的 |
| --- | --- |
| `pnpm install` | 安装依赖 |
| `pnpm build` | 构建项目 |
| `pnpm lint` | 运行 TypeScript 类型检查 |
| `pnpm test` | 运行测试套件 |
| `pnpm eval` | 运行确定性记忆开启/关闭评估框架 |
| `pnpm migrate` | 运行数据库迁移 |
| `pnpm boundary-scan` | 运行干净室边界扫描 |
| `pnpm mcp:list-tools` | 列出 MCP 工具 |
| `pnpm demo:script-check` | 验证演示固定数据是否对齐 |
## 安全性和干净室边界
从未重复询问仅使用合成数据。不要提交真实的客户数据、密钥、`.env` 文件或私有平台标识符。仓库包含一个边界扫描,以防止已知禁止令牌,并包含一个本地安全模式,以便裁判可以在没有密钥的情况下运行服务器。
参见 [`SECURITY.md`](SECURITY.md)。
## 许可证
Apache-2.0