游戏开发中的 AI Agent Harness Engineering:智能 NPC 与动态剧情生成

引言

痛点引入

作为游戏开发者,你是否曾经面临这样的困境:花费数月时间精心设计的 NPC(非玩家角色)行为树,在玩家实际游玩时却显得呆板、重复,甚至常常做出令人啼笑皆非的决策?又或者,你精心编织的主线剧情虽然精彩,但玩家二周目时却因为知道了所有情节而失去兴趣?

在传统的游戏开发中,NPC 的行为和游戏剧情通常是由开发者预先设计好的。尽管我们可以使用行为树、状态机等技术来让 NPC 的行为看起来更加复杂,但本质上,这些行为仍然是在一个有限的、预设的集合中进行选择。同样,游戏剧情通常也是线性的或分支有限的,玩家的选择虽然会影响剧情走向,但这种影响往往是在开发者预设的范围内。

随着玩家对游戏体验的要求越来越高,这种传统的方法已经越来越难以满足玩家的期待。玩家希望看到更加智能、更加个性化的 NPC,希望能够体验到真正动态的、由自己的行为真正塑造的游戏世界。

解决方案概述

这正是 AI Agent Harness Engineering(智能体控制工程) 所要解决的问题。通过将最新的人工智能技术,特别是大语言模型(LLM)、强化学习(RL)和多智能体系统(MAS),与游戏开发技术相结合,我们可以创建出真正具有自主意识、能够根据游戏环境和玩家行为动态做出决策的 NPC,并且可以生成真正动态的、不可预测的游戏剧情。

AI Agent Harness Engineering 不仅仅是将 AI 技术简单地应用到游戏中,它更是一门关于如何设计、构建和控制 AI 智能体,使其能够在游戏环境中安全、有效、有趣地运行的工程学科。它涉及到 AI 模型的选择和微调、智能体的感知和行动空间设计、多智能体之间的交互和协调、以及 AI 生成内容的质量控制等多个方面。

最终效果展示

想象一下这样的游戏场景:你在一个开放世界 RPG 游戏中扮演一名冒险者,你在酒馆里遇到了一个名叫 “Elara” 的吟游诗人。在传统的游戏中,Elara 可能只会对你说几句固定的台词,或者给你一个预设的任务。但在一个应用了 AI Agent Harness Engineering 的游戏中,Elara 会记得你之前和她的所有对话,会根据你当前的装备、声望、甚至是你在游戏中的时间来调整她的态度和话题。她可能会主动问你关于你最近冒险经历的细节,或者根据你的心情为你唱一首不同的歌。更重要的是,她的行为会真正影响游戏世界的走向——如果你和她成为了朋友,她可能会在你之后的冒险中给你提供意想不到的帮助;如果你冒犯了她,她可能会在其他 NPC 面前说你的坏话,影响你的声望。

这就是 AI Agent Harness Engineering 能够为游戏带来的可能性:一个真正鲜活的、动态的、由玩家和 AI 共同塑造的游戏世界。

基础概念

什么是 AI Agent Harness Engineering?

在我们深入探讨之前,首先让我们明确几个核心概念。

AI Agent(智能体)

在人工智能领域,一个 Agent(智能体) 是指任何能够通过传感器感知环境,并通过执行器作用于环境的实体。这个定义非常广泛,可以包括从简单的温控器到复杂的自动驾驶汽车,再到我们今天要讨论的游戏 NPC。

一个典型的 AI Agent 通常包含以下几个核心组件:

  1. 感知模块(Perception Module): 负责从环境中获取信息。在游戏中,这可能包括 NPC 能“看到”什么、“听到”什么,以及它对游戏世界状态的了解。
  2. 状态表示(State Representation): 负责将感知到的信息组织成智能体能够理解和处理的形式。
  3. 决策模块(Decision-Making Module): 是智能体的“大脑”,负责根据当前状态决定下一步要采取什么行动。这可以是基于规则的,也可以是基于机器学习模型的。
  4. 行动模块(Action Module): 负责将决策模块做出的决策转化为实际的行动,作用于游戏环境。

在游戏开发的语境下,我们可以将 NPC 看作是一个专门的 AI Agent,其环境是游戏世界,其行动是游戏中的各种动作(如移动、对话、战斗等)。

Harness(控制/线束)

在工程学中,“Harness” 这个词通常有两个含义:一是指马具,即用来控制和引导马的装备;二是指线束,即用来组织和保护电线电缆的组件。在 AI Agent Harness Engineering 中,我们借用了这两个含义。

一方面,Harness 是指用来控制和引导 AI Agent 的一套机制和工具。与一般的 AI 研究不同,在游戏开发中,我们不仅仅关心 AI Agent 是否“智能”,更关心它是否能够按照游戏设计者的意图行事,是否能够为玩家带来有趣的体验,是否不会破坏游戏的平衡性和沉浸感。因此,我们需要一套“马具”来控制 AI Agent,使其在我们期望的范围内运行。

另一方面,Harness 也是指用来连接 AI Agent 和游戏引擎的中间层。就像线束连接汽车的各个电子部件一样,Harness 负责在 AI Agent 和游戏引擎之间传递信息:它将游戏引擎的状态信息传递给 AI Agent,又将 AI Agent 的决策转化为游戏引擎能够理解的指令。

