LLM-colosseum开发者访谈:如何设计大模型的战斗AI系统

LLM-colosseum开发者访谈:如何设计大模型的战斗AI系统

【免费下载链接】llm-colosseum Benchmark LLMs by fighting in Street Fighter 3! The new way to evaluate the quality of an LLM 【免费下载链接】llm-colosseum 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-colosseum

在AI领域,评估大模型能力的方式正在经历一场革命。今天我们将深入探讨一个创新项目——LLM-colosseum,它通过让大模型在《街头霸王III》中对战来评估其智能水平。这个项目不仅提供了一种全新的大模型评估范式,更为AI与游戏交互开辟了新的可能性。

项目概述:当AI遇见街头霸王

LLM-colosseum的核心创意是让大型语言模型(LLM)通过API控制《街头霸王III》中的角色进行实时对战。不同于传统的基准测试,这种方式能够评估AI的实时决策、环境理解和策略规划能力。

项目logo

项目的GitHub地址:https://gitcode.com/GitHub_Trending/ll/llm-colosseum

评估标准:AI战士的五大素质

根据项目README.md,一个优秀的AI战士需要具备以下关键能力:

  • 快速响应:实时游戏要求AI能在毫秒级时间内做出决策
  • 智能规划:像顶级玩家一样思考多步之后的战局发展
  • 创新思维:使用出其不意的招式打乱对手节奏
  • 适应能力:从失败中学习并调整策略
  • 持久战斗力:在整场比赛中保持高水平表现

系统架构:大模型如何玩转街霸

核心组件概览

LLM-colosseum的战斗AI系统主要由以下几个模块构成:

  • 游戏环境:基于Diambra Arena构建的《街头霸王III》环境
  • AI控制器agent/robot.py中的Robot类及其子类
  • 对战管理eval/game.py中的Game和Player类
  • 本地运行配置local.py中的模型配置和启动逻辑

战斗AI的工作流程

AI战士的战斗流程可以概括为"观察-规划-行动"三个阶段:

mermaid

  1. 观察阶段:AI通过视觉或文本形式获取游戏状态
  2. 规划阶段:调用LLM生成下一步行动序列
  3. 行动阶段:将AI决策转化为游戏操作并执行

核心技术解析:从代码看AI如何战斗

Robot类设计:AI战士的大脑

agent/robot.py中,我们定义了AI战士的抽象基类Robot,以及两个具体实现:TextRobotVisionRobot

