• 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技术 | 终端技术 | 音视频技术

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

  • 相关阅读:
    K8S 在docker上部署 Selenium Grid (最新版)
    【ODX介绍】-5-用于Flash刷写的ODX-F文件概述
    vue项目类微信聊天页面,输入法弹出,ios的标题会整体上移问题
    在CentOS7中,安装并配置Redis【个人笔记】
    6.14-IPv6 6.15-IPv4与IPv6网络通信 6.16-路由
    Spring Security(七) ——跨域配置
    Java接口
    金仓数据库KingbaseES客户端编程接口指南-JDBC(8. JDBC 元数据处理)
    SpringMVC框架中注解的详细介绍
    计算机系统基础实验——数据的机器级表示(条件表达式 x?y:z)
  • 原文地址:https://blog.csdn.net/Taobaojishu/article/details/134046689