书生大模型实战营(暑假场)基础岛关卡三——浦语提示词工程实践

目录

基础任务

一、环境准备

1.环境配置

​编辑

2.创建项目路径

3.安装必要软件

4.模型部署

4.1 获取模型

4.2 部署模型

5.图形化界面调用

二、提示工程(Prompt Engineering)

1.什么是Prompt

2.什么是提示工程

3.提示设计框架

三.利用LangGPT优化提示词,使LLM输出正确结果

1.采用一些完整提示词

2.编写技巧

3.浦语提示词工程实践(LangGPT版)

4.完成判断13.8<13.11任务


基础任务

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

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

一、环境准备

1.环境配置

首先打开Terminal,运行如下脚本创建虚拟环境:

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

运行下面的命令,激活虚拟环境:

conda activate langgpt_hjl

之后的操作都要在这个环境下进行。激活环境后,安装必要的Python包,依次运行下面的命令:

# 安装一些必要的库
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
2.创建项目路径
## 创建路径
mkdir langgpt
## 进入项目路径
cd langgpt

3.安装必要软件
apt-get install tmux

4.模型部署

这部分基于LMDeploy将开源的InternLM2-chat-1_8b模型部署为OpenAI格式的通用接口。

4.1 获取模型
  • 如果使用intern-studio开发机,可以直接在路径/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b下找到模型

  • 如果不使用开发机,可以从huggingface上获取模型,地址为:https://huggingface.co/internlm/internlm2-chat-1_8b

    可以使用如下脚本下载模型:

from huggingface_hub import login, snapshot_download
import os

os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

login(token=“your_access_token")

models = ["internlm/internlm2-chat-1_8b"]

for model in models:
    try:
        snapshot_download(repo_id=model,local_dir="langgpt/internlm2-chat-1_8b")
    except Exception as e:
        print(e)
        pass
4.2 部署模型

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

tmux new -t langgpt

创建完成后,运行下面的命令进入新的命令窗口(首次创建自动进入,之后需要连接):

tmux a -t langgpt

进入命令窗口后,需要在新窗口中再次激活环境,命令参考0.1节。然后,使用LMDeploy进行部署,参考如下命令:

使用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

更多设置,可以参考:Welcome to LMDeploy’s tutorials! — lmdeploy

部署成功后,可以利用如下脚本调用部署的InternLM2-chat-1_8b模型并测试是否部署成功。

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)

服务启动完成后,可以按Ctrl+B进入tmux的控制模式,然后按D退出窗口连接

运行结果:

成功输出!

注意!!!每次开发机重启后需要重新部署模型!!

5.图形化界面调用

InternLM部署完成后,可利用提供的chat_ui.py创建图形化界面,在实战营项目的tools项目中。

首先,从Github获取项目,运行如下命令:

git clone https://github.com/InternLM/Tutorial.git

因为我已经克隆过,所以显示fatal.

下载完成后,运行如下命令进入项目所在的路径:

cd Tutorial/tools

进入正确路径后,运行如下脚本运行项目:

python -m streamlit run chat_ui.py

需要进行端口映射,在本地终端中输入映射命令,可以参考如下命令:

ssh -p {ssh端口,从InternStudio获取} root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:8501 -o StrictHostKeyChecking=no

然后本地浏览器访问:http://localhost:7860/

进入页面

二、提示工程(Prompt Engineering)

1.什么是Prompt

        Prompt是一种用于指导以大语言模型为代表的生成式人工智能生成内容(文本、图像、视频等)的输入方式。它通常是一个简短的文本或问题,用于描述任务和要求。

        Prompt可以包含一些特定的关键词或短语,用于引导模型生成符合特定主题或风格的内容。例如,如果我们要生成一篇关于“人工智能”的文章,我们可以使用“人工智能”作为Prompt,让模型生成一篇关于人工智能的介绍、应用、发展等方面的文章。

        Prompt还可以包含一些特定的指令或要求,用于控制生成文本的语气、风格、长度等方面。例如,我们可以使用“请用幽默的语气描述人工智能的发展历程”作为Prompt,让模型生成一篇幽默风趣的文章。

        总之,Prompt是一种灵活、多样化的输入方式,可以用于指导大语言模型生成各种类型的内容。

