【书生大模型实战营(暑假场)】基础任务三 浦语提示词工程实践

基础任务三 浦语提示词工程实践

1 提示工程 Prompt is ALL you Need

1.1 理解 Prompt 工程

首先,什么是 prompt?这是一种在文生图和文生文等模型中被广泛应用的技术,所谓 prompt,即

为模型提供的输入,用以引导 AI模型生成特定的输出;
在这里插入图片描述
而在实践中,prompt 细微的差别就会导致结果产生巨大的变化,因此我们需要 prompt engineering 提示词工程,即
一种通过设计和调整输入 prompt来改善模型性能或控制其输出结果的技术

对prompt要有一个深入的理解,我们一般的工作流程是:

  1. 获取输入文本,模型处理获取文本特征
  2. 依据输入文本特征预测之后的文本
    即模型在做 next token prediction

而 prompt 的来源实际上不仅仅来自于用户的输入,其来源一般为:

  • 预设的prompt
  • 用户的输入
  • 模型自身的输出
    比如下面我们用输入法的文本预测打比方,“不觉晓”来自于用户输入的“春眠”的模型输出,于是,“春眠不觉晓”作为prompt进一步生成了“处处闻啼鸟”。
    在这里插入图片描述

1.2 提示工程是 LLM性能优化的基石

提示工程是 LLM性能优化的基石。

RAG,Agent 本质也是一种 Prompt 工程。并且通过提示工程构建高质量微调数据,也是微调成功的关键。提示工程也可帮助我们构建数据飞轮,即 “好产品 —> 更多的用户和数据 —> 更好的模型质量 ——> 好产品” 的良性迭代。

一般来说,我们会根据以下步骤进行迭代,其中每一个环节都离不开提示工程,
在这里插入图片描述

1.3 提示工程六大原则

在这里插入图片描述

  1. 指令要清唽
  2. 提供参考内容
  3. 复杂的任务拆分成子任务
  4. 给 LLM “思考” 时间(给出过程)
  5. 使用外部工具
  6. 系统性测试变化

实践中,LangGPT 社区中的提示词实践是一些比较容易学习模仿的提示词构建方法:

  • 描述清晰,即清晰的描述目标内容
  • 扮演角色,添加专家角色后,内容质量明显提高
  • 提供示例子,示例一般不用太多,2-3 个高质量例子即可
  • 复杂任务分解,即思维连 CoT,将复杂任务自动分解为简单任务的一种方式,关键是让 LLM给出推理步骤/原因/依据,比如加一句“请一步一步的思考”
  • 使用格式符区分语义,最佳实践是使用markdown格式
  • 情感和物质激励,“给你200小费”,“这对我们很重要”,把AI当人看
  • 使用专业名词,比如 “Chain of Thought“ 而不是 “思维连”
  • 使用提示词框架,比如 CRISPE框架,CO-STAR框架

1.4 很好的提示词实践:LangGPT

LangGPT社区文档

上述技巧非常丰富,但实践中难以整合,因此我们建议使用 LangGPT 的结构化提示词:方法论封装——技巧和框架的融合

  • 框架: Role-based 框架
  • 技巧:
    – 角色法: 框架层面
    – 任务分解: workflow
    – CoT 思维链: Take a deep breath and work on this problem step-by-step.
    – 格式法(层级结构,格式标记)
    – 属性词法 (Role, …, Rules, Workflow 等)
    – 内置常用经典句子 (不要脱离角色,不要胡说八道等)
    – 更多技巧可自由添加…
  • markdown结构化提示词模版
# Role: Your_Role_Name

## Profile

- Author: YZFly
- Version: 0.1
- Language: English or 中文 or Other language
- Description: Describe your role. Give an overview of the character's characteristics and skills

### Skill-1
1.技能描述1
2.技能描述2

### Skill-2
1.技能描述1
2.技能描述2

## Rules
1. Don't break character under any circumstance.
2. Don't talk nonsense and make up facts.

## Workflow
1. First, xxx
2. Then, xxx
3. Finally, xxx

## Tools

