REST API似乎在请求对象包含多个具有"system"角色的消息时返回400错误。以下是一个最小的复现示例:
import requests
models = requests.get("http://127.0.0.1:8000/v1/models", headers= {"accept": "application/json"})
model_name = models.json()['data'][0]['id']
print(model_name)
# Get a response using a prompt without streaming
payload = {
"model": model_name,
"messages": [
{"role": "system", "content": "you are a helpful assistant"},
{"role": "system", "content": "you love the color green"},
{"role": "user", "content": "Write a haiku about apples."}
],
"stream": False,
# "n": 1,
"max_tokens": 8192,
}
r = requests.post("http://127.0.0.1:8000/v1/chat/completions", json=payload)
choices = r.json()["choices"]
for choice in choices:
print(f"{choice['message']['content']}\n")
注解掉任何一个系统消息,脚本都可以运行。
拥有多个系统消息是支持诸如SillyTavern等流行前端所必需的,因此支持它是个好主意。
7条答案
按热度按时间q3qa4bjr1#
深入源代码,这似乎是预期的行为 - "系统"消息需要在列表中的位置0。我会深入研究代码,看看我是否可以强行实现正确的行为 - 如果理解正确,我只需要在每个系统消息周围连接标记?
lmyy7pcs2#
感谢您指出这一点。我认为我们当然可以增强这种行为
vybvopom3#
你好,@bayley,感谢你提出这个问题。我想在这里获得更多的清晰度。你介意分享一些关于多个系统提示(可能不在位置0)的参考示例吗?我很高兴学习这里的预期行为。
7jmck4yq4#
是的,这是SillyTavern发送的一个典型请求:
我的理解是模板中的多个系统提示可以提高一些较小模型的性格跟随性能,以及一些不愿意保持角色的商业模型。
dfty9e195#
@bayley 你知道这些多系统提示是如何具体解释成特定提示的吗?大多数聊天模板遵循一个系统,然后用户/助手交替。
cuxqih216#
所以...我也在研究这个问题。文本生成WebUI的实现似乎只是简单地丢弃了除最后一个系统提示之外的所有内容,这显然是不对的:
需要进一步调查以确定正确的行为。一个简单的答案是将所有系统消息连接起来,但有传言称,OpenAI官方模型的行为取决于系统消息在消息历史中的位置,这让我认为额外的系统消息是直接添加到上下文中的。问题是,它们是用周围的令牌添加的,还是用周围的令牌?
3z6pesqy7#
现在我们将通过连接所有系统消息来实现支持。