当前位置:   article > 正文

Prompt设计与大语言模型微调

sft阶段如何编写prompt

f3387e4166cd7bafd87ce10f9581db39.gif

本文主要介绍了Prompt设计、大语言模型SFT和LLM在手机天猫AI导购助理项目应用。

d9e94a219c41fde530eddb249b53d822.png

ChatGPT基本原理

“会说话的AI”,“智能体”

44bf433fc84d1864f787a61071441a16.png

简单概括成以下几个步骤:

  1. 预处理文本:ChatGPT的输入文本需要进行预处理。

  2. 输入编码:ChatGPT将经过预处理的文本输入到神经网络中进行编码处理,使用的是多层transformer编码器结构。

  3. 预测输出:ChatGPT通过对输入进行逐个token预测,输出下一个最可能出现的token序列,使用的是softmax函数进行概率预测。

  4. 输出解码:ChatGPT将预测的token序列作为输入,经过多层transformer解码器结构进行解码处理,最终输出模型的回答。

  5. 重复步骤3和4:ChatGPT在处理输入时会持续输出预测的token序列,直到遇到停止符号或达到最大输出长度为止。



算法内核——Transformer

由 Encoder 和 Decoder 两个部分组成

2a6d7ce4e47716a5741a243d633073dd.png

编解码动画

2afc01bfe450717bcda326c02f72886f.png

Prompt设计

  什么是prompt?

0aa3d2817754b1299041bfa8621fac38.png

看来跟我今天想分享的不太一样,加个具体的限定条件,然后呢?

9f24de2b6edaad42d06ba40df8b7ee10.png

这下对了!

Prompt的不同能直接决定模型是否能按我们的预期输出

9c717c885cd9e01b684ab2c899f956a4.png

  prompt基本技巧

1.清晰,明确,避免模糊的词语

bad case good case
产品描述不应该太短,用一些句子就行,也不用特别多用3到5个短语描述这个产品

给手机天猫写首诗

b3227382e5a414afd8534c06c0bd180f.png

给手机天猫写一首四句的古文诗,模仿李白的《早发白帝城》

144d0b0a383f8b6c599964b74c77c968.png

2.用###或者"""或者<>或者'''将指令和待处理的内容分开

bad case good case
将下面内容总结为一句话。你应该提供尽可能清晰和具体的指令来表达你想让模型做什么。这将引导模型朝着期望的输出方向发展,并减少收到无关或不正确响应的可能性。不要混淆写一个清晰的提示和写一个简短的提示。在许多情况下,更长的提示提供更多的清晰度和上下文,这可以导致更详细和相关的输出。

将下面用三个引号括起来的内容总结为一句话:

需要总结的文本是:

'''

你应该提供尽可能清晰和具体的指令来表达你想让模型做什么。这将引导模型朝着期望的输出方向发展,并减少收到无关或不正确响应的可能性。不要混淆写一个清晰的提示和写一个简短的提示。在许多情况下,更长的提示提供更多的清晰度和上下文,这可以导致更详细和相关的输出。

'''

3.指定输出格式

bad case good case

生成三个虚构书名,包括它们的作者和类型。

c080810cb584c6662d02611500ce87d1.png

生成三个虚构书名,包括它们的作者和类型。以JSON列表的格式提供,包括以下键:book_id、title、author、genre

e3a4aaccdfda2c2366b0ebcef3006d87.png

4.角色扮演,用扮演、担任等这一类词汇告诉大模型在对话中特定的人格或角色

bad casegood case

给我推销一款男士洗面奶

3bee43f8897f66476413ce2f6563ae8c.png

system:我想让你扮演一个专业的导购员。你可以充分利用你的电商知识、导购话术,生动活泼的帮顾客介绍推销商品。

user:给我推销一款男士洗面奶

df84ea5d11443c05724333a2a2bb7926.png

26c55663ade65f965ff8ae2f3b0b06b0.png

  Few shot进阶

启用上下文in-context learning学习,在prompt中提供几个样例(这里只有一个例子one-shot)

603469a8db358a7cc307235b773158f7.png

  Chain of Thought(Cot)

思维链(CoT)是一种改进的提示策略,用于提高 LLM 在复杂推理任务中的性能,如算术推理、常识推理和符号推理。

one-shotCot

model input:

