基于LLM的Unity游戏开发利器——LLMUnity

译文 精选
人工智能
本文将向您介绍如何将Unity引擎中的大型语言模型与LLMUnity集成到一起以进行更高效的Unity游戏开发。

在本文中,我们将向您展示如何在Unity引擎中使用LLM(大型语言模型)。我们将使用LLMUnity包(https://github.com/undreamai/LLMUnity)展示如何仅用几行代码即可搭建一个交互对话的实例!

免责声明:我本人是LLMUnity开源包的作者。如果您有任何意见或者建议,请通过打开GitHub网址https://github.com/undreamai/LLMUnity/issues多多留言!

为什么在游戏中使用LLM?

目前,几乎所有的电脑游戏互动都是基于多选择对话形式。这是自早期PC游戏时代以来建立的一种非常原始的互动类型。游戏中的LLM可以构建更令人身临其境的体验,因为它们可以允许与PC游戏元素或角色(NPC)进行智能交互。

以《天际线》这款游戏为例,它是目前最成功的RPG游戏之一。当你第一次遇到莉迪亚——一个你可能会在游戏的大部分时间里作为同伴一起度过的NPC时,你将遇到三种可能的对话选项。那么,如果你想了解更多的关于她的信息或想讨论其他相关事情,该怎么办呢?

与Skyrim(《天际线》)游戏中的NPC Lydia互动(这是从游戏中获得的屏幕截图)

这正是LLM的优越点所在。由你来指定人工智能的角色和它们的知识世界(你已经将其作为游戏叙事的一部分),这些内容确实有助于提升对话的质量。

基于对话形式的《天际线》)游戏中的与Lydia互动的示例情形

ChatGPT怎么样?

大多数阅读本文的读者可能都熟悉OpenAI公司发布的ChatGPT,并见证了与LLM的互动是多么自然和强大。那么,为什么不在游戏中直接使用ChatGPT呢?这是因为:

  • 需要以大规模成本使用ChatGPT。虽然每一次交互都花费很小的成本,但当以大规模方式进行时,对于成千上万的用户来说,每一次都有数千次的交互,此时成本是不可忽略的。
  • ChatGPT的使用会创建一种依赖性。如果出于任何原因,ChatGPT停止工作,或者价格上涨,开发者再也负担不起,此情况下游戏就会崩溃。
  • 开源LLM的准确性与ChatGPT不相上下。尽管目前我还没有找到一个标准化的基准来证明这一点,但Meta(Llama)和Mistral发布的模型似乎在质量上与ChatGPT具有相似的准确性。
  • LLM的尺寸越来越小。最近的Mistral 7B在许多基准上击败了Llama2 13B,并超过了Llama 34B。量化方法通过将模型大小缩小到可以在任何最近的PC和GPU上使用的程度,进一步推动了这一限制。用Q4_K_M方法(模型,量化)量化的Mistral 7B至多需要7GB RAM就能运行!

欢迎LLMUnity!

LLMUnity是一个允许在Unity引擎中运行和分发LLM模型的免费开源包。

