Agent能接着聊天,不代表它能接着干活。聊天记录保存“说过什么”,工作区保存“做出了什么”,长期记忆保存“以后仍值得使用的事实”。把三者混成一个数据库,轻则上下文越来越贵,重则用户A的文件被用户B读到。分层后,重启恢复、权限审计和删除才有清楚边界。
最新事件:虚拟文件系统接上对象存储
微软在9月22日介绍langchain-azure-storage的公开预览:LangChain Deep Agents可把read、write、edit、ls、glob、grep等文件工具接到Azure Blob Storage。文本保存在Blob内容中,目录由对象键前缀模拟;第二个Agent即使没有第一个Agent的对话,也能读取同一工作区产物。来源为微软Azure SDK文章与当前包说明。
这项更新真正值得学的,不是把本地目录换成云存储,而是给Agent状态划清层次。
三种状态分别解决什么问题
生活类比:对话状态像会议记录,工作区像会议共享盘,长期记忆像经过确认后写进公司制度。会议记录能解释上下文,共享盘承载代码、表格和草稿,制度库只保留稳定规则。
类比的边界是:Agent不会天然判断哪句话应升级为长期记忆,也不会因为文件在共享盘里就自动理解它。应用仍需决定写入时机、命名空间、检索方式和删除策略。
准确地说,对话状态通常是消息与工具调用序列;持久工作区是Agent可通过文件工具读写的任务产物;长期记忆则是跨会话复用、经过提炼的用户偏好或领域事实。三者的保留期限、访问主体和一致性要求不同。Blob后端解决的是文件耐久性,不自动提供语义检索、事实去重或正确性保证。
flowchart LR
A[用户提出任务] --> B[对话状态记录意图]
B --> C[Agent调用文件工具]
C --> D[临时草稿]
D --> E{是否需要跨重启保留}
E -- 否 --> F[临时空间到期删除]
E -- 是 --> G[持久工作区按用户和任务隔离]
G --> H{是否为稳定事实}
H -- 否 --> I[继续作为任务文件]
H -- 是 --> J[审核后写入长期记忆]
J --> K[新会话按权限检索]
最小实践:两个“Agent进程”共享产物
无需第三方依赖,保存为workspace_demo.py后运行python workspace_demo.py:
from pathlib import Path
import hashlib
import json
ROOT = Path("agent_workspace")
def task_dir(user_id: str, task_id: str) -> Path:
safe = hashlib.sha256(f"{user_id}:{task_id}".encode()).hexdigest()[:16]
path = ROOT / safe
path.mkdir(parents=True, exist_ok=True)
return path
def first_process() -> None:
path = task_dir("user-42", "report-7")
(path / "draft.md").write_text("结论:先核对原始数据。", encoding="utf-8")
(path / "manifest.json").write_text(
json.dumps({"owner": "user-42", "status": "draft"}, ensure_ascii=False),
encoding="utf-8",
)
def second_process() -> None:
path = task_dir("user-42", "report-7")
manifest = json.loads((path / "manifest.json").read_text(encoding="utf-8"))
assert manifest["owner"] == "user-42"
print((path / "draft.md").read_text(encoding="utf-8"))
first_process()
second_process()
task_dir先把用户与任务组合成稳定命名空间,避免直接信任外部路径;第一个进程写草稿和清单,第二个进程不需要任何聊天历史也能恢复产物。这个本地示例已在本次任务中用Python 3实际运行,输出“结论:先核对原始数据。”。它只演示状态边界,不等同云端并发、权限和故障测试。
真实接入可安装pip install -U "langchain-azure-storage[deepagents]",再用AzureBlobBackend配置账户URL、容器和前缀。官方包默认使用DefaultAzureCredential,生产环境应优先托管身份;模型密钥与存储身份是两套权限,不要混为一个万能密钥。
四个常见误区
第一,保存全部聊天就等于持久化。聊天中可能没有生成文件的完整内容,也缺少版本与校验值。第二,共享容器就等于协作。没有按租户、用户和任务划分前缀及权限,共享会变成串数据。第三,Blob耐久就等于一致。两个Agent同时编辑同一文件仍需版本号、租约或冲突处理。第四,工作区就是知识库。文件能被列出,不代表能按语义找到正确段落;RAG(检索增强生成)还需要切分、索引、过滤和引用。
还要警惕“什么都永久保存”。草稿、上传原件和推理中间物可能含敏感数据,应分别设置保留期、加密、审计与删除流程。真正进入长期记忆的内容,最好经过用户确认或业务规则审核。
版本控制同样不能省。对象存储里的最后一次写入可能覆盖前一个Agent的结果;至少要保存内容哈希、写入者、来源任务和生成时间。高价值产物还应采用不可变版本或条件写入,让冲突显式失败,而不是静默留下一个看似完整的错误文件。
适用与不适用场景
持久工作区适合长任务、代码生成、报告制作、跨进程协作和需要恢复的Agent。不适合拿来替代事务数据库,也不适合让多个租户无条件共享同一前缀。需要精确查询、强事务或语义检索时,应配合数据库与向量索引,而非要求对象存储包办一切。
我的判断
Agent可靠性的第一步,不是记住更多,而是让每类状态只承担一种责任。 对话负责解释过程,工作区负责保存产物,长期记忆负责复用稳定事实。分开之后,恢复、授权和遗忘才都可测试。
5分钟实践题
列出你的Agent会产生的五类数据,为每类写下所有者、保存时长、恢复方式和删除条件。若某项同时被叫作“聊天记录”“文件”和“记忆”,就说明边界还没画清。
你的Agent重启后,最应该保留的是聊天、文件,还是经过审核的长期事实?
关注「蜗牛聊AI」,一起看懂技术变化背后的真正机会。
本文首发于 java4u.cn,转载请注明出处。