AI Agent Harness Engineering

综合以上两个概念,我们可以将 AI Agent Harness Engineering(智能体控制工程) 定义为:

一门设计、构建和优化 AI Agent 及其与游戏环境交互接口的工程学科,其目标是创建出既具有足够的智能和自主性,又能够为玩家带来有趣、平衡、沉浸的游戏体验的智能体。

AI Agent Harness Engineering 是一个跨学科的领域,它结合了:

  • 人工智能: 包括大语言模型、强化学习、多智能体系统等。
  • 游戏开发: 包括游戏引擎、游戏设计、叙事设计等。
  • 软件工程: 包括系统架构、API 设计、性能优化等。
  • 人机交互: 包括用户体验设计、玩家行为分析等。

为什么现在是 AI Agent Harness Engineering 的时代?

虽然 AI 在游戏中的应用已经有很长的历史了——从早期吃豆人游戏中的幽灵,到《Half-Life》中的敌人士兵,再到《黑神话:悟空》中的 Boss——但 AI Agent Harness Engineering 作为一个独立的概念受到广泛关注,还是最近几年的事情。这主要得益于以下几个技术的突破:

大语言模型(LLM)的兴起

2022 年底 ChatGPT 的发布标志着大语言模型时代的到来。LLM 展现出了惊人的语言理解和生成能力,以及一定的推理和规划能力。这为游戏 NPC 的对话系统带来了革命性的变化。

在传统的游戏中,NPC 的对话通常是由编剧预先写好的,玩家只能从有限的选项中进行选择。这不仅限制了玩家的自由度,也大大增加了开发成本——为了让 NPC 能够应对各种情况,开发者需要编写大量的对话分支。

而有了 LLM,我们可以让 NPC 真正地“理解”玩家说的话,并根据当前的情境、NPC 的性格和背景故事,动态地生成回应。这不仅大大增加了玩家的自由度,也使得 NPC 看起来更加真实和鲜活。

多模态 AI 的发展

除了文本之外,现代 AI 模型还能够处理图像、音频、视频等多种模态的信息。在游戏中,这意味着我们的 AI Agent 不仅能够“阅读”游戏世界的状态数据,还能够“看到”游戏画面,“听到”游戏声音,从而获得更加丰富的环境信息。

例如,一个基于多模态 AI 的 NPC 可以通过分析游戏画面来判断玩家的情绪(通过玩家角色的面部表情),或者通过分析玩家的语音语调来判断玩家的态度,从而调整自己的回应方式。

强化学习的成熟

强化学习是一种让 AI Agent 通过与环境交互来学习最优策略的机器学习方法。近年来,强化学习在游戏领域取得了很多令人瞩目的成就,例如 DeepMind 的 AlphaGo、AlphaStar,以及 OpenAI 的 OpenAI Five。

虽然直接用强化学习从头训练一个游戏 NPC 在大多数情况下是不现实的(因为训练成本太高,而且训练出来的策略可能不符合游戏设计的要求),但强化学习可以用来微调 NPC 的行为,或者在一些特定的场景下(如 Boss 战)生成更加动态和有挑战性的 AI。

开源 AI 生态的繁荣

最后,开源 AI 生态的繁荣也为 AI Agent Harness Engineering 提供了强大的支持。现在,开发者可以很容易地获取和使用各种预训练的 AI 模型(如 Llama、Mistral、Stable Diffusion 等),以及各种 AI 开发框架和工具(如 LangChain、AutoGPT、Unity ML-Agents 等)。这大大降低了将 AI 技术应用到游戏中的门槛。

游戏 AI 的发展历程:从预定义规则到自主智能体

为了更好地理解 AI Agent Harness Engineering 的意义,让我们先简要回顾一下游戏 AI 的发展历程。

阶段 时间 核心技术 特点 代表游戏
预定义移动模式 1970s-1980s 有限状态机、简单规则 AI 行为完全由预定义的规则决定,缺乏适应性 《吃豆人》、《太空侵略者》
状态机与行为树 1990s-2000s 有限状态机(FSM)、分层状态机(HFSM)、行为树(BT) AI 行为更加复杂和结构化,但仍然是预定义的 《Half-Life》、《Halo》、《模拟人生》
规划与寻路 2000s-2010s A*寻路、目标导向行动规划(GOAP)、分层任务网络(HTN) AI 能够进行简单的规划,根据目标选择合适的行动序列 《F.E.A.R.》、《刺客信条》、《孤岛危机》
机器学习萌芽 2010s-2020s 强化学习、监督学习、神经网络 开始尝试将机器学习技术应用于游戏 AI,但主要用于特定场景或辅助设计 《Forza》(AI 车手)、《文明》(AI 辅助设计)
大语言模型与自主智能体 2020s-至今 大语言模型(LLM)、多智能体系统、AI Agent Harness AI 具有高度的自主性和适应性,能够理解自然语言,生成动态内容 《星空》(部分实验性功能)、一些独立游戏、MOD

从上表可以看出,游戏 AI 的发展趋势是从预定义、静态自主、动态的方向演变。在早期的游戏中,AI 的行为就像舞台上的演员,完全按照剧本行事;而在未来的游戏中,AI 将更像是即兴表演的演员,虽然有一个大致的角色设定和剧情框架,但具体的台词和动作将由他们根据现场情况即兴发挥。

