Prompt对象
更新时间:2024-09-19
功能介绍
千帆ModelBuilder Python SDK提供了Prompt类型,可以更便捷地操作平台上的Prompt。
注意事项
调用本文API,需使用安全认证AK/SK鉴权,调用流程及鉴权介绍详见SDK安装及使用流程。
示例
文生文模型
此示例通过平台预置模板,生成并使用Prompt对象,调用大模型返回对话内容。
调用示例
from qianfan.common import Prompt
from qianfan.common.hub import hub
# 使用安全认证AK/SK鉴权,通过环境变量方式初始化;替换下列示例中参数,安全认证Access Key替换your_iam_ak,Secret Key替换your_iam_sk
os.environ["QIANFAN_ACCESS_KEY"] = "your_iam_ak"
os.environ["QIANFAN_SECRET_KEY"] = "your_iam_sk"
# 获取平台上的 Prompt,name 为控制台上显示的名称
p = hub.load("prompt/区域美食推荐")
print(p.template) # => 作为游客,告诉我{region}必吃的10大美食
# 第二个参数_是 negative prompt,仅文生图场景使用,此处可忽略
prompt, _ = p.render(region="上海")
# 之后就可以将渲染后的结果送入模型进行推理
qianfan.Completion().do(prompt)
实现效果
QfResponse(
code=200,
headers={
...
},
body={
'id': 'as-4v1h587fyv',
'object': 'chat.completion',
'created': 1695021339,
'result': '你好,我是百度研发的知识增强大语言模型,中文名是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。',
'is_truncated': False,
'need_clear_history': False,
'usage': {
'prompt_tokens': 7,
'completion_tokens': 67,
'total_tokens': 74
}
},
)
文生图模型
调用示例
此示例通过平台预置模板,生成并使用Prompt对象,调用大模型返回图片内容。
# 使用安全认证AK/SK鉴权,通过环境变量方式初始化;替换下列示例中参数,安全认证Access Key替换your_iam_ak,Secret Key替换your_iam_sk
os.environ["QIANFAN_ACCESS_KEY"] = "your_iam_ak"
os.environ["QIANFAN_SECRET_KEY"] = "your_iam_sk"
# 文生图的 Prompt 使用方法相同,具体类型可以从控制台查看
txt2img_prompt = hub.load("prompt/角色设计")
# 类型通过变量属性获取
from qianfan.consts import PromptSceneType
txt2img_prompt.scene_type == PromptSceneType.Text2Image # => True
prompt, negative_prompt = txt2img_prompt.render()
# 之后将 prompt 和 negative_prompt 送入模型进行推理
qianfan.Text2Image().do(
prompt=prompt,
negative_prompt=negative_prompt
)
实现效果
QfResponse(code=200,
headers={...},
body={'created': 1111,
'data': [{'b64_image': 'xxxxx',
'image': 'xx',
'index': 1,
'object': 'image'}],
'id': 'as-xxx',
'object': 'image',
'usage': {'prompt_tokens': 28, 'total_tokens': 28}})
函数列表
- 创建本地 Prompt
- 从平台拉取 Prompt
- 上传 Prompt
- 更新 Prompt
- 删除 Prompt
- 保存&加载 Prompt
- 优化 Prompt
- 评估 Prompt
创建本地 Prompt
直接使用 template
参数构造本地 Prompt 对象。
请求示例
创建自定义的本地 Prompt对象
p = Prompt(
template="本地 prompt {var1}",
)
# 或者具有更为复杂参数的 Prompt
# 文生图 Prompt 同样支持
from qianfan.consts import PromptSceneType
prompt = Prompt(
name="txt2img",
template="txt2img template ((v1))",
scene_type=PromptSceneType.Text2Image,
negative_template="negative template ((v3))", # 负向 prompt
identifier="(())", # prompt 中变量的标识符
)
请求参数
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
name | string | 否 | Prompt模版的名称 |
template | string | 是 | 模版内容,示例:请以{number}字数生成{province}省相关简介 |
scene_type | PromptSceneType | 否 | 场景类型,可选值如下: · PromptSceneType.Text2Text:文生文,默认值 · PromptSceneType.Text2Image:文生图 |
negative_template | string | 否 | 反向prompt模版内容,表示不希望大模型生成的内容,说明:只有scene_type为PromptSceneType.Text2Image,即场景类型为文生图时,该字段有效 |
identifier | string | 否 | 变量识别符号,支持以下符号: · 大括号{} (默认) · 双大括号{{}} · 中括号[] · 双中括号[[]] · 小括号() · 双小括号(()) |
返回参数
名称 | 类型 | 说明 |
---|---|---|
prompt | object | Prompt对象 |
从平台拉取 Prompt
借助于 SDK 的 hub ,可以直接从平台拉取已有的 Prompt。
请求示例
from qianfan.common.hub import hub
# 获取平台上的 Prompt,name 为控制台上显示的名称
p = hub.load("prompt/区域美食推荐")
请求参数
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
无 | string | 是 | Prompt模版的名称 |
上传 Prompt
对于本地 Prompt 来说,借助 hub 对象可以直接将其上传至平台,上传之后可以用 id
字段获取 Prompt 的 id。
p = Prompt(
template="本地 prompt {var1}",
)
# 对于平台上的 prompt 来说,name 是必须的,因此上传前必须先设置
p.name = "cookbook_prompt"
hub.push(p)
p.id # => 188
请求参数
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
无 | object | 是 | Prompt对象 |
更新 Prompt
对于平台上的 Prompt,借助 hub 对象可以直接对其进行修改。
请求示例
p.set_template("新的 Prompt {new_var}")
hub.push(p) # 更新至平台
print(p.variables) # => ['new_var']
print(p.render(new_var="hello")) # => 新的 Prompt hello
请求参数
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
无 | object | 是 | Prompt对象 |
删除 Prompt
调用delete
方法可以删除 Prompt,如果是本地 Prompt 或者预置 Prompt,那么该函数将没有作用,删除后 Prompt 仍可以本地使用。
请求示例
p=hub.load("prompt/cookbook_prompt")
p.delete()
保存&加载 Prompt
SDK 提供了save_to_file
方法,以文件形式将 Prompt 保存至本地。保存后,后续重新使用保存的Prompt,可以通过from_file
方法从文件里读取 Prompt。
请求示例
p = Prompt(template="这是一个用于{usage}的 Prompt")
p.save_to_file("test_prompt.tpl")
p = Prompt.from_file("test_prompt.tpl")
prompt, _ = p.render(usage="测试")
print(prompt) # => 这是一个用于测试的 Prompt
返回参数
名称 | 类型 | 说明 |
---|---|---|
prompt | object | Prompt对象 |
优化 Prompt
为了提升模型推理的准确率,可以通过optimize
方法对 Prompt 进行优化,返回一个优化后的Prompt,可以提升大模型的表现效果。
请求示例
prompt = Prompt(template="帮我写一份{job}年终总结")
optimized_prompt = prompt.optimize(
optimize_quality=True,
simplify_prompt=True,
iteration_round=1,
enable_cot=True,
service_name='ERNIE-4.0-8k',
)
for attr, value in vars(optimized_prompt).items():
if isinstance(value, (str, int, float, bool)):
print(f"{attr}: {value}")
返回示例
template: 请写一份今年年末的总结报告,包括以下几个部分:
1. 工作内容和职责:描述我今年在{job}方面的工作内容和职责,以及相关的任务和项目。
2. 成就和经验:总结我今年在{job}方面取得的成就和经验,包括完成的项目、解决的问题以及得到的反馈和认可。
3. 挑战和问题:讨论我今年在{job}方面面临的挑战和问题,并提出我采取的解决方案和未来的改进方向。
4. 学习和成长:描述我今年在{job}方面获得的学习和成长机会,包括参加的培训、掌握的技能和知识,以及如何应用这些知识和技能来改进我的工作。
请提供具体的细节和例子支持我的描述、讨论、挑战和问题、学习和成长等方面。同时,确保报告的结构清晰合理,包括适当的标题和小标题,以帮助读者更好地理解和阅读。让我们一步一步来思考
identifier: {}
type: PromptType.User
scene_type: PromptSceneType.Text2Text
framework_type: PromptFrameworkType.NotUse
_mode: local
请求参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
optimize_quality | bool | 否 | 优化 prompt 质量。 默认为True |
simplify_prompt | bool | 否 | 简化 prompt,可以省去“的”、“吧”等含义不强的文本实体,精炼语料内容并降低推理成本。 默认为False |
iteration_round [ 1 | 2 ] | int | 否 | 优化迭代轮数,默认为 1 |
enable_cot | bool | 否 | 开启思维链,将指引模型拆解Prompt内容,逐步进行推理。建议仅在数学计算、逻辑推理等场景下开启使用。 |
service_name | string | 否 | 优化时使用的服务名称,包括预置服务和自定义服务。示例:ERNIE-Bot,可以通过以下方式获取该字段值:在千帆ModelBuilder控制台-Prompt优化-在线优化页面,在请选择服务下拉框中查看支持的模型服务列表。 |
返回参数
名称 | 类型 | 说明 |
---|---|---|
prompt | object | Prompt对象 |
评估 Prompt
SDK 提供了evaluate
方法,可以评估不同 Prompt 在不同场景下的质量。
请求示例
old_prompt = Prompt(template="帮我写一份{job}年终总结")
new_prompt = old_prompt.optimize()
prompts= [old_prompt, new_prompt] # 待评估的 prompt 列表
# 待评估的场景
scenes= [
{
"args": {"job": "程序员"}, # prompt 变量参数
"expected": "代码" # 期望得到的输出
},
{
"args": {"job": "产品经理"},
"expected": "用户量"
}
]
# 用于评价的模型
model=Completion(model="ERNIE-3.5-8K")
results=Prompt.evaluate(prompts, scenes, model)
返回示例
Prompt.PromptEvaluateResult(
prompt=Prompt(template="帮我写一份{job}的年终总结"),
scene=[
{
'new_prompt': '帮我写一份程序员的年终总结',
'variables': {'job': '程序员'},
'expected_target': '代码',
'response': '模型生成的结果',
'score': 0.6395874962204592
}
],
summary='模型对prompt的评价'
)
请求参数
名称 | 类型 | 必填 | 描述 |
---|---|---|---|
prompt_list | list[Prompt] | 是 | 待评估的Prompt对象列表 |
scenes | list[dict] | 是 | 场景列表,每个场景包含args 和expected 两个字段,args 是 Prompt 变量参数,expected 是该 Prompt 期望的输出 |
model | Completion | 是 | Completion生成的模型对象 |
返回参数
名称 | 类型 | 描述 |
---|---|---|
result_list | list[PromptEvaluateResult] | PromptEvaluateResult的对象列表 |
PromptEvaluateResult说明:
名称 | 类型 | 描述 |
---|---|---|
prompt | list[prompt] | prompt的对象列表 |
scene | list[scene] | scene列表 |
summary | string | 对该 Prompt 表现的总结 |
scene说明:
名称 | 类型 | 描述 |
---|---|---|
new_prompt | string | 变量填充后的新 prompt |
variables | list[string] | 变量列表 |
summary | string | 期望的输出 |
response | string | 模型生成的输出 |
score | float | 对模型输出的打分 |
prompt说明:
名称 | 类型 | 说明 |
---|---|---|
name | string | Prompt模板的名称 |
labels | list[int] 或 list[string] | 模板标签Id数组,说明: · 单个模板最多可选20个标签 · 数组元素是标签id,数组所有元素类型必须一致,例如所有元素都是int,或所有元素都是string · 通过调用获取标签列表接口,返回的labelId字段获取 |
id | int | 模板标识id |
template | string | 模板内容,说明: (1)如果不使用框架,示例:请以{number}字数生成{province}省相关简介 (2)如果使用模型框架该字段值需符合框架要求,详见本文模板框架说明 |
variables | list[string] | 模板变量,示例:"var1,var2",说明:变量标识符号里面的内容,不包含变量标识符,且以逗号隔开 |
identifier | string | 变量识别符号,支持以下符号: · 大括号{} · 双大括号{{}} · 中括号[] · 双中括号[[]] · 小括号() · 双小括号(()) |
scene_type | enum | 场景类型,可选值如下: · PromptSceneType.Text2Text:文生文;如果scene字段值不传,默认为PromptSceneType.Text2Text · PromptSceneType.Text2Image:文生图 |
framework_type | enum | 模板框架,说明: (1)如果不使用模板框架,该字段值为PromptFrameworkType.NotUse (2)如果使用模板框 · PromptFrameworkType.Basic:Basic Prompt Framework · PromptFrameworkType.Fewshot:CRISPE Prompt Framework · PromptFrameworkType.Fewshot:Few-shot Promt 如果使用模板框架,参数template需按照模板框架要求填写 |
negative_template | string | 反向prompt模板内容,表示不希望大模型生成的内容,说明:只有scene为Text2Image,即场景类型为文生图时,该字段有效 |
negative_variables | list[string] | 反向prompt模板的变量,说明:只有scene为PromptSceneType.Text2Image时,即场景类型为文生图时,该字段有效 |
type | enum | 模板类型 · 1:预置模板 · 2:用户创建模板 |