介绍
聊天机器人或数字助理是旨在通过互联网以文本或语音聊天的形式模拟与人类对话的应用程序。多年来,聊天机器人的发展进展迅速,从简单的基于逻辑的机器人到现在基于自然语言理解(NLU)的机器人。
关于后者,用于构建此类聊天机器人的一些最常用框架或库是RASA、Dialogflow和Amazon Lex,仅举几例。这些框架可以应用自然语言处理(NLP)和NLU来处理输入文本,对意图进行分类,并触发正确的操作来生成响应。
随着大型语言模型(LLM)的出现,我们可以使用这些模型直接构建功能齐全的聊天机器人。这种LLM的一个著名例子是OpenAI的生成预训练模型 (GPT-3),它可以通过微调与模型的对话或对话数据来生成类似人类的文本。此功能使其成为构建自定义聊天机器人的合适选择,本文将探讨微调GPT-3模型以构建简单的会话聊天机器人所涉及的过程。
通常,我们希望在会话示例的数据集上对模型进行微调,例如来自客户服务交互的文本、聊天日志或电影的几个场景。微调过程调整模型的参数以更好地适应会话数据,使聊天机器人更善于理解和回复用户输入。
为了对GPT-3进行微调,我们可以使用来自HuggingFace的Transformers库,它为微调提供了预训练的模型和工具。该库提供了几种不同大小和功能的GPT-3模型。模型越大,它能处理的数据就越多,也可能越准确。但是,为了简单起见,我们将使用OpenAI接口并编写很少的代码行来实现此功能。
在本文中,我们将使用OpenAI GPT-3构建一个采访数字助理。
访问OpenAI
创建帐户非常简单,可以使用此链接完成。但是,我们感兴趣的是获得API密钥以允许我们访问OpenAI上的模型。因此,您可以按照以下步骤获取API密钥:
- 登录你的账户
- 转到页面的右上角,点击你的账户名,你会看到一个下拉菜单,然后点击“查看API密钥”
- 点击“创建新密钥”。确保您立即复制生成的密钥并将其保存在一个安全文件中(我们稍后将需要它),否则您将无法再次查看它。
准备数据
既然我们已经完成了帐户和API密钥的创建,那么让我们开始准备将用于对模型进行微调的数据。我们从Github存储库中收集数据集,主要包含采访问题和答案。
第一步是在我们的项目中安装OpenAI库:
pip install OpenAI
安装完成后,我们就可以加载数据了:
import os
import json
import openai
import pandas as pd
from dotenv import load_dotenv
load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_KEY')
openai.api_key = os.getenv('OPENAI_KEY')
data = pd.read_csv('data/data.csv')
new_df = pd.DataFrame({'Interview AI': data['Text'].iloc[::2].values, 'Human': data['Text'].iloc[1::2].values})
print(new_df.head(5))
我们将问题加载到访谈AI栏,将相应的答案加载到数据框中的Human栏。我们还创建了一个环境变量.env文件来保存openai_api_key。
接下来,我们将数据转换为GPT-3可接受的标准。根据文档,重要的是要确保数据是JSONL格式,有两个关键字:prompt和completion。
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
因此,我们重新构造数据集以适应这种设计,在这种设计中,我们基本上循环遍历数据框中的每一行,并将Human text分配给prompt,将Interview text分配给completion。
output = []
for index, row in new_df.iterrows():
print(row)
completion = ''
line = {'prompt': row['Human'], 'completion': row['Interview AI']}
output.append(line)
print(output)
with open('data/data.jsonl', 'w') as outfile:
for i in output:
json.dump(i, outfile)
outfile.write('\n')
然后我们需要使用prepare_dataccommand,但它会在提示符处询问一些问题,我们可以提供Y或N响应。
os.system("openai tools fine_tunes.prepare_data -f 'data/data.jsonl' ")
最后,一个名为data_prepared的文件。json文件被转储到该目录中。
模型微调
要对模型进行微调,我们需要运行一行命令:
os.system("openai api fine_tunes.create -t 'data/data_prepared.jsonl' -m davinci ")
这基本上是使用准备好的数据来训练来自OpenAI的davinci模型,微调后的模型将存储在用户配置文件下,可以在模型下的右侧面板中找到。
与模型交互
我们可以使用不同的方法与模型进行对话。我们可以直接从Python脚本、OpenAI Playground中与模型对话,或者使用Flask或FastAPI等框架围绕模型构建web服务。
在这个实验中,我们将构建一个简单的函数来与模型交互。
def generate_response(input_text):
response = openai.Completion.create(
engine="davinci:ft-personal-2023-01-25-19-20-17",
prompt="The following is a conversation with DSA an AI assistant. "
"DSA is an interview bot who is very helpful and knowledgeable in data structure and algorithms.\n\n"
"Human: Hello, who are you?\n"
"DSA: I am DSA, an interview digital assistant. How can I help you today?\n"
"Human: {}\nDSA:".format(input_text),
temperature=0.9,
max_tokens=150,
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.6,
stop=["\n", " Human:", " DSA:"]
)
return response.choices[0].text.strip()
output = generate_response(input_text)
print(output)
整合在一起
import os
import json
import openai
import pandas as pd
from dotenv import load_dotenv
load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_KEY')
openai.api_key = os.getenv('OPENAI_KEY')
data = pd.read_csv('data/data.csv')
new_df = pd.DataFrame({'Interview AI': data['Text'].iloc[::2].values, 'Human': data['Text'].iloc[1::2].values})
print(new_df.head(5))
output = []
for index, row in new_df.iterrows():
print(row)
completion = ''
line = {'prompt': row['Human'], 'completion': row['Interview AI']}
output.append(line)
print(output)
with open('data/data.jsonl', 'w') as outfile:
for i in output:
json.dump(i, outfile)
outfile.write('\n')
os.system("openai tools fine_tunes.prepare_data -f 'data/data.jsonl' ")
os.system("openai api fine_tunes.create -t 'data/data_prepared.jsonl' -m davinci ")
def generate_response(input_text):
response = openai.Completion.create(
engine="davinci:ft-personal-2023-01-25-19-20-17",
prompt="The following is a conversation with DSA an AI assistant. "
"DSA is an interview bot who is very helpful and knowledgeable in data structure and algorithms.\n\n"
"Human: Hello, who are you?\n"
"DSA: I am DSA, an interview digital assistant. How can I help you today?\n"
"Human: {}\nDSA:".format(input_text),
temperature=0.9,
max_tokens=150,
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.6,
stop=["\n", " Human:", " DSA:"]
)
return response.choices[0].text.strip()
示例应答:
input_text = "what is breadth first search algorithm"
output = generate_response(input_text)
The breadth-first search (BFS) is an algorithm for discovering all the
reachable nodes from a starting point in a computer network graph or tree data
structure
结论
GPT-3是一个强大的大型语言生成模型,可以对其进行微调以构建自定义聊天机器人。微调过程调整模型的参数以更好地适应会话数据,使聊天机器人更善于理解和响应用户输入。经过微调的模型可以集成到聊天机器人平台中,以处理用户交互,并为聊天机器人与用户交互生成类似人类的文本。