在本文中,我们将展示如何在 Unity 引擎中使用 LLM(大型语言模型)🎮。我们将使用 LLMUnity 包,并查看一些示例,了解如何仅用几行代码设置对话交互!
免责声明:我是 LLMUnity 的作者。如果您有任何意见/建议,请通过打开 GitHub 问题告诉我🤗!
NSDT工具推荐 : Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
1、为什么在游戏中使用 LLM?
目前,几乎所有 PC 游戏交互都基于多项选择对话。这是一种非常原始的交互类型,自 PC 游戏早期以来就已建立。游戏中的 LLM 可以构建更具沉浸感的体验,因为它们可以允许与 PC 游戏元素或角色(NPC)进行智能交互。
以 Skyrim 为例,它是目前最成功的 RPG 之一。当您第一次遇到 Lydia 时,您可能会作为同伴一起度过大部分游戏时间的 NPC,您有三种可能的对话选项。如果您想了解更多关于她的事情或讨论其他事情怎么办?
与《天际》中的 NPC Lydia 互动。游戏截图
这就是 LLM 可以大放异彩的地方。您可以描述 AI 的角色及其对世界的了解(您已经将其作为游戏叙事的一部分),他们可以提升对话的水平。
与 Lydia 互动的对话示例
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 架构
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 💣 已经转换的模型。
llama.cpp 支持的模型
- 运行资源(可选)。您可以指定用户应用程序可以使用的 CPU 线程数和/或 GPU 将运行的模型层数。如果不支持用户的 GPU,则将改用 CPU。
除非您想亲自动手,否则只需按"下载模型"并定义提示 😌!
可以在 LLM 脚本中参数化的不同选项
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 相同的服务器)。
多种 AI 功能
4.4 聊天机器人
创建更像游戏的东西的最后一步是增强 UI 方面,就像您希望它们在游戏中一样🏰。我不会在这里详细介绍,因为它超出了 LLM 集成范围。如果您对更复杂的 UI 感兴趣,您可以查看 ChatBot 示例,它可以创建类似于消息应用程序的更令人愉悦的交互。
消息应用程序风格的交互
5、结束语
就这些!在本指南中,我们了解了如何使用 LLMUnity 包将 LLM 集成到 Unity 中,并提供了几个实际示例。希望您觉得它有用!如果您有任何问题/意见/建议,请随时向我发送,以改进本文或 LLMUnity 包🙏。