游戏中接入ChatGPT

这周折腾了一周的ChatGPT。

这是最终成果:

最终成果

需求

我们的需求是让ChatGPT当游戏中的智能客服,用户可以和这个智能客服聊有关游戏中的问题,用户也能把这个智能客服当成一个情感树洞。

在这个需求中,接入ChatGPT进行对话并不难,调调API就完事儿了。难点是在于让ChatGPT知道游戏中的内容,并且回答。

让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。

C#计算向量余弦相似度示例代码

public static double CalculateCosineSimilarity(double[] vectorA, double[] vectorB)
{
    // 确保向量长度相同
    if (vectorA.Length != vectorB.Length)
    {
        throw new ArgumentException("Vector dimensions must be the same.");
    }

    // 计算向量的点积
    double dotProduct = vectorA.Zip(vectorB, (a, b) => a * b).Sum();

    // 计算向量的模
    double magnitudeA = Math.Sqrt(vectorA.Sum(x => x * x));
    double magnitudeB = Math.Sqrt(vectorB.Sum(x => x * x));

    // 计算余弦相似度
    double cosineSimilarity = dotProduct / (magnitudeA * magnitudeB);

    return cosineSimilarity;
}

相关

我用的SDK是OpenAI-API-dotnet

2023/08/26更新

感觉这玩意可能并不会放在实际应用中。

  • 调用ChatGPT的接口,它的稳定性值得怀疑。
  • 它的理解能力是否能得到满意的答案也值得怀疑。
  • 调用接口需要考虑付费问题

综上,如果要在游戏里部署一个智能的面向用户的NPC,只能是一些大公司用自己的模型,这样才是最好的方案。

返回顶部