在Unity中使用大模型
在本文中,我们将展示如何在 Unity 引擎中使用 LLM(大型语言模型)🎮。我们将使用 LLMUnity 包,并查看一些示例,了解如何仅用几行代码设置对话交互!
免责声明:我是 LLMUnity 的作者。如果您有任何意见/建议,请通过打开 GitHub 问题告诉我🤗!
1、为什么在游戏中使用 LLM?
目前,几乎所有 PC 游戏交互都基于多项选择对话。这是一种非常原始的交互类型,自 PC 游戏早期以来就已建立。游戏中的 LLM 可以构建更具沉浸感的体验,因为它们可以允许与 PC 游戏元素或角色(NPC)进行智能交互。
以 Skyrim 为例,它是目前最成功的 RPG 之一。当您第一次遇到 Lydia 时,您可能会作为同伴一起度过大部分游戏时间的 NPC,您有三种可能的对话选项。如果您想了解更多关于她的事情或讨论其他事情怎么办?
这就是 LLM 可以大放异彩的地方。您可以描述 AI 的角色及其对世界的了解(您已经将其作为游戏叙事的一部分),他们可以提升对话的水平。
2、ChatGPT 怎么样?
访问此页面的大多数人都熟悉 OpenAI 发布的 ChatGPT,并且见证了与 LLM 的互动是多么自然和强大。那么为什么不直接在游戏中使用 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 才能运行!
3、欢迎使用 LLMUnity!
LLMUnity 是一个允许在 Unity 引擎中运行和分发 LLM 模型的软件包。
它建立在出色的 llama.cpp 库之上,该库允许使用没有外部软件依赖项的 LLM,以及以跨平台方式部署 llama.cpp 的 llamafile。
LLMUnity 提供以下功能:
- 💻 跨平台!支持 Windows、Linux 和 macOS
- 🏠 无需互联网访问即可在本地运行,但也支持远程服务器
- ⚡ 在 CPU 和 GPU 上快速推理
- 🤗 支持主要的 LLM 模型
- 🔧 易于设置,只需一行代码即可调用
- 💰 可免费用于个人和商业用途
3.1 工作原理
LLMUnity 在后台使用 llama.cpp 服务器。服务器接收 POST 请求,在 LLM 上运行推理并返回回复。服务器由 llamafile 编译为可执行文件,可基于 cosmopolitan 库在不同的操作系统(Windows、Linux、MacOS)上使用。
LLMUnity 实现了一个客户端,它发送 POST 请求并将结果传递给您的 Unity 应用程序。
3.2 如何设置
LLMUnity 包可以使用 GitHub URL 作为自定义包安装,也可以作为 Unity 资源安装(等待资源商店批准)。说明在此处提供 🛠️。
开发人员可以创建 LLM 或 LLMClient 对象以使用 LLM 功能。LLMClient 类仅处理客户端功能,而 LLM 类继承 LLMClient 类并另外处理服务器功能。
然后,开发人员可以指定 LLMClient / LLM 属性:
- 提示。这指定了 AI 的角色。
- 玩家/AI 名称(可选)。可以为角色定义玩家和 AI 名称。
- 流媒体功能(可选)。流媒体功能允许 Unity 应用程序实时接收模型生成的输出。如果禁用,Unity 应用程序将在模型完全生成时收到模型的回复。
- 其他模型选项(可选)。还有更多模型选项可以由专家用户指定,直接由 llama.cpp 服务器使用。
以及仅 LLM 的属性:
- 模型。这指定要使用哪个 LLM。TheBloke 量化的 Mistral 7B Instruct v0.2 模型可以直接在 Unity Inspector 中下载为默认模型。否则,可以加载 llama.cpp 支持的任何 LLM。llama.cpp 使用 gguf 格式并为 HuggingFace 模型提供转换脚本。如果您想避免安装 llama.cpp 并自行进行转换,您可以使用 TheBloke 💣 已经转换的模型。
- 运行资源(可选)。您可以指定用户应用程序可以使用的 CPU 线程数和/或 GPU 将运行的模型层数。如果不支持用户的 GPU,则将改用 CPU。
除非您想亲自动手,否则只需按“下载模型”并定义提示 😌!
4、如何使用LLMUnity
现在让我们进入有趣的部分🎢!
LLMUnity 的编写方式使得它可以用最少的代码使用。您所要做的就是构造一个 LLM 对象,然后使用以下方式与其交互:
_ = llm.Chat(message, HandleReply, ReplyCompleted);
其中:
- message:包含用户输入的字符串对象
- HandleReply:以字符串类型作为模型回复输入的方法。在此函数中,您可以指定如何处理回复。如果启用了流式传输功能(默认行为),则此函数将在模型生成时接收实时回复,否则将一次性接收整个回复。
- ReplyCompleted(可选):没有参数的方法。当模型完成回复生成时,将调用此函数。
4.1 基本功能
下面显示了一个最小示例🚂。在这里,我们发送一条消息“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);
}
}
当 HandleReply 函数完成(以流式或非流式方式)时,将调用 LLM 的 Chat 函数并异步接收回复。
要在 Unity 中创建应用程序,您需要创建一个场景,其中包含:
- LLM 脚本的 GameObject。LLM 对象的属性在 Unity Inspector 中公开,可以按照上一节所述进行设置。
- MyGame 脚本的 GameObject。在这里,您将在 Unity Inspector 中的 llm 属性中链接上面创建的 LLM GameObject。
就这样 ✨!
4.2 简单交互
现在让我们看一个演示基本交互的示例:
下面是一个场景:
- LLM 脚本的 GameObject(与之前一样)
- SimpleInteraction 脚本的 GameObject
- 允许用户输入文本的 InputField(绿色)
- 从模型获取回复的 Text 字段(蓝色)
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 示例中找到此示例。
4.3 多个 AI 功能
到目前为止,我们已经看到了与单个 AI 的交互。实际上,游戏中会有多个 NPC 🤖。解决方案是创建一个如上所述的 LLM 对象来处理服务器,但使用其他 LLMClient 对象来使用不同的提示为 AI 定义其他行为。
可以在 ServerClient 示例中找到一个展示此功能的示例。这是上述代码的扩展,它对第一个 AI 使用 LLM 对象,对第二个 AI 使用具有不同提示的 LLMClient 对象(使用与第一个 AI 相同的服务器)。
4.4 聊天机器人
创建更像游戏的东西的最后一步是增强 UI 方面,就像您希望它们在游戏中一样🏰。我不会在这里详细介绍,因为它超出了 LLM 集成范围。如果您对更复杂的 UI 感兴趣,您可以查看 ChatBot 示例,它可以创建类似于消息应用程序的更令人愉悦的交互。
5、结束语
就这些!在本指南中,我们了解了如何使用 LLMUnity 包将 LLM 集成到 Unity 中,并提供了几个实际示例。希望您觉得它有用!如果您有任何问题/意见/建议,请随时向我发送,以改进本文或 LLMUnity 包🙏。
BimAnt翻译整理,转载请标明出处