NsfwAiApi/指南
角色扮演最佳本地 LLM 还是托管 API?
最适合角色扮演的大型本地 LLM 是你 GPU 能承载的、质量可接受的无审查模型,且该答案每几个月就会变化。如果你更想跳过硬件环节,托管接口能让你通过更改一个 URL 获得相同的聊天工作流。

本地还是托管:快速决策
如果你已拥有性能强劲的 GPU、希望完全离线或喜欢调整模型,请选择本地。如果你希望在故事中拥有长记忆、使用笔记本或手机,或者宁愿花几分钟也不愿花几个周末进行设置,请选择托管。许多人两者兼用:本地模型用于私密实验,托管模型用于长战役。
| 因素 | 本地模型 | 托管 API |
|---|---|---|
| 成本模型 | 硬件与电力,无按 token 计费 | 从预付额度按 token 付费 |
| 模型大小 | 受限于你的 GPU 显存 | 由提供商运行的任何模型 |
| 上下文长度 | 受限于显存,因为更长的上下文需要更多显存 | 此处为 100,000 token |
| 隐私 | 没有任何内容离开你的机器 | 提示词会发送至提供商;在此处不会用于训练 |
| 设置 | 运行时、权重、量化、更新 | Base URL 和密钥 |
| 任何设备均可使用 | 仅当你暴露自己的机器时 | 是 |
决定最佳本地模型的因素
最佳本地 LLM 的排名更新很快,且没有适合所有人的单一名称。相反,应根据实际会话中出现的因素来评估候选模型。
- 拒绝行为。 许多基础模型和指令微调模型经过调整,会拒绝某些主题。专为小说微调或标记为无审查的模型通常拒绝较少,但质量参差不齐,因此请根据你的场景进行测试。
- 保持角色一致性。 注意模型是否会开始叙述你角色的动作、每轮重复相同的短语或忘记房间里是谁。
- 文本质量。 连续阅读十个回复。有些模型适合单轮对话,但到第十轮时就会令人厌倦。
- 上下文处理。 模型可能宣称拥有长窗口,但仍会丢失中间部分的细节。运行一个测试,让早期对话中的事实在后期变得重要。
- 大小和量化。 经过重度量化压缩的大模型可能比以高精度运行的小模型丢失更多内容。请进行比较,不要假设。
你使用的运行时相关的社区讨论和模型卡片是获取当前推荐的最佳场所。下载两三个候选模型,在每个模型上运行相同的场景,保留那个让你想继续写下去的。
本地能力耗尽时
角色扮演者遇到的最大障碍是显存,这体现在两个方面。首先是模型本身:更大的模型效果更好,但需要更多的 GPU 显存。其次是上下文。长故事中的每条消息在每次新轮次中都会再次发送,存储它的缓存也会随长度增长,因此长战役可能会挤爆仅能处理短对话的 GPU。
常见的变通方法是总结旧轮次、使用仅注入相关事实的设定集(lorebooks)以及降低上下文大小。它们有效,但也是一种妥协。拥有 100,000 token 窗口的托管接口让你可以将更多故事内容保持在视野中,这适合长战役、拥有许多角色的共享世界以及持续数周的故事。
权衡在于成本,因此衡量它会有所帮助。假设聊天有 30,000 token 的历史记录,模型每次回复生成 300 token。一次交互需要 30,000 个输入 token,每 1M 个 token 价格为 $0.15,即 $0.0045,加上 300 个输出 token,每 1M 个 token 价格为 $0.50,即 $0.00015。每次交互成本为 $0.00465,100 次交互为 $0.465。一个漫长的夜晚游玩成本远低于一美元。定价页面列出了费率以及较大充值对应的奖励层级。
Python 中的托管设置
该接口兼容 OpenAI,因此官方的 openai 包无需更改即可使用,只需更改 Base URL 和密钥。模型 ID 为 uncensored。首先从 API 密钥页面获取密钥;新账户只需点击一下即可领取 $0.50 试用额度,无需支付详细信息。
此脚本保持滚动历史记录,流式输出回复并修剪旧轮次,以保持提示词较小。系统提示词是你值得花时间关注的部分:它设定了背景、规则和风格。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.nsfwaiapi.com/v1",
api_key=os.environ["NSFWAIAPI_KEY"],
)
SYSTEM = '''You are the narrator and all non-player characters in an adult fiction roleplay.
Setting: a rain-soaked port city, late autumn, gaslight and smuggler politics.
Rules:
- Write in third person, past tense, 2 to 4 short paragraphs per reply.
- Never write the player's actions, words or thoughts. Stop where the player decides.
- Keep each character's voice and goals consistent. Track who is present in the scene.
- All characters are adults. Do not write sexual content involving minors under any circumstances.
- Stay in the story. No disclaimers or out-of-character commentary unless the player asks with (OOC).'''
history = [{"role": "system", "content": SYSTEM}]
MAX_TURNS = 40 # keep the last 40 messages besides the system prompt
def say(user_text):
history.append({"role": "user", "content": user_text})
trimmed = [history[0]] + history[1:][-MAX_TURNS:]
stream = client.chat.completions.create(
model="uncensored",
messages=trimmed,
temperature=0.9,
top_p=0.95,
frequency_penalty=0.3,
max_tokens=600,
stream=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)
print()
history.append({"role": "assistant", "content": reply})
say("I push open the door of the Gull and Anchor and look for the harbor master.")
由于窗口为 100,000 token,你可以将 MAX_TURNS 设置得很高,然后再进行修剪。修剪仍是一个好习惯:较短的提示词成本更低,并使模型专注于最近的事件。
SillyTavern 等应用的客户端设置
大多数角色扮演前端都有一个用于 OpenAI 兼容或自定义聊天完成源的连接屏幕。例如,SillyTavern 允许你添加一个 OpenAI 兼容的接口。字段在所有地方都是相同的:
- Base 或接口 URL:
https://api.nsfwaiapi.com/v1。某些应用需要以/chat/completions结尾的完整路径;如果应用要求输入 Base URL,则停在/v1。 - API 密钥: 你的密钥,作为 Bearer token 发送。
- 模型:
uncensored。如果应用可以获取模型列表,它可以调用GET /v1/models。 - 流式输出:开启。回复在生成时即显示,如果你不喜欢方向,应用可以提前停止。
对于采样,温度在 0.8 到 1.0 之间适合叙事文本,top_p 接近 0.95。较小的频率或存在惩罚可以减少长对话中容易积累的重复短语。仅在你看到重复时才提高惩罚,因为高值会使文本显得奇怪地回避。停止序列会原样传递,因此添加玩家姓名后跟冒号作为停止字符串,如果模型试图替你说话,这将有所帮助。将应用的上下文大小设置为你愿意付费的任何值;你不需要填满所有 100,000 token。
如果你运行多个聊天标签页或为朋友运行的机器人,请注意并发限制。完整密钥允许 8 个并发请求和每分钟 300 个请求,试用密钥允许 2 个和每分钟 60 个。流式回复会占用其槽位,直到流结束,因此卡住的标签页可能会占用一个槽位。文档列出了限制和响应头,包括 X-Balance-USD,显示你的剩余额度。
保持长故事健康的小例程
长角色扮演会话会以可预测的方式出错,一些习惯可以预防大部分问题。每 20 或 30 轮写一个简短的故事摘要,并将其保持在提示词顶部,系统消息之后。手动更新它或要求模型生成它,然后检查名称、地点和承诺是否保留。将绝不能忘记的事实(如关系和未解决的线索)固定在系统提示词中。
如果回复走向你不喜欢的方向,请重新生成它,而不是在聊天中与它争论。争论会污染历史记录,并教会模型场景是关于争论的。当你想要引导时,在括号中添加一行清晰的指示,例如关于下一幕情绪的备注,让下一个回复携带它。保持角色名称一致,并为每个非玩家角色提供一行语音说明,因为模型会混淆听起来相似的角色。
该模型的诚实局限
这是一个开放权重模型,由独立提供商运行,并经过调整以在法律成人使用中无内容拒绝地回答。它不是任何模型供应商的官方 API,也不是跨多个模型的网关。你无法在模型之间进行选择,也不应期望它在每项任务上都与最佳闭源模型相匹配。
它仅生成文本。没有你角色的图片,没有语音,也没有用于设定集搜索的嵌入,因此如果你想要肖像或语音,你需要为每个功能添加单独的服务。也没有微调。质量也将取决于你的提示词:模糊的系统提示词会产生模糊的小说,而带有示例对话的良好角色配置文件比任何采样调整都更有效。
有一条规则是固定的。涉及未成年人的性内容是不允许的,试图生成此类内容的配置将不受支持。请确保角色为成年人,且你的使用方式合法。对于面向成人的虚构作品、伴侣应用和角色聊天,更少的拒绝和更长的上下文窗口是其主要优势。
更多指南
问答
本地 LLM 比托管 API 更适合角色扮演吗?
两者并非在所有场景下都占优。本地部署提供离线隐私且无按 token 计费的成本,而托管服务提供长上下文窗口且无硬件限制。许多人同时使用两者。
我可以使用 SillyTavern 配合此 API 吗?
可以。SillyTavern 及类似应用支持 OpenAI 兼容的接口。将 https://api.nsfwaiapi.com/v1 输入为 URL,填入你的密钥,并选择模型 ID uncensored。
角色扮演会话可以使用多少上下文?
上下文窗口为 100,000 个 token,包含提示词和回复。长对话成本更高,因为历史记录会在每一轮中发送。
它能为我的角色生成图片或语音吗?
不会。该服务仅支持文本,不支持图像、音频或视频生成,也不支持嵌入。