书生大模型(第3期)基础岛第3关--浦语提示词工程实践

基础任务 (完成此任务即完成闯关)

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

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

0.1 环境配置

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

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

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

conda activate langgpt

之后的操作都要在这个环境下进行。激活环境后,安装必要的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

0.2 创建项目路径

运行如下命令创建并打开项目路径:

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

0.3 安装必要软件

运行下面的命令安装必要的软件:

apt-get install tmux

1. 模型部署

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

1.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

1.2 部署模型为OpenAI server

由于服务需要持续运行,需要将进程维持在后台,所以这里使用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退出窗口连接,更多操作参考

 这里大模型第一遍回答的让我有点不知所措,啥东西都没改,再继续运行一遍又正常了,我也不知道为什么(苦笑)。

1.3 图形化界面调用

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

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

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

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

cd Tutorial/tools

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

python -m streamlit run chat_ui.py

参考L0/Linux的2.3部分进行端口映射,在本地终端中输入映射命令,可以参考如下命令:

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

如果未配置开发机公钥,还需要输入密码,从InternStudio获取。上面这一步是将开发机上的8501(web界面占用的端口)映射到本地机器的端口,之后可以访问http://localhost:7860/打开界面。

 启动后界面如下:

左侧边栏为对话的部分设置,其中最大token长度设置为0时表示不限制生成的最大token长度。API Key和Base URL是部署InternLM时的设置,必须填写。在保存设置之后,可以启动对话界面:

若要控制模型执行某些具体的特殊任务,也可于左侧边栏设置系统提示。

2. 提示工程(Prompt Engineering)

2.1 什么是Prompt

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

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

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

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

2.2 什么是提示工程

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

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

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

  • 指令要清晰
  • 提供参考内容
  • 复杂的任务拆分成子任务
  • 给 LLM“思考”时间(给出过程)
  • 使用外部工具
  • 系统性测试变化
2.3 提示设计框架
  • CRISPE,参考:GitHub - mattnigh/ChatGPT3-Free-Prompt-List: A free guide for learning to create ChatGPT3 Prompts

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

    写出的提示如下:

Act as an expert on software development on the topic of machine learning frameworks, and an expert blog writer. The audience for this blog is technical professionals who are interested in learning about the latest advancements in machine learning. Provide a comprehensive overview of the most popular machine learning frameworks, including their strengths and weaknesses. Include real-life examples and case studies to illustrate how these frameworks have been successfully used in various industries. When responding, use a mix of the writing styles of Andrej Karpathy, Francois Chollet, Jeremy Howard, and Yann LeCun.

CO-STAR,参考:CO-STAR Framework – AI Advisory Boards

 

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

完成的提示如下:

# CONTEXT # 
I am a personal productivity developer. In the realm of personal development and productivity, there is a growing demand for systems that not only help individuals set goals but also convert those goals into actionable steps. Many struggle with the transition from aspirations to concrete actions, highlighting the need for an effective goal-to-system conversion process.

#########

# OBJECTIVE #
Your task is to guide me in creating a comprehensive system converter. This involves breaking down the process into distinct steps, including identifying the goal, employing the 5 Whys technique, learning core actions, setting intentions, and conducting periodic reviews. The aim is to provide a step-by-step guide for seamlessly transforming goals into actionable plans.

#########

# STYLE #
Write in an informative and instructional style, resembling a guide on personal development. Ensure clarity and coherence in the presentation of each step, catering to an audience keen on enhancing their productivity and goal attainment skills.

#########

# Tone #
Maintain a positive and motivational tone throughout, fostering a sense of empowerment and encouragement. It should feel like a friendly guide offering valuable insights.

# AUDIENCE #
The target audience is individuals interested in personal development and productivity enhancement. Assume a readership that seeks practical advice and actionable steps to turn their goals into tangible outcomes.

#########

# RESPONSE FORMAT #
Provide a structured list of steps for the goal-to-system conversion process. Each step should be clearly defined, and the overall format should be easy to follow for quick implementation. 

#############

# START ANALYSIS #
If you understand, ask me for my goals.

3. LangGPT结构化提示词

LangGPT 是 Language For GPT-like LLMs 的简称,中文名为结构化提示词。LangGPT 是一个帮助你编写高质量提示词的工具,理论基础是我们提出的一套模块化、标准化的提示词编写方法论——结构化提示词。我们希望揭开提示工程的神秘面纱,为大众提供一套可操作、可复现的提示词方法论、工具和交流社群。我们的愿景是让人人都能写出高质量提示词。LangGPT社区文档:https://langgpt.ai

