【大模型】API调用(以kimi python为例)

参考:Moonshot AI 开放平台

key

学习大模型第一步是申请key,一定要记住(因为它只出现一次)!!!
在这里插入图片描述
在这里插入图片描述

概念

Token

可以被理解为文本处理的基本单位,根据具体的应用场景,这个基本单位可以是单词、子词或者字符等。

Prompt

模型在生成文本或响应之前所接收的初始输入或指令。请编写清晰的说明,模型越少猜测你的需求,你越有可能得到满意的结果。

快速上手

现在的大模型基本都兼容了 OpenAI 的接口规范,可以使用 OpenAI 提供的 Python 或 NodeJS SDK 来调用和使用,这意味着如果你的应用和服务基于 openai 的模型进行开发,那么只需要将 base_url 和 api_key 替换成对应的配置,即可无缝迁移使用其他的大模型

from openai import OpenAI # 导入OpenAI官方库中的OpenAI类

client = OpenAI(
    api_key="MOONSHOT_API_KEY",  # <--在这里将 MOONSHOT_API_KEY 替换为你从 Kimi 开放平台申请的 API Key
    base_url="https://api.moonshot.cn/v1", # <-- 将 base_url 从 https://api.openai.com/v1 替换为https://api.moonshot.cn/v1
)
 
completion = client.chat.completions.create(
    model = "moonshot-v1-8k",		# 使用Moonshot的8k上下文模型
    messages = [
        {
    
    "role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"},				# 系统角色消息,用于初始化AI行为准则
        {
    
    "role": "user", "content": "你好,我叫李雷,1+1等于多少?"}
    ],
    temperature = 0.3,				# 控制输出随机性(0-2,值越低越确定)
)
 
# 通过 API 我们获得了 Kimi 大模型给予我们的回复消息(role=assistant)
print(completion.choices[0].message.content)

# 输出:你好,李雷!1+1等于2。

接口规范

role

指定每条消息的来源,角色决定了在冲突情况下指令的权威性。

  • *system: 由OpenAI添加的消息
  • developer: 来自应用程序开发者(可能也包括OpenAI)
  • *user: 终端用户输入
  • assistant: 从语言模型中采样生成的内容
  • tool: 由某些程序生成,例如代码执行或API调用

流式输出

每当大模型生成了一定数量的 Tokens 时(通常情况下,这个数量是 1 Token),立刻将这些 Tokens 传输给客户端,而不再是等待所有 Tokens 生成完毕后再传输给客户端。

from openai import OpenAI
 
client = OpenAI(
    api_key = "MOONSHOT_API_KEY", # 在这里将 MOONSHOT_API_KEY 替换为你从 Kimi 开放平台申请的 API Key
    base_url = "https://api.moonshot.cn/v1",
)
 
stream = 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, # <-- 注意这里,我们通过设置 stream=True 开启流式输出模式
)
 
# 当启用流式输出模式(stream=True),SDK 返回的内容也发生了变化,我们不再直接访问返回值中的 choice
# 而是通过 for 循环逐个访问返回值中每个单独的块(chunk)
 
for chunk in stream:
	# 在这里,每个 chunk 的结构都与之前的 completion 相似,但 message 字段被替换成了 delta 字段
	delta = chunk.choices[0].delta # <-- message 字段被替换成了 delta 字段
 
	if delta.content:
		# 我们在打印内容时,由于是流式输出,为了保证句子的连贯性,我们不人为地添加
		# 换行符,因此通过设置 end="" 来取消 print 自带的换行符。
		print(delta.content, end="")

/v1/chat/completions
/v1/files
/v1/files/{file_id}
/v1/files/{file_id}/content