目录
基础任务
-
背景问题:近期相关研究发现,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
使用这样的开场白:“您好,请告诉我你想要比较的数字,我会帮您比较出来”。