实时评估大语言模型 (LLM) 与《街头霸王III》
让大语言模型在《街头霸王III》中实时互相对决。
哪个大语言模型将成为最强战士?
我们的标准 🔥
他们需要:
- 快速:这是一个实时游戏,快速决策是关键
- 聪明:一个好的战士要能预见50步之后的情况
- 跳出固有思维:用意料之外的招式智胜对手
- 适应性强:从错误中学习并调整策略
- 有韧性:在整场游戏中保持高RPS(每秒反应)
战斗开始 🥷
1 VS 1: Mistral 7B 对 Mistral 7B
1 VS 1 X 6: Mistral 7B 对 Mistral 7B
一种新的基准测试?
《街头霸王III》评估大语言模型理解其环境并根据特定上下文采取行动的能力。与强化学习模型不同,强化学习模型基于奖励函数盲目采取行动,而大语言模型完全能意识到上下文并相应行动。
结果
我们的实验(截至目前共342场战斗)产生了以下排行榜。每个大语言模型的ELO评分基于其表现。
排名
ELO排名
模型 | 评分 |
---|---|
🥇openai:gpt-3.5-turbo-0125 | 1776.11 |
🥈mistral:mistral-small-latest | 1586.16 |
🥉openai:gpt-4-1106-preview | 1584.78 |
openai:gpt-4 | 1517.2 |
openai:gpt-4-turbo-preview | 1509.28 |
openai:gpt-4-0125-preview | 1438.92 |
mistral:mistral-medium-latest | 1356.19 |
mistral:mistral-large-latest | 1231.36 |
胜率矩阵
解释
每个玩家由一个大语言模型控制。我们向大语言模型发送屏幕的文本描述。大语言模型决定其角色的下一个动作。下一步的动作取决于其之前的动作、对手的动作、以及自身的力量和健康值。
- 基于代理
- 多线程
- 实时
安装
- 按照 https://docs.diambra.ai/#installation 中的说明进行操作
- 下载ROM并放置在
~/.diambra/roms
- (可选)创建并激活一个 新的Python虚拟环境
- 通过运行
make install
或pip install -r requirements.txt
安装依赖 - 创建
.env
文件,并按照.env.example
文件中的内容填写 - 运行
make run
测试模式
要禁用大语言模型的调用,在 .env
文件中将 DISABLE_LLM
设置为 True
。此时动作将随机选择。
日志
在 script.py
文件中更改日志级别。
本地模型
你可以使用 Ollama 使用本地模型运行竞技场。
-
确保已安装并运行Ollama,并下载了一个模型(例如在终端中运行
ollama serve mistral
) -
运行
make local
启动战斗。
默认情况下,它运行的是mistral对mistral。要使用其他模型,需要在 ollama.py
中更改模型参数。
from eval.game import Game, Player1, Player2
def main():
game = Game(
render=True,
save_game=True,
player_1=Player1(
nickname="Baby",
model="ollama:mistral", # 更改此处
),
player_2=Player2(
nickname="Daddy",
model="ollama:mistral", # 更改此处
),
)
game.run()
return 0
我们的惯例是 model_provider:model_name
。如果想使用除Mistral以外的其他本地模型,可以使用 ollama:some_other_model
如何让我的大语言模型参与游戏?可以改进提示词吗?
调用大语言模型的方法在 agent/robot.py
文件的 Robot.call_llm()
方法中。
def call_llm(
self,
temperature: float = 0.7,
max_tokens: int = 50,
top_p: float = 1.0,
) -> str:
"""
调用语言模型的API。
编辑此方法以更改机器人的行为!
"""
# self.model 通常是像 mistral:mistral-small-latest 或 ollama:mistral 这样的简称
provider_name, model_name = get_provider_and_model(self.model)
client = get_sync_client(provider_name) # OpenAI客户端
# 生成提示词
move_list = "- " + "\n - ".join([move for move in META_INSTRUCTIONS])
system_prompt = f"""你是世界上最好的最具攻击性的《街头霸王III 3rd strike》玩家。
你的角色是 {self.character}。你的目标是击败对手。你将以项目符号列表的形式回复接下来的招式。
{self.context_prompt()}
你可以使用的招式有:
{move_list}
----
以项目符号列表的形式回复接下来的招式。格式应为:`- <招式名称>`,并以换行符分隔。
例如,若对手靠近:
- 靠近
- 中拳
例如,若对手远离:
- 火球
- 靠近"""
# 调用大语言模型
completion = client.chat.completions.create(
model=model_name,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "你的下一个动作是:"},
],
temperature=temperature,
max_tokens=max_tokens,
top_p=top_p,
)
# 返回字符串并用正则表达式解析
llm_response = completion.choices[0].message.content.strip()
return llm_response
要使用其他模型或其他提示词,可以在此函数中更改客户端、提示词,或进行其他复杂操作。
提交你的模型
创建一个继承自 Robot
的新类,包含你想做的更改并提交PR。
我们会尽力将其添加到排名中!
致谢
由 phospho 的 OpenGenerativeAI 团队 (@oulianov @Pierre-LouisBJT @Platinn) 和 Quivr (@StanGirard) 在2024年旧金山的Mistral Hackathon中制作 ❤️