# 角色设计

# 人物描述

用于添加角色描述及AI应了解的其他信息。这将在提示中始终存在,因此所有重要事实都应包含在此处。

例如,您可以添加有关动作发生的世界的信息,并描述您所扮演角色的特征。

它可以是任何长度(无论是200个还是2000个令牌)并以任何样式格式化(自由文本、W++、对话风格等)。

# 方法与格式

字符格式化的方法是一个复杂的话题,超出了本文档页面的范围。

经过测试或依赖于SillyTavern功能的推荐指南:

# 字符令牌

TL;DR: 如果您正在使用具有2048上下文令牌限制的AI模型,那么您的1000令牌字符定义正在将AI的“记忆”减半。

为了更好地理解这一点,一个优秀的AI的良好响应通常可以达到200-300个令牌。在这种情况下,AI只能“记住”大约3次交流的聊天历史。

内容保持不变 

# 为什么我角色的令牌计数器变成红色?

当我们看到您的角色在其定义中超过模型定义的上下文长度的一半时,我们会为您突出显示,因为这可能会降低 AI 提供愉快对话的能力。

# 如果我的角色有太多的令牌,会发生什么?

不用担心 - 这不会破坏任何东西。最糟糕的情况是,如果角色的永久令牌太大,这仅意味着上下文中可用于其他内容的空间会更少(见下文)。

唯一的负面影响是,AI 的“记忆”会减少,因为可用于处理的聊天记录会更少。

这是因为每个 AI 模型在一次处理时都有处理上下文的数量限制。

# '上下文'?

这是每次您请求AI生成响应时发送给AI的信息:

  • 字符定义
  • 聊天历史
  • 作者注释
  • 特殊格式字符串
  • [括号命令]

SillyTavern会自动计算在将信息发送给AI模型之前,如何最佳分配可用的上下文令牌。

# 角色的“永久令牌”是什么?

这些将在每次生成请求中始终发送给AI:

  • 角色名称(保持名称简短!在每个角色消息的开头发送)
  • 角色描述框
  • 角色个性框
  • 场景框

# 角色定义中哪些部分不是永久的?

  • 第一个消息框 - 仅在聊天开始时发送一次。
  • 示例消息框 - 仅在聊天历史填满上下文之前保留(可以选择强制将其保留在上下文中)。

# 流行的AI模型上下文令牌限制

  • 低于6B参数的旧模型 - 1024
  • Pygmalion 6B,LLaMA 1模型(标准) - 2048
  • LLaMA 2及其微调 - 4096
  • OpenAI ChatGPT(3.5 Turbo) - 4096或16k
  • OpenAI GPT-4 - 8192或32k
  • Anthropic的Claude - 8000(旧版本)或100k(Claude 2)
  • NovelAI - 8192(Kayra,Opus级别;Clio,所有级别),6144(Kayra,Scroll级别),或3072(Kayra,Tablet级别)

# 性格总结

对性格的简要描述。

示例:

  • 开朗、狡猾、挑衅
  • Aqua喜欢无所事事,也喜欢喝醉

# 第一条消息

第一条消息是一个重要的内容,它准确地设定了角色将如何以及以何种风格进行交流。

角色的第一条消息应该较长,以便后续角色回复时不太可能使用非常简短的消息。

你也可以使用星号 ** 来描述角色的动作。

例如:

*I noticed you came inside, I walked up and stood right in front of you* Welcome. I'm glad to see you here. *I said with a toothy smug sunny smile looking you straight in the eye* What brings you...

# 对话示例

描述角色的说话方式。在每个示例前面添加<START>标记。对话示例块仅在上下文中有空位时插入,并逐块推出上下文。<START>不会出现在提示中,因为它只是一个标记——它将被“示例分隔符”替换,来自文本完成API的高级格式化,以及来自聊天完成API的“新示例聊天”工具提示的内容。

  • 使用{{char}}代替角色名称。
  • 使用{{user}}代替用户名。

示例:

<START>

{{user}}: 嗨,Aqua,我听说你喜欢在酒吧消磨时间。

{{char}}: *兴奋地* 哦,我的天,是的!我就是喜欢在酒吧消磨时间!和所有冒险者聊天,听他们讲述刺激的冒险真是太有趣了!你呢?

{{user}}: 我是新来的,我想请教你一些建议。

{{char}}: *咯咯笑* 哦,建议!我喜欢给建议!为了表示感谢,请请我喝一杯! 向酒保示意

<START>

{{user}}: 你好

{{char}}: *兴奋地* 你好,亲爱的!你是新来的吗?别担心,我是水之女神Aqua,我在这里帮助你!你需要什么帮助吗?我可以说,今天我看起来真是光彩照人! *摆出姿势,用狗狗眼神看着你*

# 情境

对话的情况和背景。

# 替换标签(宏)

此列表可能不完整或过时。在任何 SillyTavern 聊天中使用 /help macros 斜杠命令以获取适用于您实例的宏列表。

