提示:《Moonshot.Ai(月之暗面Ai模型)》文章主要选自:moonshot官方文档
提示:《Moonshot.Ai(月之暗面Ai模型)》官方网站:https://www.moonshot.cn/ Moonshot Ai
Moonshot.Ai(月之暗面Ai模型)
一、主要概念
(一)文本生成模型
Moonshot的文本生成模型(指moonshot-v1)是训练用于理解自然语言和书面语言的,它可以根据输入生成文本输出。对模型的输入也被称为“prompt”。通常我们建议您提供明确的指令以及给出一些范例,来让模型能够完成既定的任务,设计 prompt 本质上就是学会如何“训练”模型。moonshot-v1模型可以用于各种任务,包括内容或代码生成、摘要、对话、创意写作等。
(二)语言模型推理服务
语言模型推理服务是一个基于我们 (Moonshot AI) 开发和训练的预训练模型的 API 服务。在设计上,我们对外主要提供了一个 Chat Completions 接口,它可以用于生成文本,但是它本身是不支持访问网络、数据库等外部资源,也不支持执行任何代码。
(三)Token
文本生成模型以 Token 为基本单位来处理文本。Token 代表常见的字符序列。例如,单个汉字"夔"可能会被分解为若干 Token 的组合,而像"中国"这样短且常见的短语则可能会使用单个 Token。大致来说,对于一段通常的中文文本,1 个 Token 大约相当于 1.5-2 个汉字。
需要注意的是,对于我们的文本模型,Input 和 Output 的总和长度不能超过模型的最大上下文长度。
(四)速率限制
这些速率限制是如何工作的?
速率限制通过4种方式衡量:并发、RPM(每分钟请求数)、TPM(每分钟 Token 数)、TPD(每天 Token 数)。速率限制可能会在任何一种选项中达到,取决于哪个先发生。例如,你可能向 ChatCompletions 发送了 20 个请求,每个请求只有 100 个 Token ,那么你就达到了限制(如果你的 RPM 限制是 20),即使你在这些 20 个请求中没有发满 200k 个 Token (假设你的TPM限制是 200k)。
对网关,出于方便考虑,我们会基于请求中的 max_tokens 参数来计算速率限制。这意味着,如果你的请求中包含了 max_tokens 参数,我们会使用这个参数来计算速率限制。如果你的请求中没有包含 max_tokens 参数,我们会使用默认的 max_tokens 参数来计算速率限制。当你发出请求后,我们会基于你请求的 token 数量加上你 max_tokens 参数的数量来判断你是否达到了速率限制。而不考虑实际生成的 token 数量。
而在计费环节中,我们会基于你请求的 token 数量加上实际生成的 token 数量来计算费用。
(五)模型列表
你可以使用我们的 List Models API 来获取当前可用的模型列表。
当前的,我们支持的模型有:
moonshot-v1-8k: 它是一个长度为 8k 的模型,适用于生成短文本。
moonshot-v1-32k: 它是一个长度为 32k 的模型,适用于生成长文本。
moonshot-v1-128k: 它是一个长度为 128k 的模型,适用于生成超长文本。
以上模型的区别在于它们的最大上下文长度,这个长度包括了输入消息和生成的输出,在效果上并没有什么区别。这个主要是为了方便用户选择合适的模型。
二、使用指南
(一)获取 API 密钥
你需要一个 API 密钥来使用我们的服务。你可以在我们的控制台中创建一个 API 密钥。
(二)发送请求
你可以使用我们的 Chat Completions API 来发送请求。你需要提供一个 API 密钥和一个模型名称。你可以选择是否使用默认的 max_tokens 参数,或者自定义 max_tokens 参数。可以参考 API 文档中的调用方法。
(三)处理响应
通常的,我们会设置一个 5 分钟的超时时间。如果单个请求超过了这个时间,我们会返回一个 504 错误。如果你的请求超过了速率限制,我们会返回一个 429 错误。如果你的请求成功了,我们会返回一个 JSON 格式的响应。
如果是为了快速处理一些任务,你可以使用我们的 Chat Completions API 的非 streaming 模式。这种模式下,我们会在一次请求中返回所有的生成文本。如果你需要更多的控制,你可以使用 streaming 模式。在这种模式下,我们会返回一个 SSE 流,你可以在这个流中获取生成的文本,这样用户体验可能会更好,并且你也可以在任何时候中断请求,而不会浪费资源。
三、具体操作步骤
(一)新建项目
(二)获取API Key
(三)Python 实现方式
from openai import OpenAI
client = OpenAI(
api_key = "秘钥信息(请自主修改)",
base_url = "https://api.moonshot.cn/v1",
)
completion = client.chat.completions.create(
model = "moonshot-v1-8k",
messages = [
{"role": "user", "content": "请帮我简单介绍一下Moonshot"}
],
temperature = 0.3,
)
print(completion.choices[0].message.content)
输出结果:
Moonshot 是一个英文单词,字面意思是“登月计划”,它通常用来描述那些雄心勃勃、创新性极强且具有变革性的目标或项目。这个词汇源自美国的阿波罗登月计划(Apollo Moonshot),这是一个在20世纪60年代由美国国家航空航天局(NASA)实施的太空探索项目,目的是将人类送上月球。
在更广泛的语境中,“Moonshot”可以指代任何需要巨大努力、创新和合作才能实现的宏伟目标。例如,它可以用于描述在医疗、能源、交通等领域的突破性项目,旨在解决长期存在的难题或实现重大的技术进步。
Moonshot思维也鼓励人们跳出传统思维框架,勇于尝试那些看似不可能的事情,以期达到意想不到的成果。这种思维方式在科技、商业和社会创新中都非常受欢迎,因为它鼓励人们追求高远的目标,并激发出前所未有的创造力和决心。
四、基本信息
(一)公开的服务地址
Moonshot 提供基于 HTTP 的 API 服务接入,并且对大部分 API,我们兼容了 OpenAI SDK。
官方服务地址:https://api.moonshot.cn
(二)单轮对话
OpenAI 官方 SDK 支持 Python 和 Node.js 两种语言,使用 OpenAI SDK 和 Curl 与 API 进行交互的代码如下:
from openai import OpenAI
client = OpenAI(
api_key = "$MOONSHOT_API_KEY",
base_url = "https://api.moonshot.cn/v1",
)
completion = client.chat.completions.create(
model = "moonshot-v1-8k",
messages = [
{"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"},
{"role": "user", "content": "你好,我叫李雷,1+1等于多少?"}
],
temperature = 0.3,
)
print(completion.choices[0].message.content)
(三)多轮对话
上面的单轮对话的例子中语言模型将用户信息列表作为输入,并将模型生成的信息作为输出返回。 有时我们也可以将模型输出的结果继续作为输入的一部分以实现多轮对话。
from openai import OpenAI
client = OpenAI(
api_key = "$MOONSHOT_API_KEY",
base_url = "https://api.moonshot.cn/v1",
)
history = [
{"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"}
]
def chat(query, history):
history.append({
"role": "user",
"content": query
})
completion = client.chat.completions.create(
model="moonshot-v1-8k",
messages=history,
temperature=0.3,
)
result = completion.choices[0].message.content
history.append({
"role": "assistant",
"content": result
})
return result
print(chat("地球的自转周期是多少?", history))
print(chat("月球呢?", history))
五、API 说明
1.请求地址
POST https://api.moonshot.cn/v1/chat/completions
2.请求内容
{
"model": "moonshot-v1-8k",
"messages": [
{
"role": "system",
"content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"
},
{ "role": "user", "content": "你好,我叫李雷,1+1等于多少?" }
],
"temperature": 0.3
}
3.字段说明
字段 | 是否必须 | 说明 | 类型 | 取值 |
---|---|---|---|---|
messages | required | 包含迄今为止对话的消息列表 | List[Dict] | 这是一个结构体的列表,每个元素类似如下:{“role”: “user”, “content”: “你好”} role 只支持 system,user,assistant 其一,content 不得为空 |
model | required | Model ID, 可以通过 List Models 获取 | string | 目前是 moonshot-v1-8k,moonshot-v1-32k,moonshot-v1-128k 其一 |
max_tokens | optional | 聊天完成时生成的最大 token 数。如果到生成了最大 token 数个结果仍然没有结束,finish reason 会是 “length”, 否则会是 “stop” | int | 这个值建议按需给个合理的值,如果不给的话,我们会给一个不错的整数比如 1024。特别要注意的是,这个 max_tokens 是指您期待我们返回的 token 长度,而不是输入 + 输出的总长度。比如对一个 moonshot-v1-8k 模型,它的最大输入 + 输出总长度是 8192,当输入 messages 总长度为 4096 的时候,您最多只能设置为 4096,否则我们服务会返回不合法的输入参数( invalid_request_error ),并拒绝回答。如果您希望获得“输入的精确 token 数”,可以使用下面的“计算 Token” API 使用我们的计算器获得计数 |
temperature | optional | 使用什么采样温度,介于 0 和 1 之间。较高的值(如 0.7)将使输出更加随机,而较低的值(如 0.2)将使其更加集中和确定性 | float | 默认为 0,如果设置,值域须为 [0, 1] 我们推荐 0.3,以达到较合适的效果 |
top_p | optional | 另一种采样方法,即模型考虑概率质量为 top_p 的标记的结果。因此,0.1 意味着只考虑概率质量最高的 10% 的标记。一般情况下,我们建议改变这一点或温度,但不建议 同时改变 | float | 默认 1.0 |
n | optional | 为每条输入消息生成多少个结果 | int | 默认为 1,不得大于 5。特别的,当 temperature 非常小靠近 0 的时候,我们只能返回 1 个结果,如果这个时候 n 已经设置并且 > 1,我们的服务会返回不合法的输入参数(invalid_request_error) |
presence_penalty | optional | 存在惩罚,介于-2.0到2.0之间的数字。正值会根据新生成的词汇是否出现在文本中来进行惩罚,增加模型讨论新话题的可能性 | float | 默认为 0 |
frequency_penalty | optional | 频率惩罚,介于-2.0到2.0之间的数字。正值会根据新生成的词汇在文本中现有的频率来进行惩罚,减少模型一字不差重复同样话语的可能性 | float | 默认为 0 |
response_format | optional | 设置为 {“type”: “json_object”} 可启用 JSON 模式,从而保证模型生成的信息是有效的 JSON。当你将 response_format 设置为 {“type”: “json_object”} 时,你需要在 prompt 中明确地引导模型输出 JSON 格式的内容,并告知模型该 JSON 的具体格式,否则将可能导致不符合预期的结果。 | object | 默认为 {“type”: “text”} |
stop | optional | 停止词,当全匹配这个(组)词后会停止输出,这个(组)词本身不会输出。最多不能超过 5 个字符串,每个字符串不得超过 32 字节 | String, List[String] | 默认 null |
stream | optional | 是否流式返回 | bool | 默认 false, 可选 true |
4.调用示例
from openai import OpenAI
client = OpenAI(
api_key = "$MOONSHOT_API_KEY",
base_url = "https://api.moonshot.cn/v1",
)
response = client.chat.completions.create(
model="moonshot-v1-8k",
messages=[
{
"role": "system",
"content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。",
},
{"role": "user", "content": "你好,我叫李雷,1+1等于多少?"},
],
temperature=0.3,
stream=True,
)
collected_messages = []
for idx, chunk in enumerate(response):
# print("Chunk received, value: ", chunk)
chunk_message = chunk.choices[0].delta
if not chunk_message.content:
continue
collected_messages.append(chunk_message) # save the message
print(f"#{idx}: {''.join([m.content for m in collected_messages])}")
print(f"Full conversation received: {''.join([m.content for m in collected_messages])}")
5.Vision
{
"model": "moonshot-v1-8k-vision-preview",
"messages":
[
{
"role": "system",
"content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"
},
{
"role": "user",
"content":
[
{
"type": "image_url",
"image_url":
{
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABhCAYAAAApxKSdAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUUSURBVHgB7Z29bhtHFIWPHQN2J7lKqnhYpYvpIukCbJEAKQJEegLReYFIT0DrCSI9QEDqCSIDaQIEIOukiJwyza5SJWlId3FFz+HuGmuSSw6p+dlZ3g84luhdUeI9M3fmziyXgBCUe/DHYY0Wj/tgWmjV42zFcWe4MIBBPNJ6qqW0uvAbXFvQgKzQK62bQhkaCIPc10q1Zi3XH1o/IG9cwUm0RogrgDY1KmLgHYX9DvyiBvDYI77XmiD+oLlQHw7hIDoCMBOt1U9w0BsU9mOAtaUUFk3oQoIfzAQFCf5dNMEdTFCQ4NtQih1NSIGgf3ibxOJt5UrAB1gNK72vIdjiI61HWr+YnNxDXK0rJiULsV65GJeiIescLSTTeobKSutiCuojX8kU3MBx4I3WeNVBBRl4fWiCyoB8v2JAAkk9PmDwT8sH1TEghRjgC27scCx41wO43KAg+ILxTvhNaUACwTc04Z0B30LwzTzm5Rjw3sgseIG1wGMawMBPIOQcqvzrNIMHOg9Q5KK953O90/rFC+BhJRH8PQZ+fu7SjC7HAIV95yu99vjlxfvBJx8nwHd6IfNJAkccOjHg6OgIs9lsra6vr2GTNE03/k7q8HAhyJ/2gM9O65/4kT7/mwEcoZwYsPQiV3BwcABb9Ho9KKU2njccDjGdLlxx+InBBPBAAR86ydRPaIC9SASi3+8bnXd+fr78nw8NJ39uDJjXAVFPP7dp/VmWLR9g6w6Huo/IOTk5MTpvZesn/93AiP/dXCwd9SyILT9Jko3n1bZ+8s8rGPGvoVHbEXcPMM39V1dX9Qd/19PPNxta959D4HUGF0RrAFs/8/8mxuPxXLUwtfx2WX+cxdivZ3DFA0SKldZPuPTAKrikbOlMOX+9zFu/Q2iAQoSY5H7mfeb/tXCT8MdneU9wNNCuQUXZA0ynnrUznyqOcrspUY4BJunHqPU3gOgMsNr6G0B0BpgUXrG0fhKVAaaF1/HxMWIhKgNMcj9Tz82Nk6rVGdav/tJ5eraJ0Wi01XPq1r/xOS8uLkJc6XYnRTMNXdf62eIvLy+jyftVghnQ7Xahe8FW59fBTRYOzosDNI1hJdz0lBQkBflkMBjMU5iL13pXRb8fYAJrB/a2db0oFHthAOEUliaYFHE+aaUBdZsvvFhApyM0idYZwOCvW4JmIWdSzPmidQaYrAGZ7iX4oFUGnJ2dGdUCTRqMozeANQCLsE6nA10JG/0Mx4KmDMbBCjEWR2yxu8LAM98vXelmCA2ovVLCI8EMYODWbpbvCXtTBzQVMSAwYkBgxIDAtNKAXWdGIRADAiMpKDA0IIMQikx6QGDEgMCIAYGRMSAsMgaEhgbcQgjFa+kBYZnIGBCWWzEgLPNBOJ6Fk/aR8Y5ZCvktKwX/PJZ7xoVjfs+4chYU11tK2sE85qUBLyH4Zh5z6QHhGPOf6r2j+TEbcgdFP2RaHX5TrYQlDflj5RXE5Q1cG/lWnhYpReUGKdUewGnRmhvnCJbgmxey8sHiZ8iwF3AsUBBckKHI/SWLq6HsBc8huML4DiK80D6WnBqLzN68UFCmopheYJOVYgcU5FOVbAVfYUcUZGoaLPglCtITdg2+tZUFBTFh2+ArWEYh/7z0WIIQSiM43lt5AWAmWhLHylN4QmkNEXfAbGqEQKsHSfHLYwiSq8AnaAAKeaW3D8VbijwNW5nh3IN9FPI/jnpaPKZi2/SfFuJu4W3x9RqWL+N5C+7ruKpBAgLkAAAAAElFTkSuQmCC"
}
},
{
"type": "text",
"text": "请描述这个图片"
}
]
}
],
"temperature": 0.3
}