跳转至

记忆

问题和回答

记忆让 AI 智能体在生成个性化内容时使用之前收集的信息。每条记忆由一个问题和对应的回答组成。问题可以直接使用自然语言,例如 你希望学习什么?;已有的文本键也继续支持。

在同一 MarkdownFlow 文档中,普通交互直接使用 ?[选项 A | 选项 B] 或 ?[...输入提示] 即可。后续提示词可以自然引用用户刚才的回答。当答案需要保存为记忆以供后续使用时,再添加明确的问题绑定。

收集与读取记忆

将 {{问题}} 放在交互开头,指定这次回答应记录到哪个问题下:

询问用户希望学习的主题,并保存回答以供后续小节使用。
?[{{ 你希望学习什么? }} Python | JavaScript | ...其他主题]

在后续提示词中引用同一个问题:

根据 {{ 你希望学习什么? }} 的回答选择一个相关示例,
并以适合初学者的方式讲解。

标记指定 AI 应使用的信息。AI 读取可用记忆并执行提示词;该写法不承诺自动替换源文中的文本。例如,在 HTML 属性中写入标记,并不保证平台会将回答自动填入该属性。

收集和读取时应使用相同的问题文本。修改问题文本会产生不同的键。回答是否获准持久保存、重复回答如何更新同一条记忆,以及哪些后续文档可以读取,都由承载平台决定。

记忆范围与可用性

承载平台为 MarkdownFlow 智能体提供记忆,并定义存储与共享范围。在一个文档中保存回答,并不意味着所有文档都能读取。

例如,AI 师傅的课程记忆可在同一课程的不同小节间使用,不在不同课程间共享。AI 师傅还将 sys_ 前缀保留给平台,新课程创作不能声明以此前缀开头的问题绑定。其他平台可能提供自己的系统上下文和访问规则;使用这些信息前,应查阅相应平台的说明。

在 AI 师傅中,主教学脚本里的问题绑定用于声明可记录的回答。普通 {{问题}} 引用、围栏代码示例和参考文档中的文本,本身都不会授予保存回答的权限。持久保存仍须遵循平台的记忆策略。

所需回答不可用时,应在提示词中说明先询问用户,或使用明确的默认方案,不要让 AI 编造记忆:

根据 {{ 你希望学习什么? }} 的回答选择主题。
如果没有可用的回答,先请用户选择主题,再继续讲解。

问题文本规则

问题以文本键保存,不作为编程语言的标识符或表达式解释。记忆引用和交互开头的绑定都使用 {{问题}} 标记,遵循相同的文本规则:

  1. 从 {{ 读取到第一个字面的 }}。标记内部的 {{ 不会递归解析。
  2. 去掉名称两端的空白字符(trim),结果不能为空。
  3. 其余内容逐字保留,包括内部空格、连续空格、标点、Unicode 字符、表情符号、方括号、引号和反斜杠。名称区分大小写,不进行 Unicode 或标点归一化。
  4. trim 后的名称不能包含控制字符(U+0000–U+001F 或 U+007F–U+009F)、U+2028、U+2029,也不能包含保留的结束序列 }}。

引号不表示特殊的引用语法,反斜杠也不会在名称中引入转义。{{"name"}} 使用包含双引号的键 "name",{{path\}} 使用以反斜杠结尾的键。{{name[0]}} 和 {{user.name}} 都是字面键名,不表示数组索引或属性访问。

trim 使用明确的跨语言空白字符集:U+0009–U+000D、U+001C–U+0020、U+0085、U+00A0、U+1680、U+2000–U+200A、U+2028–U+2029、U+202F、U+205F 和 U+3000。U+FEFF 保留为键内容。先 trim,再检查控制字符;内部空白不合并。

示例

标记 精确键名
{{user_name}} user_name
{{ name }} name
{{user name}} user name
{{user name}} user name(两个内部空格)
{{你的性别是?}} 你的性别是?
{{🚀 rocket}} 🚀 rocket
{{a{b}c}} a{b}c
{{ a} }} a}
{{outer{{inner}} outer{{inner(不解析嵌套)

{{}} 和 {{ }} 的 trim 结果为空,因此无效。名称内部不能包含换行或控制字符。当前语法无法表达包含字面 }} 的键:{{a}}b}} 会被解析为键 a,后面跟随文本 b}}。该结束序列没有额外的转义或引号写法。

