资讯动态

Unity集成本地大语言模型实战:LLMUnity脚本开发与性能优化指南

发布时间:2026/8/6 16:07:32 来源:尧图企业网站定制
1. 项目概述当Unity遇上本地大语言模型如果你正在Unity里捣鼓AI NPC想让游戏里的角色能真正“听懂人话”并“思考回答”而不是播放预设的台词那你大概率已经听说过或者正在尝试LLMUnity这个开源方案。这个项目最吸引人的地方就是它承诺能把大型语言模型LLM直接“塞”进Unity项目里实现本地离线运行。这意味着你不再需要为每个API调用付费也不用担心网络延迟破坏玩家的沉浸感理论上可以在PC、移动端甚至VR设备上打造出拥有真正对话能力的智能角色。然而理想很丰满现实往往会在脚本学习和探索阶段给你当头一棒。我自己在深入使用LLMUnity构建一个叙事驱动型Demo时就踩遍了从环境配置、模型加载到脚本交互的几乎所有“坑”。网上关于LLMUnity的教程大多停留在“Hello World”级别的展示一旦你想把它整合进自己复杂的游戏逻辑里各种稀奇古怪的问题就接踵而至。比如为什么模型加载到一半Unity编辑器就卡死无响应如何让LLM的输出结果精准地驱动游戏内的状态机和动画RAG检索增强生成功能到底该怎么和游戏内的数据库或剧情文本结合这些问题官方文档往往语焉不详需要你像侦探一样从源码、社区碎片和不断的试错中寻找答案。这篇文章就是我作为一线开发者在经历了无数个“编辑器崩溃-重启-查日志”的循环后总结出的LLMUnity脚本深度探索笔记。它不是一篇简单的功能罗列而是聚焦于实际开发中必然会遇到的棘手问题及其解决方案。我会拆解LLMUnity的核心脚本架构分享如何绕过那些导致“黑屏无响应”的陷阱详解如何编写健壮的C#脚本来与LLM交互并最终让AI角色真正“活”在你的游戏世界里。无论你是想做一个能和你聊哲学的山洞智者还是一个能根据玩家行为动态生成任务描述的城镇守卫接下来的内容都将是你不可或缺的实战指南。2. LLMUnity核心架构与脚本交互原理拆解在开始写第一行调用代码之前我们必须先搞清楚LLMUnity到底是怎么在Unity里“跑”起一个大模型的。很多开发者一上来就直接拖预制体、挂脚本结果遇到问题完全无从下手根本原因就是没理解其底层的工作流程。LLMUnity本质上是一个“桥梁”它自身并不包含模型推理的核心引擎而是封装并调用了像llama.cpp这样的本地推理库。2.1 双进程通信模型Unity与推理后端这是理解所有问题的基石。LLMUnity采用了一种典型的客户端-服务器架构尽管它都在你的本地机器上运行。Unity主进程客户端你的游戏或编辑器在此运行。LLMUnity提供的C#脚本如LLMClient在这里工作负责准备输入数据如玩家对话文本、发送请求、并接收和处理模型返回的结果。推理后端进程服务器这是一个独立的进程由LLMUnity在后台启动。它负责加载巨大的模型文件通常是几个GB的.gguf格式文件执行实际的矩阵运算推理并将生成的文本返回给Unity进程。这两个进程之间通过本地网络接口如localhost进行通信通常使用HTTP或WebSocket协议。这种设计的优点是隔离了重量级的模型计算防止它直接卡死Unity的主线程。但同时也引入了新的复杂度进程间通信IPC的稳定性、后端进程的生命周期管理、以及错误传递。当你点击PlayUnity侧脚本尝试连接一个不存在的后端或者后端崩溃了但Unity不知情就会导致脚本挂起、游戏无响应。你看到的“Unity程序打开黑屏无响应”很多时候并不是Unity本身的问题而是这个后端进程启动失败或卡死了。2.2 核心脚本组件解析LLMUnity的脚本主要分布在几个关键组件上理解它们的关系至关重要LLMClient / LLMUnityClient这是你主要交互的类。你可以把它理解为一个“对话管理器”。在你的游戏脚本中你会实例化一个LLMClient对象配置好模型路径、后端地址等参数然后调用它的Generate或Chat方法来发送请求。// 示例在自定义MonoBehaviour中初始化LLMClient public class MyAIController : MonoBehaviour { private LLMClient _llmClient; private string _modelPath Assets/StreamingAssets/models/llama-2-7b-chat.Q4_K_M.gguf; async void Start() { _llmClient new LLMClient(); // 配置是关键这里指定模型文件和本地后端地址 await _llmClient.Initialize(_modelPath, “http://127.0.0.1:8080”); } }注意Initialize方法通常是异步的。如果你在Start或Awake中同步调用它并且没有妥善处理异步等待很可能导致Unity在等待后端响应时卡住。正确的做法是使用async/await或协程Coroutine来管理初始化流程。LLMBackend (或类似的后台运行器)这个组件负责在后台启动和管理那个独立的推理进程如llama.cpp的server。在Unity编辑器中它可能以一个隐藏窗口或控制台的形式运行。你需要确保这个进程有足够的权限访问模型文件并且其端口没有被其他程序占用。RAG检索增强生成组件这是LLMUnity的进阶功能。它允许你向模型提供额外的知识库比如游戏的所有任务文本、物品描述、世界观设定。其脚本通常包括一个DocumentLoader用于加载和分割你的文本文件和一个VectorDatabase用于存储和检索文本嵌入。当玩家提问时系统会先从你的知识库中检索最相关的片段然后连同问题和片段一起送给模型让模型生成基于游戏知识的准确回答。2.3 脚本工作流与数据流一次完整的AI对话在脚本层面是如何流动的我们梳理一下触发玩家按下对话键或进入NPC触发区域。你的DialogueTrigger脚本调用MyAIController.StartDialogue(playerInput)。预处理MyAIController将玩家的原始输入可能还需要加上当前的游戏上下文如“玩家正在下雨的森林里”格式化为一个符合模型要求的提示词Prompt。例如“你是一个住在森林里的老巫师。现在正在下雨。玩家对你说{playerInput}。请用巫师的语气回答”请求发送调用_llmClient.ChatAsync(prompt)。这个脚本方法会将Prompt序列化为JSON通过HTTP POST请求发送到配置的后端地址如http://127.0.0.1:8080/v1/chat/completions。后端推理后端进程收到请求从内存中已加载的模型里进行计算生成文本流。响应接收与解析Unity侧的LLMClient异步地接收HTTP响应流将JSON结果反序列化提取出response.Choices[0].Message.Content。后处理与游戏集成你拿到纯文本回答后事情才完成一半。你需要文本驱动将回答送入你的对话UI系统逐字显示。意图解析可能需要用简单的规则或另一个小型分类模型从回答中解析出“NPC是否给出了任务物品”、“对话情绪是友好还是敌对”。状态机驱动根据解析出的意图触发游戏内事件改变NPC的动画状态如从Idle转为Talking更新任务日志或增减玩家声望值。整个链条非常长任何一个环节的脚本出现异常如网络请求超时、JSON解析失败、模型生成不稳定的内容都会导致最终效果不符合预期甚至直接崩溃。3. 环境配置与模型部署的深水区按照README文件一步步操作却卡在第一步这太常见了。LLMUnity的入门门槛90%集中在环境配置和模型准备上。下面我以WindowsUnity Editor环境为例拆解每一步的细节和巨坑。3.1 模型文件格式、下载与放置模型是核心也是第一个拦路虎。必须使用GGUF格式LLMUnity的后端通常是llama.cpp只支持GGUF这种量化后的模型格式。你不能直接把Hugging Face上的原始PyTorch模型.bin或.safetensors拖进来用。你需要去Hugging Face Model Hub寻找带有GGUF标签的模型例如TheBloke/Llama-2-7B-Chat-GGUF。量化等级的选择Q4_K_M, Q8_0等这直接决定了模型大小、推理速度和精度。Q4_K_M最常用的平衡选择。在7B模型上能将原始16GB的模型压缩到约4GB精度损失在可接受范围内推理速度较快。对于大多数初次尝试和移动端目标我强烈建议从这里开始。Q8_0或Q6_K精度更高模型更大7B模型约6-7GB速度稍慢。适合对回答质量要求极高且不介意资源占用的PC项目。Q2_K极端量化模型极小7B模型可小于3GB但输出质量可能严重下降容易出现乱码或胡言乱语。除非你的目标平台极其受限如低端安卓手机否则不推荐。模型放置路径这是导致“文件未找到”错误的常见原因。LLMUnity的示例通常要求把模型放在Assets/StreamingAssets/文件夹下。你必须确保Unity能够正确识别这个路径。一个更稳妥的做法是在代码中使用Application.streamingAssetsPath来构建绝对路径。private string GetModelPath(string relativeModelPath) { // 例如: relativeModelPath models/my_model.Q4_K_M.gguf return Path.Combine(Application.streamingAssetsPath, relativeModelPath); }实操心得不要使用Resources文件夹大模型文件放在Resources里会被Unity尝试导入和压缩导致启动极慢甚至崩溃。StreamingAssets是存放只读二进制数据如模型、视频的正确位置。3.2 后端部署llama.cpp的编译与启动LLMUnity需要llama.cpp的server版本作为后端。官方可能提供预编译的二进制文件但版本兼容性问题频发。自行编译推荐以获得最佳兼容性从GitHub克隆llama.cpp仓库。按照其README使用CMake和你的编译器Windows上常用Visual Studio的MSVC进行编译。关键是要开启LLAMA_BUILD_SERVERON选项。编译成功后你会得到一个llama-server.exeWindows或serverLinux/macOS的可执行文件。启动参数配置通过LLMUnity的脚本或手动启动后端时参数至关重要。# 一个典型的启动命令示例 .\llama-server.exe -m “D:\YourUnityProject\Assets\StreamingAssets\models\llama-2-7b-chat.Q4_K_M.gguf” -c 2048 --host 127.0.0.1 --port 8080 -ngl 20-m: 模型文件路径。务必使用绝对路径相对路径很可能导致后端找不到模型。-c: 上下文长度。决定了模型能“记住”多长的对话历史。2048是常用值但可根据模型能力调整。太长会消耗更多内存。--host/--port: 指定后端监听的地址和端口。必须与Unity脚本中LLMClient配置的地址完全一致。-ngl: GPU层数这是性能关键它指定有多少层模型被卸载到GPU运行。值越大GPU负载越高推理速度越快。如果你有不错的NVIDIA显卡可以设置为20-40。如果设为0则完全使用CPU速度会慢很多。如果设置超过了你GPU显存能承受的范围启动时会直接崩溃且错误信息可能不清晰。集成到Unity Editor流程理想情况下你希望点击Play时后端自动启动停止Play时后端自动关闭。这需要你编写一个Editor脚本使用System.Diagnostics.Process来启动和管理llama-server进程。你需要妥善处理进程的标准输出和错误流并将其重定向到Unity的Debug.Log这样当后端崩溃时你才能在Console窗口看到如“CUDA out of memory”这样的关键错误信息而不是单纯的黑屏。3.3 Unity项目设置与依赖项即使模型和后端都准备好了Unity项目本身的设置不对也会前功尽弃。API Compatibility Level 与 .NET版本LLMUnity的C#脚本可能使用了较新的C#特性。确保在Player SettingsOther Settings中将Api Compatibility Level设置为.NET Standard 2.1或.NET Framework而不是旧的.NET 2.0 Subset。这能避免很多因缺少系统库而导致的编译错误。允许HTTP请求仅Editor/开发阶段由于是本地HTTP通信你可能需要处理Unity的安全策略。对于Windows/Mac Standalone平台通常没问题。但在Editor内和某些平台上可能需要确保没有阻止localhost的请求。处理“无法将‘xxx’识别为cmdlet...”类错误这个热搜词虽然看起来是PowerShell的命令问题但其本质在Unity集成中同样存在系统路径和环境变量。当你通过C#的Process.Start调用外部程序如编译好的llama-server时如果该程序依赖某些动态库如CUDA的DLL而系统PATH环境变量里没有包含这些库的路径进程就会启动失败。解决方案是要么将依赖库如CUDA的bin目录添加到系统的PATH中要么更简单粗暴一点在启动进程前在C#代码中将这些依赖库直接复制到你的项目StreamingAssets或Plugins文件夹下并确保Process.StartInfo.WorkingDirectory设置正确。4. 核心脚本编写从Hello World到生产级交互环境配好了终于可以开始写代码了。但如何写出健壮、高效、易于集成的LLM交互脚本是另一个维度的挑战。4.1 初始化与连接管理初始化不能简单地在Start里写一行new LLMClient()就了事。public class RobustLLMController : MonoBehaviour { private LLMClient _client; private bool _isInitialized false; private string _serverUrl “http://localhost:8080”; [SerializeField] private string _modelRelativePath “models/llama-2-7b-chat.Q4_K_M.gguf”; public async Taskbool InitializeLLMAsync() { if (_isInitialized) return true; string fullModelPath Path.Combine(Application.streamingAssetsPath, _modelRelativePath); if (!File.Exists(fullModelPath)) { Debug.LogError($“模型文件不存在: {fullModelPath}”); return false; } _client new LLMClient(); try { // 设置一个合理的超时时间比如30秒 _client.Timeout TimeSpan.FromSeconds(30); await _client.Initialize(fullModelPath, _serverUrl); _isInitialized true; Debug.Log(“LLM客户端初始化成功。”); return true; } catch (System.Net.Http.HttpRequestException ex) { Debug.LogError($“连接LLM后端失败请确保后端服务已启动在 {_serverUrl}。错误: {ex.Message}”); // 这里可以触发一个UI提示让玩家/开发者知道AI服务未就绪 } catch (Exception ex) { Debug.LogError($“LLM初始化未知错误: {ex}”); } return false; } void OnDestroy() { // 清理资源如果客户端有Dispose方法的话 _client?.Dispose(); } }关键点异步初始化使用async/await避免阻塞主线程。可以将初始化放在一个加载场景或开场动画期间。文件存在性检查在尝试初始化前先检查模型文件是否存在。这是一个廉价的预防性检查。异常处理用try-catch包裹初始化过程特别是网络请求部分。根据不同的异常类型如HttpRequestException可以给出更明确的错误提示指导下一步排查是后端没启动还是端口被占。超时设置给Initialize或后续的请求设置超时。模型加载可能需要几十秒但网络连接失败应该在几秒内就报错而不是让游戏无限期卡住。状态标志使用_isInitialized这样的标志位防止重复初始化并在其他方法里检查此状态。4.2 设计高效的提示词工程模型的表现90%取决于你给的提示词Prompt。对于游戏内的NPC你需要精心设计系统提示词System Prompt来塑造角色。public class NPCPersonality { public string CharacterName; public string Background; public string PersonalityTraits; public string SpeechStyle; public string KnowledgeScope; // RAG相关的知识范围描述 public string BuildSystemPrompt() { return $” 你是一个名为‘{CharacterName}’的游戏角色。 背景{Background} 性格特点{PersonalityTraits} 说话风格{SpeechStyle} 你的所有回答都必须严格基于以下设定和已知信息不要编造设定之外的内容。 已知信息范围{KnowledgeScope} 请用第一人称‘我’来回答问题保持语气符合角色性格。 回答请尽量简洁控制在3句话以内。 “; } } // 在对话管理器中使用 public async Taskstring AskNPCAsync(string playerQuestion, NPCPersonality personality) { if (!_isInitialized) return “[AI未就绪]”; string fullPrompt personality.BuildSystemPrompt() $“\n\n玩家说{playerQuestion}\n{CharacterName}回答”; try { var response await _client.ChatAsync(new ChatMessage[] { new ChatMessage { Role “system”, Content personality.BuildSystemPrompt() }, new ChatMessage { Role “user”, Content playerQuestion } }); return response.Choices[0].Message.Content.Trim(); } catch (TaskCanceledException) { Debug.LogWarning(“LLM请求超时。”); return “思考中…”; } }提示词设计技巧角色锁定在System Prompt里明确“你是XXX”并给出背景、性格、口吻。指令清晰使用“必须”、“不要”、“请”等词给出明确指令如“控制在3句话以内”。格式约束如果需要模型输出特定格式如JSON在Prompt中给出明确示例。上下文管理对于多轮对话你需要维护一个消息历史列表ListChatMessage每次将新的用户消息和历史一起发送。但要注意上下文长度限制当历史太长时需要丢弃最早的消息或进行摘要。4.3 集成RAG让NPC拥有游戏世界知识这是让AI对话不“跑偏”的关键。假设你的游戏有一个庞大的任务数据库你想让NPC能回答关于任务细节的问题。准备知识库文档将你的任务文本、物品描述、 lore 背景整理成纯文本文件如.txt或.md放在StreamingAssets下的某个文件夹例如Assets/StreamingAssets/KnowledgeBase/。编写文档加载与处理脚本public class GameKnowledgeRAG { private LLMClient _client; private string _knowledgeBasePath; public async Task SetupRAGAsync() { _knowledgeBasePath Path.Combine(Application.streamingAssetsPath, “KnowledgeBase”); // 假设LLMClient有相关RAG配置方法 await _client.ConfigureRAGAsync(_knowledgeBasePath, chunkSize: 500, overlap: 50); } public async Taskstring QueryWithKnowledgeAsync(string playerQuestion, NPCPersonality personality) { // 这个方法会先检索知识库再将检索到的片段和问题一起发给模型 string systemPrompt personality.BuildSystemPrompt() “\n\n请优先使用以下提供的游戏信息来回答问题”; var response await _client.ChatWithContextAsync( systemPrompt: systemPrompt, userMessage: playerQuestion, retrievalTopK: 3 // 检索最相关的3个片段 ); return response; } }RAG工作流程当玩家提问“那个‘寻找失落圣剑’的任务下一步该去哪”时ChatWithContextAsync内部会将你的知识库所有文本块转换为向量嵌入。将玩家的问题也转换为向量。在向量数据库中做相似度搜索找出与问题最相关的几个文本片段例如任务描述中关于“圣剑在黑暗森林”的段落。将这些片段作为“上下文”插入到最终发给模型的Prompt中模型就能基于这些准确信息生成回答而不是凭空想象。5. 性能优化与内存管理实战在Unity中运行LLM性能是最大的挑战之一。模型动辄数GB推理消耗大量CPU/GPU和内存。5.1 推理速度优化GPU卸载-ngl参数如前所述这是最有效的加速手段。在llama-server启动命令中调整-ngl的值。你可以写一个简单的性能测试脚本在游戏启动时尝试不同的层数并记录生成第一个token的延迟找到一个速度和显存占用的平衡点。上下文长度-c参数在满足需求的前提下尽可能使用短的上下文长度。2048通常是个安全的起点。每增加一位都会增加KV缓存的负担影响速度。批处理与流式响应如果游戏中有多个NPC可能同时需要生成对话虽然不常见可以研究后端是否支持批处理请求。对于单个请求使用流式响应如果LLMUnity支持可以让玩家看到文字逐字出现提升体验而不是等待全部生成完才显示。缓存常用回答对于一些非常通用、高频的玩家问题如“你好”、“你是谁”可以不用每次都请求模型。在本地建立一个简单的问答缓存字典。当玩家输入匹配缓存的关键词时直接返回缓存的回答极大减轻负载。5.2 内存与资源管理模型加载时机不要在场景一开始就加载所有AI模型。采用按需加载或分场景加载。例如只在玩家进入主要城镇场景时加载该城镇NPC的模型进入战斗场景则卸载AI模型释放内存。后端进程生命周期在Unity Editor中确保停止Play时通过Process.Kill()或发送关闭信号来终止llama-server进程防止它变成僵尸进程持续占用内存和GPU显存。Unity对象与LLMClient的绑定通常一个LLMClient实例足以服务多个NPC。不要为每个NPC都创建一个LLMClient和独立的后端连接那会迅速耗尽资源。设计一个LLMManager单例来集中管理请求队列和响应分发。监控与降级在脚本中加入性能监控。如果检测到连续几次请求响应时间超过阈值如5秒或者系统内存告急可以自动切换到降级模式例如使用更简单的规则引擎生成回答或者直接返回预设的备用对话。6. 调试、错误排查与常见问题实录开发过程中你一定会遇到各种报错和诡异行为。下面是我踩过坑后整理的排查清单。6.1 问题现象Unity编辑器卡死、无响应排查点1后端进程是否成功启动操作打开任务管理器Windows或活动监视器Mac查找名为llama-server或类似名称的进程。如果不存在说明启动失败。解决检查Unity Editor Console是否有启动后端的日志或错误。手动在命令行中运行你的后端启动命令观察输出。常见错误模型路径错误、CUDA版本不匹配、端口被占用。排查点2模型文件是否正确操作检查模型文件的MD5是否与下载源一致。损坏的模型文件会导致后端在加载时崩溃。解决重新下载模型文件并确保其格式为GGUF。排查点3GPU内存VRAM是否不足操作查看任务管理器的GPU内存占用。如果你设置了-ngl 40但显卡只有8GB显存很可能在加载模型层时就爆显存。解决减少-ngl参数值或换用更小、量化等级更低的模型如从7B换到3B或从Q4_K_M换到Q2_K。6.2 问题现象LLMClient请求超时或返回网络错误排查点1端口与地址是否正确操作确认Unity脚本中LLMClient配置的serverUrl如http://127.0.0.1:8080与后端启动命令中的--host和--port完全一致。注意localhost和127.0.0.1在大多数情况下等价但某些网络配置下可能有区别建议统一使用127.0.0.1。解决在浏览器中访问http://127.0.0.1:8080如果后端提供了简单的状态页看是否能连通。排查点2防火墙或杀毒软件拦截操作临时关闭防火墙和杀毒软件进行测试。解决为llama-server.exe和Unity Editor添加防火墙例外规则。6.3 问题现象模型回答质量差、胡言乱语或不符合角色排查点1提示词Prompt是否足够清晰操作将你实际发送给模型的完整Prompt包括System和User消息打印到Debug.Log中仔细检查。解决强化System Prompt中的约束。使用更明确的指令如“你必须以中世纪骑士的口吻回答”“你的回答不能超过50个字”。对于胡言乱语可能是模型量化损失太大尝试换用更高精度的量化模型如从Q4_K_M升级到Q6_K。排查点2RAG检索是否生效操作检查RAG检索环节是否真的返回了相关的文本片段。可以在ChatWithContextAsync调用前后打印出检索到的片段内容。解决优化你的知识库文档。确保文档分割合理chunkSize和overlap参数信息密度高。过于零碎或冗长的文档会影响检索质量。6.4 问题现象在移动平台Android/iOS上崩溃或无法运行排查点1模型是否适配移动端操作移动端资源极其紧张。确保使用为移动端优化的超小模型如Phi-2, TinyLlama和低量化等级如Q2_K。解决在PC上充分测试性能预估移动端的承受能力。考虑在移动端完全禁用本地LLM或采用云端API方案但这违背了LLMUnity的本地化初衷。排查点2后端二进制文件是否跨平台操作llama.cpp需要为AndroidARM架构和iOSARM架构单独编译。不能直接将Windows的exe文件放到移动项目里。解决查阅llama.cpp的交叉编译指南或寻找社区预编译的移动端版本。这是一个高级且复杂的话题可能需要深入NDK和Xcode配置。7. 进阶应用超越简单对话的脚本设计当基础对话跑通后你可以思考如何将LLM更深层次地融入游戏机制。动态剧情生成不止于问答。你可以让模型根据玩家当前的状态背包物品、完成任务情况、阵营声望生成一小段动态的剧情描述或任务简报。这需要你将游戏状态数据巧妙地编码进Prompt。NPC行为决策给模型一个简化的游戏世界状态描述如“时间是夜晚”“玩家声望是友善”“仓库里有食物”以及几个可选的行为选项“去睡觉”“去巡逻”“和玩家交易”让模型为NPC选择一个最合理的行为。这可以将LLM作为高级决策层驱动底层的行为树或状态机。内容审核与安全层在将模型生成的文本显示给玩家之前增加一个“安全过滤”脚本。这个脚本可以用一个极小的、本地运行的分类模型或简单的关键词正则匹配来检测输出中是否包含不适当的内容如果发现则触发备用回复。与Unity其他AI工具结合例如将LLM生成的文本描述通过语音合成TTS插件转换为NPC的语音或者将LLM解析出的玩家意图如“攻击”、“交易”转换为Unity的导航网格NavMesh指令让NPC执行相应的移动动作。探索LLMUnity的过程就像在Unity这个熟悉的乐园里开辟一片充满未知的AI森林。它不会一帆风顺你会遇到环境配置的荆棘、性能优化的陡坡和脚本集成的迷雾。但每解决一个问题你就离创造出那个能真正理解玩家、并做出有趣反应的虚拟角色更近一步。这份探索的乐趣和最终的成果正是驱动我们不断踩坑和填坑的核心动力。记住从一个小而具体的功能开始比如一个能回答关于它自身三个问题的NPC让它稳定运行然后再逐步添加RAG、多角色、行为决策等复杂功能。稳扎稳打你的AI游戏世界就会一点点构建起来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价