LLMUnity建立在功能强大的llama.cpp库(https://github.com/ggerganov/llama.cpp)基础之上——该库允许在没有外部软件依赖的情况下使用LLM;还依赖llamafile——以跨平台的方式部署llama.cpp。

归纳起来看,LLMUnity提供以下功能:

  • 跨平台!支持Windows、Linux和macOS
  • 在本地运行,无需访问互联网,但也支持远程服务器
  • 基于CPU和GPU的快速推理
  • 支持主流的LLM模型
  • 易于设置,只需一行代码即可调用
  • 免费用于个人和商业目的

LLMUnity的工作原理

LLMUnity架构

LLMUnity在后台使用llama.cpp服务器。服务器接收POST请求,在LLM上运行推理并返回回复。该服务器由llamafile编译成可执行文件,可在基于国际化库的不同操作系统(Windows、Linux、MacOS)中使用。

LLMUnity实现了一个客户端,该客户端发送POST请求并将结果传递给Unity应用程序。

使用前的设置准备

LLMUnity包可以使用GitHub URL的方式以自定义包形式进行安装,也可以作为Unity资源文件的形式进行安装(在资源商店中将显示等待审批状态)。链接https://github.com/undreamai/LLMUnity?tab=readme-ov-file#setup提供了详细的安装说明

开发人员可以创建LLM或LLMClient对象来使用LLM功能。注意,LLMClient类仅能够处理客户端功能,而LLM类在继承自LLMClient类的基础上还能够处理服务器端功能。

接下来,开发人员可以指定LLMClient/LLM的如下属性:

  • prompt(提示词):用于指定AI的角色。
  • player / AI name(一个可选用属性):可以为角色定义玩家和AI名称。
  • streaming functionality(流功能,也是一个可选用属性)。流功能允许Unity应用程序实时接收模型产生的输出。如果禁用,Unity应用程序将会在回复内容完全生成时收到模型的回复。
  • 其他模型选项(可选)。通过llama.cpp服务器直接使用的专家级用户可以指定更多的模型选项。

下面列举的仅是LLM类提供的属性:

  • model模型):个属性指定了要使用的LLM。TheBloke量化的Mistral 7B Instruction v0.2模型(https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2)可以作为默认模型直接在Unity Inspector中下载使用当然可以加载llama.cpp支持的任何LLM。注意,llama.cpp使用gguf格式,并为HuggingFace模型提供转换脚本(https://github.com/ggerganov/llama.cpp/tree/master?tab=readme-ov-file#prepare-data--run)。如果你想避免安装llama.cpp并自己进行转换,那么你可以使用TheBloke已经转换现成的模型

llama.cpp支持的所有模型列表

l running resources(运行资源,可选用属性)。您可以指定用户应用程序可以使用的CPU线程数和/或GPU将运行的模型层数。如果不支持使用用户的GPU功能;则将默认使用CPU。

除非你使用一切默认设置;否则,你可以简单地按下按钮“Download model(下载模型)”并定义提示词!

可以在LLM脚本中参数化的不同选项

如何使用LLMUnity

现在,让我们进入有趣的部分!

LLMUnity的开发使得它可以与最少的代码一起使用。您所要做的就是构造一个LLM对象,然后与它交互:

_ = llm.Chat(message, HandleReply, ReplyCompleted);

其中的各个参数含义如下:

  • message:包含用户输入的字符串对象
  • HandleReply:以字符串类型的模型回复作为输入的方法。在这个函数中,您可以指定如何处理回复。如果启用了流媒体功能(默认行为),该函数将在模型生成时接收实时回复;否则,将接收一次完整回复。
  • ReplyCompleted(可选参数):不带参数的方法。当模型完成生成回复内容时,即会调用此函数。

基本功能

下面显示了一个最小的示例。在这里,我们仅发送一条消息“Hello bot!”,并在控制台中显示模型的回复:

using UnityEngine;
using LLMUnity;

public class MyGame : MonoBehaviour{
  public LLM llm;

  void HandleReply(string reply){
    Debug.Log(reply);
  }

  void Start(){
    _ = llm.Chat("Hello bot!", HandleReply);
  }
}

上述代码中调用了LLM的Chat函数,在HandleReply函数中完成回复(以流式或非流式方式)后以异步方式接收回复。

要在Unity中创建应用程序,您需要使用以下内容创建一个场景:

  • 一个对应于LLM脚本的游戏对象GameObject。LLM对象的属性显示在Unity Inspector中,可以按照上一节中的描述进行设置。
  • 还有一个对应于MyGame脚本的GameObject。在此处实现中,您需要链接上面在Unity Inspector的LLM属性中创建的LLM GameObject。

而且…仅此而已!

实现一个简单的交互界面

现在,我们来看一个基本交互的演示示例:

简单的交互示例

本实例中,我们创建了这样的一个场景:

  • 一个对应于LLM脚本的游戏对象GameObject(如前所述)
  • 一个对应于SimpleInteraction脚本的游戏对象GameObject
  • 一个允许用户输入文本的InputField(绿色)
  • 一个从模型获取答复的文本字段(蓝色)

SimpleInteraction脚本的完整内容如下:

using UnityEngine;
using LLMUnity;
using UnityEngine.UI;

public class SimpleInteraction : MonoBehaviour
{
    public LLM llm;
    public InputField playerText;
    public Text AIText;

    void Start()
    {
        playerText.onSubmit.AddListener(onInputFieldSubmit);
        playerText.Select();
    }

    void onInputFieldSubmit(string message)
    {
        playerText.interactable = false;
        AIText.text = "...";
        _ = llm.Chat(message, SetAIText, AIReplyComplete);
    }

    public void SetAIText(string text)
    {
       AIText.text = text;
    }

    public void AIReplyComplete()
    {
        playerText.interactable = true;
        playerText.Select();
        playerText.text = "";
    }
}

该脚本定义了以下函数:

  • Start:在场景开始时选择playerText输入字段,以便用户可以输入文本。一个监听器被附加到playerText,当文本被提交时,它调用onInputFieldSubmit函数。
  • onInputFieldSubmit:当用户提交输入时,playerText将被禁用,直到模型回复。清空模型输出字段AIText,然后调用LLM聊天函数。
  • SetAIText:当模型生成一些回复并将AIText文本设置为回复内容时,会调用此函数。
  • AIReplyComplete:当模型完成回复时,会调用此函数。playerText输入字段再次启用并清空,以便玩家可以输入下一个输入。

就这么简单,我们可以进行成熟的LLM交互(功能方面已经成熟,只是那么漂亮您可以在SimpleInteraction示例(https://github.com/undreamai/LLMUnity/tree/main/Samples~/SimpleInteraction)中找到此示例的完整代码

多种AI功能

到目前为止,我们已经看到了与单个人工智能的交互。在实际开发中,我们往往会在一个游戏中创建多个NPC。解决方案是,按上面的办法创建一个LLM对象,该对象处理服务器功能,但还具有创建另外几个LLMClient对象,以便使用不同的提示词为AI定义额外的行为。

ServerClient示例(https://github.com/undreamai/LLMUnity/tree/main/Samples~/ServerClient)中提供了展示此功能的示例。其实,这仅是上面基础代码的扩展,它为第一个AI使用LLM对象,为第二个AI使用具有不同提示词的LLMClient对象(使用与第一个AI相同的服务器)。

多种AI功能

聊天机器人

创建更像真实游戏内容的最后一步是增强UI展示,因为你希望它们出现在你的游戏中如果你对更复杂的UI感兴趣,我推荐你可以看看ChatBot示例(https://github.com/undreamai/LLMUnity/tree/main/Samples~/ChatBot),它可以创建一个类似于消息应用程序的更令人愉快的交互。

消息应用程序风格的互动

小结

仅此而已!在本文中,我们看到了如何使用LLMUnity包在Unity应用中集成LLM,以及一些实际示例。

译者介绍

朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。

责任编辑:姜华 来源: 51CTO
相关推荐

2023-12-27 08:00:00

SQL数据库LMQL

2013-04-27 16:14:33

Corona

2011-06-13 10:54:20

JAVA

2012-12-24 09:04:04

iOSUnity3D

2013-04-25 13:12:16

unity3D手机游戏引擎

2015-04-22 20:33:06

宝德云游戏蛮牛unity

2012-03-06 10:56:32

HTML 5

2023-01-03 15:16:27

2022-12-27 14:39:38

2024-03-04 00:05:00

人工智能LLM 评估

2021-09-30 18:06:03

AI

2016-06-14 15:33:47

SpriteKitSwift开发

2012-12-24 08:46:50

iOSUnity3D

2013-04-25 00:06:06

unity3D手机游戏引擎

2016-06-21 10:27:54

游戏Unity3DC#

2015-08-27 16:35:10

Unity游戏引擎Linux

2023-10-16 16:05:44

PythonPyCharm编程语言

2023-02-15 14:02:52

HutoolMapProxy工具包

2021-09-02 07:04:44

Go 开发利器
点赞
收藏

51CTO技术栈公众号