【AI最佳实践导读】咱们好,我是一个拥有8年经历的全栈开发者。我在这个行业中度过了许多精彩的时刻,从我的第一份作业,到在第二家公司度过的近6年的时刻,再到我决议成为一名独立开发者,每一步都充满了挑战和收成。现在,我首要从事长途项目开发,并正在研究AI领域的技能,同时也在运营自己的自媒体渠道。

在我的职业生涯中,我有幸参加了许多令人兴奋的项目,其间一些涉及到最前沿的技能,如人工智能和机器学习。这些项目不只让我有机会深化了解这些技能,也让我看到了它们在解决实际问题中的巨大潜力。

今日,我想和咱们共享一个项目:运用ChatGLM-6B模型和PaddleNLP完结人物扮演功用。这是一个十分有趣的项目,它让我有机会深化研究这些先进的AI技能,并看到它们在测验中的效果。

在这个教程中,我将向你们展示怎么在BML CodeLab上运转这个项目,包含怎么设置环境,怎么编写代码。我期望这个教程能对你们有所协助,无论你是一个有经历的开发者,仍是一个对AI技能感兴趣的初学者。

什么是ChatGLM-6B

“ChatGLM-6B”是OpenAI的一个特定版别的ChatGLM模型,开源的、支撑中英双语的对话言语模型,其间的”6B”表明该模型有60亿(6 billion)的参数。参数的数量通常是衡量一个神经网络模型杂乱性和处理能力的一个重要目标。一般来说,参数越多,模型的处理能力越强,但同时也需求更多的核算资源来练习和运转。

这个模型是在大量的文本数据上练习的,包含书籍、网页和其他类型的文本。经过这种练习,模型学习到了怎么了解和生成自然言语。在对话任务中,ChatGLM-6B能够依据给定的对话前史生成连贯的回复。

需求注意的是,虽然ChatGLM-6B是一个强壮的模型,但它并不完美。因为 ChatGLM-6B 的规划较小,它或许会生成不精确或许不相关的回复,也或许不了解一些杂乱的问题。此外,它也不能了解或生成超出其练习数据范围的信息。例如,它不能了解或生成在其练习数据收集结束后产生的事件或信息。

基于ChatGLM-6B模型 + prompt完结人物扮演功用,几句话调教一个专属谈天机器人,几行代码完结谈天机器人运用建立!

本项目的技能根底是 ChatGLM 和 Prompt。ChatGLM 能够让机器像人类相同进行对话。Prompt 则是一种预设的对话模板,能够协助机器生成愈加精确和流畅的答复。经过结合这两种技能,项目能够供给高度自然和精确的沟通体会。

环境设置

在开端编写代码之前,咱们需求保证咱们的开发环境已经准备就绪。因为咱们将在BML CodeLab上运转这个项目,咱们需求装置最新版别的Paddle和PaddleNLP。

import paddle
print(paddle.version.cuda())
from IPython.display import clear_output
!unzip paddlenlp.zip
!cp -Rf paddlenlp /home/aistudio/.data/webide/pip/lib/python3.7/site-packages/paddlenlp
# !python -m pip install paddlepaddle-gpu==0.0.0.post112 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html 
#  注意装置后重启内核
# 下次重启该项目后,或许要再装置paddlepaddle-gpu==0.0.0.post112,或许加 --user 防止下次再装置
!python -m pip install paddlepaddle-gpu==0.0.0.post112 -f https://www.paddlepaddle.org.cn/whl/linux/gpu/develop.html --user
clear_output()
print('装置结束,注意重启内核')

读取模型

import warnings
warnings.filterwarnings("ignore")
import paddle
from paddlenlp.transformers import (
    ChatGLMConfig,
    ChatGLMForConditionalGeneration,
    ChatGLMTokenizer,
)
from predict_convert import convert_example_neko,convert_example, get_response
#读取原始的chatglm-6b模型
model_name_or_path = 'data/data217141'
# model_name_or_path = 'THUDM/glm-515m'
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()

