使用ChatGLM-6B基于Prompt封装创建应用

★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

本项目是一个使用ChatGLM-6B创建应用的Baseline,你可以fork本项目,快速根据以下逻辑建立一个根据指定提示词内容的应用。基本上傻瓜式套用即可~

1. 建立&读取模型
2. 配置辅助函数
3. 推理

例如,我希望LLM能够实现信息抽取,则需要Prompt:

请从句子里摘抄“姓名”、“电话”、“地址”三项信息,摘抄的句子是“_________________________”

则可以根据本项目提供的接口,根据用户输入的信息"13456456789王二狗百度科技园二号楼",拼接给定的Prompt,完成信息抽取。

上面这个例子是基于文心一言获得的,对于ChatGLM不合适哒

本项目偏重于示例,从实际效果来说可能不太好,参考“参考项目”,大家可以自行探索一些有趣并且有效的提示词及对话策略

本项目提供了一个菜单生成器,用于根据给定的菜品需求获取推荐菜品。如果希望构建自己的Prompt应用,简单修改Prompt模板即可!

参考项目

特别鸣谢!

PaddleNLP

PaddleNLP现在已经支持ChatGLM6B微调啦!具体参考PaddleNLP中相关内容,非常简单!

代码流程

非常简单的代码调用流程!用于简单了解整个使用过程!

环境准备

# 获取PaddleNLP
# import os
# if not os.path.exists('PaddleNLP'):
#     ! git clone https://github.com/PaddlePaddle/PaddleNLP.git
# 为了避免git失败,可以直接从压缩包获取
!unzip -oq paddlenlp.zip
# 更新环境
!cp -Rf paddlenlp /home/aistudio/.data/webide/pip/lib/python3.7/site-packages/paddlenlp
# !pip install --pre --upgrade paddlenlp -f https://www.paddlepaddle.org.cn/whl/paddlenlp.html # 安装nlp分支最新包,和上一条命令选用即可
!python -m pip install paddlepaddle-gpu==0.0.0.post112 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html --user
#  注意安装后重启内核

创建模型

import paddle
from paddlenlp.transformers import (
    ChatGLMConfig,
    ChatGLMForConditionalGeneration,
    ChatGLMTokenizer,
)

#读取原始的chatglm-6b模型
model_name_or_path = 'THUDM/chatglm-6b' # 使用该路径会自动下载和加载模型
# model_name_or_path = 'data/data217141' # 本地路径,无需下载,运行更快
tokenizer = ChatGLMTokenizer.from_pretrained(model_name_or_path)

config = ChatGLMConfig.from_pretrained(model_name_or_path)
paddle.set_default_dtype(config.paddle_dtype)

model = ChatGLMForConditionalGeneration.from_pretrained(
    model_name_or_path,
    tensor_parallel_degree=paddle.distributed.get_world_size(),
    tensor_parallel_rank=0,
    load_state_as_np=True,
    dtype=config.paddle_dtype,
)

model.eval()

对话推理

本部分从ChatGLM-6B应用测试,包括全部安装步骤,封装好了调用代码及图形界面摘抄了函数,更多封装后的函数,如多轮对话请参考原项目。

辅助函数声明

函数非常单纯,由3部分组成

  1. text转化为id
  2. 根据id进行推理
  3. 将推理后的id转化为text
# 函数定义,用于一问一答
# 输入参数:初始prompt, 最长输入长度,最长输出长度
def glm_single_QA(model,tokenizer,next_inputs,input_length,output_length):
    # 输入格式转换
    inputs = tokenizer(
        next_inputs,
        return_tensors="np",
        padding=True,
        max_length=input_length,
        truncation=True,
        truncation_side="left",
    )
    input_map = {}
    for key in inputs:
        input_map[key] = paddle.to_tensor(inputs[key])

    # 获取结果
    infer_result = model.generate(
        **input_map,
        decode_strategy="sampling",
        top_k=1,
        # top_p =5,
        max_length=output_length,
        use_cache=True,
        use_fast=True,
        use_fp16_decoding=True,
        repetition_penalty=1,
        temperature = 0.95,
        length_penalty=1,
    )[0]

    # 结果转换
    output = ''
    result = []
    for x in infer_result.tolist():
        res = tokenizer.decode(x, skip_special_tokens=True)
        res = res.strip("\n")
        result.append(res)
        output = output + res
    return output

调用

# 调用函数示例

# 要求
Q = "上海菜,口味偏咸"
# 问题模板
Q_motif = f"你是一个美食家,熟悉各地的菜品,请根据要求推荐一些菜品,你能够根据别人的需求,推荐许多符合要求的菜品。" \
           "这些菜品需要满足条件:{Q}。" \
           "请务必保证自己推荐的内容满足条件。需要满足限定条件中的每个细节。"
print("Q:"+Q_motif)
# 获取结果
result=glm_single_QA(model,tokenizer,Q_motif,2048,2048)
print("A:"+result)
Q:你是一个美食家,熟悉各地的菜品,请根据要求推荐一些菜品,你能够根据别人的需求,推荐许多符合要求的菜品。这些菜品需要满足条件:{Q}。请务必保证自己推荐的内容满足条件。需要满足限定条件中的每个细节。
A:作为一名美食家,我熟悉各地的菜品,以下是我根据你的需求推荐的一些符合要求的菜品:

1. 清炒蔬菜:清炒蔬菜是一道简单而美味的菜品,适合在任何场合食用。它需要新鲜的蔬菜和适量的油和盐。

2. 红烧肉:红烧肉是一道传统的中国菜品,它需要选用优质的猪肉,经过多道工序制作而成。它的口感鲜美,肉质酥软,肥而不腻。

3. 烤鸡翅:烤鸡翅是一道美味可口的西式菜品,它需要选用新鲜的鸡翅,加入适量的调料和油,然后直接放入烤箱中烤制。它的口感香脆,外酥里嫩。

4. 鱼香肉丝:鱼香肉丝是一道四川菜品,它需要选用优质的猪肉,切成丝,加入适量的调料和油,搅拌均匀后煮熟。它的口感鲜美,酸辣可口。

5. 宫保鸡丁:宫保鸡丁是一道湖南菜品,它需要选用优质的鸡肉,切成丁,加入适量的调料和油,搅拌均匀后煮熟。它的口感香辣可口,肉质鲜嫩。

6. 麻婆豆腐:麻婆豆腐是一道四川菜品,它需要选用优质的豆腐,切成块,加入适量的麻婆酱和油,煮熟。它的口感麻辣可口,香味浓郁。

以上是我根据你的需求推荐的一些菜品,它们符合你的条件,并且口感美味。希望你会喜欢它们!

应用部署

脚本在Gradio_packages/main_local.gradio.py中。

大家只需要修改脚本78行和87行对应内容,直接点击发布即可。

展望

GLM终于在Aistudio能轻松跑起来啦~

接下来还可以进行微调训练,拼接画画模型等~

此文章为搬运
原项目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值