Q:小明有5个球,他又买了2筐,每一筐有3个球。那么他现在总共有几个球?

A:答案是11

Q:小花有23个苹果,他们午餐用去了20个,又买了6个。那么现在还有多少个苹果?

model output:

abe969ffc50d8c14a7aad9571cd93f65.png

model input:

Q:小明有5个球,他又买了2筐,每一筐有3个球。那么他现在总共有几个球?

A:小明开始有5个球,又买了2筐球,每筐3个共6个球,合计11个球,答案是11

Q:小花有23个苹果,他们午餐用去了20个,又买了6个。那么现在还有多少个苹果?

model output:

6903fc07d17ee1afee04d804d6b8adf5.png

上面的例子很好的激发了大模型的潜能,是否有prompt技巧无能为力的问题?

答案是肯定的,一些偏实时,模型训练过程中缺乏的语料知识,它也无能为力。



  Search API & GPT

a52286ccecddb755cce1ec32f2b3d6f9.png

  1. """
  2. 网页搜索结果:
  3. {web_results}
  4. 当前日期:{current_date}
  5. 指令: 用给定的网络搜索结果,总结回复用户query
  6. 用户Query: {query}
  7. 回复语言: {reply_language}
  8. """

私有化知识库(嵌入式向量检索+LLM)

3e9282fa0d000c2ed72603984ea2b68c.png

  ReAct框架

大模型Agent功能,大模型会自己分析问题,选择合适的工具,最终解决问题。

ReAct方式的作用就是协调LLM模型和外部的信息获取,与其他功能交互。如果说LLM模型是大脑,那ReAct框架就是这个大脑的手脚和五官。

关键概念描述
Thought由LLM模型生成,是LLM产生行为和依据
ActAct是指LLM判断本次需要执行的具体行为
ObsLLM框架对于外界输入的获取。
  1. 尽可能回答以下问题,可以使用工具:
  2. {工具名和描述}
  3. 使用以下格式回答:
  4. 问题:你必须回答的问题
  5. 思考:你应该一致保持思考,思考要怎么解决问题
  6. 动作:{工具名}。每次动作只选择一个工具,工具列表{工具名和描述}
  7. 输入:{调用工具时需要传入的参数}
  8. 观察:{第三方工具返回的结果}
  9. 【思考-动作-输入-观察】循环N次
  10. 思考:最后,输出最终结果
  11. 最终结果:针对原始问题,输出最终结果
  1. 开始!
  2. 问题:上海最高楼是多少?它楼层高度的平方是多少?
  3. 思考:我需要知道上海最高楼,然后进行计算。
  4. 动作:搜索API
  5. 观察:632
  6. 思考:我需要计算上海最高楼高度的平方,然后得到结果。
  7. 动作:计算器
  8. 输入:632^2
  9. 观察:399424
  10. 思考:
  11. 最终结果:上海最高楼632米,它的高度平方是399424

42571a2f73e9c50b13942587177df124.png

大模型SFT(supervised fine tuning)

  预训练 VS 微调

预训练:模型以一种无监督的方式去训练,学习根据前文生成下一个单词。在海量数据下进行,让大模型具备语言理解和生成能力。

指令微调:有监督的方式进行学习,包括任务描述,输入等,去预测答案。目标是如何跟人类指令对齐,让模型更加适应专业化领域场景

5e301319e30a18eabdfa07170d35cc61.png

业务数据从哪来?

  1. 人工标注

  2. 种子数据 + self-instruct(gpt 3.5构造)

258a5d3ce86111ae102a71295e5dd33d.png

  P-tuning

动机:Fine-tuning需要微调整个预训练语言模型,且额外添加了新的参数,而Prompting则可以将整个预训练语言模型的参数保持固定,而只需要添加prompt来预测结果即可;

ed1b1bbf095694994a0b363673fe888d.png

P-tuning:将Prompt转换为可以学习的Embedding层,并用MLP+LSTM的方式来对Prompt Embedding进行一层处理。

P-tuning V2:每一层都加入可训练的prompts,只对Prompt部分的参数进行训练,而语言模型的参数固定不变。

  LoRA

Low-rank Adaption of LLM,利用低秩适配(low-rank adaptation)的方法,可以在使用大模型适配下游任务时只需要训练少量的参数即可达到一个很好的效果。在计算资源受限的情况下的弥补方案。