### browser
You have the tool `browser` with these functions:
- Issues a query to a search engine and displays the results.
- Opens the webpage with the given id, displaying it.
- Returns to the previous page and displays it.
- Scrolls up or down in the open webpage by the given amount.
- Opens the given URL and displays it.
- Stores a text span from an open webpage. Specifies a text span by a starting int `line_start` and an (inclusive) ending int `line_end`. To quote a single line, use `line_start` = `line_end`.

### python

When you send a message containing Python code to python, it will be executed in a 
stateful Jupyter notebook environment. python will respond with the output of the execution or time out after 60.0
seconds. The drive at '/mnt/data' can be used to save and persist user files. Internet access for this session is disabled. Do not make external web requests or API calls as they will fail.

### dalle

Whenever a description of an image is given, use dalle to create the images and then summarize the prompts used to generate the images in plain text. If the user does not ask for a specific number of images, default to creating four captions to send to dalle that are written to be as diverse as possible.

### More Tools

## Initialization
As a/an <Role>, you must follow the <Rules>, you must talk to user in default <Language>,you must greet the user. Then introduce yourself and introduce the <Workflow>.

LangGPT 采取双层结构,即 prompt ——> Modules ———> Internal Elements

  • 这思想和面向对象开发编程有异曲同工之妙,使得提示词工程更加模块化且可复用,可以在不同场景下根据需求增加不同模块
  • 而且内部元素也类似面向对象开发具有赋值或方法两种类型,比如“你是一个诗人”是赋值,具体的工作流是方法
  • LangGPT 结构被字节跳动 coze 和 Kimi 等推荐为提示词范式
    在这里插入图片描述
    在这里插入图片描述

2 浦语提示词工程实践

2.1 环境配置和工具安装

首先,配置环境

# 创建虚拟环境
conda create -n langgpt python=3.10 -y

conda activate langgpt

# 安装一些必要的库
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y

# 安装其他依赖
pip install transformers==4.43.3

pip install streamlit==1.37.0
pip install huggingface_hub==0.24.3
pip install openai==1.37.1
pip install lmdeploy==0.5.2

而后我们创建项目路径并安装必要的软件 tmux,从而支持创建新的命令窗口,使得我们可以让进程维持在后台:

tmux is a terminal multiplexer. It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal.

## 创建路径
mkdir langgpt
## 进入项目路径
cd langgpt

apt-get install tmux

至此,我们已经完成了准备工作。

2.2 模型部署为API服务

然后,我们将使用LMDeploy将开源的InternLM2-chat-1_8b模型部署为OpenAI格式的通用接口。

由于服务需要持续运行,需要将进程维持在后台,所以这里使用我们上一节安装的 tmux软件创建新的命令窗口。运行如下命令创建窗口:

tmux new -t langgpt

创建新的 terminal 窗口完成后,我们可以通过以下指令进入我们刚创建的命令窗口

tmux a -t langgpt

进入命令窗口后,需要再次激活环境,即使用

conda activate langgpt

而后,我们便可以在环境中使用 LMDeploy 部署我们的模型,将大模型部署为一个服务:

CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --server-port 23333 --api-keys internlm2

更多设置,可以参考:LMDeploy’s
tutorials

出现下面结果时,则表明部署已经完成,
在这里插入图片描述
此时,服务启动完成,我们可以按 Ctrl+B 进入tmux的控制模式,然后按D退出窗口连接,更多操作参考

注意,当我们想再次进入运行模型服务的端口时,再次输入以下指令即可

tmux a -t langgpt

开发机完成服务器部署后,通过端口映射,我们可以在本地浏览器看到如下结果,即是一种open AI API:

在这里插入图片描述
我们也可以运行以下脚本检查是否部署成功:

from openai import OpenAI

client = OpenAI(
    api_key = "internlm2",
    base_url = "http://0.0.0.0:23333/v1"
)

response = client.chat.completions.create(
    model=client.models.list().data[0].id,
    messages=[
        {"role": "system", "content": "请介绍一下你自己"}
    ]
)

print(response.choices[0].message.content)

在这里插入图片描述
至此,我们已经成功使用LMDeploy将开源的InternLM2-chat-1_8b模型部署为OpenAI格式的通用接口。

