Prompt设计与大语言模型微调
这是一篇非常详实的技术实践总结,涵盖了从Prompt设计、大模型微调到实际电商导购项目落地的完整链路。整篇文章信息量很大,既有理论框架,也有具体的工程经验。下面,我们就来仔细拆解一下这些内容。
ChatGPT基本原理
所谓“会说话的AI”,或者更时髦的说法“智能体”,其底层的运作逻辑可以简单概括为以下几个步骤:
- 输入到ChatGPT的文本需要先经过清洗、分词等预处理。
预处理文本:
- 经过预处理的文本被送入神经网络进行编码,这里使用的是多层Transformer编码器结构。
输入编码:
- 模型根据当前输入,逐个预测下一个最可能出现的token(词元),通过softmax函数输出概率分布。
预测输出:
- 预测出的token序列再经过多层Transformer解码器解码,最终形成模型的回答。
输出解码:
- 步骤3和4反复进行,直到遇到停止符号或达到最大输出长度为止。
迭代生成:
算法内核——Transformer
Transformer架构由Encoder和Decoder两个部分组成,这是整个系统的核心。下面两个动画直观展示了编解码过程:
<iframe allowfullscreen="" frameborder="0" src="https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3158830945987411971"></iframe>
<iframe allowfullscreen="" frameborder="0" src="https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3158831740187262988"></iframe>
Prompt设计
什么是prompt?
我们经常跟大模型说一句话,但往往发现它回得不太对。这时候加个具体的限定条件,结果就大不一样了。不同Prompt能直接决定模型是否能按预期输出——这才是关键。
prompt基本技巧
这里整理了四个非常实用的基本原则:
1. 清晰明确,避免模糊
| bad case | good case |
| 产品描述不应该太短,用一些句子就行,也不用特别多 | 用3到5个短语描述这个产品 |
| 给手机天猫写首诗 | 给手机天猫写一首四句的古文诗,模仿李白的《早发白帝城》 |
2. 用分隔符将指令和待处理内容分开
| bad case | good case |
| 将下面内容总结为一句话。你应该提供尽可能清晰和具体的指令…… | 将下面用三个引号括起来的内容总结为一句话: 需要总结的文本是: '''你应该提供尽可能清晰和具体的指令……''' |
3. 指定输出格式
| bad case | good case |
| 生成三个虚构书名,包括它们的作者和类型。 | 生成三个虚构书名,包括它们的作者和类型。以JSON列表的格式提供,包括以下键:book_id、title、author、genre |
4. 角色扮演
| bad case | good case |
| 给我推销一款男士洗面奶 | system: 我想让你扮演一个专业的导购员。你可以充分利用你的电商知识、导购话术,生动活泼地帮顾客介绍推销商品。 user: 给我推销一款男士洗面奶 |
Few shot进阶
利用上下文学习(in-context learning),在prompt中提供几个样例(比如这里只用了一个one-shot)就能显著提升模型表现。
Chain of Thought(CoT)
思维链是一种改进的提示策略,专门用于提升LLM在复杂推理任务中的表现(算术推理、常识推理、符号推理)。对比一下就很清楚:
| one-shot | Cot |
| Q:小明有5个球,他又买了2筐,每一筐有3个球。那么他现在总共有几个球? A:答案是11 Q:小花有23个苹果,他们午餐用去了20个,又买了6个。那么现在还有多少个苹果? | Q:小明有5个球,他又买了2筐,每一筐有3个球。那么他现在总共有几个球? A:小明开始有5个球,又买了2筐球,每筐3个共6个球,合计11个球,答案是11 Q:小花有23个苹果…… |
上面的例子很好地激发了模型的潜能。但Prompt技巧也不是万能的——一些实时性要求高、训练语料中缺乏的知识,它也无能为力。
Search API & GPT
为了弥补知识缺口,可以结合网络搜索:
"""
网页搜索结果:
{web_results}
当前日期:{current_date}
指令: 用给定的网络搜索结果,总结回复用户query
用户Query: {query}
回复语言: {reply_language}
"""
私有化知识库(嵌入式向量检索+LLM)
另一种方式是构建私有知识库,通过向量检索找到相关内容,再送入LLM生成回答。
ReAct框架
大模型的Agent功能里,模型会自己分析问题,选择合适的工具,最终解决问题。ReAct就像大脑的手脚和五官,协调模型与外部信息交互。
| 关键概念 | 描述 |
| Thought | 由LLM生成,是行为产生的依据 |
| Act | LLM判断本次需要执行的具体行为 |
| Obs | LLM对外界输入的获取 |
一个典型流程是这样的:
开始!
问题:上海最高楼是多少?它楼层高度的平方是多少?
思考:我需要知道上海最高楼,然后进行计算。
动作:搜索API
观察:632米
思考:我需要计算上海最高楼高度的平方,然后得到结果。
动作:计算器
输入:632^2
观察:399424
思考:最终结果:上海最高楼632米,它的高度平方是399424
大模型SFT(supervised fine tuning)
预训练 VS 微调
预训练是一种无监督方式,模型在海量数据中学习“根据前文生成下一个词”,具备语言理解和生成能力。指令微调则是有监督学习,包括任务描述、输入等,预测答案——目标是让模型与人类指令对齐,适应专业化场景。
业务数据从哪里来?主要两种途径:
- 人工标注
- 种子数据 + self-instruct(利用GPT-3.5构造)
P-tuning
Fine-tuning需要微调整个预训练模型,且额外添加新参数。而Prompting可以保持模型参数固定,只需添加prompt来预测结果。P-tuning将Prompt转换为可学习的Embedding层,并用MLP+LSTM对Prompt Embedding进行处理。P-tuning V2则在每一层都加入可训练的prompt,只训练prompt部分的参数,语言模型参数固定。
LoRA
Low-rank Adaption of LLM,利用低秩适配方法,适配下游任务时只需训练少量参数就能达到不错的效果,在计算资源受限时是很好的替代方案。不同的下游任务只需在预训练模型基础上重新训练AB矩阵,大大加速了训练节奏。
LoRA VS 全参数微调
LoRA的优点在于轻量、低资源,但缺点也很明显:训练参数量不多(百万到千万级别),实验效果比全量微调差一些。
C-Eval评估
C-Eval由上海交通大学、清华大学、爱丁堡大学共同构建,覆盖人文、社科、理工、其他专业四个方向,52个学科(微积分、线代等),从中学到大学研究生及职业考试,共13948道中文知识和推理测试题。它的理念是:一个模型要强,首先要有广泛的知识,然后在知识基础上做推理,这样才能处理复杂困难的任务。此外,还有多种公开评测集用于评估模型综合能力、语言能力、推理能力等。
手机天猫AI导购助理项目落地应用
项目背景
“AI形象”璇玑作为个人专属导购员,在交互式对话中理解用户需求、导购商品。产品定位是交互式搜索导购。
算法框架

