feat: 更新 README.md,重构 Prompt Envelope Protocol 方案,明确协议层与 UI 层的设计原则及 Segment 类型
This commit is contained in:
@@ -39,91 +39,163 @@ HCI 告诉我们:**界面的信息架构应该反映系统的心智模型**。
|
|||||||
|
|
||||||
## 方案:Prompt Envelope Protocol
|
## 方案:Prompt Envelope Protocol
|
||||||
|
|
||||||
本项目的答案是:**一种将 LLM 完整上下文结构化的协议和对应的可视界面**。
|
本项目的答案是两层设计:
|
||||||
|
|
||||||
### 核心思想
|
- **协议层** —— 一种结构化的数据格式,用带类型的 Segment 描述 LLM 上下文
|
||||||
|
- **UI 层** —— 一个参考实现,展示协议如何被渲染为可读的聊天界面
|
||||||
|
|
||||||
不是让聊天消息变成纯文本,而是让每条消息由若干带明确类型的 **Segment**(片段)组成:
|
### 协议:每条消息 = Segments 的有序列表
|
||||||
|
|
||||||
|
协议定义的不是"聊天文本",而是**上下文的结构化描述**。一条消息不再是字符串,而是若干带明确 `kind` 的 Segment:
|
||||||
|
|
||||||
```
|
```
|
||||||
一条消息不是 "你好,帮我审阅这篇论文"
|
一条消息不是 "你好,帮我审阅这篇论文"
|
||||||
而是:
|
而是:
|
||||||
├─ text segment "你好,帮我审阅这篇论文"
|
├─ text segment "你好,帮我审阅这篇论文"
|
||||||
├─ long_text segment [论文全文 — 默认折叠,点击展开]
|
├─ long_text segment [论文全文,1423 字]
|
||||||
├─ document segment 📄 paper-draft.pdf (2.3MB)
|
├─ document segment paper-draft.pdf (2.3MB)
|
||||||
└─ media segment 🖼️ 图3:实验组vs对照组
|
└─ media segment image: 图3 实验组vs对照组
|
||||||
```
|
```
|
||||||
|
|
||||||
每种 Segment 在界面中有**独立的视觉呈现**——系统指令是折叠的灰色面板,用户记忆是紫色的记忆卡片,工具请求是深色终端风格的代码块。
|
每个 Segment 的 `kind` 字段声明了"这是一段什么",其余字段携带数据本身。协议只关心 types 和 structure,**不关心颜色、折叠、布局**——那是 UI 层的决策。
|
||||||
|
|
||||||
|
### UI:每种类型有独立视觉呈现
|
||||||
|
|
||||||
|
在本项目的参考实现中,每种 Segment 被渲染为不同的视觉组件。例如 system prompt 是折叠面板,工具请求是代码块,变量在会话横栏中展示。**但这只是一种可能的 UI,协议本身与视觉无关。**
|
||||||
|
|
||||||
### 设计原则
|
### 设计原则
|
||||||
|
|
||||||
|
**协议原则:**
|
||||||
|
|
||||||
| 原则 | 说明 |
|
| 原则 | 说明 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| **信息密度梯度** | 核心对话文本优先可见;元信息(system prompt / memory / tools)默认折叠 |
|
| **类型明确** | 每种上下文有独立的 Segment kind,无一物混在文本中 |
|
||||||
| **颜色编码系统** | 灰=系统 · 紫=记忆 · 绿=技能 · 橙=工具 · 蓝=变量 · 深色=工具调用 |
|
| **可导出** | 协议可无损导出为标准 OpenAI Chat Format,不被本项目 UI 绑定 |
|
||||||
| **协议即视图** | 折叠状态内嵌于数据结构中;相同协议数据在任何渲染器下产生相同视图 |
|
| **自描述** | 协议数据不依赖外部渲染逻辑——kind 字段即语义标签 |
|
||||||
| **可导出,不锁死** | 协议可以导出为标准 OpenAI Chat Format,不依赖本项目的 UI |
|
|
||||||
|
**UI 原则(本项目的参考实现):**
|
||||||
|
|
||||||
|
| 原则 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| **信息密度梯度** | 核心对话文本优先可见;元信息默认折叠 |
|
||||||
|
| **颜色编码** | 不同类型用不同颜色辅助区分,形成可学习的视觉语言 |
|
||||||
|
| **折叠默认值在数据中** | segment 的 `collapsed` 字段指定默认状态,保证数据自足 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 方法:区分 9 种上下文类型
|
## 协议:11 种 Segment 类型
|
||||||
|
|
||||||
通过对主流 LLM 聊天产品(ChatGPT、Claude、Kimi、豆包)的逆向分析,以及对 127 名 LLM 用户行为研究文献的查阅,识别出 **9 种需要差异化呈现的上下文类型**:
|
通过对主流 LLM 聊天产品的逆向分析,我们识别出 LLM 上下文中 **11 种需要区分类型的信息**。每种在协议中对应一个 Segment kind。
|
||||||
|
|
||||||
### 1. 文本(text)
|
### text
|
||||||
|
|
||||||
用户和 AI 的直接对话内容。**始终可见**,不做折叠。用 Markdown 渲染保留结构化表达。
|
用户和 AI 的直接对话文本。协议中最基本的 Segment。
|
||||||
|
|
||||||
### 2. 静态变量(static_var)
|
```typescript
|
||||||
|
{ kind: 'text', content: string }
|
||||||
如 `{{user_name}}`、`{{current_date}}`——在对话开始前被替换为具体值。提取为**对话区顶部的会话变量横栏**,不在消息气泡中占用空间。
|
|
||||||
|
|
||||||
```
|
|
||||||
会话变量 {{user_name}} → 小明 {{current_date}} → 2026年6月8日
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. System Prompt(system_prompt)
|
### static_var
|
||||||
|
|
||||||
模型的行为准则和角色设定。**默认折叠**为灰色面板,标注行数。支持展开查看——当用户想知道"为什么 AI 这样说话"。
|
会话级模板变量,在对话开始时被替换为具体值。协议中携带变量名和展开后的值,使替换关系可见。
|
||||||
|
|
||||||
### 4. 用户记忆(memory)
|
```typescript
|
||||||
|
{ kind: 'static_var', name: string, value: string, description?: string }
|
||||||
|
```
|
||||||
|
|
||||||
跨对话持久化的用户信息。**默认折叠**为紫色面板,展开后以标题列表展示每条记忆。用户可以质疑不准确的记忆。
|
### system_prompt
|
||||||
|
|
||||||
### 5. Skills
|
模型的行为准则和角色设定。协议中为完整文本内容,可标记折叠默认状态。
|
||||||
|
|
||||||
模型可调用的技能,遵循 Anthropic SKILL.md 规范。**默认折叠**为绿色面板。展开后实现**渐进式披露**:
|
```typescript
|
||||||
|
{ kind: 'system_prompt', content: string, collapsed: boolean }
|
||||||
|
```
|
||||||
|
|
||||||
- **L1**:名称 + 描述(始终可见)
|
### memory
|
||||||
- **L2**:完整指令 body(点击展开——提示"触发时会加载到 LLM 上下文")
|
|
||||||
|
|
||||||
### 6. 工具总览(tool_overview)
|
跨对话持久化的用户信息,以标题-内容条目组织。协议中为记忆项列表。
|
||||||
|
|
||||||
模型可使用的工具清单。**默认折叠**为橙色面板。每项工具可独立展开其 JSON Schema 定义。
|
```typescript
|
||||||
|
{ kind: 'memory', items: MemoryItem[], collapsed: boolean, description?: string }
|
||||||
|
```
|
||||||
|
|
||||||
### 7. 工具调用(tool_call)
|
### skills
|
||||||
|
|
||||||
拆分为两个子类型:
|
模型可调用的技能,遵循 Anthropic SKILL.md 规范。协议中每项包含 name、description(L1 始终在上下文)和 body(L2 触发时加载的 Markdown 正文)。
|
||||||
|
|
||||||
| 子类型 | 视觉 | 默认状态 | 说明 |
|
```typescript
|
||||||
|--------|------|---------|------|
|
{ kind: 'skills', items: SkillItem[], collapsed: boolean, description?: string }
|
||||||
| `tool_call_request` | 深色终端风格代码块 | **展开** | 绿色方法名 + 参数键值行 |
|
```
|
||||||
| `tool_call_result` | 绿/红 状态条 | **折叠**(成功)/ **展开**(失败) | 一眼看出是否出错 |
|
|
||||||
|
|
||||||
在界面中,工具调用会被自动拆分为独立的 `tool` 角色消息,与正常的对话消息交替排列。
|
### tool_overview
|
||||||
|
|
||||||
### 8. 传文档(document)
|
模型可用的工具清单。每项包含名称、描述、参数摘要和可选的 JSON Schema 定义。
|
||||||
|
|
||||||
用户上传的文件。以**文件卡片**展示:图标 + 文件名 + 大小 + 前 200 字预览。点击「查看解析」可展开 AI 提取的文档内容。
|
```typescript
|
||||||
|
{ kind: 'tool_overview', items: ToolItem[], collapsed: boolean }
|
||||||
|
```
|
||||||
|
|
||||||
### 9. 长文本素材(long_text)
|
### tool_call_request
|
||||||
|
|
||||||
用户粘贴的长篇文本(>500 字)。**默认折叠**,展示前 2 行预览 + 字数统计。点击展开显示全文(Markdown 渲染)。
|
模型发起的工具调用。协议中携带函数名和参数键值对。
|
||||||
|
|
||||||
### 附加:多模态(media)
|
```typescript
|
||||||
|
{ kind: 'tool_call_request', toolName: string, arguments: Record<string, unknown>, collapsed: boolean }
|
||||||
|
```
|
||||||
|
|
||||||
图片、音频、视频。图片有有效 URL 时直接渲染缩略图;加载失败或无 URL 时回退为图标占位 + alt 文本。音频/视频展示类型标签。
|
### tool_call_result
|
||||||
|
|
||||||
|
工具调用的执行结果。协议中标记成功/失败状态和结果文本。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{ kind: 'tool_call_result', toolName: string, result: string, success: boolean, collapsed: boolean }
|
||||||
|
```
|
||||||
|
|
||||||
|
### document
|
||||||
|
|
||||||
|
用户上传的文件。协议中存储文件名、MIME 类型、大小和文本预览,可附带解析后的完整内容。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{ kind: 'document', fileName: string, mimeType: string, snippet: string, sizeBytes: number, parsedContent?: string }
|
||||||
|
```
|
||||||
|
|
||||||
|
### long_text
|
||||||
|
|
||||||
|
用户粘贴的长篇文本素材。协议中携带完整内容和字符数,可标记折叠默认状态。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{ kind: 'long_text', content: string, charCount: number, collapsed: boolean }
|
||||||
|
```
|
||||||
|
|
||||||
|
### media
|
||||||
|
|
||||||
|
图片、音频、视频等多模态内容。协议中记录媒体类型、URL 和替代文本。
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
{ kind: 'media', mediaType: 'image'|'audio'|'video', url: string, altText?: string }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## UI 参考实现:差异化视觉呈现
|
||||||
|
|
||||||
|
以上是协议层——定义了什么信息存在、以什么结构存在。以下是本项目为协议做的参考 UI。**颜色、折叠行为、布局都是 UI 决策,不是协议规范。**
|
||||||
|
|
||||||
|
| Segment | UI 处理 | 交互 |
|
||||||
|
|---------|--------|------|
|
||||||
|
| `text` | 正文渲染,支持 Markdown | 无交互 |
|
||||||
|
| `static_var` | 提取到对话区顶部的会话变量横栏,不在气泡内 | 纯展示 |
|
||||||
|
| `system_prompt` | 折叠面板,灰色标记,标注行数 | 点击展开 |
|
||||||
|
| `memory` | 折叠面板,紫色标记,展开为标题-内容列表 | 点击展开 |
|
||||||
|
| `skills` | 折叠面板,绿色标记,每项支持渐进式披露(L1 名称+描述 → L2 body) | 逐层点击展开 |
|
||||||
|
| `tool_overview` | 折叠面板,橙色标记,每项可独立展开 JSON Schema | 点击展开 |
|
||||||
|
| `tool_call_request` | 深色终端风格代码块,参数以标签化键值行展示 | 默认展开;长值折叠 |
|
||||||
|
| `tool_call_result` | 绿色(成功)/ 红色(失败)状态条 | 成功默认折叠,失败默认展开 |
|
||||||
|
| `document` | 文件卡片:图标 + 文件名 + 大小 + 文本预览 | 可展开 AI 解析内容 |
|
||||||
|
| `long_text` | 折叠态前 2 行预览 + 字数标签 | 点击展开全文 |
|
||||||
|
| `media` | 图片有 URL 时可渲染缩略图;其他类型图标占位 | 加载失败回退为图标 |
|
||||||
|
|
||||||
|
完整类型定义见 [`src/types/protocol.ts`](src/types/protocol.ts)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -152,7 +224,7 @@ interface Message {
|
|||||||
|
|
||||||
### Segment(片段联合类型)
|
### Segment(片段联合类型)
|
||||||
|
|
||||||
每种 Segment 有独有的 `kind` 字段,UI 据此决定渲染方式:
|
每种 Segment 有独有的 `kind` 字段,标识其语义类型:
|
||||||
|
|
||||||
```
|
```
|
||||||
text | static_var | system_prompt | memory | skills |
|
text | static_var | system_prompt | memory | skills |
|
||||||
|
|||||||
Reference in New Issue
Block a user