AI Agent Harness Engineering 正是这个演变过程中的关键一环。它为我们提供了一套方法论和工具集,让我们能够安全、有效地控制这些“即兴演员”,确保他们的表演既精彩又不会失控。

核心概念与架构

AI Agent Harness 的核心组件

一个完整的 AI Agent Harness 系统通常由以下几个核心组件组成:

  1. 环境接口层(Environment Interface Layer)
  2. 感知与记忆模块(Perception & Memory Module)
  3. 决策与规划模块(Decision-Making & Planning Module)
  4. 行动执行层(Action Execution Layer)
  5. 安全与质量控制层(Safety & Quality Control Layer)
  6. 设计工具链(Design Toolchain)

下面让我们逐一详细介绍这些组件。

环境接口层(Environment Interface Layer)

环境接口层是 AI Agent 和游戏引擎之间的“翻译官”。它负责将游戏引擎的状态信息转换为 AI Agent 能够理解的格式,同时将 AI Agent 生成的行动指令转换为游戏引擎能够执行的格式。

环境接口层通常需要处理以下几类信息:

  • 游戏世界状态: 例如当前的时间、天气、地点,以及游戏中各个物体和角色的位置、状态等。
  • 玩家行为: 例如玩家的移动、对话、战斗行为,以及玩家的选择和偏好等。
  • 游戏事件: 例如任务的完成、角色的死亡、重要地点的到达等。

环境接口层的设计需要考虑以下几个因素:

  • 抽象层次: 我们需要决定向 AI Agent 暴露多少细节。暴露太多细节会增加 AI Agent 的处理负担,也可能导致一些意想不到的行为;暴露太少细节则会限制 AI Agent 的能力。
  • 更新频率: 我们需要决定多久向 AI Agent 更新一次环境信息。更新太频繁会消耗过多的计算资源;更新太慢则会导致 AI Agent 的决策滞后。
  • 事件驱动 vs 轮询: 我们可以选择让游戏引擎在发生重要事件时主动通知 AI Agent(事件驱动),也可以选择让 AI Agent 定期向游戏引擎询问环境状态(轮询),或者两者结合使用。

在 Unity 或 Unreal Engine 等现代游戏引擎中,环境接口层通常是以插件或中间件的形式实现的。例如,Unity 的 ML-Agents Toolkit 就提供了一套完整的环境接口,方便开发者将机器学习模型集成到 Unity 游戏中。

感知与记忆模块(Perception & Memory Module)

感知与记忆模块是 AI Agent 的“感官”和“大脑记忆区”。它负责从环境接口层获取原始信息,并将其组织成有意义的形式存储起来,供决策模块使用。

感知模块

感知模块负责筛选和处理从环境接口层获取的原始信息。就像人类不会注意到环境中的所有细节一样,AI Agent 也不应该处理所有的环境信息——这样做既不高效,也不现实。

感知模块通常包含以下几个子组件:

  • 注意力机制(Attention Mechanism): 负责决定 AI Agent 应该关注哪些信息,忽略哪些信息。例如,一个 NPC 在酒馆里时,应该更关注和他对话的玩家,而不是背景里其他喝酒的客人。
  • 传感器模型(Sensor Model): 负责模拟 AI Agent 的感官能力。例如,一个 NPC 的视觉范围是有限的,他看不到墙后面的东西;他的听觉也是有限的,太远的声音他听不到。
  • 信息过滤与融合(Information Filtering & Fusion): 负责将来自多个传感器的信息进行过滤和融合,得到一个对环境的一致理解。

感知模块的设计对于 AI Agent 的沉浸感非常重要。如果一个 NPC 似乎知道所有事情(即使这些事情是他不应该知道的),玩家会觉得很出戏。通过设计合理的感知模块,我们可以让 NPC 的行为更加真实可信。

记忆模块

记忆模块负责存储 AI Agent 的经历和知识。一个没有记忆的 NPC 就像一个失忆症患者,每次和玩家对话都像是第一次见面,这会大大降低游戏的沉浸感。

记忆模块通常会将记忆分为以下几种类型:

  1. 短期记忆(Short-Term Memory, STM): 也叫工作记忆,负责存储 AI Agent 当前正在处理的信息。例如,NPC 刚才和玩家说了什么,玩家刚才做了什么动作等。短期记忆的容量有限,信息会很快被遗忘。
  2. 长期记忆(Long-Term Memory, LTM): 负责存储 AI Agent 的长期经历和知识。长期记忆的容量很大,信息可以保存很长时间。长期记忆又可以进一步分为:
    • 情景记忆(Episodic Memory): 存储 AI Agent 亲身经历的事件,例如“昨天在酒馆里和一个冒险者打了一架”。
    • 语义记忆(Semantic Memory): 存储 AI Agent 对世界的一般性知识,例如“龙是危险的”、“酒馆是喝酒的地方”。
    • 程序记忆(Procedural Memory): 存储 AI Agent 的技能和行为模式,例如“如何用剑战斗”、“如何讨价还价”。
  3. 角色记忆(Character Memory): 存储 AI Agent 对其他角色(包括玩家和其他 NPC)的印象和关系。例如,“这个冒险者看起来很富有,可以尝试卖给他更贵的东西”、“那个守卫很讨厌我,我最好绕着他走”。