class Robot(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def call_llm(self, max_tokens: int = 50, top_p: float = 1.0) -> Generator:
        """调用语言模型生成动作指令"""
        raise NotImplementedError("call_llm method must be implemented")
        
    @abc.abstractmethod
    def observe(self, observation: dict, actions: dict, reward: float):
        """观察游戏环境"""
        pass
        
    def plan(self) -> None:
        """规划下一步行动"""
        # 从LLM获取移动指令
        next_steps_from_llm = self.get_moves_from_llm()
        # 将移动转换为游戏按钮操作
        next_buttons_to_press = [
            button for combo in next_steps_from_llm
            for button in META_INSTRUCTIONS_WITH_LOWER[combo][self.current_direction.lower()]
            + [0] * NB_FRAME_WAIT  # 添加帧等待
        ]
        self.next_steps.extend(next_buttons_to_press)
        
    def act(self) -> int:
        """执行动作"""
        if not self.next_steps:
            return 0  # 无动作
        return self.next_steps.pop(0)

两种AI战士:文本型与视觉型

项目提供了两种不同类型的AI战士:

TextRobot:基于文本描述的AI

TextRobot通过文本描述理解游戏状态,适合纯文本大模型:

class TextRobot(Robot):
    def context_prompt(self) -> str:
        """生成包含游戏状态的文本提示"""
        # 位置提示
        # 能量提示
        # 上一动作提示
        # 分数提示
        return f"{position_prompt}\n{power_prompt}\n{last_action_prompt}\n{score_prompt}"
        
    def call_llm(self, max_tokens: int = 50, top_p: float = 1.0) -> Generator[ChatResponse, None, None]:
        """调用文本模型生成动作"""
        move_list = "- " + "\n - ".join([move for move in META_INSTRUCTIONS])
        system_prompt = f"""你是世界上最优秀的《街头霸王III》玩家。
你的角色是{self.character}。目标是击败对手。
{self.context_prompt()}
可用招式:
{move_list}
----
用项目符号列表回复招式,格式: `- <招式名称>`"""
        
        messages = [
            ChatMessage(role="system", content=system_prompt),
            ChatMessage(role="user", content="你的下一步招式是:")
        ]
        return client.stream_chat(messages)
VisionRobot:基于图像理解的AI

VisionRobot直接分析游戏画面,适合多模态大模型:

class VisionRobot(Robot):
    def last_image_to_image_node(self) -> ImageNode:
        """将游戏画面转换为模型可理解的图像节点"""
        rgb_array = self.observations[-1]["frame"]
        img = Image.fromarray(rgb_array)
        buffer = io.BytesIO()
        img.save(buffer, format="PNG")
        return ImageNode(
            image=base64.b64encode(buffer.getvalue()).decode("utf-8"),
            image_mimetype="image/png",
        )
        
    def call_llm(self, max_tokens: int = 50, top_p: float = 1.0) -> Generator[CompletionResponse, None, None]:
        """调用多模态模型生成动作"""
        move_list = "- " + "\n - ".join([move for move in META_INSTRUCTIONS])
        system_prompt = f"""你是世界上最优秀的《街头霸王III》玩家。
你的角色是{self.character}。目标是击败对手。
当前游戏状态如图所示。
可用招式:
{move_list}
----
用项目符号列表回复3个招式,格式: `- <招式名称>`"""
        
        return client.stream_complete(
            prompt=system_prompt, 
            image_documents=[self.last_image_to_image_node()]
        )

对战管理:Game类如何组织战斗

eval/game.py中的Game类负责协调整个对战过程:

class Game:
    def run(self):
        """运行游戏对战"""
        # 初始化线程处理AI决策
        player1_thread = PlanAndActPlayer1(game=self, episode=episode)
        player1_thread.start()
        player2_thread = PlanAndActPlayer2(game=self, episode=episode)
        player2_thread.start()
        
        # 主游戏循环
        while True:
            if self.render:
                self.env.render()
            # 执行AI生成的动作
            observation, reward, terminated, truncated, info = self.env.step(actions)
            # 检查游戏结束条件
            if terminated or truncated:
                self._determine_winner(episode)
                episode.save()
                break

多线程设计确保两个AI可以并行思考,不会相互阻塞,这对实时游戏至关重要。

本地运行与模型配置

通过local.py,我们可以配置本地模型进行对战:

def main():
    game = Game(
        render=True,
        save_game=True,
        player_1=Player1(
            nickname="Baby",
            model="ollama:mistral",  # 使用Ollama运行的本地模型
            robot_type="text",  # 文本型AI
            temperature=0.7,  # 控制AI的随机性
        ),
        player_2=Player2(
            nickname="Daddy",
            model="ollama:mistral",
            robot_type="text",
            temperature=0.7,
        ),
    )
    game.run()

实战数据:大模型战斗力排行榜

经过546场对战,项目得出了不同模型的ELO评分排行榜:

胜率矩阵

排名模型评分
1openai:gpt-4o:text1912.5
2openai:gpt-4o-mini:vision1835.27
3openai:gpt-4o-mini:text1670.89
4openai:gpt-4o:vision1656.93
5mistral:pixtral-large-latest:vision1654.61

有趣的是,多模态模型(vision)在某些情况下表现优于纯文本模型,这可能是因为它们能更直观地理解游戏画面。

结语:AI游戏对战的未来

LLM-colosseum项目展示了一种创新的大模型评估方法,通过游戏对战这种直观且富有趣味性的方式,我们可以更全面地评估AI的综合能力。未来,我们期待看到更多模型加入这场"AI街霸大赛",也期待社区能够贡献更多创新的AI战斗策略。

如果你也想让自己的AI模型参与这场街霸大赛,可以通过修改agent/robot.py中的提示词或决策逻辑,创建自定义的AI战士!

【免费下载链接】llm-colosseum Benchmark LLMs by fighting in Street Fighter 3! The new way to evaluate the quality of an LLM 【免费下载链接】llm-colosseum 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-colosseum

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值