##前情提要
想要一个电商网站的机器人客服(chatbot),但目前直接引入GPT作为客服可能会被投诉N次,因为他无法基于你的网站信息进行精准回答。
为此我调研国内(阿里/京东),国外的(欧米茄/戴森)客服小助手,发现目前市面上最成熟(...)的电商机器人应该是问答系统chatbot,这种问答系统有几个特点:
(1)主要以售后问答为主(像订单、物流、退换货等);
(2)都并没有接入GPT这类生成式对话机器人(超出了他的问题范围会提示不知道);
(3)问答推荐商品时理解困难;
(4)虽然有点笨,但是回答的准确率是很高的。
但是我们想要的是AIGC下的chatbot,为此我再次调研基于GPT这种生成式对话机器人如何能够落地实现(属于基于私域数据进行生成式对话)?发现主要有两种方案:
(1)利用openAI的fine-tune训练私域对话数据(格式要求是jsonl);
(2)利用LangChain、向量数据库(Pinecone) 和 LLM(如 GPT-4 和 ChatGPT)构建基于文 档的问答系统。
本文主要介绍第一种方案。fine-tune微调模型实现电商网站(公司内部)chatbot。
openAI产品价格表:Pricing
一、在openAI页面中构建fine-tune模型
(1)进入openAI官网,点击左侧栏的fine-tuning
(2)点击右上角 create 创建一个新的微调模型
model的分类:
Ada:Ada是一种基础模型,适合用于提示和短对话。
Babbage:Babbage是一个中等规模的模型,适合于更长的对话和创造性写作。
Curie:Curie是一个大型模型,适用于复杂的对话和生成性任务。
Davinci:Davinci是OpenAI提供的最先进的语言模型,适合处理长篇大论、技术文档和创造 性写作等。
turbo:没有找到很精确的定义,从字面理解是融合上面4种类型的新模型。
注明:下面的fine tunes是我已经创建成功的微调模型,你可以基于已有的微调模型继续加入新数据微调。
这里根据实际需求选择base model(一般肯定选最新的。。),这里我选了turbo-1106。
(3)选择训练集和验证集
Training data:对话训练集(这里我用gpt帮我想了一些对话);
{"messages": [{"role": "user", "content": "我想知道你们超市有哪些好吃的水果?"}, {"role": "assistant", "content": "我们商店冬季好吃的水果有:草莓"}]}
{"messages": [{"role": "user", "content": "我想知道你们超市有哪些草莓?"}, {"role": "assistant", "content": "目前只有丹东草莓了,亲"}]}
{"messages": [{"role": "user", "content": "你们的丹东草莓多少钱"}, {"role": "assistant", "content": "大草莓66元一斤,中草莓45元一斤"}]}
{"messages": [{"role": "user", "content": "你们超市还有哪些热带水果?"}, {"role": "assistant", "content": "还有芒果,亲"}]}
{"messages": [{"role": "user", "content": "你们超市最甜的是哪种芒果?"}, {"role": "assistant", "content": "目前可售的最甜芒果是贵妃芒"}]}
{"messages": [{"role": "user", "content": "你们超市贵妃芒怎么卖?"}, {"role": "assistant", "content": "只有中型贵妃芒,¥12.8一斤"}]}
{"messages": [{"role": "user", "content": "你们超市有什么蔬菜好吃吗?"}, {"role": "assistant", "content": "我们商店冬季好吃的蔬菜有:秋葵"}]}
{"messages": [{"role": "user", "content": "天哪我不喜欢秋葵,还有别的吗"}, {"role": "assistant", "content": "目前只有秋葵了,亲"}]}
{"messages": [{"role": "user", "content": "你们商店种类少得可怜"}, {"role": "assistant", "content": "我们主打的是零食呢,亲"}]}
{"messages": [{"role": "user", "content": "你们超市有哪些零食?"}, {"role": "assistant", "content": "我们商店热销的零食是卫龙系列,其次是坚果"}]}
{"messages": [{"role": "user", "content": "你们超市有坚果礼盒吗?"}, {"role": "assistant", "content": "目前最热销的坚果礼盒是三只松鼠新春礼盒,亲"}]}
{"messages": [{"role": "user", "content": "你们超市三只松鼠新春礼盒多少钱"}, {"role": "assistant", "content": "¥88一盒"}]}
{"messages": [{"role": "user", "content": "这些新鲜水果你们是怎么运输的?"}, {"role": "assistant", "content": "我们的新鲜水果通过空运/陆运来保证新鲜度。"}]}
{"messages": [{"role": "user", "content": "你们蔬菜的保质期是多久?"}, {"role": "assistant", "content": "这批蔬菜的保质期是7天,我们保证新鲜送达。"}]}
{"messages": [{"role": "user", "content": "你们超市的海鲜的来源地是哪里?"}, {"role": "assistant", "content": "我们的海鲜来自本地渔民或者经过严格挑选的渔场。"}]}
{"messages": [{"role": "user", "content": "QQ星这款牛奶是全脂还是脱脂的?"}, {"role": "assistant", "content": "这款牛奶是全脂牛奶,含有丰富的营养。"}]}
{"messages": [{"role": "user", "content": "你们肉类产品是怎么保存的?"}, {"role": "assistant", "content": "我们的肉类产品在低温环境下密封保存,以确保新鲜和质量。"}]}
{"messages": [{"role": "user", "content": "这个季节最适合购买哪些水果?"}, {"role": "assistant", "content": "这个季节最适合购买草莓、蓝莓和哈密瓜等水果。"}]}
{"messages": [{"role": "user", "content": "这批新鲜蔬菜有机认证吗?"}, {"role": "assistant", "content": "是的,这批蔬菜是有机认证的,不含有害农药。"}]}
{"messages": [{"role": "user", "content": "咯咯香品牌的鸡蛋是放养的吗?"}, {"role": "assistant", "content": "是的,这个品牌的鸡蛋是放养鸡产的,品质优良。"}]}
{"messages": [{"role": "user", "content": "这些冷冻海鲜可以重新冷冻吗?"}, {"role": "assistant", "content": "建议不要重新冷冻,以免影响口感和食品安全。"}]}
{"messages": [{"role": "user", "content": "这个季节你们超市最新鲜的蔬菜有哪些?"}, {"role": "assistant", "content": "这个季节最新鲜的蔬菜包括西兰花、菠菜和胡萝卜等。"}]}
validation data:对话验证集(用来验证这个微调模型的准确率,和训练集互斥)
{"messages": [{"role": "user", "content": "你们有什么好吃的水果?"}, {"role": "assistant", "content": "我们商店冬季好吃的水果有:草莓"}]}
{"messages": [{"role": "user", "content": "还有别的吗?"}, {"role": "assistant", "content": "还有葡萄"}]}
{"messages": [{"role": "user", "content": "葡萄多少钱"}, {"role": "assistant", "content": "特价¥9.9一斤"}]}
{"messages": [{"role": "user", "content": "咯咯香品牌的鸡蛋是圈养的吗?"}, {"role": "assistant", "content": "不是,是放养鸡产的。"}]}
{"messages": [{"role": "user", "content": "你们的冷冻海鲜必须马上吃掉吗?"}, {"role": "assistant", "content": "是的,直接烹饪口感更好"}]}
{"messages": [{"role": "user", "content": "这个季节不打农药的蔬菜有哪些?"}, {"role": "assistant", "content": "亲,有机蔬菜一般不含农药"}]}
选择upload new加载新文件(或者选择已有的旧文件),两个集合都选好后点击create,等待训练成功。
(4)在python中调用自己的微调模型进行机器人对话
mport gradio as gr
from openai import OpenAI
# 创建 OpenAI 客户端
client = OpenAI(
organization='org-WqmRLAjW6Ou4shDc2caPi3Qe',
api_key="你的openai中的apikey"
)
context = "现在你是客服"
# 初始上下文
def generate_response(question):
global context # 使用全局变量 context
messages = [
{"role": "system", "content": context},
{"role": "user", "content": question}
]
response = client.chat.completions.create(
model="你的微调模型名称",
messages=messages,
max_tokens=100,
temperature=0.1
)
context = response.choices[0].message.content # 将模型的回复作为下一轮对话的上下文
return context
# 创建 Gradio 接口
iface = gr.Interface(
fn=generate_response,
inputs=gr.Textbox(label="请输入你的问题:"),
outputs=gr.Textbox(label="回答:")
)
# 启动 Gradio 应用程序
iface.launch(share=True)
运行之后就可以点击端口连接在gradio中进行对话。