要点
- $0.50 的试用额度足以进行数百次简短的角色扮演回合,有效期 7 天,无需付款。
- 任何接受 OpenAI 兼容接口的前端均可使用:设置 base URL、密钥和模型
uncensored。 - 成本由聊天历史记录长度决定,而非回复长度。精简或总结旧回合。
- 仅限合法成人的虚构和角色扮演。绝不涉及未成年人。
此处的“免费”含义
该服务没有无限免费聊天,最好提前说明。你获得的是试用余额:使用 Google 或电子邮件和密码注册后,你可以在 API 密钥页面 上一键领取 $0.50 的试用额度。每人限领一次,有效期 7 天,无需付款。试用密钥支持 2 个并发请求和每分钟 60 个请求,这对于单人聊天已绰绰有余。
这听起来很少,但 token 很便宜。输入成本为每 1M token $0.15,输出成本为每 1M token $0.50。一次典型的角色扮演回合,使用 8,000 token 的提示词和 300 token 的回复,成本为 $0.00135,因此 $0.50 大约可覆盖 370 次回合。对许多人来说,这足以度过整个晚上或完成几部短篇故事,足以在产生任何费用之前判断设置是否适合你。
当试用额度用完时,你可以从 $20 起以任意整数金额充值,最高 $500。额度永不过期,失败或被拒绝的请求不收费,且无需取消订阅。该站点仅接受加密货币:TRC20 上的 USDT 或 Base 上的 USDC。
选择前端
API 仅通过 HTTP 传输文本。你仍需要一些工具来保存你的角色、聊天历史记录和提示词模板。三种常见选择:
- SillyTavern。 一款专为角色聊天构建的本地 Web 应用,支持设定集、人设和预设。它允许你添加一个 OpenAI 兼容的接口,这正是本 API 所提供的。
- 另一个聊天客户端 暴露了自定义 OpenAI 兼容 URL 的字段。寻找名为自定义接口、代理或 OpenAI 兼容的设置。
- 你自己的脚本。 50 行 Python 代码即可让你完全掌控内存、提示词和成本。这也是查看实际发送内容的最佳方式。
如果你正在构建应用而不仅仅是聊天,相同的调用也适用于任何 OpenAI SDK。文档中的快速入门在一个地方列出了接口、标头和限制。
分五步连接 SillyTavern
- 创建账户,打开API 密钥页面,领取试用额度并复制你的密钥。
- 在 SillyTavern 中,打开插件图标(API 连接)并将 API 类型设置为Chat Completion。
- 选择名为 Custom (OpenAI-compatible) 的源。
- 将
https://api.uncensoredvideo.cc/v1粘贴到自定义接口字段,将密钥粘贴到密钥字段,并将uncensored输入为模型 ID。 - 点击连接。绿色状态表示对
GET /v1/models的请求或测试消息成功。
菜单标签在 SillyTavern 版本之间会有所变化,因此请按意思对应而非照搬措辞。在责怪应用之前,请从终端测试密钥:
curl https://api.uncensoredvideo.cc/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"uncensored","messages":[{"role":"user","content":"Reply with the word ready."}]}'如果 curl 能正常工作但应用不行,问题出在应用的字段中:缺少 /v1、密钥中有意外空格,或模型名称错误。
或者编写一个简单的聊天循环
脚本是了解角色扮演成本的好方法,因为你可以打印每次回合的 token 使用情况。此脚本保留人格提示词,将历史记录限制为最后 20 条消息,并流式输出回复。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.uncensoredvideo.cc/v1",
api_key=os.environ["API_KEY"],
)
system = (
"You are Mara, a dry-witted smuggler pilot in a space-opera story. "
"Stay in character, write in third person, keep replies under 150 words."
)
history = []
while True:
user = input("> ")
history.append({"role": "user", "content": user})
messages = [{"role": "system", "content": system}] + history[-20:]
stream = client.chat.completions.create(
model="uncensored",
messages=messages,
temperature=0.9,
top_p=0.95,
max_tokens=300,
stream=True,
stream_options={"include_usage": True},
)
reply = ""
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
piece = chunk.choices[0].delta.content
reply += piece
print(piece, end="", flush=True)
if chunk.usage:
print("\n[tokens in/out: %d/%d]" % (chunk.usage.prompt_tokens, chunk.usage.completion_tokens))
history.append({"role": "assistant", "content": reply})观察使用情况行。经过几十次回合后,你会看到输入计数上升,而输出保持平稳。这是你需要管理的数字。
编写一个持久的角色提示词
大多数角色扮演问题始于提示词,而非模型。一个好的角色提示词应简短且具体。给角色起名,用一两句话描述语气,描述背景,并说明回复长度。然后停止。每条额外规则都是你在每轮对话中都要付费的 token,而冗长的“要”和“不要”列表往往不如清晰的示例执行得好。
比较两种描述同一飞行员的方式。第一种说她勇敢、有趣、忠诚和聪明。这没有给模型任何可据以行动的信息。第二种说她先开玩笑回答问题,再说真话,除非被问两次,否则不解释过去,并在飞船部件损坏时轻微咒骂。第二种给出了模型可以重复的习惯,而习惯正是读者体验到的个性。
添加一个简短的三到四行对话示例。模型非常擅长模仿节奏,因此示例可以固定长度、时态和视角,而无需单独的规则。如果你使用第二人称,请展示它。如果你想要斜体叙述,也请展示。将示例放在系统提示词中或作为历史记录的前几条消息。
最后,决定谁控制其他角色。如果你希望模型扮演整个演员阵容,请说明。如果你希望它只扮演一个角色,请说明它绝不能写你角色的话语或动作。在你角色名称上的停止序列可在 API 层面支持这一点。
一次角色扮演回合的成本
每次请求都会重新发送系统提示词、角色描述和历史记录,因此随着聊天变长,输入 token 会增长。以下是 300 token 回复的计算:其单独成本为 300 x $0.50 / 1,000,000 = $0.00015:
| 提示词大小 | 输入成本 | 每回合成本 | 每 100 次回合 | $0.50 可支持的回合数 |
|---|---|---|---|---|
| 4,000 token | $0.0006 | $0.00075 | $0.075 | 约 666 |
| 8,000 token | $0.0012 | $0.00135 | $0.135 | 约 370 |
| 20,000 token | $0.0030 | $0.00315 | $0.315 | 约 158 |
| 50,000 token | $0.0075 | $0.00765 | $0.765 | 约 65 |
计算很简单。对于相同数量的回合,8,000 token 的提示词比 50,000 token 的提示词便宜约 5.7 倍。在 8,000 token 的水平下,$20 的充值可支持约 14,800 个回合。更大的充值有额外奖励:$50 起 +5%,$100 起 +10%,$200 起 +15%,因此 $100 可获赠 $110 额度。完整表格请参阅 定价页面。
保持长篇故事便宜且连贯
上下文窗口为 100,000 token(包含提示词和回复),因此你可以加载大量内容。但你通常不应这样做。长提示词成本更高,并给模型更多容易失去追踪的文本。以下习惯会有所帮助:
- 先总结,再丢弃。 每 20 个回合,让模型对到目前为止的故事进行 150 词的总结,将其保留在系统提示词中,并删除旧消息。
- 保持角色卡简短。 模型忽略的规则页就是你在每个回合都要付费的页面。
- 限制回复长度。
max_tokens是可选的,但限制可以防止回复失控并保持节奏紧凑。 - 调整采样。 0.8 到 1.0 之间的温度适合小说。如果模型重复短语,稍微提高频率或存在惩罚。它们会被传递。
- 使用
stop序列,这样模型就不会替你写台词,例如在你的角色名称后加上冒号作为停止符。
固定种子也会一并传入,这在你想回放场景并比较两个提示词版本时很有帮助。
常见问题与快速修复
以下是长对话中最常遇到的问题,以及通常能解决问题的设置。
- 模型替你说。 在系统提示词中添加一行,并在角色名称上设置停止序列。
- 回复逐轮变长。 模型会复制早期回复的长度。降低
max_tokens,手动缩短一条长回复,即可重置该模式。 - 重复短语。 略微提高温度,添加较小的存在惩罚或频率惩罚,并多样化你自己的消息。模型会镜像它所看到的内容。
- 遗忘细节。 将必须保留的事实(如姓名、伤势和承诺)放在提示词顶部附近的简短固定笔记中,并在故事变化时刷新它。
- 语调平淡。 提供更强的声音示例。语调更多来自示例,而非形容词。
当出现异常情况时,打印你的脚本发送的完整消息列表。十有八九,原因在提示词本身可见:一条残留的指令、重复的摘要,或未修剪的历史记录。
可能遇到的限制和错误
完整密钥允许 8 个并发请求和每分钟 300 个请求,试用密钥为 2 和 60。如果超出限制,API 将返回 HTTP 429。错误代码 rate_limited 表示每分钟请求过多,concurrency 表示同时请求过多。带有 Retry-After: 5 头的 429 响应表示临时过载,因此等待五秒后重试。
一个容易让人忽略的细节:流式请求会占用其并发槽位,直到流结束。如果你在试用密钥上快速点击三次重新生成,第三次尝试可能会因 concurrency 而失败。等待流结束,或让客户端在短暂暂停后重试。每个响应都包含 X-Balance-USD,因此你的脚本可以在每轮之后打印剩余余额。
一条不变的规则:该模型经过调整,可在合法成人使用中无内容拒绝地回答,且不会生成涉及未成年人的性内容。让你的故事保持在此界限内。提示词不用于训练。