语料收集
- 从端内会话日志和手机天猫sug种子问题中获取。
电商种子问题收集:
- 明确场景问题定义,通过手猫核心query、种子问题等设计prompt,利用GPT补充收集问题。
问题泛化:
- 标注高质量语料。
人工标注:
- 通过prompt(few-shot)方法,根据人工标注扩充新的instruction,用GPT获取更多训练语料,解决人效瓶颈。
self-instruction:
模型训练
基础模型选型参考了中文评测和数学评测。训练平台采用AOP/星云/PAI。基于达摩院模型基座qwen-14B,针对璇玑产品新增电商领域训练数据,增强电商知识、安全、导购等能力。
params="--stage sft --model_name_or_path /data/oss_bucket_0/Qwen_14B_Chat_ms_v100/ --do_train --dataset_dir data --dataset xuanji --template chatml --finetuning_type full --output_dir file_path --overwrite_cache --per_device_train_batch_size 2 --gradient_accumulation_steps 4 --lr_scheduler_type cosine --logging_steps 5 --sa ve_strategy epoch --sa ve_steps 10000 --learning_rate 2e-6 --num_train_epochs 3.0 --warmup_ratio 0.15 --warmup_steps 0 --weight_decay 0.1 --fp16 ${fp16} --bf16 ${bf16} --deepspeed ds_config.json --max_source_length 4096 --max_target_length 4096 --use_fast_tokenizer False --is_shuffle True --val_size 0.0 "
pai -name pytorch112 -zproject algo_platform_dev -Dscript='${job_path}' -DentryFile='-m torch.distributed.launch --nnodes=${workerCount} --nproc_per_node=${node}${entry_file}' -DuserDefinedParameters="${params}" -DworkerCount=${workerCount} -Dcluster=${resource_param_config} -Dbuckets=${oss_info}${end_point}
训练中间过程如图。
模型部署&调用
- 基于allspark做量化加速,部署在dashscope平台,机器为双卡A10。
达摩院千问:
import dashscope
from dashscope import Generation
from http import HTTPStatus
dashscope.api_key = 'your-dashscope-api-key'
response_generator = Generation.call(
model='model_name',
prompt=build_prompt([{'role':'system','content':'content_info'},{'role':'user', 'content':'query'}]),
stream=True, use_raw_prompt=True, seed=random_num
)
for resp in response_generator:
if resp.status_code == HTTPStatus.OK:
print(resp.output)
else:
print('Failed request_id: %s, status_code: %s, code: %s, message:%s' % (resp.request_id, resp.status_code, resp.code, resp.message))
- 部署发布与模型管理如代码所示。
Whale私有化:
from whale import TextGeneration
import json
TextGeneration.set_api_key("api_key", base_url="api_url")
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"}
prompt = [{"role": "user", "content": "content_info"}]
response = TextGeneration.call(model="model_name", prompt=json.dumps(prompt), timeout=120, streaming=True, generate_config=config)
for event in response:
if event.status_code == 200:
print(event.finished)
if event.finished is False:
print(event.output['response'], end="")
else:
print('error_code: [%d], error_message: [%s]' % (event.status_code, event.status_message))
- 借助EAS,代码和模型文件分离进行LLM服务部署,基于HTTP协议提供流式输出,模型存储在OSS上。
EAS:
模型评测
- 在公开评测集上评估模型中英文、推理、知识问答能力。
基础能力评测:
- 以人工评测为主,每个大模型任务150个评测问题。
业务评测:
- 通过埋点日志获取,定期review。
体验问题:
参考链接
1. Attention is All you Need
2. Qwen-14B-Chat
3. zero_nlp
4. ChatGLM-6B ptuning
5. B站视频
6. arXiv 2305.08322
7. 知乎文章
8. Baichuan2技术报告
9. Stanford Alpaca
团队介绍
我们是淘天集团下FC技术部智能策略团队,主要负责手机天猫的推荐和广告算法的研发与优化工作,为用户提供更精准的推荐服务,提高用户体验和满意度。此外,团队还致力于AI技术的创新应用,如智能导购等领域,并积极探索创新性的业务实践。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名