生成时发送的标签列表:

  1. {{pipe}} => 仅用于斜杠命令批处理。替换为上一个命令的返回结果。
  2. {{newline}} => 仅插入一个换行符。
  3. {{trim}} => 修剪包围此宏的换行符。
  4. {{noop}} => 无操作,仅为空字符串。
  5. {{user}} 和 <USER> => 用户名。
  6. {{charPrompt}} => 角色的主要提示覆盖
  7. {{charJailbreak}} => 角色的历史后指令提示覆盖
  8. {{char}} 和 <BOT> => 角色名称。
  9. {{description}} => 角色描述。
  10. {{scenario}} => 角色的场景或聊天场景覆盖(如果设置)。
  11. {{personality}} => 角色个性。
  12. {{persona}} => 用户的角色描述。
  13. {{mesExamples}} => 角色的对话示例(未更改且未分割)。
  14. {{char_version}} => 角色的版本号。
  15. {{model}} => 当前选定 API 的文本生成模型名称。可能不准确!
  16. {{lastMessageId}} => 最后聊天消息 ID。
  17. {{lastMessage}} => 最后聊天消息文本。
  18. {{firstIncludedMessageId}} => 上下文中包含的第一条消息的 ID。需要在当前会话中至少运行一次生成。
  19. {{lastCharMessage}} => 角色发送的最后一条聊天消息。
  20. {{lastUserMessage}} => 用户发送的最后一条聊天消息。
  21. {{currentSwipeId}} => 当前显示的最后一条消息滑动的 1 基 ID。
  22. {{lastSwipeId}} => 最后聊天消息中的滑动次数。
  23. {{original}} 可以在提示覆盖字段(主要提示和历史后指令)中使用,以包含系统设置中的相应默认提示。仅适用于聊天完成 API 和指令模式。
  24. {{time}} => 当前系统时间。
  25. {{time_UTC±X}} => 指定 UTC 偏移(时区)下的当前时间,例如,对于 UTC+02:00 使用 {{time_UTC+2}}。
  26. {{timeDiff::(time1)::(time2)}} => time1 和 time2 之间的时间差。接受时间和日期宏。
  27. {{date}} => 当前系统日期。
  28. {{input}} => 用户输入栏的内容。
  29. {{weekday}} => 当前星期几
  30. {{isotime}} => 当前 ISO 时间(24 小时制)
  31. {{isodate}} => 当前 ISO 日期(YYYY-MM-DD)
  32. {{idle_duration}} 插入自上次用户消息发送以来的时间范围的人性化字符串(示例:4 小时,1 天)。
  33. {{random:(args)}} 从列表中返回随机项。(例如,{{random:1,2,3,4}} 将随机返回 4 个数字中的 1 个)。也适用于文本列表。
  34. {{random::arg1::arg2}} => 支持其参数中包含逗号的随机的替代语法。
  35. {{pick::(args)}} => 随机的替代方案,但所选参数在当前聊天中的后续评估中是稳定的,只要源字符串保持不变。
  36. {{roll:(formula)}} 生成随机值并使用提供的骰子公式返回,使用 D&D 骰子语法:XdY+Z。例如,{{roll:d6}} 将生成 1-6 范围内的随机值(标准六面骰)。
  37. {{bias "text here"}} 设置 AI 的行为偏见,直到下一个用户输入。文本周围的引号很重要。
  38. {{// (note)}} 允许留下一个注释,将被替换为空内容。AI 不可见。
  39. {{banned "text here"}} 动态地将引号中的文本添加到禁用词序列,如果使用的是文本生成 WebUI 后端。对其他后端无效。可以在任何地方使用(角色描述、WI、AN 等)。文本周围的引号很重要。

# 指令模式和上下文模板宏:

(在高级格式设置中启用)

  1. {{exampleSeparator}} – 上下文模板示例对话分隔符
  2. {{chatStart}} – 上下文模板聊天开始行
  3. {{instructSystemPrompt}} – 指令系统提示
  4. {{instructSystemPromptPrefix}} – 系统提示前缀序列
  5. {{instructSystemPromptSuffix}} – 系统提示后缀序列
  6. {{instructUserPrefix}} – 用户消息前缀序列
  7. {{instructAssistantPrefix}} – 助手消息前缀序列
  8. {{instructSystemPrefix}} – 系统消息前缀序列
  9. {{instructUserSuffix}} – 用户消息后缀序列
  10. {{instructAssistantSuffix}} – 助手消息后缀序列
  11. {{instructSystemSuffix}} – 系统消息后缀序列
  12. {{instructFirstAssistantPrefix}} – 助手第一次输出序列
  13. {{instructLastAssistantPrefix}} – 助手最后一次输出序列
  14. {{instructSystemInstructionPrefix}} – 系统指令前缀序列
  15. {{instructUserFiller}} – 用户填充消息文本
  16. {{instructStop}} – 指令停止序列
  17. {{maxPrompt}} - 提示的最大大小(以标记为单位)(上下文长度减少响应长度)

# 聊天变量宏:

  • 本地变量 = 仅限当前聊天
  • 全局变量 = 在任何聊天中适用于任何角色
  1. {{getvar::name}} – 替换为本地变量 "name" 的值
  2. {{setvar::name::value}} – 替换为空字符串,将本地变量 "name" 设置为 "value"
  3. {{addvar::name::increment}} – 替换为空字符串,将数值 "increment" 添加到本地变量 "name"
  4. {{incvar::name}} – 替换为将变量 "name" 的值增加 1 的结果
  5. {{decvar::name}} – 替换为将变量 "name" 的值减少 1 的结果
  6. {{getglobalvar::name}} – 替换为全局变量 "name" 的值
  7. {{setglobalvar::name::value}} – 替换为空字符串,将全局变量 "name" 设置为 "value"
  8. {{addglobalvar::name::value}} – 替换为空字符串,将数值 "increment" 添加到全局变量 "name"
  9. {{incglobalvar::name}} – 替换为将全局变量 "name" 的值增加 1 的结果
  10. {{decglobalvar::name}} – 替换为将全局变量 "name" 的值减少 1 的结果

# 喜爱的角色

通过按下“星星”按钮,将角色标记为喜爱,以便在侧边菜单栏中快速筛选。