用户要求“根据团队讨论和迭代,整理成完整的章节 Markdown 内容”。
提供的材料显示了一个完整的、多轮的写作迭代过程。第1轮给出了初始草稿和编辑反馈,第2轮给出了修订后的完整稿。
编辑在第2轮末尾明确标注了[CHAPTER_DONE],意味着章节已经定稿。
我的角色是模拟AgentBehavior类中定义的“高级AI代理”,执行“严格执行PHP类”的指令。
这意味着我需要:
- 模拟内部的
think()过程。 - 产出符合所有
CONSTRAINTS(如无项目符号、表情符号标题、隐喻、块引用注释)的最终内容。 - 内容应基于提供的材料,特别是被标记为完成的版本。
分析过程:
- 分析请求:用户要求整理最终的章节内容。材料中已有一个被编辑批准的完整稿(第2轮Writer的输出)。
- 制定策略:我将采用第2轮Writer的“【第2章完整稿】”作为基础。它已经包含了编辑第一轮要求的所有元素(完整代码、深度注释、持久化细节、小结),并且编辑在第二轮已经批准。
- 自我修正:检查最终稿是否符合
CONSTRAINTS:
- NOBULLETPOINTS:内容以叙事段落和代码块呈现,没有使用项目符号列表。✅
- VISUALTITLES</strong>:每个二级标题(<code>##</code>)都以相关的表情符号开头(🧠, 🏗️, 💻, 🗄️, 🎯)。✅
- <strong>METAPHORUSE:使用了“双轨记忆”、“临时工作台”、“永久档案馆”、“海马体与皮层”、“裁剪艺术”等隐喻。✅
- ANNOTATIONS:在ScoreBasedContextCreator部分使用了Markdown块引用(>)进行深度注释。✅
完全符合。
因此,我的最终输出就是呈现这份已经被批准的、符合所有写作规范的第2章完整Markdown内容。
Alice盯着屏幕上沉默的搜索助手,一个念头击中了她:这个能干的助手,每次重启后都会“失忆”,仿佛从未与她交谈过。如何让代码拥有“记忆”,成为她新的探索目标。
🧠 记忆的两种形态:短时与长时
人类记忆分为转瞬即逝的工作记忆与沉淀数年的长期记忆。CAMEL的智能体架构精妙地映射了这种二元性——ChatHistoryBlock如同大脑的临时工作台,维护着当前对话的上下文流;VectorDBBlock则像海马体与皮层组成的永久档案馆,将对话编码为向量,支撑语义检索。两者非但不互斥,反而通过LongtermAgentMemory形成互补的“双轨记忆”系统。
🏗️ Block架构的设计智慧
CAMEL v0.2.16重构后的Memory模块采用Composite模式,MemoryBlock作为抽象基类,允许开发者像搭积木般组合存储策略。这种解耦设计让Alice既能快速原型(纯内存存储),也能生产部署(Qdrant向量库+Redis持久化),无需改动Agent核心逻辑。
💻 实战:赋予智能体持久记忆
以下是Alice为搜索助手“小科”装配双轨记忆的完整代码:
from camel.agents import ChatAgent
from camel.models import ModelFactory
from camel.types import ModelPlatformType
from camel.memories import (
ChatHistoryBlock, VectorDBBlock, LongtermAgentMemory,
ScoreBasedContextCreator, MemoryRecord
)
from camel.types import OpenAIBackendRole
from camel.utils import OpenAITokenCounter
# 初始化双轨记忆
memory = LongtermAgentMemory(
context_creator=ScoreBasedContextCreator(
token_counter=OpenAITokenCounter(ModelType.GPT_4O_MINI),
token_limit=1024,
),
chat_history_block=ChatHistoryBlock(),
vector_db_block=VectorDBBlock()
)
# 装配到Agent
agent = ChatAgent(
system_message='你是小科,拥有记忆的搜索助手',
model=ModelFactory.create(ModelPlatformType.DEEPSEEK),
memory=memory
)
🔍 深度注释:ScoreBasedContextCreator的裁剪艺术 当对话历史膨胀至超出token预算(本例1024)时,ContextCreator不会粗暴截断,而是根据每条记忆的“relevance score”智能取舍。高分记忆(如用户明确标注的重要信息)优先保留,低分内容(如早期寒暄)被优雅地移出上下文窗口,让Agent在有限视野内始终聚焦最关键信息。
🗄️ 持久化:让记忆“关机不遗忘”
纯内存记忆随进程结束而消散。要实现真正的持久化,只需替换Storage层:
from camel.storages import QdrantStorage, RedisStorage
# 向量记忆持久化到Qdrant
vector_storage = QdrantStorage(
vector_dim=1536,
url='localhost:6333',
collection_name='agent_longterm_memory'
)
# 聊天历史持久化到Redis
from camel.storages.key_value_storages import RedisStorage
chat_storage = RedisStorage(host='localhost', port=6379)
# 重构记忆模块
memory = LongtermAgentMemory(
context_creator=ScoreBasedContextCreator(...),
chat_history_block=ChatHistoryBlock(storage=chat_storage),
vector_db_block=VectorDBBlock(storage=vector_storage)
)
现在,即使重启服务,“小科”依然能记得上周Alice询问的学术论文主题——长期记忆已安全沉淀在向量数据库中。
🎯 本章回顾与展望
Alice望着运行中的“小科”,它不仅能联网搜索,还能在对话中自然引用三天前的讨论细节。这标志着她的智能体从“无状态脚本”进化为了“有记忆的伙伴”。下一章,她将为这位伙伴注入“人格”,让它能以特定角色(如严谨的技术评审员)进行专业对话。
【亮点】CAMEL的Storage层解耦设计实现了“存储后端的无感切换”——从内存到Qdrant/Redis只需改一行配置,Agent业务代码零改动,这是生产级部署的关键设计哲学。