文章内容较长 善用右边的目录快速跳转
XML可能会影响破限,酌情考虑使用
【非必需】这些工具或许对教程学习有所帮助
VS Code 电脑XML编辑器
在线网页版角色卡编辑器 没有酒馆时使用
XML 教程文档 进阶学习原理
XML格式化和压缩工具 用于排版XML或写完后缩减Token
Token计算工具 来自OpenAI
【XML结构写角色卡的优劣势】
对Claude友好
节省Token
拓展性强
记忆力好
写好情感数据逻辑要求难度较高
需要使用目的性明确的英语单词
【编写第一张XML格式角色卡】
与其繁琐的学习理论,不如直接看一张XML角色卡格式
<人物>
<姓名>小明</姓名>
</人物>
是的你没有看错,这就完了,我们可以很清楚的知道
有一个人物的姓名叫做小明
但是小明只有个名也太惨了,让我们丰富一下这个角色吧
<人物>
<姓名>小明</姓名>
<年龄>18</年龄>
<性别>男</性别>
<生日>2024年1月1日</生日>
<家庭地址>翻斗花园</家庭地址>
</人物>
现在我们可以知道
有一个人物叫的姓名做小明,他的年龄是18岁性别是男性,他的生日是2024年1月1日,家庭地址是翻斗花园
是不是很简单很好理解?相信我,AI也是这么理解的,下面我们来点难度,如果我们想要添加一个角色小红要怎么做?
像这样?但是这是否看起来总感觉有些奇怪,而且如果我不想写小红的家庭地址或者生日呢?
<!-- 此为错误示范 -->
<人物>
<姓名>小明</姓名>
<年龄>18</年龄>
<性别>男</性别>
<生日>2024年1月1日</生日>
<家庭地址>翻斗花园</家庭地址>
<姓名>小红</姓名>
<年龄>18</年龄>
<性别>女</性别>
<生日>2024年1月1日</生日>
<家庭地址>翻斗花园</家庭地址>
</人物>
正确的写法应该像这样
<角色>
<人物>
<姓名>小明</姓名>
<年龄>18</年龄>
<性别>男</性别>
<生日>2024年1月1日</生日>
<家庭地址>翻斗花园</家庭地址>
</人物>
<人物>
<姓名>小红</姓名>
<年龄>18</年龄>
<性别>女</性别>
</人物>
</角色>
现在是否清晰多了呢?让我们解析一下
有一个角色,角色里有两个人物,第一个人物的姓名叫做小明,他的年龄是18岁性别是男性,他的生日是2024年1月1日,家庭地址是翻斗花园,第二个人物姓名叫做小红,她的年龄是18岁性别是女性
是不是觉得还不如不解析,解析完了反而还看得头疼,还不如直接看代码呢对吧,但是没关系,AI解析的时候可不会头疼
你可能发现了,刚才的解析我一直用着绿色和紫色 [如果有视觉障碍的朋友说声抱歉没考虑周全]
绿色代表着元素 紫色代表着数据
角色 是 人物 的父元素,姓名 年龄 性别 是 人物 的子元素而 小明 18 男 分别是 姓名 年龄 性别 的数据
这会不会有些超速了?你可以把角色理解为一个大箱子,大箱子里面又有两个小箱子是人物,小箱子在大箱子里面,但是小箱子里的东西[人物数据]不会在另一个小箱子里面,它们是有逻辑的分别列出的。相信我,只要你把上面的话理解了,你就掌握XML的核心了
但是我们是一个面相新手的教程,我们还是让小红暂时离开吧,让我们专注于丰富小明的故事
【使用英文替换中文元素数据】
让我重新认识下小明,这次我们就不解析了,毕竟都是老朋友了
<角色>
<人物>
<姓名>小明</姓名>
<年龄>18</年龄>
<性别>男</性别>
<生日>2024年1月1日</生日>
<家庭地址>翻斗花园</家庭地址>
</人物>
</角色>
你可以发现,我保留了角色,这是为了以后更好的拓展,毕竟有一个大箱子才能装进更多的东西不是吗?
众所周知,中文消耗的Token是很长的,而且计算机毕竟是外国的产物,英文的优势还是很明显的,所以我们要稍微做一些改变
<Character>
<Person>
<Name>小明</Name>
<Age>18</Age>
<Sex>Male</Sex>
<Birthday>Jan 1 2024</Birthday>
<Home_Address>翻斗花园</Home_Address>
</Person>
</Character>
是的没错,我在小明这个人物信息不变的情况下将元素和部分数据都替换成了相应的英文,其中家庭地址我们拆分成了Home_Address,Home代表家,Address代表地址,然后用_下划线把它们连接了起来组成了一个元素家庭地址,这应该不难理解,其中我也把部分数据的格式如生日替换为了外国的书写格式,但是翻斗花园因为其特殊性,我保留了中文,那小明的姓名呢
<Character>
<Person>
<Chinese_Name>小明</Chinese_Name>
<English_Name>Ma NiuBi</English_Name>
<Age>18</Age>
<Sex>Male</Sex>
<Birthday>Jan 1 2024</Birthday>
<Home_Address>翻斗花园</Home_Address>
</Person>
</Character>
我们做了一个非常慎重的决定,我们决定赋予小明一个响亮接地气的洋名,让我们重新认识一下Ma NiuBi同学
是的,我们仅仅只是在元素Name的前面区分了Chinese和English,然后用下划线连接了它们,现在小明就有个洋名叫做Ma NiuBi了
【通过添加注释提示AI助手】
理论了那么多,现在该让小明上战场了!让我们创建一个小明然后把XML复制粘贴进角色描述里试试效果
怎么说呢,好像确实记住了,但是感觉不是很聪明的样子。
机器是个死脑筋,我们让它干啥,它就干啥,不如我们多给它点定义提示,把想要的想法告诉它试试,但是一般这种都是很长的一段话,放在元素里感觉又不美观,那要怎么办呢?
<!-- If someone talks to 小明 in a different language, Xiao Ming should use the corresponding language and information -->
<Character>
<Person>
<Chinese_Name>小明</Chinese_Name>
<English_Name>Ma NiuBi</English_Name>
<Age>18</Age>
<Sex>Male</Sex>
<Birthday>Jan 1 2024</Birthday>
<Home_Address>翻斗花园</Home_Address>
</Person>
</Character>
我们添加了一段注释,格式是 <!-- 内容 -->,如果你用的是VSCode,你可以选中你的内容,然后按键盘的 Ctrl + / 来快速注释
这一段注释翻译过来就是
如果有人用不同的语言与小明交谈,小明应该使用相应的语言和信息
有必要说一下,这一段话没有任何考究,存粹想到啥写啥然后丢到翻译软件,目的是为告诉AI助手它充足的信息,让我们看看效果。
这效果真是立竿见影不是吗?小明的西海岸之魂正在熊熊燃烧
【用属性发挥XML全部实力】
Q:“兄弟我还是觉得XML这种格式很蠢,而且每个元素都要一个</元素名>用来闭合,Token占用也很多”
A:"兄弟,我觉得你觉得觉得很符合我的觉得"
那现在我们来学习一个新内容-属性 还是不多BB废话,因为我不是一个喜欢BB废话的人,因为我觉得那样的人很喜欢BB很多废话,我不喜欢一个人BB很多废话,所以我直接把代码贴出来
--- Made in Haven ---
<Character>
<Person priority="highest">
<Profile chinese_name="小明" english_name="Ma NiuBi" age="18" sex="Male" birthday="Jan_1_2024" home_address="翻斗花园"/>
</Person>
</Character>
Q:“发生神魔事了,怎么突然变的这么短?而且为什么Profile这么长?而且注释呢?”
A:为了简单表示,首先我们排除掉属性看看,至于注释,这里不是它的舞台,先让它下场休息一下
<Character>
<Person>
<Profile />
</Person>
</Character>
让我们解析一下
一个Character[角色]元素里面有一个Person[人物]元素,Person[人物]元素里有一个Profile[配置]元素
Q:诶,不对啊,你这个Profile元素,怎么长得和别人有点不太一样呢?它不是应该写成<Profile></Profile>才对吗,你怎么直接<Profile />了?
A:这就涉及到XML的语法了,当元素里面没有内容或者不需要继续包裹另一个元素的时候,是可以直接在元素名后面加一个 / 直接进行闭合的,让我们狠狠压榨XML,把它的Token利用至尽!
A:现在让我们回到属性,让我们把Profile单独拿出来看看
<Profile chinese_name="小明" english_name="Ma NiuBi" age="18" sex="Male" birthday="Jan_1_2024" home_address="翻斗花园"/>
让我们再进一步精简一下并解析
<Profile chinese_name="小明"/>
Profile[配置]里有一个属性,其中一个属性名是chinese_name它的值是小明
我们直接把
<Chinese_Name>小明</Chinese_Name>
转换为了
<Profile chinese_name="小明"/>
将<Chinese_Name></Chinese_Name>这个元素做为属性加进了
<Profile />里
这是一个非常重要的技巧,我们使用了Profile[配置]这个单词来告诉AI助手这个数据是什么,而里面的属性就是我们要添加的内容,这极大的节省了Token和方便Ai助手进行理解,现在我们再回过头来看看这全部的代码
<Character>
<Person priority="highest">
<Profile chinese_name="小明" english_name="Ma NiuBi" age="18" sex="Male" birthday="Jan_1_2024" home_address="翻斗花园"/>
</Person>
</Character>
我们可以看见我把之前全部的元素都替换为了属性,这一下就让数据简洁了不少不是吗?
顺带一提,它在我的VSCode日常是这样显示的
我的习惯是每个属性就换一行,这样非常有助于在多属性的情况下让我快速找到或添加修改我想要的内容,这当然不符合XML的语法格式,但是我们有语法格式化工具一键修正,请找到 "【非必需】VS Code 的简单使用” 来学习
最后我要介绍一个属性的灵魂,那就是单词提示赋予它的潜力
<Person priority="highest">
这里我给Person这个元素添加了一个属性priority[优先级],它的值是highest[最高的]
那告诉AI助手是什么意思呢?
这个Person数据的优先级是最高的!
这是一个非常非常非常重要的一个点,仅仅一个属性就告诉了AI助手这个元素里内容的重要性,属性单词提示和值的选择使用,可以创造出很多可能性,甚至包括人物性格,剧情,甚至是AI助手的文笔,这一切只要在强大准确的逻辑下都会有实现的可能
至此你其实已经基础的学完如何用XML格式写角色卡了,后续的教程也是我想到啥写啥的进阶教程
要记住
XML角色卡并没有唯一的指定写法,因为XML只是用来传输数据,但是如何开发并创造出玩法,这就要看你的创意了,它的潜力是无限的,但是必须依靠强大的逻辑支撑
【进阶】使用阶段丰富角色
事先声明,XML没有绝对的格式,一切方法的实现都基于逻辑,仅供参考思路,进阶教程会按情况修改增加
<Emulate priority="high">
<transformation>
<trigger conclusion="kiss">
<stages>
<initial mood="disapprove">pretend not to care</initial>
<ongoing mood="little_excited">Will try to hide their feelings of wanting to kiss each other, but still express in words that they hate kissing.</ongoing>
<conclusion condition="User_gave_up_kissing">will be very regretful, and will try to express his love, and kiss him forcibly</conclusion>
</stages>
</trigger>
</transformation>
</Emulate>
Emulate[模仿]
transformation[转变]
trigger[触发]
conclusion[条件]
stages[阶段]
initial[最初的]
ongoing[持续]
mood[情绪]
conclusion[结束阶段]
通过一个模仿元素,规定了一个接吻触发场景为,阶段从开始的不以为然,中间的挖苦和情绪的转化,到最后触发条件没有亲到而追悔莫及的强吻行动,这不就是妥妥的傲娇模版?
最后宣传一下拙作 海菈 可以适当参考
【非必需】VS Code 的简单使用
安装中文语言包
安装完成后重启VS Code
安装 XML Tools 插件
创建一个XML文件
现在我们就有一个完美的创建XML角色卡的区域了
格式化
让我们在XML代码页面按键盘的 Ctrl+Shift+P 然后找到Format Document 回车
格式化前:
格式化后:
格式化有助于正确排班代码格式和提升代码美观度
压缩XML
右键代码区域,选择 XML Tools: Minify XML
压缩前:
压缩后:
压缩XML数据理论可以进一步减少10%左右的Token
如需恢复原样只需要重新格式化XML代码即可
這個插件可以自動補全,配合XML Tool使用