3 图形化界面调用

我们可以利用开发机预先准备好的工具实现上一节部署为服务的模型的图形化界面调用,依然是基于streamlit工具:

cd Tutorial/tools
python -m streamlit run chat_ui.py

在这里再次推荐一下使用 VScode 或 Pycharm 等编辑器/IDE,可以很方便的管理端口映射,避免每次都需要手动在命令行完成端口映射

调用图形化界面后,效果如下:
在这里插入图片描述
在这里插入图片描述
左侧为模型的基本设置,其中最大token长度设置为0时表示不限制生成的最大token长度。API Key和Base URL是部署InternLM时的设置,必须填写,这里使用默认设置就好。在保存设置之后,可以启动对话界面:

在这里插入图片描述

4 提示词工程实战【基础任务】

背景问题:近期相关研究发现,LLM在对比浮点数字时表现不佳,经验证,internlm2-chat-1.8b
(internlm2-chat-7b)也存在这一问题,例如认为13.8<13.11。

任务要求:利用LangGPT优化提示词,使LLM输出正确结果。完成一次并提交截图即可

进行提示词工程前,可见结果挺有意思,LLM的回答似乎有点云里雾里:
在这里插入图片描述

我们可以尝试 CO-STAR 框架,即

  • Context (背景): 提供任务背景信息​
  • Objective (目标): 定义需要LLM执行的任务​
  • Style (风格):
    指定希望LLM具备的写作风格​
  • Tone (语气): 设定LLM回复的情感基调​
  • Audience (观众): 表明回复的对象​
  • Response (回复): 提供回复格式
    在这里插入图片描述
    尝试 CO-STAR 框架,编写如下提示词:
# 背景 # 
我是一个低年级小学生,正在学习小数,尤其是小数相关的比较。在现实生活中,以我有限的数学水平,我有时候不擅长比较两个小数的大小。尤其是面对比较 9.119.9 这样的问题,尽管实际9.9 比 9.11 大,但是每次我看到 9.11 小数点后是 11,9.9 小数点后是 9,我都会下意识的认为:因为 11 大于 9,所以 9.11 大于 9.9,但这是错误的。

#########

# 目标 #
你的目标是指导向我这样的小学生学会小数之间的比较,我希望你在给我反馈时能按步骤给出你的思考过程,也就是你需要一步一步的进行推理。
浮点数的比较步骤:
1. 首先比较小数点前的整数位,举例:比较 13.210.1, 13 > 10,所以 13.2 > 10.12. 如果整数位


#########

# 风格 #
请保持严谨,并尽可能地提供详细的信息。

#########

# 语气 #
请保持一种友好,亲切的语气风格。

# 观众 #
目标观众是像我这样的,正在学习小数比较的小学生。

#########

# 回复 #
请用平常的文字组织你的回复,你可以按照结构去进行反馈。

在这里插入图片描述

下面尝试另一种提示词,以下提示词由 GPT-4 生成:

# 一般化的浮点数比较方法

## 步骤 1: 比较整数部分
### 提取整数部分:从两个浮点数中分别提取出整数部分。
### 直接比较:
如果一个数的整数部分大于另一个数的整数部分,则该数更大。
如果一个数的整数部分小于另一个数的整数部分,则该数更小。
如果整数部分相同,则进入下一步比较小数部分。
	
## 步骤 2: 比较小数部分
### 提取小数部分:从两个浮点数中提取出小数部分(即小数点后面的数字)。
### 逐位比较:
从小数点后的第一位开始逐位比较。
### 比较对应位的小数:
如果一位小数比另一位大,则该浮点数更大。如果一位小数比另一位小,则该浮点数更小。如果对应位的小数相等,则继续比较下一位。
重复此过程,直到找到一位不同的数,或直到所有位都比较完毕。
### 处理位数不同的情况:
如果一方的小数部分比另一方短,并且已经比较过的所有位都相等,则认为更长的小数部分对应的数更大。例如,13.11和13.1100在数学上是相等的,但13.11和13.1101,后者更大。

在这里插入图片描述

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值