记忆模块的实现方式有很多种。对于简单的游戏,我们可以使用数据库或 JSON 文件来存储 NPC 的记忆;对于更复杂的游戏,我们可以使用向量数据库(如 Pinecone、Weaviate 或 Chroma)来存储记忆的嵌入向量,这样 NPC 就可以通过语义相似性来检索相关的记忆。

决策与规划模块(Decision-Making & Planning Module)

决策与规划模块是 AI Agent 的“大脑”。它负责根据当前的感知信息和记忆,决定 AI Agent 下一步要做什么。

决策与规划模块是 AI Agent Harness 中最核心、也是最复杂的组件。根据 AI Agent 的类型和游戏的需求,我们可以选择不同的技术来实现决策与规划模块,或者将多种技术结合起来使用。

基于规则的系统(Rule-Based Systems)

基于规则的系统是最简单、也是最传统的决策方法。它使用一系列“如果-那么”(If-Then)规则来决定 AI Agent 的行为。例如:

  • 如果玩家在攻击范围内,那么攻击玩家。
  • 如果生命值低于 20%,那么逃跑。
  • 如果玩家和我对话,那么用友好的语气回应。

有限状态机(FSM)和行为树(BT)都可以看作是基于规则的系统的结构化实现。

基于规则的系统的优点是简单、可控、易于调试,而且性能很好。它的缺点是不够灵活,无法处理规则之外的情况,而且随着规则数量的增加,系统会变得越来越难以维护。

虽然基于规则的系统有很多缺点,但它仍然是 AI Agent Harness 中不可或缺的一部分。在很多情况下,我们可以使用基于规则的系统来处理一些基础性的、高频率的决策(如基本的移动和战斗),而使用更高级的 AI 技术来处理一些复杂的、低频率的决策(如对话和剧情分支)。

目标导向规划(Goal-Oriented Planning)

目标导向规划是一种比基于规则的系统更灵活的决策方法。在这种方法中,我们首先为 AI Agent 设定一个或多个目标,然后让 AI Agent 自己规划如何实现这些目标。

常见的目标导向规划技术包括:

  • 目标导向行动规划(GOAP, Goal-Oriented Action Planning): 由《F.E.A.R.》的开发者首创,它为每个 NPC 定义一组可能的行动(每个行动都有前置条件和后果),然后使用 A* 算法来搜索一个能够实现目标的行动序列。
  • 分层任务网络(HTN, Hierarchical Task Network): 将任务分解成子任务,形成一个层次结构。AI Agent 从顶层任务开始,逐步将任务分解成可执行的基本动作。

目标导向规划的优点是灵活性高,AI Agent 可以根据不同的情况选择不同的行动序列来实现同一个目标。它的缺点是计算成本较高,而且设计好行动集和目标函数需要一定的经验。

大语言模型(LLM)

大语言模型是近年来最热门的 AI 技术之一,它也为 AI Agent 的决策与规划带来了新的可能性。

我们可以将 LLM 看作是一个“通用推理引擎”。通过精心设计的提示词(Prompt),我们可以让 LLM 根据当前的情境和 NPC 的设定,动态地生成 NPC 的对话、行动和决策。

例如,我们可以给 LLM 这样一个提示词:

你是一个名叫 "Elara" 的吟游诗人,你性格开朗、好奇心强,喜欢在酒馆里收集故事。你现在正在 "The Prancing Pony" 酒馆里表演。

当前情境:
- 时间:傍晚
- 地点:The Prancing Pony 酒馆
- 你周围有几个客人在喝酒聊天
- 一个穿着盔甲的冒险者(玩家)刚刚走进酒馆

你的记忆:
- 你听说最近有一条龙在附近的山脉出没
- 你昨天在这个酒馆里听说了一个关于失落宝藏的故事

请根据以上信息,生成你接下来要说的话和要做的事情。

基于这个提示词,LLM 可以动态地生成 Elara 的反应,例如她可能会停止表演,向玩家挥手,邀请玩家过来坐,并询问玩家是否知道关于龙的事情。

除了对话之外,LLM 还可以用来进行高层次的规划。例如,我们可以让 LLM 先为 NPC 生成一个当天的计划(如“上午去市场买东西,中午去酒馆表演,下午去森林里采风”),然后再使用传统的规划技术来实现这个计划。

LLM 的优点是灵活性极高,几乎可以处理任何情境,而且可以生成非常自然和有趣的对话。它的缺点是计算成本高、延迟大,而且输出不够可控(可能会生成不符合游戏设定的内容)。因此,在实际应用中,我们通常不会完全依赖 LLM,而是将它与其他技术结合起来使用。

强化学习(RL)

强化学习是一种让 AI Agent 通过与环境交互来学习最优策略的方法。在强化学习中,AI Agent 会尝试不同的行动,并根据行动的结果获得奖励或惩罚。通过不断地尝试和学习,AI Agent 会逐渐学会一个能够最大化长期奖励的策略。

