概念介绍
大语言模型推理服务
备案信息: MUSAChat(对应备案模型:摩笔大模型),上线备案号:Beijing-MoBi-202407050022。
语言模型推理服务是摩尔线程大语言模型的 API 服务,运行于摩尔线程全自研 GPU 服务器上,对外提供 Chat Completions 接口,可用于生成文本、问答、摘要、翻译等任务。
Token
文本生成以 Token 为单位处理文本。Token 代表常见的字符序列;对于一段常规中文文本,1 个 Token 大约相当于 1.5~2 个汉字。
使用语言模型推理服务不能超过模型的最大上下文,超过后会被截断。
使用指南
接口描述
MUSAChat(对应备案模型:摩笔大模型)对话接口,用于以对话形式使用该模型的对话能力。用户提供历史对话信息和问题,通过 HTTP 接口调用 MUSAChat Serving API;模型响应后,以流式或非流式形式返回相应结果。该服务的上线备案号为 Beijing-MoBi-202407050022。
发送请求
你可以使用我们的 Chat Completions API 来发送请求,需要提供一个 API 密钥和一个模型名称。
处理响应
请求成功后会返回一个 JSON 格式的响应。
API 文档
基本信息
| 键
|
值
|
说明
|
| 接口地址
|
http://{{endpoint}}/v1/chat/completions
|
endpoint 为 MUSAChat(对应备案模型:摩笔大模型)服务地址
|
| 请求方式
|
HTTP / POST
|
|
| 授权信息
|
密钥
|
你需要一个 API 密钥来使用我们的服务。如需试用,请联系我们获取 API 密钥。
|
请求参数
| 变量名
|
类型
|
是否必填
|
取值/长度范围
|
描述
|
示例值
|
id
|
String
|
否
|
[1, 64]
|
用于追踪对话的 Session ID,提供后可提升对话效率。
|
a44ee98c-8273-40d9-92cf-2f49182b45f9
|
model
|
String
|
否
|
[1, 64]
|
调用 MUSAChat(对应备案模型:摩笔大模型)的模型名称,默认为 MusaChat-Small-4K-v0.26.2。
|
MusaChat-Small-4K-v0.26.2
|
messages
|
List<Message>
|
是
|
[1, 64]
|
历史对话信息列表。
|
|
stream
|
Bool
|
否
|
true / false
|
是否以流式形式返回。流式返回采用 SSE,非流式返回采用普通 POST 请求;默认为 false。
|
true
|
max_tokens
|
Int
|
否
|
[1, 2048]
|
最大回复 Token 数量,默认值为 256。
|
256
|
temperature
|
Float
|
否
|
[0, 2]
|
采样温度,默认值为 0.0,表示不采样。值越大,采样越均匀;值越小,采样越集中。
|
0.0
|
repetition_penalty
|
Float
|
否
|
(0, 2)
|
重复惩罚系数,默认值为 1.0,表示不惩罚。
|
1.0
|
Message
| 变量名
|
类型
|
是否必填
|
取值/长度范围
|
描述
|
示例值
|
role
|
String
|
是
|
system / assistant / user
|
历史对话信息列表中对应轮次的角色。system 表示系统输入,assistant 表示模型回复,user 表示用户提问;最后一轮对话的 role 必须为 user。
|
user
|
content
|
String
|
是
|
[0, 2048]
|
历史对话信息列表中对应轮次的对话内容。
|
Hello!
|
返回参数
| 变量名
|
类型
|
是否必有
|
取值/长度范围
|
描述
|
示例值
|
id
|
String
|
是
|
[1, 64]
|
用于追踪对话的 Session ID,后续对话中提供该 ID 可提升对话效率。
|
a44ee98c-8273-40d9-92cf-2f49182b45f9
|
object
|
String
|
否
|
[1, 64]
|
返回结果类型。chat.completion.chunk 表示流式返回结果,chat.completion 表示非流式返回结果。
|
chat.completion.chunk
|
created
|
Int
|
否
|
[0, MAX_INT]
|
时间戳。
|
1677652288
|
model
|
String
|
否
|
[1, 64]
|
处理该轮次对话的模型名称。
|
MusaChat-Small-4K-v0.26.2
|
choices
|
List<Choice>
|
否
|
[1, 64]
|
该轮次对话中模型返回的 N 组选项结果。
|
|
usage
|
Usage
|
否
|
|
该轮次模型对话的详细信息,仅在非流式访问时存在。
|
|
error
|
Error
|
否
|
|
调用发生错误的详细信息,仅在调用发生错误时存在。
|
|
Choice
| 变量名
|
类型
|
是否必有
|
取值/长度范围
|
描述
|
示例值
|
index
|
Int
|
是
|
[0, 16]
|
该轮次对话中模型回复 N 组选项的编号。
|
0
|
delta / message
|
Message
|
是
|
|
模型回复的信息详情,此时 role 字段不一定存在。请求体中的 stream 为 true 时,此处为 delta;stream 为 false 时,此处为 message。
|
|
finish_reason
|
String
|
是
|
[0, 64] 或 null
|
模型回复停止标签;值为 stop 时表示回复停止。
|
|
Usage
| 变量名
|
类型
|
是否必有
|
取值/长度范围
|
描述
|
示例值
|
prompt_tokens
|
Int
|
是
|
[0, 2048]
|
本轮对话中,模型拼接历史对话信息后的输入 Token 数。
|
9
|
completion_tokens
|
Int
|
是
|
[0, 2048]
|
本轮对话中模型输出的 Token 数。
|
12
|
total_tokens
|
Int
|
是
|
[0, 2048]
|
本轮对话使用的全部 Token 数。
|
21
|
Error
| 变量名
|
类型
|
是否必有
|
取值/长度范围
|
描述
|
示例值
|
code
|
Int
|
是
|
[0, MAX_INT]
|
发生错误时返回的错误码,用于表示错误类型。
|
50001000
|
message
|
String
|
是
|
[0, 512]
|
发生错误时返回的错误信息,用于定位错误位置与状态。
|
Unknown Error
|
错误码
| 错误代码
|
描述
|
可能原因
|
解决方案
|
50001000
|
ModelWorker 组件发生内部未知错误
|
内部未知错误,无法定位具体原因
|
联系服务运维人员解决
|
40001002
|
ModelWorker 组件发生参数校验错误
|
参数校验错误,输入参数非法
|
请根据错误信息调整参数
|
50002000
|
ModelServer 组件发生内部未知错误
|
ModelServer 内部未知错误,无法定位具体原因
|
联系服务运维人员解决
|
40002002
|
ModelServer 组件发生参数校验错误
|
参数校验错误,输入参数非法
|
请根据错误信息调整参数
|
接入示例
非流式正确返回示例
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"id": "5ac7deb3-75d9-4b6d-a89f-7a17895b8719",
"model": "MusaChat-Small-4K-v0.26.2",
"messages": [
{
"role": "system",
"content": ""
},
{
"role": "user",
"content": "你好!"
}
],
"stream": false,
"max_tokens": 512,
"temperature": 0.0,
"repetition_penalty": 1.0
}'
{
"id": "5ac7deb3-75d9-4b6d-a89f-7a17895b8719",
"object": "chat.completion",
"created": 1677652288,
"model": "MusaChat-Small-4K-v0.26.2",
"choices":
[
{
"index": 0,
"message":
{
"role": "assistant",
"content": "你好!有什么我可以帮助你的吗?"
},
"finish_reason": "stop"
}
],
"usage":
{
"prompt_tokens": 36,
"completion_tokens": 13,
"total_tokens": 49
}
}
流式正确返回示例
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"id": "36af8d58-2620-40ea-89dc-65253db4b889",
"model": "MusaChat-Small-4K-v0.26.2",
"messages": [
{
"role": "system",
"content": ""
},
{
"role": "user",
"content": "你好!"
}
],
"stream": true,
"max_tokens": 512,
"temperature": 0.0,
"repetition_penalty": 1.0
}'
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":"1"}]}
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"你"},"finish_reason":"2"}]}
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"好"},"finish_reason":"3"}]}
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":"4"}]}
...
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"提供"},"finish_reason":"44"}]}
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"帮助"},"finish_reason":"45"}]}
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{"content":"."},"finish_reason":"46"}]}
data:{"id":"36af8d58-2620-40ea-89dc-65253db4b889","object":"chat.completion.chunk","created":1694268190,"model":"MusaChat-Small-4K-v0.26.2","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data:[DONE]
非流式错误返回示例
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"id": "5ac7deb3-75d9-4b6d-a89f-7a17895b8719",
"model": "MusaChat-Small-4K-v0.26.2",
"messages": [
{
"role": "system",
"content": ""
},
{
"role": "user",
"content": "你好!"
}
],
"stream": false,
"max_tokens": 512,
"temperature": -1,
"repetition_penalty": 1.0
}'
{
"error": {
"code": 40001002,
"message": "-1 is less than the minimum of 0 - 'temperature'"
}
}
调用方法
Curl 调用方法
curl --location 'http://{{endpoint}}/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"id": "714fea0b-f7e1-4f25-9514-cf2281161011",
"model": "MusaChat-Small-4K-v0.26.2",
"messages": [
{
"role": "system",
"content": ""
},
{
"role": "user",
"content": "一年有多少天?"
}
],
"stream": true,
"max_tokens": 512,
"temperature": 0.0,
"repetition_penalty": 1.0
}'
Python 调用方法
import requests
import json
def parse_stream_helper(line: bytes):
if line:
if line.strip() == b"data: [DONE]":
return None
if line.startswith(b"data: "):
line = line[len(b"data: "):]
return line.decode("utf-8")
else:
return None
return None
# 是否需要流式返回
stream = False
data = {
"messages": [{"role": "user", "content": "你好"}],
"temperature": 0.0,
"max_tokens": 512,
"stream": stream,
}
api_base = "http://{{endpoint}}/v1/"
url = api_base + "/chat/completions"
response = requests.post(url, json=data)
if stream:
answer = ""
for line in response.iter_lines():
item = parse_stream_helper(line)
if item:
item = json.loads(item)
answer += item["choices"][0]["delta"]["content"]
print(answer)
else:
resp_data = response.json()
answer = resp_data["choices"][0]["message"]["content"]
print(answer)