Rust AI CLI 会话历史:本地记录要先处理隐私和截断
一、CLI 也会积累敏感上下文
AI 命令行工具经常会保存会话历史,方便继续追问、回放请求或排查问题。这个功能很实用,但也容易把 API Key、文件路径、代码片段和用户输入长期留在本地。CLI 不是浏览器页面,也一样需要隐私边界。
会话历史设计要先回答三个问题:保存什么,保存多久,谁能读取。默认把完整 prompt 和回答写进明文文件,短期省事,长期风险很高。
二、历史记录要分层
flowchart TD
A[用户输入] --> B[敏感信息过滤]
B --> C[会话摘要]
C --> D[本地存储]
D --> E[下次请求加载]
完整消息适合短期调试,摘要适合长期续聊,结构化元数据适合统计。不同内容应有不同保留策略。用户显式开启调试模式,才保存更详细的请求。
会话过长时要截断。CLI 工具不能把历史无限塞进模型上下文。应保留目标、约束、最近几轮和关键文件引用,删除重复解释和失败尝试。
三、Rust 存储结构要显式
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct SessionRecord {
session_id: String,
summary: String,
turns: Vec<TurnMeta>,
}
#[derive(Debug, Serialize, Deserialize)]
struct TurnMeta {
role: String,
content_hash: String,
created_at: String,
}
不要一开始就把所有字段塞进字符串。结构化记录便于未来迁移、脱敏和版本兼容。content_hash 可以帮助排查重复请求,又避免保存完整敏感文本。
fn redact(input: &str) -> String {
input.replace("sk-", "sk-***")
}
真实项目中的脱敏规则要更完整,包括环境变量、Token、路径和邮箱等。这里只展示思路:写入前先处理,而不是事后补救。
四、默认策略要保守
CLI 的默认行为应是最小保存。用户可以通过配置开启详细日志,但必须知道风险。配置文件里应写清保存路径、保留天数和是否保存原文。
还要提供清理命令。比如 tool session clean --older-than 7d。能保存,就要能删除。会话历史不是越多越好,能解释当前任务即可。
会话历史也要考虑并发写入。多个终端同时使用同一个工具时,直接覆盖 JSON 文件可能损坏记录。可以使用按会话拆文件、临时文件原子替换或轻量数据库。工具越小,越容易忽略这种边界。
跨版本读取同样重要。旧版本保存的会话,新版本应能迁移或给出清晰错误。可以在记录中加入 schema_version,读取时根据版本做转换。不要等用户升级后才发现历史会话全都解析失败。
调试模式要醒目。若用户开启保存原文,应在配置说明和命令输出中明确提示保存路径和风险。默认保护用户,用户明确选择后再放宽,这是本地 AI 工具更稳的策略。
最后,会话恢复前应展示摘要,让用户确认继续的是哪个任务。自动加载错误历史,比不加载更危险。
一个容易忽略的数字:AI 工具每次会话的上下文如果保存完整原文,一周的日常使用就可能积累几十 MB 的 JSON 文件。不加清理策略,磁盘会慢慢被吃满。设一个保留天数加自动清理,或者只保留最近 N 轮对话,比事后删文件要靠谱。清理策略应写进配置,让用户自己决定保留多久。
还有一个隐私细节:日志文件存放路径应默认放在用户配置目录(~/.config/xxx/),不要直接落工作区根目录。我就见过有人把会话日志写在工作区根目录,git 误提交上了远程。
五、总结
Rust AI CLI 的会话历史要区分摘要、元数据和完整原文,写入前做脱敏,并提供截断、保留周期和清理命令。
命令行工具也会处理敏感上下文。默认少保存、可配置、可清理,才是更稳的本地 AI 工具设计。
380

被折叠的 条评论
为什么被折叠?