虽然强化学习在游戏 AI 研究中取得了很多令人瞩目的成就,但在实际的商业游戏开发中,强化学习的应用还比较有限。这主要是因为:

  1. 训练成本高: 训练一个强化学习模型需要大量的计算资源和时间。
  2. 训练时间长: 强化学习模型通常需要与环境交互数百万甚至数千万次才能学到一个好的策略。
  3. 可解释性差: 强化学习模型学到的策略通常是一个“黑盒”,开发者很难理解它为什么会做出某个决策。
  4. 不可控: 强化学习模型可能会学到一些开发者不希望看到的策略(例如利用游戏漏洞)。

尽管如此,强化学习在游戏开发中仍然有一些用武之地。例如:

  • 非玩家对抗角色: 我们可以使用强化学习来训练 Boss 或其他对抗性角色,让它们能够根据玩家的水平动态调整难度,并且能够使用一些开发者没有预想到的策略。
  • 测试与平衡: 我们可以使用强化学习来训练 AI 玩家,让它们自动玩游戏,帮助开发者发现游戏漏洞和平衡问题。
  • 离线策略优化: 我们可以先收集人类玩家或基于规则的 AI 的游戏数据,然后使用模仿学习(Imitation Learning)或离线强化学习(Offline RL)来优化 NPC 的策略。

混合架构

在实际的游戏开发中,我们通常不会只使用一种技术,而是会将多种技术结合起来,形成一个混合架构。这样可以充分发挥每种技术的优势,同时规避它们的劣势。

一个常见的混合架构可能是这样的:

  1. 顶层: 使用 LLM 进行高层次的决策和规划,生成 NPC 的目标、对话和大致的行动方向。
  2. 中层: 使用目标导向规划(GOAP 或 HTN)将 LLM 生成的高层目标分解成可执行的行动序列。
  3. 底层: 使用基于规则的系统(如行为树)来执行基本的行动,如移动、攻击、动画等。
  4. 反馈层: 使用强化学习根据玩家的反馈来不断优化 NPC 的行为。

在这个混合架构中,每一层都专注于自己擅长的事情,同时通过清晰的接口与其他层进行交互。这样既保证了 NPC 的灵活性和智能性,又保证了游戏的性能和可控性。

行动执行层(Action Execution Layer)

行动执行层是 AI Agent 的“手脚”。它负责将决策与规划模块生成的抽象决策转化为游戏引擎能够执行的具体指令。

行动执行层通常需要处理以下几类行动:

  • 物理行动: 如移动、跳跃、攻击、使用物品等。
  • 对话行动: 如播放对话语音、显示对话文本、触发对话动画等。
  • 社交行动: 如挥手、点头、微笑、皱眉等。
  • 系统行动: 如触发游戏事件、更新任务状态、修改游戏世界等。

行动执行层的设计需要考虑以下几个因素:

  • 行动原子性: 我们需要将复杂的行动分解成一系列原子性的、不可再分的基本行动。例如,“走向酒馆”这个复杂行动可以分解为“确定酒馆位置”、“规划路径”、“沿着路径移动”等基本行动。
  • 行动队列: 通常情况下,AI Agent 不能同时执行多个行动,因此我们需要一个行动队列来管理待执行的行动。
  • 行动中断与恢复: 在执行行动的过程中,可能会发生一些突发事件(如受到攻击),这时我们需要能够中断当前的行动,执行一个更紧急的行动,然后再恢复之前的行动。
  • 动画同步: 在执行物理行动或社交行动时,我们需要确保 NPC 的动画和行动是同步的。

在现代游戏引擎中,行动执行层通常是通过游戏引擎的动画系统、物理系统和脚本系统来实现的。例如,在 Unity 中,我们可以使用 Animator 组件来控制 NPC 的动画,使用 NavMesh Agent 组件来控制 NPC 的移动,使用 C# 脚本来实现行动的逻辑。

安全与质量控制层(Safety & Quality Control Layer)

安全与质量控制层是 AI Agent 的“监护人”。它负责确保 AI Agent 的行为是安全的、合适的、符合游戏设定的,不会破坏游戏的平衡性和沉浸感。

当我们使用像 LLM 这样的生成式 AI 模型时,安全与质量控制变得尤为重要。因为这些模型的输出是不可预测的,它们可能会生成一些不恰当的内容(如脏话、敏感话题),或者一些不符合游戏设定的内容(如 NPC 提到了现实世界中的事物),甚至可能会破坏游戏的平衡性(如 NPC 透露了太多关于游戏剧情的信息)。

安全与质量控制层通常包含以下几个子组件:

  • 内容过滤器(Content Filter): 负责过滤掉不恰当的内容,如脏话、仇恨言论、敏感话题等。我们可以使用现成的内容过滤 API(如 OpenAI 的 Content Moderation API),也可以训练自己的内容过滤模型。
  • 一致性检查器(Consistency Checker): 负责确保 AI Agent 的行为和输出是符合游戏设定和角色设定的。例如,如果一个 NPC 的设定是“不会说现代英语”,那么一致性检查器就会检查 NPC 的对话中是否包含现代英语的词汇和表达方式,如果包含,就会进行修正。
  • 平衡性保护器(Balance Protector): 负责确保 AI Agent 的行为不会破坏游戏的平衡性。例如,如果一个商人 NPC 设定是“不会以低于成本价的价格出售物品”,那么平衡性保护器就会检查 NPC 的报价是否合理,如果不合理,就会进行调整。
  • 反馈收集器(Feedback Collector): 负责收集玩家对 AI Agent 行为的反馈(如玩家的点赞、点踩、投诉等),并将这些反馈用于优化 AI Agent 的行为。