功用规划

问答和前史对话规划

正如前面说到,GLM是个填词模型,对话经过填空完结。故参阅了官方的测验代码,用 ‘问:’、‘答:’分别表明用户和体系回复的开端,用 [Round x] 表明轮次来记录前史对话。

经过预载入对话前史(prompt表明),完结模型依据对话填充‘答:’后面的内容

最终变成经过prompt来完结人物设定,利用ChatGLM的填词功用来填充人物对话

在 history = [(‘xxxx’),(‘xx’)] 处修正

括号内前面是用户说,后面是体系答。修正和规划对话前史,让模型顺着前文更好地答复

import os
from IPython.display import clear_output as clear
import json
input_length=2048 # max input length
output_length=160 # max output length
start = 0
history = ''
# 括号内前面是用户说,后面是体系答。修正和规划对话前史,让模型顺着前文更好地答复
history = [('你是一只会说话、会建立神经网络、精通python的猫猫,能够自由答复问题,像人类相同思考和表达。现在你与我对话时每一句话后面都要加上喵,并加上表情。”。','好的主人喵~'),
('你是?','我是猫猫啊,喵~')]
auto_query=''
example = {'user_input':'' , 'sys_output':'' ,'history':history}
# # 载入对话前史
# example = np.load('history_chat.npy',allow_pickle=True).tolist()
# example['user_input']=''
print(convert_example(example, tokenizer, get_query=False))
while(1):
    user_input = input()
    if(user_input==''):
        user_input = auto_query
    if(user_input== '1'):
        print('-----\n》》退出')
        break
    if(user_input== '2'):
        # prompt = convert_example_neko(example, tokenizer, get_query=True)
        prompt = convert_example(example, tokenizer, get_query=True)
        auto_query = get_response(prompt, model, tokenizer, input_length, output_length,print_prompt=False,rand= True)
        print('-----\n》》是否方案回复(是则直接回车,否则不用管):'+auto_query)
        continue
    if(user_input== '0'):
        user_input_pre = example['history'][-1][0]
        example['history'].pop()
        # prompt = convert_example_neko(example, tokenizer, get_query=False)
        prompt = convert_example(example, tokenizer, get_query=False)
        os.system('cls' if os.name == 'nt' else 'clear')
        clear()
        response = get_response(prompt, model, tokenizer, input_length, output_length,print_prompt=True,rand= True)
        print(response)
        example['history'].append((user_input_pre,response))
        print('-----\n》》直接输入进行回复;或许扣1退出;扣2提示一个回复例子;扣9保存对话前史;扣0换一个体系答复;')
        continue
    if(user_input== '3'):
        user_input = '你是谁?咱们方才谈了什么?'
    if(user_input== '9'):
        import numpy as np
        np.save('history_chat',example)
        print('对话已保存history_chat.npy')
        continue
    os.system('cls' if os.name == 'nt' else 'clear')
    clear()
    example['user_input'] = user_input
    # prompt = convert_example_neko(example, tokenizer, get_query=False)
    prompt = convert_example(example, tokenizer, get_query=False)
    res = get_response(prompt, model, tokenizer, input_length, output_length,print_prompt=True,rand= False)
    example['sys_output'] = res
    example['history'].append((user_input,res))
    print(res)
    # 遗忘
    while(len(convert_example(example, tokenizer, get_query=False)) +16 >= input_length):
        example['history'] = example['history'][1:]
    print('-----\n》》直接输入进行回复;或许扣1退出;扣2提示一个回复例子;扣9保存对话前史;扣0换一个体系答复;')

人物模板规划 经过prompt来完结人物扮演功用

prompt.json 能够参阅****awesome-chatgpt-prompts 假如不想自己下载能够联系我共享

with open('prompt.json', 'r') as file:
    content = file.read()
prompts = json.loads(content)
outs = []
for i in range(len(prompts)):
    outs.append(str(i) +' ' + prompts[i]['act'] + '\n')