12ad1c4a75a356a3a7b3543866080d83.png

06558cffcfb32e09f79a1daa696d5a46.png

对于不同的下游任务,只需要在预训练模型基础上重新训练AB就可以了,这样也能加快大模型的训练节奏。

  LoRA VS 全参数微调

lora的优点在于轻量化,低资源。但缺点很明显,参与训练的模型参数量不多,在百万到千万级别的参数量,实验来看效果比全量微调差一些。



  C-Eval评估

C-Eval由上海交通大学,清华大学,爱丁堡大学共同完成,是构造了一个覆盖人文,社科,理工,其他专业四个大方向,52 个学科(微积分,线代 …),从中学到大学研究生以及职业考试,一共 13948 道题目的中文知识和推理型测试集。

d5ee425e98dc3826691f80163c569138.png

C-Eval认为:一个模型要强,首先需要广泛的知识,然后在知识的基础上做推理,这样才能代表一个模型可以做复杂且困难的事情。

此外,还有一些公开评测集,用于评估模型在学科综合、语言能力、推理能力等。

0f4a742313faf1f61013e6f957a027cd.png

dff114c4342c1fda2b28c5e6f6c87c96.png

手机天猫AI导购助理项目落地应用

  项目背景

“AI形象”璇玑作为个人专属导购员,在交互式对话中进行用户理解、导购商品。

定位:交互式搜索导购产品

597e8ce09ee1fcf3789f017896f4c359.png


  算法框架

e42447f71ec413674c663370fe6573dd.png

  语料收集

  1. 电商种子问题收集:端内会话日志、小红书sug收集电商领域种子问题:

  2. 问题泛化:明确场景问题定义,通过手猫核心query、种子问题等,设计prompt,通过gpt补充收集问题;

  3. 人工标注: 标注高质量语料;

  4. self-instruction:通过prompt(few-shot)方法根据已有人工标注扩充新的instruction。通过gpt获取更多训练语料,解决标注人效瓶颈。

  模型训练

base模型选型

中文评测

1971f5f744caa876a31c18200f0d47b0.png

数学评测

c6eb6e3cbaa9c62c3f1cf0f98378e8cc.png

训练平台:AOP/星云/PAI

基于达摩院模型基座qwen-14B,针对璇玑产品,新增电商领域的训练数据,增强模型的电商领域知识、安全、导购等能力。

  1. params="--stage sft \
  2. --model_name_or_path /data/oss_bucket_0/Qwen_14B_Chat_ms_v100/ \
  3. --do_train \
  4. --dataset_dir data \
  5. --dataset xuanji \
  6. --template chatml \
  7. --finetuning_type full \
  8. --output_dir file_path \
  9. --overwrite_cache \
  10. --per_device_train_batch_size 2 \
  11. --gradient_accumulation_steps 4 \
  12. --lr_scheduler_type cosine \
  13. --logging_steps 5 \
  14. --save_strategy epoch \
  15. --save_steps 10000 \
  16. --learning_rate 2e-6 \
  17. --num_train_epochs 3.0 \
  18. --warmup_ratio 0.15 \
  19. --warmup_steps 0 \
  20. --weight_decay 0.1 \
  21. --fp16 ${fp16} \
  22. --bf16 ${bf16} \
  23. --deepspeed ds_config.json \
  24. --max_source_length 4096 \
  25. --max_target_length 4096 \
  26. --use_fast_tokenizer False \
  27. --is_shuffle True \
  28. --val_size 0.0 \
  29. "
  1. pai -name pytorch112z
  2. -project algo_platform_dev
  3. -Dscript='${job_path}'
  4. -DentryFile='-m torch.distributed.launch --nnodes=${workerCount} --nproc_per_node=${node} ${entry_file}'
  5. -DuserDefinedParameters=\"${params}\"
  6. -DworkerCount=${workerCount}
  7. -Dcluster=${resource_param_config}
  8. -Dbuckets=${oss_info}${end_point}

训练中间过程

0d74ed60f09c910594b1ff513ced2d95.png

  模型部署&调用

  • 达摩院千问