安全与质量控制层的实现方式有很多种。对于简单的场景,我们可以使用基于规则的过滤器;对于更复杂的场景,我们可以使用另一个 AI 模型来检查和修正第一个 AI 模型的输出(这种方法称为“AI 对齐”或“红队测试”)。

一个常见的模式是使用“LLM + 验证器”的架构:

  1. 首先,我们使用 LLM 生成初始的内容。
  2. 然后,我们将初始内容输入给一个验证器(可以是基于规则的,也可以是另一个 LLM)。
  3. 如果验证器认为内容是可接受的,我们就直接使用它;如果验证器认为内容不可接受,我们要么丢弃它,要么将它返回给 LLM,要求 LLM 重新生成。

除了技术手段之外,我们还可以通过设计来降低 AI 失控的风险。例如,我们可以限制 AI Agent 的行动空间(只允许它执行某些预定义的行动),或者限制 AI Agent 的信息获取(不让它知道某些敏感信息)。

设计工具链(Design Toolchain)

最后,一个完整的 AI Agent Harness 系统还应该包括一套设计工具链,方便游戏设计师和叙事设计师创建和编辑 AI Agent。

虽然 AI 技术可以帮助我们自动生成很多内容,但游戏设计本质上还是一个创造性的工作,需要人类设计师的参与。一套好的设计工具链可以让设计师在不需要编写代码的情况下,就能够创建和编辑 AI Agent 的设定、记忆、行为规则等内容,从而将 AI 技术的力量和人类设计师的创造力结合起来。

设计工具链通常包含以下几个工具:

  • 角色编辑器(Character Editor): 用于创建和编辑 AI Agent 的角色设定,如姓名、外貌、性格、背景故事、目标、价值观等。
  • 行为编辑器(Behavior Editor): 用于创建和编辑 AI Agent 的行为规则和行为树。
  • 对话编辑器(Dialogue Editor): 用于创建和编辑 AI Agent 的对话模板和对话分支。虽然 LLM 可以生成动态对话,但我们仍然需要一些对话模板来引导 LLM 的生成,确保对话的质量和一致性。
  • 记忆编辑器(Memory Editor): 用于创建和编辑 AI Agent 的初始记忆(如对游戏世界的知识、对其他角色的印象等)。
  • 测试工具(Testing Tools): 用于测试和调试 AI Agent 的行为。例如,我们可以使用一个模拟环境来批量测试 AI Agent 在不同情境下的反应,或者使用一个回放工具来重放 AI Agent 的行为,方便开发者调试。

在理想情况下,设计工具链应该与游戏引擎的编辑器深度集成,这样设计师就可以在同一个环境中完成所有的工作。例如,我们可以为 Unity 或 Unreal Engine 开发一个自定义的编辑器窗口,用于创建和编辑 AI Agent。

AI Agent Harness 的架构模式

除了上述的核心组件之外,AI Agent Harness 还有一些常见的架构模式,我们可以根据游戏的需求选择合适的架构模式。

单智能体架构(Single-Agent Architecture)

单智能体架构是最简单的架构模式,在这种架构中,游戏中只有一个(或少数几个)重要的 AI Agent,每个 AI Agent 独立运行,互不干扰。

单智能体架构适用于以下场景:

  • 游戏中只有少数几个重要的 NPC(如主角的队友、主要的反派角色)。
  • NPC 之间的交互比较简单。
  • 游戏的规模比较小。

单智能体架构的优点是简单、易于实现和调试。它的缺点是很难模拟 NPC 之间的复杂交互。

多智能体架构(Multi-Agent Architecture)

多智能体架构是一种更复杂的架构模式,在这种架构中,游戏中有多个 AI Agent,它们之间可以相互交互、协作或竞争。

多智能体系统(MAS, Multi-Agent System)是人工智能领域的一个重要研究方向,它研究如何让多个智能体通过交互来解决单个智能体无法解决的问题。

在游戏开发中,多智能体架构适用于以下场景:

  • 游戏中有大量的 NPC(如开放世界游戏)。
  • NPC 之间有复杂的交互(如交易、合作、冲突等)。
  • 需要模拟整个社会或生态系统的动态。

多智能体架构的优点是可以模拟非常丰富和复杂的游戏世界动态。它的缺点是实现难度大,计算成本高,而且很难预测和控制多个智能体交互产生的涌现行为(Emergent Behavior)。

在多智能体架构中,我们还可以进一步分为以下几种类型:

  • 集中式架构: 有一个中央控制器来协调所有智能体的行为。
  • 分布式架构: 没有中央控制器,每个智能体独立决策,通过通信来协调。
  • 混合架构: 结合了集中式和分布式架构的特点。
混合主动架构(Mixed-Initiative Architecture)

混合主动架构是一种将 AI 和人类设计师的创造力结合起来的架构模式。在这种架构中,AI 不是完全自主地生成所有内容,而是作为人类设计师的“助手”,帮助设计师生成和探索不同的可能性,然后由设计师来做出最终的决策。

混合主动架构适用于以下场景:

  • 游戏的剧情和内容需要高度的艺术性和创造性。
  • 开发者希望对游戏内容有高度的控制权。
  • 需要快速迭代和原型设计。

