大模型API
星河大模型 API 服务
星河大模型 API 是为开发者提供的一套基础的大模型 API 服务,背靠百度智能云千帆平台,提供文心大模型能力。该大模型 API 服务兼容openai-python SDK,开发者可以直接使用原生的 openai-python SDK来调用文心大模型服务。
准备
访问令牌
访问令牌用于 AI Studio 用户进行身份验证,可通过访问令牌向 AI Studio 执行授权范围(如大模型 API 的调用权限,仓库相关的读取访问权限等)指定的特定操作。可前往个人中心的 访问令牌页面 查看个人专属 access token。
Tokens
Tokens 为星河社区上调用大模型SDK或使用大模型应用的最终计量单位,星河为每个开发者提供了100万的免费 Tokens 额度。开发者使用不同的模型会扣除不同数量的Tokens,Token 收支明细可查看使用明细。若Tokens 已消耗完,可购买 Tokens 后再使用。
服务域名
用星河大模型 API 服务的域名地址: https://aistudio.baidu.com/llm/lmapi/v3
在使用 openai-python
调用星河大模型 API 服务时,需要将
- 指定 api_key = "令牌(Access Token)"
- 指定 base_url = "https://aistudio.baidu.com/llm/lmapi/v3"
安装
# install from PyPI
pip install openai
用法
文生文
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("AI_STUDIO_API_KEY"), # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
base_url="https://aistudio.baidu.com/llm/lmapi/v3", # aistudio 大模型 api 服务域名
)
chat_completion = client.chat.completions.create(
messages=[
{'role': 'system', 'content': '你是 AI Studio 实训AI开发平台的开发者助理,你精通开发相关的知识,负责给开发者提供搜索帮助建议。'},
{'role': 'user', 'content': '你好,请介绍一下AI Studio'}
],
model="ernie-3.5-8k",
)
print(chat_completion.choices[0].message.content)
为了避免将api_key
暴露在代码中,可以使用 python-dotenv 将其添加AI_STUDIO_API_KEY="YOUR_ACCESS_TOKEN"
到您的.env
文件中。当然,也可以通过api_key="YOUR_ACCESS_TOKEN"
直接指定
多轮对话
import os
from openai import OpenAI
def get_response(messages):
client = OpenAI(
api_key=os.environ.get("AI_STUDIO_API_KEY"), # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
base_url="https://aistudio.baidu.com/llm/lmapi/v3", # aistudio 大模型 api 服务域名
)
completion = client.chat.completions.create(model="ernie-3.5-8k", messages=messages)
return completion
messages = [
{
"role": "system",
"content": "你是 AI Studio 开发者助理,你精通开发相关的知识,负责给开发者提供搜索帮助建议。",
}
]
assistant_output = "您好,我是AI Studio 开发者助理,请问有什么能帮助你的吗?"
print(f"""输入:"结束",结束对话\n""")
print(f"模型输出:{assistant_output}\n")
user_input = ""
while "结束" not in user_input:
user_input = input("请输入:")
# 将用户问题信息添加到messages列表中
messages.append({"role": "user", "content": user_input})
assistant_output = get_response(messages).choices[0].message.content
# 将大模型的回复信息添加到messages列表中
messages.append({"role": "assistant", "content": assistant_output})
print(f"模型输出:{assistant_output}")
print("\n")
流式输出
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("AI_STUDIO_API_KEY"), # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
base_url="https://aistudio.baidu.com/llm/lmapi/v3", # aistudio 大模型 api 服务域名
)
completion = client.chat.completions.create(
model="ernie-3.5-8k",
messages=[
{'role': 'system', 'content': '你是 AI Studio 实训AI开发平台的开发者助理,你精通开发相关的知识,负责给开发者提供搜索帮助建议。'},
{'role': 'user', 'content': '你好,请介绍一下AI Studio'}
],
stream=True,
)
for chunk in completion:
print(chunk.choices[0].delta.content or "", end="")
异步调用
import os
from openai import AsyncOpenAI
import asyncio
client = AsyncOpenAI(
api_key=os.environ.get("AI_STUDIO_API_KEY"), # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
base_url="https://aistudio.baidu.com/llm/lmapi/v3", # aistudio 大模型 api 服务域名
)
async def main() -> None:
chat_completion = await client.chat.completions.create(
messages=[
{'role': 'system', 'content': '你是 AI Studio 实训AI开发平台的开发者助理,你精通开发相关的知识,负责给开发者提供搜索帮助建议。'},
{'role': 'user', 'content': '你好,请介绍一下AI Studio'}
],
model="ernie-3.5-8k",
)
print(chat_completion.choices[0].message.content)
asyncio.run(main())
文生图
import os
from openai import OpenAI
import base64
client = OpenAI(
api_key=os.environ.get("AI_STUDIO_API_KEY"), # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
base_url="https://aistudio.baidu.com/llm/lmapi/v3", # aistudio 大模型 api 服务域名
)
# 生成的图片以链接形式返回
images_url = client.images.generate(prompt="一只白猫, 红帽子", model="Stable-Diffusion-XL", response_format="url")
print(images_url.data[0].url)
# 生成的图片以 base64 形式返回
images_base64 = client.images.generate(prompt="一只黑猫, 蓝帽子", model="Stable-Diffusion-XL", response_format="b64_json")
# 保存生成的图片
for i, image in enumerate(images_base64.data):
with open("image_{}.png".format(i), "wb") as f:
f.write(base64.b64decode(image.b64_json))
向量
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("AI_STUDIO_API_KEY"), # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
base_url="https://aistudio.baidu.com/llm/lmapi/v3", # aistudio 大模型 api 服务域名
)
embeddings = client.embeddings.create(
model="embedding-v1",
input=[
"推荐一些美食",
"给我讲个故事"
]
)
print(embeddings)
支持的模型
# 查询支持的模型列表
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("AI_STUDIO_API_KEY"), # 含有 AI Studio 访问令牌的环境变量,https://aistudio.baidu.com/account/accessToken,
base_url="https://aistudio.baidu.com/llm/lmapi/v3", # aistudio 大模型 api 服务域名
)
models = client.models.list()
for model in models.data:
print(model.id)
目前支持的模型:
模型名 | 类型 |
---|---|
ernie-3.5-8k | 文生文模型 |
ernie-4.0-8k | 文生文模型 |
ernie-4.0-turbo-8k | 文生文模型 |
ernie-char-8k | 文生文模型 |
ernie-speed-128k | 文生文模型 |
ernie-speed-8k | 文生文模型 |
ernie-tiny-8k | 文生文模型 |
ernie-lite-8k | 文生文模型 |
Stable-Diffusion-XL | 文生图模型 |
embedding-v1 | 向量模型 |
参数支持
针对 openai-python 原生不支持的参数,可以通过extra_body
参数传入
文生文
请求参数
body说明
名称 | 类型 | 必填 | 描述 | openai-python是否原生支持 |
---|---|---|---|---|
model | string | 是 | 模型ID,可选值可从client.models.list() 获取 |
是 |
messages | List | 是 | 聊天上下文信息。说明: (1)messages成员不能为空,1个成员表示单轮对话,多个成员表示多轮对话,例如: 1个成员示例, "messages": [ {"role": "user","content": "你好"}] 3个成员示例, "messages": [ {"role": "user","content": "你好"},{"role":"assistant","content":"需要什么帮助"},{"role":"user","content":"自我介绍下"}] (2) 最后一个message为当前请求的信息,前面的message为历史对话信息 (3)messages的role说明: 第一条message的role必须是user或system 最后一条message的role必须是user 当第一条message的role为user,role值需要依次为user/function -> assistant -> user/function ...,即奇数位message的role值必须为user或function,偶数位message的role值为assistant,例如: 示例中message中的role值分别为user、assistant、user、assistant、user;奇数位(红框)message中的role值为user,即第1、3、5个message中的role值为user;偶数位(蓝框)值为assistant,即第2、4个message中的role值为assistant 当第一条message的role为system,role值需要依次为system -> user/function -> assistant -> user/function ... (4)message中的content总长度不能超过对应model的输入字符限制和输入tokens限制,请查看各模型上下文长度说明 |
是 |
stream | bool | 否 | 是否以流式接口的形式返回数据,说明: (1)beam search模型只能为false (2)默认false |
是 |
temperature | float | 否 | 说明: (1)较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定 (2)默认0.95,范围 (0, 1.0],不能为0 |
是 |
top_p | float | 否 | 说明: (1)影响输出文本的多样性,取值越大,生成文本的多样性越强 (2)默认0.7,取值范围 [0, 1.0] |
是 |
penalty_score | float | 否 | 通过对已生成的token增加惩罚,减少重复生成的现象。说明: (1)值越大表示惩罚越大 (2)默认1.0,取值范围:[1.0, 2.0] |
否 |
max_completion_tokens | int | 否 | 指定模型最小输出token数,说明: (1)取值范围[2, 2048] |
是 |
response_format | string | 否 | 指定响应内容的格式,说明: (1)可选值: json_object:以json格式返回,可能出现不满足效果情况 text:以文本格式返回 (2)如果不填写参数response_format值,默认为text |
是 |
seed | int | 否 | 说明: (1)取值范围: (0,2147483647),会由模型随机生成,默认值为空 (2)如果指定,系统将尽最大努力进行确定性采样,以便使用相同seed和参数的重复请求返回相同的结果 |
是 |
stop | List | 否 | 生成停止标识,当模型生成结果以stop中某个元素结尾时,停止文本生成。说明: (1)每个元素长度不超过20字符 (2)最多4个元素 |
是 |
frequency_penalty | float | 否 | 说明: (1)正值根据迄今为止文本中的现有频率对新token进行惩罚,从而降低模型逐字重复同一行的可能性 (2)取值范围:[-2.0, 2.0] (3)支持以下模型: ernie-speed-8k、ernie-speed-128k 、ernie-tiny-8k、ernie-char-8k、ernie-lite-8k |
是 |
presence_penalty | float | 否 | 说明: (1)正值根据token记目前是否出现在文本中来对其进行惩罚,从而增加模型谈论新主题的可能性 (2)取值范围:[-2.0, 2.0] (3)支持以下模型: ernie-speed-8k、ernie-speed-128k 、ernie-tiny-8k、ernie-char-8k、ernie-lite-8k |
是 |
message说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
role | string | 是 | 当前支持以下: user: 表示用户 assistant: 表示对话助手 system:表示人设 |
name | string | 否 | message名 |
content | string | 是 | 对话内容,说明: (1)不能为空 (2)最后一个message对应的content不能为blank字符,如空格、"\n"、“\r”、“\f”等 |
响应参数
名称 | 类型 | 描述 |
---|---|---|
id | string | 本次请求的唯一标识,可用于排查问题 |
object | string | 回包类型 chat.completion:多轮对话返回 |
created | int | 时间戳 |
model | string | 模型ID |
choices | object | 说明:当请求参数stream值不同时,返回内容不同 |
usage | usage | token统计信息,说明: (1)同步请求默认返回 (2)会在最后一个chunk返回实际内容,其他chunk返回null |
choices说明
名称 | 类型 | 描述 |
---|---|---|
index | int | choice列表中的序号 |
message | message | 响应信息,当stream=false时返回 |
delta | delta | 响应信息,当stream=true时返回 |
finish_reason | string | 输出内容标识,说明: normal:输出内容完全由大模型生成,未触发截断、替换 stop:输出结果命中入参stop中指定的字段后被截断 length:达到了最大的token数 content_filter:输出内容被截断、兜底、替换为**等 function_call:调用了function call功能 |
flag | int | 安全细分类型,说明: (1)当stream=false,flag值含义如下: 0或不返回:安全 1:低危不安全场景,可以继续对话 2:禁聊:不允许继续对话,但是可以展示内容 3:禁止上屏:不允许继续对话且不能上屏展示 4:撤屏 (2)当stream=true时,返回flag表示触发安全 |
ban_round | int | 当flag 不为 0 时,该字段会告知第几轮对话有敏感信息;如果是当前问题,ban_round = -1 |
delta说明
名称 | 类型 | 描述 |
---|---|---|
content | string | 流式响应内容 |
usage说明
名称 | 类型 | 描述 |
---|---|---|
prompt_tokens | int | 问题tokens数(包含历史QA) |
completion_tokens | int | 回答tokens数 |
total_tokens | int | 总tokens数 |
message说明
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
role | string | 是 | 当前支持以下: user: 表示用户 assistant: 表示对话助手 system:表示人设 |
name | string | 否 | message名 |
content | string | 是 | 对话内容,说明: (1)不能为空 (2)最后一个message对应的content不能为blank字符,如空格、"\n"、“\r”、“\f”等 |
文生图
请求参数
名称 | 类型 | 必填 | 描述 | openai-python是否原生支持 |
---|---|---|---|---|
model | string | 是 | 模型ID,可选值可从client.models.list() |
是 |
prompt | string | 是 | 提示词,即用户希望图片包含的元素。说明: 长度限制为1024字符,建议中文或者英文单词总数量不超过150个 | 是 |
negative_prompt | string | 否 | 反向提示词,即用户希望图片不包含的元素。说明: 长度限制为1024字符,建议中文或者英文单词总数量不超过150个 | 否 |
response_format | string | 否 | 返回生成图像的格式。必须是url 或b64_json 之一。生成图像后,url 7天内有效。 |
是 |
size | string | 否 | 生成图片长宽,说明: (1)默认值 1024x1024 (2)取值范围如下: 适用头像: ["768x768", "1024x1024", "1536x1536", "2048x2048"] 适用文章配图 :["1024x768", "2048x1536"] 适用海报传单:["768x1024", "1536x2048"] 适用电脑壁纸:["1024x576", "2048x1152"] 适用海报传单:["576x1024", "1152x2048"] |
是 |
n | int | 否 | 生成图片数量,说明: (1)默认值为1 (2)取值范围为1-4 (3)单次生成的图片较多及请求较频繁可能导致请求超时 |
是 |
steps | int | 否 | 迭代轮次,说明: 默认值为20 取值范围为[10-50] |
否 |
style | string | 否 | 生成风格。说明: (1)默认值为Base (2)可选值: Base:基础风格 3D Model:3D模型 Analog Film:模拟胶片 Anime:动漫 Cinematic:电影 Comic Book:漫画 Craft Clay:工艺黏土 Digital Art:数字艺术 Enhance:增强 Fantasy Art:幻想艺术 Isometric:等距风格 Line Art:线条艺术 Lowpoly:低多边形 Neonpunk:霓虹朋克 Origami:折纸 Photographic:摄影 Pixel Art:像素艺术 Texture:纹理 |
是 |
sampler_index | string | 否 | 采样方式,说明: (1)默认值:Euler a (2)可选值如下: Euler Euler a DPM++ 2M DPM++ 2M Karras LMS Karras DPM++ SDE DPM++ SDE Karras DPM2 a Karras Heun DPM++ 2M SDE DPM++ 2M SDE Karras DPM2 DPM2 Karras DPM2 a LMS |
否 |
retry_count | int | 否 | 重试次数,默认1次 | 否 |
request_timeout | float | 否 | 请求超时时间,默认60秒 | 否 |
backoff_factor | float | 否 | 请求重试参数,用于指定重试的策略,默认为0 | 否 |
seed | integer | 否 | 随机种子,说明: 不设置时,自动生成随机数 取值范围 [0, 4294967295] |
否 |
cfg_scale | float | 否 | 提示词相关性,说明:默认值为5,取值范围0-30 | 否 |
响应参数
名称 | 类型 | 描述 |
---|---|---|
created | int | 时间戳 |
data | list(image) | 生成图片结果 |
image说明
名称 | 类型 | 描述 |
---|---|---|
b64_json | string | 图片base64编码内容,当且仅当response_format=b64_json |
url | string | 图片链接,当且仅当response_format=url |
index | int | 序号 |
向量
请求参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
model | str | 否 | 模型ID,可选值可从client.models.list() |
Input | List[str] | 是 | 填写文本,说明: (1)不能为空List,List的每个成员不能为空字符串 (2)文本数量不超过16 (3)每个文本token数不超过384且长度不超过1000个字符 |
返回参数
名称 | 类型 | 描述 |
---|---|---|
object | str | 回包类型,固定值“embedding_list” |
data | List[EmbeddingData] | embedding信息,data成员数和文本数量保持一致 |
usage | Usage | token统计信息,token数 = 汉字数+单词数*1.3 (仅为估算逻辑) |
EmbeddingData说明
名称 | 类型 | 描述 |
---|---|---|
object | str | 固定值"embedding" |
embedding | List[float] | embedding 内容 |
index | int | 序号 |
Usage说明
名称 | 类型 | 描述 |
---|---|---|
prompt_tokens | int | 问题tokens数 |
total_tokens | int | tokens总数 |
错误码
HTTP状态码 | 类型 | 错误码 | 错误信息 |
---|---|---|---|
400 | invalid_request_error | malformed_json | Invalid JSON |
400 | invalid_request_error | invalid_model | model is empty |
400 | invalid_request_error | malformed_json | Invalid Argument |
400 | invalid_request_error | malformed_json | 返回的具体错误信息 |
400 | invalid_request_error | invalid_messages | 返回的具体错误信息 |
400 | invalid_request_error | characters_too_long | the max input characters is xxx |
400 | invalid_request_error | invalid_user_id | user_id can not be empty |
400 | invalid_request_error | tokens_too_long | Prompt tokens too long |
401 | access_denied | no_parameter_permission | 返回的具体错误信息 |
401 | invalid_request_error | invalid_model | No permission to use the model |
401 | invalid_request_error | invalid_appid | No permission to use the appid |
401 | invalid_request_error | invalid_iam_token | IAM Certification failed |
403 | unsafe_request | system_unsafe | the content of system field is invalid |
403 | unsafe_request | user_setting_unsafe | the content of user field is invalid |
403 | unsafe_request | functions_unsafe | the content of functions field is invalid |
404 | invalid_request_error | no_such_model | |
405 | invalid_request_error | method_not_supported | Only POST requests are accepted |
429 | rate_limit_exceeded | rpm_rate_limit_exceeded | Rate limit reached for RPM |
429 | rate_limit_exceeded | tpm_rate_limit_exceeded | Rate limit reached for TPM |
429 | rate_limit_exceeded | preemptible_rate_limit_exceeded | Rate limit reached for preemptible resource |
429 | rate_limit_exceeded | user_rate_limit_exceeded | qps request limit by APP ID reached |
429 | rate_limit_exceeded | cluster_rate_limit_exceeded | request limit by resouce cluster reached |
500 | Internal_error | internal_error | Internal error |
500 | Internal_error | dispatch_internal_error | Internal error |