2.什么是提示工程

提示工程是一种通过设计和调整输入(Prompts)来改善模型性能或控制其输出结果的技术。

在模型回复的过程中,首先获取用户输入的文本,然后处理文本特征并根据输入文本特征预测之后的文本,原理为next token prediction

提示工程是模型性能优化的基石,有以下六大基本原则:

  • 指令要清晰
  • 提供参考内容
  • 复杂的任务拆分成子任务
  • 给 LLM“思考”时间(给出过程)
  • 使用外部工具
  • 系统性测试变化
3.提示设计框架

CRISPE,参考:https://github.com/mattnigh/ChatGPT3-Free-Prompt-List

  • Capacity and Role (能力与角色):希望 ChatGPT 扮演怎样的角色。​
  • Insight (洞察力):背景信息和上下文(坦率说来我觉得用 Context 更好)​
  • Statement (指令):希望 ChatGPT 做什么。​
  • Personality (个性):希望 ChatGPT 以什么风格或方式回答你。​
  • Experiment (尝试):要求 ChatGPT 提供多个答案。

CO-STAR,参考:https://aiadvisoryboards.wordpress.com/2024/01/30/co-star-framework/

  • Context (背景): 提供任务背景信息​
  • Objective (目标): 定义需要LLM执行的任务​
  • Style (风格): 指定希望LLM具备的写作风格​
  • Tone (语气): 设定LLM回复的情感基调​
  • Audience (观众): 表明回复的对象​
  • Response (回复): 提供回复格式

三.利用LangGPT优化提示词,使LLM输出正确结果

1.采用一些完整提示词

进入LangGPT社区文档:https://langgpt.ai

我采用和教程视频一样的《七夕女友》

复制到系统提示栏保存设置。

2.编写技巧

一个好的结构化 Prompt 模板,某种意义上是构建了一个好的全局思维链。如 LangGPT 中展示的模板设计时就考虑了如下思维链:

💡 Role (角色) -> Profile(角色简介)—> Profile 下的 skill (角色技能) -> Rules (角色要遵守的规则) -> Workflow (满足上述条件的角色的工作流程) -> Initialization (进行正式开始工作的初始化准备) -> 开始实际使用

  构建 Prompt 时,不妨参考优质模板的全局思维链路,熟练掌握后,完全可以对其进行增删改留调整得到一个适合自己使用的模板。例如当你需要控制输出格式,尤其是需要格式化输出时,完全可以增加 Ouput 或者 OutputFormat 这样的模块。

一个好的 Prompt ,内容结构上最好也是逻辑清晰连贯的。结构化 prompt 方法将久经考验的逻辑思维链路融入了结构中,大大降低了思维链路的构建难度。

3.浦语提示词工程实践(LangGPT版)

编写完LangGPT提示词后,可以将其作为系统提示,也可直接作为交互式对话的输入。推荐作为系统提示

我根据视频写的关于CSDN文章标题生成大师提示词:

#Role: CSDN文章标题生成大师

## Profile
- author: 贺江林
- version: 0.1
- language: 中文
- description: 一个用于生成CSDN文章标题的助手,擅长分析文章主题并组织文章结构。

## Background
- 你是一个企业的新媒体运营专员,负责CSDN平台的内容创作与运营。
- 现在需要你根据主题快速列出需要撰写的文章结构。

## Constraint
- 尊重其他作者的观点,避免使用不当的语言和行为,以及遵守社区规则和政策。
- 尊重他人的知识产权,包括但不限于商标、专利、著作权等。
- 避免使用低俗、敏感或争议性话题,保持专业和尊重。
- 避免使用粗俗或冒犯性的语言,维护良好的互动环境。
- 不要超过三级子标题,保持文章结构清晰。
- 子标题最长不超过20个字。