生成标记时,应在键的两侧各加一个空格:{{ 键 }}。这样能保留以单个 } 结尾的名称,无需新增转义语法。无效或空标记按普通文本保留,解析器不能从其内部继续提取嵌套记忆标记。

交互中的问题绑定

每个记忆标记都作为一个完整的 token 解析,然后再解释交互边界和操作符。标记内部的 ] 不结束交互,| 不分隔选项,// 不引入选项值,... 不引入输入框。只有交互开头(可有前置空白)的回答绑定才指定当前交互对应的问题;位于选项内的标记不会绑定当前答案。

控件外也遵循同样的保护规则:{{ key ?[A|B] }} 是一个记忆标记,不是交互。未闭合的记忆标记将剩余内容保留为普通文本,不再从其内部识别控件。

询问用户希望选择的学习路径和级别。
?[{{ 学习[路径] | 级别//提示...? }} 概念//concepts | 示例//examples]

在下一个文档中,根据 {{ 学习[路径] | 级别//提示...? }} 调整教学内容。

两个标记使用同一个精确键名 学习[路径] | 级别//提示...?。只有回答绑定结束后的操作符才描述按钮。

Markdown 字面量边界

保留 Markdown 行内代码、完整行内公式和行内链接资源部分(目标地址及标题)、完整的尖括号 URI 或邮箱自动链接、围栏和缩进代码块、完整 HTML 标签,以及 script、style、pre、textarea 原始 HTML 块原有的边界。其中展示的记忆引用写法不能越过所属上下文,遮蔽后面的记忆标记或控件。代码和公式的分隔符在所属的原生段落或标题上下文内配对,不能跨过空段落或原生块边界,包括围栏代码块及 ATX、Setext 标题。原始 HTML 块包含结束标签所在的完整一行。为兼容已有提示词,文档记忆提取仍收集原本支持的完整示例标记,包括行内代码、HTML 标签和代码围栏语言信息中的标记;各平台保留原有的代码块排除规则。应在各个上下文内独立读取。按照 Markdown 规则用反斜杠转义左花括号后,该字符不再开启记忆标记。

列表和引用容器中的代码围栏、引用式链接定义保留 Markdown 边界。<div> 等普通 HTML 块在下一个空行结束;上述四类原始 HTML 块则在结束标签所在行之后结束。HTML 注释、处理指令、声明和 CDATA 块同样包含其结束标记所在的完整一行。原始 HTML 块和已知块标签遵循原生起始规则,起始标签可以不完整。确认离开容器时,其中的 HTML 块也随之结束。LF、CRLF 和 CR 都作为物理换行处理,不改写标记原文或源码偏移。

例如,展示 `{{`,然后 ?[{{ q }} A|B] 声明 q,并包含一个交互。在普通文本中,一旦识别出记忆标记,其内部的反引号、HTML 和用作前后空白的换行均属于标记内容;该处真正未闭合的标记仍占据后续全部内容。

兼容性

旧的交互开头绑定写法 %{{名称}} 继续兼容。新文档请使用 {{名称}}。

原有字母、数字和下划线键名保持不变。{{name}}、{{ name}} 和 {{ name }} 使用相同的键。已有的标点、引号和反斜杠键不会被解码或重命名,不迁移已存记忆。

新规则也会识别旧实现可能按普通文本处理或拒绝的名称,例如 {{user name}}。升级解析器时,应检查展示记忆引用写法的示例文本。旧版 SDK 可能曾错误地收集或替换 Markdown 转义后的起始符,文档处理现在将该起始符保留为字面量。历史上的畸形标记,以及内部含控制字符的名称,不属于有效语法。

语法不规定固定的名称长度。平台可以在规范化后另行检查存储或请求长度限制,但不能静默截断键名。旧版 SDK 可能尚不支持扩展规则,采用新规则的实现应通过共享样例。

共享一致性样例提供文本 trim、记忆提取、交互解析和文档上下文的共同验收数据。

在生成指令中使用记忆

需要个性化内容时,可以通过引用问题来指导 AI。应描述期望的输出,而不是依赖对源文进行文本插值。

标题和讲解

根据 {{ 你希望学习什么? }} 生成章节标题和简短讲解,
并选择符合用户所选主题的示例。

列表或表格

根据 {{ 你希望练习哪些技能? }} 生成表格,每项所选技能占一行,
并为每项技能推荐一个合适的入门练习。

链接或 HTML 输出

根据 {{ 你希望了解哪种产品? }} 从提供的产品目录中选择相关产品。
仅使用目录中已有的网址生成链接,并解释该产品为何符合用户的回答。