print(''.join(outs))
print('》》输入对应的数字检查模板;')
user_input = input()
try:
    clear()
    prompt = prompts[int(user_input)]['prompt']
    print(prompt)
except:
    None
res = get_response(prompt, model=model, tokenizer=tokenizer, input_length=1024, output_length=160,print_prompt=False)
print(res)

这仅仅一个根本的示例,你能够依据自己的需求对其进行修正。例如,你能够创立更多的人物,或许为模型生成的文本添加更多的上下文信息。

如何使用ChatGLM-6B模型和PaddleNLP实现角色扮演功能:一个全栈开发者的实战经验分享

如何使用ChatGLM-6B模型和PaddleNLP实现角色扮演功能:一个全栈开发者的实战经验分享

如何使用ChatGLM-6B模型和PaddleNLP实现角色扮演功能:一个全栈开发者的实战经验分享

小技巧

怎么防止内容识别为AI生成的?

  1. 个性化和情感染:AI生成的内容通常较为客观和中立,缺乏个性化和情感染的元素。在内容中参加一些个人观点、情感颜色或许个人经历等元素,能够使内容更具人性化,然后下降被识别为AI生成的或许性。

  2. 运用非标准言语和俚语:AI通常在生成内容时会遵从标准言语规矩,而人类在沟通时往往会运用一些非标准言语、俚语或许地方方言。在内容中恰当运用这些非标准言语和俚语,能够使内容更具人性化。

  3. 防止运用模板:AI生成的内容往往有必定的模板化倾向,假如你的内容中有大量重复的模式或许结构,或许会被识别为AI生成。尽量防止运用固定的模板,让内容更具变化和创新性。

  4. 参加错误和不完美:人类在写作时往往会有一些小错误或许不完美,而AI生成的内容通常会十分完美,没有任何错误。恰当地在内容中参加一些小错误或许不完美,能够使内容更具人性化。

  5. 结合实际情况:AI在生成内容时,往往无法考虑到所有的实际情况和细节。在内容中参加一些详细的实际情况和细节,能够使内容更具真实感。

怎么防止生成重复的内容?

  1. 运用唯一标识符:在生成内容时,能够为每个内容块分配一个唯一的标识符。然后在生成新的内容块时,检查其是否与已有的标识符重复。这种办法需求一个机制来跟踪和存储已生成的内容。

  2. 运用检查点:在生成内容的过程中,定期保存检查点。然后在生成新的内容时,从最近的检查点开端,而不是从头开端。这能够防止生成完全相同的内容。

  3. 运用不同的输入:假如你的AI模型是基于输入生成内容的,那么能够测验供给不同的输入,以生成不同的内容。例如,你能够改动输入的顺序,或许添加一些随机性。

  4. 运用多样性参数:一些AI模型答应你设置一个多样性参数,这能够影响生成内容的多样性。经过增加多样性参数,你能够使生成的内容愈加多样化,然后削减重复。

  5. 后处理:在生成内容后,能够运用一些后处理步骤来检测和删除重复的内容。例如,你能够运用一些文本类似度衡量来检测重复的内容,然后删除它们。

怎么将上下文导入给模型?

  1. 直接输入:对于一些模型,比如GPT-3,你能够直接将上下文信息作为输入供给给模型。例如,假如你想让模型生成一个故事的续篇,你能够将故事的前半部分作为输入供给给模型。

  2. 编码上下文:对于一些模型,你或许需求将上下文信息编码为模型能够了解的形式。例如,你能够将上下文信息编码为一个向量,然后将这个向量作为模型的输入。

  3. 运用上下文感知的模型:一些模型,如Transformer模型,具有内置的机制来处理上下文信息。这些模型能够处理一系列的输入,并在生成每个输出时考虑到所有从前的输入。

  4. 运用回忆网络:回忆网络是一种特别的神经网络,它能够在处理序列数据时保存从前的信息。这使得它们十分合适处理需求上下文信息的任务。

以上仅仅一些根本的办法,详细的完结或许需求依据你的详细情况和需求进行调整。