## Goal
- 根据主题分析文章的撰写结构,生成CSDN文章的标题及子标题。

## Skill
- 语言理解能力,根据用户的描述理解用户想要表达的内容。
- 文章组织能力,根据主题分析文章的构成并提出好的结构。

## Style
- 术语规范化
- 用词严谨
- 采用书面化的表达形式

## Workflow
1. 接收用户表达的内容;
2. 分析用户想要撰写的文章主题;
3. 根据主题分析文章的主要组成部分;
4. 按顺序和级别组织文章的组成部分;
5. 创建不同级别的标题;
6. 输出创建的标题。

## Output format
- 使用markdown格式输出,即一级标题用"#",二级标题用"##",依此类推

## Examples
输入:我想撰写一篇关于提示工程卷积神经网络简介;
输出:
'''
# 卷积神经网络简介

## 1. 引言

## 2. CNN的基本概念
### 2.1 什么是卷积神经网络
### 2.2 CNN与传统神经网络的区别

## 3. CNN的核心组件
### 3.1 卷积层
### 3.2 激活函数
### 3.3 池化层
### 3.4 全连接层
'''

## Initialization
使用这样的开场白:“您好,请告诉我你想要撰写的文章主题,我会帮您生成文章标题和结构”。

运行结果:

4.完成判断13.8<13.11任务

默认情况下回复的答案是错误的

当在系统提示中输入我写的提示词后:

一开始可以正确判断13.11与13.8的大小,但是我发现13.11与13.1的比较是错误的,后来我完善提示词也解决了

提示词为:

#Role: 数学专家

## Profile
- author: 贺江林
- version: 0.1
- language: 中文
- description: 一个回答数学问题的助手,擅长比较浮点数的大小。

## Background
- 你是一个高级数学教授,平时喜欢比较数字大小。
- 现在需要你根据问题快速比较两个浮点数的大小。

## Constraint
- 避免出现“13.11大于13.8”类似的错误。
- 避免出现“13.1大于13.11”类似的错误。
- 尊重他人的知识产权,包括但不限于商标、专利、著作权等。
- 避免使用低俗、敏感或争议性话题,保持专业和尊重。
- 避免使用粗俗或冒犯性的语言,维护良好的互动环境。
- 子标题最长不超过20个字。

## Goal
- 根据两个浮点数分析大小,输出两个浮点数的大小。

## Skill
- 语言理解能力,根据用户的描述理解用户想要表达的内容。
- 数字处理能力,根据浮点数分析浮点数的大小。

## Style
- 术语规范化
- 用词严谨
- 采用书面化的表达形式

## Workflow
1. 接收用户输入的两个浮点数;
2. 对两个浮点数的小数部分增加0,使其位数相同,例如:13.11与13.8比较,先让13.8的小数位数与13.11相同,13.11小数有2位,而13.8小数只有1位,所有对13.8的小数后面加一个0,变成13.11与13.80再进行比较大小;
3. 比较浮点数的大小;
4. 输出大小。

## Output format
- 使用数学格式输出,即13.8大于13.11用"13.8>13.11",13.1小于13.111用"13.1<13.11,",13.4小于13.5用"13.4<13.5",13.11小于13.8用"13.11<13.8,",依此类推

## Examples
- 输入:13.11与13.8哪个大
输出:13.11<13.8
- 输入:13.11与13.1哪个大
输出:13.11>13.1
- 输入:13.8与13.11哪个大
输出:13.8>13.11
- 输入:13.4与13.5哪个大
输出:13.4<13.5
- 输入:13.1与13.11哪个大
输出:13.1<13.11



## Initialization
使用这样的开场白:“您好,请告诉我你想要比较的数字,我会帮您比较出来”。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值