Skip to content

Commit

Permalink
add doc
Browse files Browse the repository at this point in the history
  • Loading branch information
ZingLix committed Jan 16, 2024
1 parent 75af52c commit 9ba6026
Show file tree
Hide file tree
Showing 5 changed files with 489 additions and 12 deletions.
285 changes: 282 additions & 3 deletions cookbook/prompt.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
Expand Down Expand Up @@ -454,6 +454,285 @@
"print(prompt)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 优化 Prompt"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"为了能够提升模型的生成效果,SDK 提供了优化 prompt 的功能,能够快速生成高质量的 prompt。"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"请撰写一份{job}的年终报告,包括该{job}的概要、成绩和挑衅。请在报告中提供{job}的详细说明和目标,并阐明{job}的成果和挑战。同时,请提供相关数据和指标,以证明{job}的有效性和可操作性。请注意,您的报告应该简洁明了,并包含所有必要的细节和信息,以帮助读者更好地理解{job}的表现和结果。\n"
]
}
],
"source": [
"old_prompt = Prompt(\"帮我写一份{job}的年终报告\")\n",
"new_prompt = old_prompt.optimize()\n",
"print(new_prompt.template)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"优化可以开启不同选项:\n",
"\n",
"- `optimize_quality`:优化 prompt 质量\n",
"- `simplify_prompt`:简化 prompt,可以省去“的”、“吧”等含义不强的文本实体,精炼语料内容并降低推理成本\n",
"- `iteration_round`:优化迭代轮数,默认为 1\n",
"- `enable_cot`:开启思维链,将指引模型拆解Prompt内容,逐步进行推理。建议仅在数学计算、逻辑推理等场景下开启使用。"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## 评估 Prompt"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"在优化完 Prompt 后,SDK 提供了 `evaluate` 方法,可以快速评估不同 Prompt 的质量。"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from qianfan import Completion\n",
"\n",
"prompts = [old_prompt, new_prompt]\n",
"scenes = [\n",
" {\n",
" \"args\": {\"job\": \"程序员\"},\n",
" \"expected\": \"代码\"\n",
" },\n",
" {\n",
" \"args\": {\"job\": \"产品经理\"},\n",
" \"expected\": \"用户量\"\n",
" }\n",
"]\n",
"model = Completion()\n",
"\n",
"results = Prompt.evaluate(prompts, scenes, model)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"results 是一个 list,每个元素是一个 PromptEvaluateResult 对象,代表一个 Prompt 的评估结果。可以用 summary 字段获取评估总结。"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"程序员\n",
"【用户期望结果】:\n",
"\n",
"1. 清晰明确的提示词:用户需要一个简洁、明确的提示词,以便快速理解需要完成的任务。\n",
"2. 具体性:用户期望提示词能够提供足够的具体信息,以便生成符合要求的年终报告。\n",
"3. 通用性:用户希望提示词具有一定的通用性,以便能够适应不同的工作场景和需求。\n",
"\n",
"【模型生成结果】:\n",
"\n",
"1. 清晰明确:提示词“帮我写一份{job}的年终报告”简洁明了,用户可以快速理解需要完成的任务。\n",
"2. 具体性:该提示词提供了“job”这一关键词,用户可以根据自己的实际工作情况填写具体的职业或岗位名称,使得生成的年终报告更具针对性。\n",
"3. 通用性:该提示词中的“{job}”是一个占位符,可以根据不同的工作场景和需求进行替换,具有一定的通用性。\n",
"\n",
"【评价】:\n",
"\n",
"该提示词模版撰写得相对较好,既简洁明了,又具有一定的具体性和通用性,能够满足用户的需求。如果一定要对模版进行改进,可以考虑增加一些细节方面的提示,例如在“年终报告”前加上“工作总结”等关键词,以更好地引导用户生成符合要求的年终报告。\n",
"======\n",
"产品经理\n",
"根据您提供的模板,以下是对提示词模版撰写质量的评价:\n",
"\n",
"1. 清晰度:模版使用了简洁明了的语言,使得用户可以快速理解要求的内容和格式。每个部分都有明确的标题,如“概要”、“成绩”和“挑衅”,这有助于用户组织思路和信息。\n",
"2. 适应性:模版使用了灵活的占位符,如“{job}”,使得该模版可以适用于多种不同的职位和场景。通过替换占位符,用户可以轻松地生成特定于其职位的年终报告。\n",
"3. 完整性:模版要求包含所有必要的部分,如“概要”、“成绩”和“挑衅”,以确保报告的全面性。这有助于用户在撰写报告时不会遗漏任何重要信息。\n",
"4. 数据和指标要求:模版强调了提供相关数据和指标的重要性,这有助于证明该职位的有效性和可操作性。这是年终报告中一个非常关键的部分,因为它为读者提供了具体的信息,以评估该职位的成果和挑战。\n",
"5. 简洁性:模版提醒用户报告应该简洁明了,这有助于确保报告易于阅读和理解。在撰写报告时,避免冗余和不必要的细节是非常重要的,模版的这一要求有助于实现这一目标。\n",
"\n",
"综上所述,该提示词模版撰写质量较高,能够为用户提供清晰、完整和实用的指导,以确保他们能够生成一份出色的年终报告。\n",
"======\n"
]
}
],
"source": [
"for scene, result in zip(scenes, results):\n",
" print(scene[\"args\"][\"job\"])\n",
" print(result.summary)\n",
" print(\"======\")"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"同时也可以通过 scene 字段,获取不同场景下每个 prompt 评估分数与模型输出。"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"预期输出: 代码\n",
"评价得分: 0.6875922409817495\n",
"模型输出: 年度工作总结与展望\n",
"\n",
"尊敬的领导和各位同事:\n",
"\n",
"我是XXX,一名普通的程序员,很荣幸在这里向大家汇报我今年的工作情况。\n",
"\n",
"一、个人概要\n",
"\n",
"我从事软件开发工作已有X年,对各种编程语言如Python、Java等有着深厚的功底,同时对数据结构和算法有深入的理解。我的目标是不断提升自己的技术水平,为公司的业务发展提供强有力的支持。\n",
"\n",
"二、成绩和挑衅\n",
"\n",
"今年,我参与了多个项目的开发,其中最值得一提的是我们团队成功完成了“XX系统”的升级工作。在这个项目中,我负责了核心部分的编程和优化,通过改进算法和提升效率,我们成功地为客户系统带来了20%的性能提升,得到了客户和领导的高度赞扬。\n",
"\n",
"然而,我也面临着一些挑战。一方面,随着技术的快速发展,我需要不断学习新的知识和技能,以应对不断变化的开发环境;另一方面,我注意到团队中一些成员对复杂技术的接受程度有限,这在一定程度上制约了我们项目的进展。为此,我感到有必要提升自己的教学和传播能力,以便更好地帮助团队成员提升技术水平。\n",
"\n",
"三、程序员的详细说明和目标\n",
"\n",
"1. 编程语言和工具:我主要使用Python和Java进行开发,工具包括Git、Jira等项目管理工具,以及各种数据库和云服务。\n",
"2. 技能提升:今年我特别关注了人工智能和机器学习的相关知识,希望能将这些技术应用到我们的项目中。同时,我也提高了我的英语阅读能力,以便更好地获取国际前沿的技术信息。\n",
"3. 目标:我希望在明年能够带领我们的团队完成更多的高质量项目,同时提升我们的技术教学能力,帮助更多的团队成员提升技术水平。\n",
"\n",
"四、成果和挑战\n",
"\n",
"今年,我们团队取得了丰硕的成果。我们参与的多个项目都得到了客户的满意反馈,其中“XX系统”的升级项目更是我们的亮点。我们的代码质量得到了显著提升,错误率下降了30%,这大大提高了我们项目的成功率。\n",
"\n",
"然而,我们也面临一些挑战。首先,随着业务的发展,我们的项目数量和复杂度都在增加,这给我们团队带来了很大的工作压力。其次,尽管我们在代码质量和效率上有了一定的提升,但在某些特殊场景下的性能优化仍然是我们需要解决的问题。最后,如何培养和提升团队成员的技术能力也是一个我们需要面对的挑战。\n",
"\n",
"五、数据和指标\n",
"\n",
"为了证明我们团队的有效性和可操作性,我附上了一些相关的数据和指标:\n",
"\n",
"1. 项目成功率:今年我们参与的多个项目中,有85%的项目得到了客户的满意反馈,我们认为这是由于我们在代码质量和效率上的提升。\n",
"2. 错误率:今年我们的代码错误率相比去年下降了30%,这表明我们的编程质量和效率得到了显著提升。\n",
"3. 学习资源:我们团队非常重视学习新的技术和知识。今年我们阅读了大量的英文技术文章和书籍,参加了多个线上和线下的技术研讨会。这些学习资源有助于我们跟上技术的发展步伐。\n",
"\n",
"以上就是我的年终报告,感谢大家在一年中的支持和帮助。在未来的工作中,我们会继续努力,为公司的业务发展做出更大的贡献。谢谢大家!\n",
"======\n",
"预期输出: 用户量\n",
"评价得分: 0.6793301118887888\n",
"模型输出: 产品经理年终报告\n",
"\n",
"尊敬的领导:\n",
"\n",
"我是XXX公司XXX产品经理,在这一年中,我带领团队成功完成了XXX产品的发展、设计、开发、测试和上线工作。以下是我在这一年的工作总结和成果分析,以及对未来挑战的展望。\n",
"\n",
"一、产品经理概要\n",
"\n",
"姓名:XXX\n",
"职位:XXX产品经理\n",
"公司:XXX公司\n",
"产品名称:XXX产品\n",
"任职时间:自XXXX年XX月开始\n",
"\n",
"二、成绩和挑衅\n",
"\n",
"1.成绩\n",
"\n",
"(1)产品成功上线:我们成功推出了XXX产品,并获得了广大用户的积极反馈。产品上线以来,用户量持续增长,市场表现良好。\n",
"(2)团队协作高效:我与研发、设计、市场等部门的紧密合作,保证了项目的顺利进行。在团队的共同努力下,我们的产品开发周期比原计划缩短了20%。\n",
"(3)用户反馈积极:通过对用户的调研和反馈进行分析,我们不断优化产品功能,提升用户体验。目前,我们的产品满意度高达90%。\n",
"\n",
"2.挑战\n",
"\n",
"(1)竞争激烈:尽管我们的产品表现良好,但市场上同类竞品层出不穷,这给我们的产品带来了巨大的竞争压力。\n",
"(2)用户需求变化快:随着市场的变化,用户对产品的需求也在不断变化。我们需要及时调整产品策略,以满足用户的新需求。\n",
"(3)技术难题:在产品开发过程中,我们遇到了一些技术难题,如数据安全、性能优化等。这些问题需要我们投入更多的资源和时间来解决。\n",
"\n",
"三、产品经理目标和成果\n",
"\n",
"1.目标\n",
"\n",
"(1)提升用户满意度:通过优化产品功能,提升用户体验,我们将努力将用户满意度提高到95%。\n",
"(2)扩大市场份额:我们将加大市场推广力度,提高产品的知名度和市场占有率。\n",
"(3)优化技术架构:解决技术难题,提高产品的稳定性和性能,为未来的产品升级打下基础。\n",
"\n",
"四、相关数据和指标\n",
"\n",
"1.用户增长:产品上线以来,用户数量增长了50%,日活跃用户占比达到了40%。\n",
"2.市场反馈:在各大应用商店中,我们的产品评分达到了4.5分(满分5分)。\n",
"3.竞品分析:对市场上同类竞品进行深入分析,了解其优缺点和营销策略。\n",
"4.技术指标:通过各项性能测试和安全评估,我们的产品达到了预期的技术指标。\n",
"\n",
"五、有效性及可操作性验证\n",
"\n",
"通过数据分析和市场反馈,我们的产品在市场上表现良好,用户满意度高,市场反响热烈。同时,我们的团队成员也表示,在产品开发过程中,他们的工作效率得到了提高,团队协作更加顺畅。这些数据和反馈都验证了我们在产品管理方面的有效性和可操作性。\n",
"\n",
"六、未来展望\n",
"\n",
"尽管我们在过去一年中取得了不错的成绩,但面临的挑战仍然不小。我们将继续努力,争取在竞争激烈的市场中取得更大的成功。具体来说,我们将:\n",
"\n",
"(1)加强用户需求调研,及时调整产品策略,以满足用户的新需求;\n",
"(2)加大市场推广力度,提高产品的知名度和市场占有率;\n",
"(3)持续优化技术架构,解决技术难题,提高产品的稳定性和性能;\n",
"(4)培养团队成员的创新能力,不断推出新的功能和特性,提升产品的竞争力。\n",
"\n",
"感谢领导和同事们在过去一年中的支持和帮助,我们会继续努力,为公司的长远发展贡献力量。\n",
"\n",
"此致\n",
"敬礼!\n",
"\n",
"XXX公司XXX产品经理 XXX\n",
"XXXX年XX月XX日\n",
"======\n"
]
}
],
"source": [
"scene_list = results[1].scene\n",
"for scene in scene_list:\n",
" print(\"预期输出:\",scene['expected_target'])\n",
" print(\"评价得分:\", scene['score'])\n",
" print(\"模型输出:\", scene['response'])\n",
" print(\"======\")\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
Expand All @@ -464,7 +743,7 @@
],
"metadata": {
"kernelspec": {
"display_name": "base",
"display_name": "py311",
"language": "python",
"name": "python3"
},
Expand All @@ -483,7 +762,7 @@
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "58f7cb64c3a06383b7f18d2a11305edccbad427293a2b4afa7abe8bfc810d4bb"
"hash": "f553a591cb5da27fa30e85168a93942a1a24c8d6748197473adb125e5473a5db"
}
}
},
Expand Down
4 changes: 2 additions & 2 deletions docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ $ qianfan dataset view [OPTIONS] DATASET
* `--raw`:展示原始数据。
* `--help`:展示帮助文档。