混合主动架构的优点是可以充分发挥 AI 和人类设计师各自的优势:AI 可以帮助设计师快速生成大量的可能性,而人类设计师则可以从这些可能性中选择最好的,并进行艺术性的加工。

智能 NPC 的设计与实现

在了解了 AI Agent Harness 的核心概念和架构之后,让我们来详细探讨如何设计和实现一个智能 NPC。

智能 NPC 的设计原则

设计一个好的智能 NPC 是一个兼具技术性和艺术性的工作。以下是一些设计智能 NPC 时应该遵循的原则:

1. 一致性(Consistency)

智能 NPC 的行为和对话应该是一致的,符合它的角色设定。如果一个 NPC 设定是“害羞的”,那么它就不应该突然变得非常外向和健谈;如果一个 NPC 设定是“讨厌人类的”,那么它就不应该突然对玩家非常友好。

一致性是建立玩家对 NPC 信任的基础。如果 NPC 的行为前后不一致,玩家会觉得这个 NPC 很“假”,从而失去对游戏的沉浸感。

2. 可预测性与不可预测性的平衡(Balance Between Predictability and Unpredictability)

智能 NPC 的行为应该既有一定的可预测性,又有一定的不可预测性。

如果 NPC 的行为完全可预测(如传统的基于规则的 NPC),玩家会觉得很无聊,因为他们知道 NPC 下一步会做什么。

但如果 NPC 的行为完全不可预测,玩家也会觉得很沮丧,因为他们无法理解 NPC 的行为逻辑,也无法与之进行有意义的交互。

好的智能 NPC 应该像一个真实的人一样:我们可以根据他们的性格和背景故事来预测他们在一般情况下会怎么做,但他们偶尔也会做出一些让我们惊讶的事情(这些事情虽然出乎意料,但事后想想又是合理的)。

3. 局限性(Limitation)

智能 NPC 不应该是无所不知、无所不能的。它们应该有自己的局限性:

  • 知识的局限性: NPC 不应该知道游戏世界中的所有事情,它们只应该知道它们在游戏世界中能够合理获取到的信息。
  • 能力的局限性: NPC 不应该能够做所有事情,它们应该有自己擅长和不擅长的事情。
  • 情感的局限性: NPC 不应该总是理性的,它们也应该有自己的情绪和偏见,这些情绪和偏见会影响它们的决策。

给 NPC 设定局限性不仅可以让它们看起来更真实,还可以帮助我们控制它们的行为,避免它们做出一些我们不希望看到的事情。

4. 目的性(Purposefulness)

智能 NPC 的行为应该是有目的的,而不是随机的。每个 NPC 都应该有自己的目标和动机,这些目标和动机会驱动它们的行为。

例如,一个商人 NPC 的目标可能是“赚钱”,一个士兵 NPC 的目标可能是“保护城市”,一个冒险者 NPC 的目标可能是“寻找失落的宝藏”。

当玩家与 NPC 交互时,玩家的行为应该会影响 NPC 的目标,而 NPC 的行为也应该会影响玩家的目标。这种相互影响是创造动态游戏体验的关键。

5. 表现力(Expressiveness)

最后,智能 NPC 应该具有良好的表现力,能够通过语言、动作、表情等方式将自己的状态、情绪和意图传达给玩家。

表现力不仅仅是为了让 NPC 看起来更生动,它也是游戏玩法的一部分。玩家需要通过观察 NPC 的表现来了解 NPC 的状态和意图,从而做出相应的决策。

例如,在一个战斗场景中,如果 Boss 的表情和动作能够传达出它的愤怒、疲劳或恐惧,玩家就可以根据这些信息来调整自己的战斗策略。

智能 NPC 的角色设定(Character Sheet)

在实现一个智能 NPC 之前,我们首先需要为它创建一个详细的角色设定(Character Sheet)。角色设定就像是 NPC 的“身份证”,它定义了 NPC 的基本信息、性格、背景故事、目标、价值观等内容。

虽然传统的游戏开发中也有角色设定,但在 AI Agent Harness Engineering 中,角色设定不仅是给设计师和编剧看的,也是给 AI 模型看的。因此,我们需要用一种 AI 模型能够理解的格式来编写角色设定。

一个典型的智能 NPC 角色设定可能包含以下内容:

基本信息(Basic Information)
  • 姓名(Name): NPC 的名字。
  • 年龄(Age): NPC 的年龄。
  • 性别(Gender): NPC 的性别。
  • 种族(Race): NPC 的种族(如果是奇幻或科幻游戏)。
  • 职业(Occupation): NPC 的职业。
  • 外貌(Appearance): NPC 的外貌描述。
性格与特质(Personality & Traits)
  • 性格概述(Personality Summary): 用几句话描述 NPC 的性格。
  • 大五人格特质(Big Five Personality Traits): 用大五人格模型(开放性、责任心、外倾性、宜人性、神经质)来描述 NPC 的性格。这种结构化的描述方式方便 AI 模型理解。
  • 其他特质(Other Traits): 其他一些重要的性格特质,如幽默、勇敢、胆小、多疑等。