模型基于allspark做量化加速,部署在dashscope平台,机器为双卡A10。

  1. # For prerequisites running the following sample
  2. import dashscope
  3. from dashscope import Generation
  4. from http import HTTPStatus
  5. dashscope.api_key = 'your-dashscope-api-key'
  6. response_generator = Generation.call(
  7. model='model_name',
  8. prompt=build_prompt([
  9. {'role':'system','content':'content_info'},
  10. {'role':'user', 'content':'query'}
  11. ]),
  12. stream=True,
  13. use_raw_prompt=True,
  14. seed=random_num
  15. )
  16. for resp in response_generator:
  17. # when stream, you need to get the result through iteration
  18. if resp.status_code == HTTPStatus.OK:
  19. print(resp.output)
  20. else:
  21. print('Failed request_id: %s, status_code: %s, \
  22. code: %s, message:%s' %
  23. (resp.request_id, resp.status_code, resp.code, resp.message))
  24. # Result:
  25. # {"text": "汝亦来", "finish_reason": "null"}
  26. # {"text": "汝亦来哉,幸会。\n\n汝可", "finish_reason": "null"}
  27. # {"text": "汝亦来哉,幸会。\n\n汝可唤我一声「百晓生", "finish_reason": "null"}
  28. # {"text": "汝亦来哉,幸会。\n\n汝可唤我一声「百晓生」,不知可否?", "finish_reason": "null"}
  29. # {"text": "汝亦来哉,幸会。\n\n汝可唤我一声「百晓生」,不知可否?", "finish_reason": "stop"}
  • Whale私有化

部署发布:

2f16647207f2dc6546a0254e09caee7d.png

模型管理:

bb7d5448188403a8f7b252d93362c4fb.png

  1. from whale import TextGeneration
  2. import json
  3. # 设置apiKey
  4. # 预发或线上请勿指定base_url
  5. TextGeneration.set_api_key("api_key", base_url="api_url")
  6. # 设置模型生成结果过程中的参数
  7. config = {"pad_token_id": 0, "bos_token_id": 1, "eos_token_id": 2, "user_token_id": 0, "assistant_token_id": 0, "max_new_tokens": 2048, "temperature": 0.95, "top_k": 5, "top_p": 0.7, "repetition_penalty": 1.1, "do_sample": False, "transformers_version": "4.29.2"}
  8. prompt = [
  9. {
  10. "role": "user",
  11. "content": "content_info"
  12. }
  13. ]
  14. # 请求模型
  15. response = TextGeneration.call(
  16. model="model_name",
  17. prompt=json.dumps(prompt),
  18. timeout=120,
  19. streaming=True,
  20. generate_config=config)
  21. # 处理流式结果
  22. for event in response:
  23. if event.status_code == 200:
  24. print(event.finished)
  25. if event.finished is False:
  26. print(event.output['response'], end="")
  27. else:
  28. print('error_code: [%d], error_message: [%s]'
  29. % (event.status_code, event.status_message))

  • EAS

借助EAS,将代码和模型文件分离进行LLM服务部署,基于http协议提供流式输出。模型存储在oss上。

  模型评测

基础能力评测:在公开评测集上评估模型中英文、推理、知识问答能力表现。

业务评测:以业务人工评测为主,每个大模型任务150个评测问题。

体验问题:埋点日志获取,定期review。

5b9e56babf198250eef67fefad687914.png

参考链接

1.https://www.semanticscholar.org/paper/Attention-is-All-you-Need-Vaswani-Shazeer/204e3073870fae3d05bcbc2f6a8e263d9b72e776

2.https://huggingface.co/Qwen/Qwen-14B-Chat

3.https://github.com/yuanzhoulvpi2017/zero_nlp

4.https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning

5.https://www.bilibili.com/video/BV1jP411d7or/?spm_id_from=333.337.search-card.all.click

6.https://arxiv.org/pdf/2305.08322v1.pdf

7.https://zhuanlan.zhihu.com/p/630111535?utm_id=0

8.https://cdn.baichuan-ai.com/paper/Baichuan2-technical-report.pdf

9.https://github.com/tatsu-lab/stanford_alpaca

0fe4b49e749fad0782049af52733153d.png

团队介绍

我们是淘天集团下FC技术部智能策略团队,主要负责手机天猫的推荐和广告算法的研发与优化工作,为用户提供更精准的推荐服务,提高用户体验和满意度。此外,团队还致力于AI技术的创新应用,如智能导购等领域,并积极探索创新性的业务实践。

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/412036
推荐阅读
相关标签
  

闽ICP备14008679号