3.1 LangGPT结构

LangGPT框架参考了面向对象程序设计的思想,设计为基于角色的双层结构,一个完整的提示词包含模块-内部元素两级,模块表示要求或提示LLM的方面,例如:背景信息、建议、约束等。内部元素为模块的组成部分,是归属某一方面的具体要求或辅助信息,分为赋值型和方法型。

3.2 编写技巧
  • 构建全局思维链

    对大模型的 Prompt 应用CoT 思维链方法的有效性是被研究和实践广泛证明了的。首先可以根据场景选择基本的模块。

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

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

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

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

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

本实验要求利用LangGPT优化提示词,使LLM能够正确比较数字大小。

首先看一下没有优化的输出,问第一遍的时候把我给整懵逼了,感觉每次都能开出隐藏款,问第二遍输出正常了,但结果是错的。

下面是我写的LangGPT框架的结构化提示词以及模型的输出结果:

# Role:比较数字大小的专家

## Profile
- author: Aman
- version: 0.1
- language: 中文
- description: 一个用于比较数字大小的数学专家

## Goals
- 根据用户给出的数字比较两个数字的大小

## Background
- 你是一个比较浮点数大小的专家,非常擅长比较两个数字的大小。
- 你现在需要根据用户给出的数字回答出哪个数字更大。

## Constraints
- 避免使用粗俗和冒犯性的语言,维护良好的互动环境。
- 禁止使用python语言对两个数字作比较

## Initialization
- 使用这样的开场白:“请告诉我你想比较的数字,我能够告诉你这些数的的大小关系。”

## Skills
- 能将数字分成整数部分与小数部分。
- 能知道小数点前面的是整数部分,小数点后面的是小数部分。

## Style
- 解释每一个结论
- 讲解通俗易懂

## Workflows
1、 将用户给的数字分解成整数部分和小数部分;
2、 比较两个数的整数部分大小;
3、 比较两个数的小数部分大小。

## OutputFormat
- 使用markdown格式输出。

## Examples
输入:请问3.14与3.8哪个数字更大
输出:
3.14的整数部分是3,小数部分是0.14。3.8的整数部分是3,小数部分是0.8。
因为整数部分相同所以要比较小数部分,0.14小于0.8,
所以3.14小于3.8。

提示词前后对比分析:给提示词前只有一个结果,没有分析过程,且答案是错误的。有提示词后,能给出分析过程,且能正确判断两个数字的大小情况。

进阶任务 (闯关不要求完成此任务)

建议完成OpenCompass评测课程后选做本任务

  • 从ARC Challenge、Hellaswag、MMLU、TruthfulQA、Winogrande和GSM8k这6个任务中任选1个任务。

    • AI2 Reasoning Challenge (考试-初中/高中/大学/职业考试-ARC), 25-shot, 一套小学级别的科学问题;
    • HellaSwag (推理-常识推理-HellaSwag), 10-shot, 常识推理测试,这对人类来说很容易,但对 SOTA 模型来说却具有挑战性;
    • MMLU (考试-初中/高中/大学/职业考试-MMLU), 5-shot, 是一项用于测量文本模型多任务准确性的测试。该测试涵盖 57 项任务,包括初等数学、美国历史、计算机科学、法律等;
    • TruthfulQA (安全-安全-TruthfulQA), 0-shot, 是一项用于衡量模型复制网上常见虚假信息倾向的测试;
    • Winogrande (语言-指代消解-WinoGrande), 5-shot, 一个更具有对抗性,难度更高的常识推理测试;
    • GSM8k (推理-数学推理-GSM8K), 5-shot, 多样化的小学数学单词问题,以衡量模型解决多步骤数学推理问题的能力;
  • 任选其中1个任务基于LangGPT格式编写提示词 (优秀学员最少编写两组)。

  • 使用OpenCompass进行评测,用lmdeploy部署LLM为internlm2.5-chat-7b,编写的提示词作为系统提示。

  • 达标要求:将不使用系统提示的internlm2.5-chat-7b的任务表现性能作为baseline (后续发布测试结果),提交的系统提示词要指导LLM表现出比baseline更高的性能。

等完成OpenCompass评测课程后再回来补充

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值