## trainer 训练
### trainer 训练

**用法**:

Expand All @@ -260,7 +260,7 @@ $ qianfan trainer [OPTIONS] COMMAND [ARGS]...

* `run`:运行 trainer 任务

### run
#### run 发起训练任务

运行 trainer 任务

Expand Down
52 changes: 52 additions & 0 deletions docs/prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,58 @@ prompt, _ = p.render(usage="测试")
print(prompt) # => 这是一个用于测试的 Prompt
```

### 优化 Prompt

为了提升模型推理的准确率,可以通过 `optimize` 方法对 Prompt 进行优化。

```python
prompt = Prompt(template="帮我写一份{job}年终总结")
optimized_prompt = prompt.optimize()
```

优化可以开启不同选项:

- `optimize_quality`:优化 prompt 质量
- `simplify_prompt`:简化 prompt,可以省去“的”、“吧”等含义不强的文本实体,精炼语料内容并降低推理成本
- `iteration_round`:优化迭代轮数,默认为 1
- `enable_cot`:开启思维链,将指引模型拆解Prompt内容,逐步进行推理。建议仅在数学计算、逻辑推理等场景下开启使用。
- `app_id`:优化时使用的 App ID,可选参数
- `service_name`:优化时使用的服务名称,可选参数

### 评估 Prompt

SDK 提供了 `evaluate` 方法,可以评估不同 Prompt 在不同场景下的质量。

```python
prompts = [old_prompt, new_prompt]
scenes = [
{
"args": {"job": "程序员"},
"expected": "代码"
},
{
"args": {"job": "产品经理"},
"expected": "用户量"
}
]
model = Completion()

results = Prompt.evaluate(prompts, scenes, model)
```

其中 `prompts` 是一个 Prompt 列表,`model` 是进行生成的模型对象,`scenes` 是一个场景列表,每个场景包含 `args``expected` 两个字段,`args` 是 Prompt 变量参数,`expected` 是该 Prompt 期望的输出。

输出是一个列表,列表中每个元素是一个 `PromptEvaluateResult` 对象,对应了每个 Prompt 的评估结果,具有以下字段:

- `prompt`:评估的 Prompt 对象
- `scene`:不同场景下的表现
- `new_prompt`:变量填充后的新 prompt
- `variables`:变量列表
- `expected_target`:期望的输出
- `response`:模型生成的输出
- `score`:对模型输出的打分
- `summary`:对该 Prompt 表现的总结

### 框架类型

为了能够让模型更好的理解输入,需要提供足够详细的信息,千帆提供了数个 Prompt 框架类型,能够帮助用户编写出足够高质量的 Prompt,目前 SDK 支持如下框架类型:
Expand Down
Loading

0 comments on commit 9ba6026

Please sign in to comment.