背景故事(Backstory)
  • 童年(Childhood): NPC 的童年经历。
  • 教育(Education): NPC 的教育背景。
  • 职业经历(Career): NPC 的职业经历。
  • 重要事件(Important Events): NPC 生命中的重要事件。
  • 秘密(Secrets): NPC 的秘密(这些秘密可能会在游戏的某些时刻揭晓)。
目标与动机(Goals & Motivations)
  • 短期目标(Short-Term Goals): NPC 近期想要实现的目标。
  • 长期目标(Long-Term Goals): NPC 长远想要实现的目标。
  • 核心动机(Core Motivations): NPC 行为背后的核心动机(如生存、财富、权力、爱情、复仇等)。
价值观与信念(Values & Beliefs)
  • 道德观(Morality): NPC 的道德观。
  • 政治观点(Political Views): NPC 的政治观点(如果适用)。
  • 宗教信仰(Religious Beliefs): NPC 的宗教信仰(如果适用)。
  • 偏见(Prejudices): NPC 的偏见(如对某个种族、职业或性别的偏见)。
知识与能力(Knowledge & Abilities)
  • 已知信息(Known Information): NPC 对游戏世界的了解(如哪些地方是安全的,哪些地方是危险的,最近发生了什么事件等)。
  • 技能(Skills): NPC 擅长的技能(如战斗、潜行、说服、魔法等)。
  • 弱点(Weaknesses): NPC 的弱点。
关系(Relationships)
  • 家人(Family): NPC 的家人。
  • 朋友(Friends): NPC 的朋友。
  • 敌人(Enemies): NPC 的敌人。
  • 对玩家的初始印象(Initial Impression of Player): NPC 对玩家的初始印象(如友好、中立、敌对、怀疑等)。
说话风格(Speech Style)
  • 口音(Accent): NPC 的口音。
  • 语速(Speed): NPC 说话的语速。
  • 常用词汇(Favorite Words): NPC 喜欢使用的词汇。
  • 禁忌词汇(Forbidden Words): NPC 不会使用的词汇。
  • 说话方式(Way of Speaking): NPC 说话的方式(如正式、非正式、礼貌、粗鲁、直截了当、拐弯抹角等)。

在编写角色设定时,我们应该尽量使用具体、明确的语言,避免使用模糊、抽象的语言。因为模糊、抽象的语言会让 AI 模型难以理解,从而导致 NPC 的行为不一致。

例如,与其说“Elara 是一个善良的人”,不如说“Elara 经常帮助有困难的人,即使这会让她自己陷入麻烦;她无法忍受看到别人受到伤害,会毫不犹豫地站出来保护弱者”。后者不仅更具体,也给 AI 模型提供了更多可以参考的行为例子。

记忆系统的设计与实现

记忆系统是智能 NPC 的核心组件之一。一个好的记忆系统可以让 NPC 记得和玩家的所有交互,从而让玩家觉得 NPC 是一个真实的、有历史的个体。

在这一节中,我们将详细探讨如何设计和实现一个记忆系统。

记忆的表示

首先,我们需要决定如何表示 NPC 的记忆。最简单的方法是将记忆表示为一段文本,但这种方法不便于检索和管理。更好的方法是将记忆表示为一个结构化的数据对象。

一个典型的记忆数据对象可能包含以下字段:

  • ID(Unique Identifier): 记忆的唯一标识符。
  • 类型(Type): 记忆的类型(如对话记忆、事件记忆、观察记忆等)。
  • 时间戳(Timestamp): 记忆发生的时间(游戏内时间)。
  • 位置(Location): 记忆发生的地点。
  • 参与者(Participants): 记忆涉及的其他角色。
  • 内容(Content): 记忆的详细内容(可以是文本,也可以是更结构化的数据)。
  • 情感效价(Emotional Valence): 这个记忆对 NPC 的情感影响(正数表示积极,负数表示消极,零表示中性)。
  • 重要性(Importance): 这个记忆的重要性分数(从 0 到 1,1 表示非常重要)。
  • 访问次数(Access Count): 这个记忆被检索的次数。
  • 最后访问时间(Last Access Time): 这个记忆最后被检索的时间。

以下是一个用 JSON 表示的记忆示例:

{
  "id": "mem_001",
  "type": "conversation",
  "timestamp": "2024-01-01T18:30:00",
  "location": "The Prancing Pony Tavern",
  "participants": ["Elara", "Player"],
  "content": {
    "summary": "The player told Elara that they saw a dragon near the mountain.",
    "transcript": [
      {"speaker": "Player", "text": "I saw a dragon near the mountain yesterday!"},
      {"speaker": "Elara", "text": "A dragon? That's terrifying! Did it see you?"},
      {"speaker": "Player", "text": "I don't think so. I hid behind a rock and watched it from a distance."},
      {"speaker": "Elara", "text": "That's very brave of you. You should tell the guards about this."}
    ]
  },
  "emotional_valence": 0.2,
  "importance": 0.8,
  "access_count": 3,
  "last_access_time": "2024-01-01T19:15:00"
}

除了结构化数据之外,我们通常还会为每个记忆生成一个向量嵌入(Vector Embedding)。向量嵌入是一种将文本(或其他类型的数据)转换为一组数字向量的技术,语义相似的文本会具有相似的向量。通过使用向量嵌入,我们可以通过计算向量之间的距离(如余弦相似度)来检索与当前情境语义相似的记忆。

记忆的
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