游戏中接入ChatGPT当游戏客服
这周折腾了一周的ChatGPT。
这是最终成果:
需求
我们的需求是让ChatGPT当游戏中的智能客服,用户可以和这个智能客服聊有关游戏中的问题,用户也能把这个智能客服当成一个情感树洞。
在这个需求中,接入ChatGPT进行对话并不难,调调API就完事儿了。难点是在于让ChatGPT知道游戏中的内容,并且回答。
微调
我发现微调的模型里并没有ChatGPT 3.5 Turbo,提供了一些基础模型,经过我尝试,发现如果数据集很少或是没有时,微调后的模型并不能对话,会说一堆乱七八糟的词。可能是因为GPT-3 对来自开放互联网的大量文本进行了预训练,而提供的模型没有经过预训练。
最后得出结论:数据集不够是不能让自己训练的模型向ChatGPT一样智能回答问题的,所以不适用我们的需求。
嵌入
关于嵌入,嵌入是将单词和短语表示为向量的一种方式。它们可以用于各种任务,包括语义搜索、异常检测和分类。说白了就是相似单词或句子计算出的嵌入向量的相似度会高于不相似的。
关于嵌入向量的理解,可以参考这个视频:5. OpenAI Embeddings API - Searching Financial Documents - YouTube
视频里小哥的文档:Word Embeddings.ipynb - Colaboratory (google.com)
根据这篇文章给出的提示,可以得出这样一个结论:如果ChatGPT不知道问题的答案,那么只需告诉它与答案相关的文字,让它生成答案。
步骤如下
- 首先使用Embeddings API,将游戏内的文档段落都计算出一个嵌入向量
- 在用户提问时,也用Embeddings API,从游戏相关的向量中排序找到最相关的,取出与之对应的文档,之后将用户的提问和相关文档都发到ChatGPT
嵌入向量计算完后可以保存到文件中,下次就不用再计算一遍了。
通过嵌入让ChatGPT回答的示例
假设用户问题是”游戏中攻击力最高的角色是谁?”
提交给ChatGPT的内容是这样的:
如果问题答案不在这个文档中,你就回答不知道。
文档:鹿大侠是游戏中攻击力最高的角色
问题:游戏中攻击力最高的角色是谁
答案:
这样就能让ChatGPT回答游戏相关的问题了。
如果问题与文档的相似度不高,可以直接把用户问题给ChatGPT。
相关
想要判断向量相似度,需要用numpy,我们客户端服务器都是C#,我选用了这个Numpy.NET库。(已知问题:多线程访问一定要注意!参考链接。由于网络请求都是多线程异步,await完之后可能不在一个线程)
我用的SDK是OpenAI-API-dotnet