⚔️

AI に League of Legends の最強新メタビルドを考えてもらいたかった

2024/06/28に公開

TL;DR

AI に League of Legends のビルドを考えてもらって実践したらボコボコに負けました。

対象読者

  • League of Legends をプレイしている人
  • LLM に興味がある人
  • Gemini 1.5 Pro に興味がある人
  • LLM で大きいデータを楽に扱いたい人

サモナーズリフトへようこそ

こんにちは。クラウドエース バックエンドエンジニアリング部 の伊藝です。

みなさんは、League of Legends をプレイされていますか?

League of Legends (LoL) とは、Riot Games が開発した 5 対 5 のマルチプレイヤーオンラインバトルアリーナ (MOBA) ゲームです。

私はほぼ毎日プレイしています。

https://www.leagueoflegends.com/ja-jp/

ゲームをプレイしていると、周りより強くなりたくなりますよね。

LoL は課金で強くなるゲームではなく、プレイヤー自身のスキルと知識が勝敗を分けるゲームです。

https://youtu.be/DCL07RAEglE

LoL では、チャンピオン (キャラクター) ごとにビルド (アイテム構成) があります。

ビルドを間違えてしまうと、強くなるどころか弱くなってしまいます。一般的には、ビルドは統計データやプロプレイヤーの動画を参考にして考えられます。

しかし、有名なビルドは対策方法も広く知られているため、新しいビルドを考えることも重要です。

そこで、今回は LLM (AI) に LoL のビルドを考えてもらいます。

環境

扱うデータ

League of Legends の Data Dragon という API を利用します。Data Dragon は LoL のチャンピオンやアイテムなどのデータを JSON で提供しています。

https://developer.riotgames.com/docs/lol#data-dragon

問題点

Data Dragon から全チャンピオンの詳細データとアイテムのデータを取得すると、合計で 2.5MB のデータになります。

LLM は、入力データが大きすぎるとトークンの制限に引っかかる可能性があります。

大きいデータを扱う際には、データを小さく分割して処理するか、データを圧縮するなどの対策が一般的です。

https://zenn.dev/buenotheebiten/articles/4ba927d896b9e1

しかし、今回利用する Gemini 1.5 Pro は 100 万という大量のトークンを扱えるため、データを分割せずとも扱うことができます。

コード

Data Dragon から取得したデータを LLM に渡してビルドを考えてもらいます。

LangChain というフレームワークを使うことで、LLM を簡単にアプリケーションに組み込むことができます。

https://www.langchain.com/

プロンプトでは「誰も考えたことがない、勝率 60% を超えるようなビルドを考えてください。」と指示しています。

コード
import json
from enum import StrEnum
from operator import itemgetter
from typing import Any, Dict, List, Optional, Union

import httpx
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import (
    RunnableParallel,
    RunnableSerializable,
)
from langchain_google_vertexai import ChatVertexAI
from pydantic import BaseModel, ConfigDict, Field

CHAMPIONS_JSON_URL = (
    "https://ddragon.leagueoflegends.com/cdn/14.12.1/data/en_US/champion.json"
)

CHAMPION_JSON_URL_FORMAT = (
    "https://ddragon.leagueoflegends.com/cdn/14.12.1/data/en_US/champion/{}.json"
)

ITEM_JSON_URL = "https://ddragon.leagueoflegends.com/cdn/14.12.1/data/en_US/item.json"

# API から取得するデータのスキーマ

class ChampionListDataInfo(BaseModel):
    model_config = ConfigDict(extra="forbid")
    attack: int
    defense: int
    magic: int
    difficulty: int


class Image(BaseModel):
    model_config = ConfigDict(extra="forbid")
    full: str
    sprite: str
    group: str
    x: int
    y: int
    w: int
    h: int


class ChampionListDataStats(BaseModel):
    model_config = ConfigDict(extra="forbid")
    hp: int
    hpperlevel: int
    mp: int
    mpperlevel: float
    movespeed: int
    armor: float
    armorperlevel: float
    spellblock: float
    spellblockperlevel: float
    attackrange: int
    hpregen: float
    hpregenperlevel: float
    mpregen: float
    mpregenperlevel: float
    crit: int
    critperlevel: int
    attackdamage: int
    attackdamageperlevel: float
    attackspeedperlevel: float
    attackspeed: float


class ChampionListData(BaseModel):
    model_config = ConfigDict(extra="forbid")
    version: str
    id: str
    key: str
    name: str
    title: str
    blurb: str
    info: ChampionListDataInfo
    image: Image
    tags: List[str]
    partype: str
    stats: ChampionListDataStats


class ChampionList(BaseModel):
    model_config = ConfigDict(extra="forbid")
    type: str
    format: str
    version: str
    data: Dict[str, ChampionListData]


class ChampionDetailDataSkin(BaseModel):
    model_config = ConfigDict(extra="forbid")
    id: str
    num: int
    name: str
    chromas: bool


class ChampionDetailDataLeveltip(BaseModel):
    model_config = ConfigDict(extra="forbid")
    label: List[str]
    effect: List[str]


class ChampionDetailDataSpell(BaseModel):
    model_config = ConfigDict(extra="forbid")
    id: str
    name: str
    description: str
    tooltip: str
    leveltip: Optional[ChampionDetailDataLeveltip] = None
    maxrank: int
    cooldown: List[float]
    cooldownBurn: str
    cost: List[int]
    costBurn: str
    datavalues: dict
    effect: List[Optional[List[float]]]
    effectBurn: List[Optional[str]]
    vars: List
    costType: str
    maxammo: str
    range: List[int]
    rangeBurn: str
    image: Image
    resource: Optional[str] = None


class ChampionDetailDataPassive(BaseModel):
    model_config = ConfigDict(extra="forbid")
    name: str
    description: str
    image: Image


class ChampionDetailDataInfo(BaseModel):
    model_config = ConfigDict(extra="forbid")
    attack: int
    defense: int
    magic: int
    difficulty: int


class ChampionDetailDataStats(BaseModel):
    model_config = ConfigDict(extra="forbid")
    hp: int
    hpperlevel: int
    mp: int
    mpperlevel: float
    movespeed: int
    armor: int
    armorperlevel: float
    spellblock: int
    spellblockperlevel: float
    attackrange: int
    hpregen: float
    hpregenperlevel: float
    mpregen: float
    mpregenperlevel: float
    crit: int
    critperlevel: int
    attackdamage: int
    attackdamageperlevel: float
    attackspeedperlevel: float
    attackspeed: float


class ChampionDetailData(BaseModel):
    model_config = ConfigDict(extra="forbid")
    id: str
    key: str
    name: str
    title: str
    image: Image
    skins: List[ChampionDetailDataSkin]
    lore: str
    blurb: str
    allytips: List[str]
    enemytips: List[str]
    tags: List[str]
    partype: str
    info: ChampionDetailDataInfo
    stats: ChampionDetailDataStats
    spells: List[ChampionDetailDataSpell]
    passive: ChampionDetailDataPassive
    recommended: List


class ChampionDetail(BaseModel):
    model_config = ConfigDict(extra="forbid")
    type: str
    format: str
    version: str
    data: Dict[str, ChampionDetailData]


class ItemListBasicRune(BaseModel):
    model_config = ConfigDict(extra="forbid")
    isrune: bool
    tier: int
    type: str


class ItemListDataGold(BaseModel):
    model_config = ConfigDict(extra="forbid")
    base: int
    total: int
    sell: int
    purchasable: bool


class ItemListBasic(BaseModel):
    model_config = ConfigDict(extra="forbid")
    name: str
    rune: ItemListBasicRune
    gold: ItemListDataGold
    group: str
    description: str
    colloq: str
    plaintext: str
    consumed: bool
    stacks: int
    depth: int
    consumeOnFull: bool
    from_: List[int] = Field(..., alias="from")
    into: List[int]
    specialRecipe: int
    inStore: bool
    hideFromAll: bool
    requiredChampion: str
    requiredAlly: str
    stats: Dict[str, float]
    tags: List[str]
    maps: Dict[str, bool]


class ItemListData(BaseModel):
    model_config = ConfigDict(extra="forbid")
    name: str
    description: str
    colloq: str
    plaintext: str
    stacks: Optional[int] = None
    consumed: Optional[bool] = None
    inStore: Optional[bool] = None
    into: Optional[List[int]] = None
    image: Image
    gold: ItemListDataGold
    tags: List[str]
    maps: Dict[str, bool]
    stats: Dict[str, Union[int, float]]
    depth: Optional[int] = None
    consumeOnFull: Optional[bool] = None
    from_: Optional[List[int]] = Field(None, alias="from")
    specialRecipe: Optional[int] = None
    hideFromAll: Optional[bool] = None
    requiredChampion: Optional[str] = None
    requiredAlly: Optional[str] = None
    effect: Optional[Dict[str, Union[int, float, str]]] = None


class ItemListGroup(BaseModel):
    model_config = ConfigDict(extra="forbid")
    id: str
    MaxGroupOwnable: str


class ItemListTree(BaseModel):
    model_config = ConfigDict(extra="forbid")
    header: str
    tags: List[str]


class ItemList(BaseModel):
    model_config = ConfigDict(extra="forbid")
    type: str
    version: str
    basic: ItemListBasic
    data: Dict[str, ItemListData]
    groups: List[ItemListGroup]
    tree: List[ItemListTree]


class ChampionBuildRole(StrEnum):
    TOP = "top"
    JUNGLE = "jungle"
    MIDDLE = "middle"
    BOTTOM = "bottom"
    SUPPORT = "support"


class ChampionBuild(BaseModel):
    champion: str
    role: ChampionBuildRole
    items: List[str]
    runes: List[str]
    description: str


class ChampionBuildList(BaseModel):
    builds: List[ChampionBuild]


# HTTP クライアント
http_client = httpx.Client()

# チャンピオンデータを取得
with open("./data/champions.json", "wb") as f:
    f.write(http_client.get(CHAMPIONS_JSON_URL).content)

# チャンピオンデータを読み込む
champion_list: ChampionList
with open("./data/champions.json", "r") as f:
    champion_list = ChampionList.model_validate_json(f.read())

# チャンピオン詳細データを取得
for champion in champion_list.data.values():
    print(champion.id)

    with open(f"./data/{champion.id}.json", "wb") as f:
        f.write(http_client.get(CHAMPION_JSON_URL_FORMAT.format(champion.id)).content)

# チャンピオンデータをリストに変換
champions: List[ChampionDetailData] = []
for champion_list_champion in champion_list.data.values():
    with open(f"./data/{champion_list_champion.id}.json", "r") as f:
        champion = ChampionDetail.model_validate_json(f.read())
        champions.append(champion.data[champion_list_champion.id])

# アイテムデータを取得
with open("./data/items.json", "wb") as f:
    f.write(http_client.get(ITEM_JSON_URL).content)

# アイテムデータを読み込む
items_list: ItemList
with open("./data/items.json", "r") as f:
    items_list = ItemList.model_validate_json(f.read())

# アイテムデータをリストに変換
items: List[ItemListData] = []
for item in items_list.data.values():
    items.append(item)

# プロンプトテンプレート
PROMPT_TEMPLATE = """You are a League of Legends professional AI.
You have access to the latest champion and item information.
Come up with 20 new amazing League of Legends off-meta builds that no one has ever thought of before and give me a win rate of over 60%.

Champions data:
```
{champions}
```

Items data:
```
{items}
```

Output example:
```
{{
    "builds": [
        {{
            "champion": "Aatrox",
            "role": "top",
            "items": ["Divine Sunderer", "Plated Steelcaps", "Goredrinker", "Sterak's Gage", "Death's Dance", "Guardian Angel"],
            "runes": ["Conqueror", "Triumph", "Legend: Tenacity", "Last Stand", "Ravenous Hunter", "Taste of Blood"],
            "description": "This build focuses on survivability and sustain, allowing Aatrox to stay in fights longer and deal more damage over time."
        }},
        {{
            "champion": "Zed",
            "role": "middle",
            "items": ["Duskblade of Draktharr", "Serylda's Grudge", "The Collector", "Youmuu's Ghostblade", "Edge of Night", "Guardian Angel"],
            "runes": ["Electrocute", "Sudden Impact", "Eyeball Collection", "Ravenous Hunter", "Presence of Mind", "Coup de Grace"],
            "description": "This build focuses on burst damage and lethality, allowing Zed to assassinate squishy targets quickly."
        }},
        ...
    ]
}}
```

Output schema:
```
{output_schema}
```

Output:
"""

# プロンプト
PROMPT = ChatPromptTemplate.from_template(PROMPT_TEMPLATE)

# LLM
llm = ChatVertexAI(
    model_name="gemini-1.5-pro",
)

# 出力パーサー
output_parser = PydanticOutputParser[ChampionBuildList](
    pydantic_object=ChampionBuildList,
)

# プロンプト、LLM、出力パーサーを chain として繋げる
chain: RunnableSerializable[Dict[str, Any], ChampionBuildList] = (
    RunnableParallel(
        {
            "champions": itemgetter("champions"),
            "items": itemgetter("items"),
            "output_schema": lambda _: json.dumps(
                ChampionBuildList.model_json_schema()
            ),
        }
    )
    | PROMPT
    | llm
    | output_parser
)

# chain を実行
result = chain.invoke(
    input={
        "champions": json.dumps([champion.model_dump_json() for champion in champions]),
        "items": json.dumps([item.model_dump_json() for item in items]),
    },
)

# 結果を出力
print(result.model_dump_json(indent=4))

結果

LLM にビルドを考えてもらうことに成功しました。様々なユニークなビルドが提案されました。

ダリウス (Darius) Jungle に関しては、あまり一般的ではありませんが自分のお気に入りのビルドに近いです。

しかし、アイテムの情報が古いものになっている (削除されたアイテムが含まれる) など、不確実な部分もあります。

結果
{
  "builds": [
    {
      "champion": "Ahri",
      "description": "This off-meta build turns Ahri into a mobile support with strong poke and utility. The combination of Imperial Mandate, Shurelya's Battlesong, and Ardent Censer provides a potent boost to allied damage, while Staff of Flowing Water and Redemption offer additional healing and shielding. Runes like Summon Aery and Scorch enhance her poke potential, while Presence of Mind ensures she has the mana to spam her abilities.",
      "items": [
        "Imperial Mandate",
        "Shurelya's Battlesong",
        "Ardent Censer",
        "Ionian Boots of Lucidity",
        "Staff of Flowing Water",
        "Redemption"
      ],
      "role": "support",
      "runes": [
        "Summon Aery",
        "Manaflow Band",
        "Transcendence",
        "Scorch",
        "Presence of Mind",
        "Coup de Grace"
      ]
    },
    {
      "champion": "Akali",
      "description": "This high-risk, high-reward build transforms Akali into a powerful magic damage jungler with high burst and mobility. Night Harvester and Lich Bane allow her to quickly clear camps and deal significant burst damage, while Rabadon's Deathcap and Void Staff maximize her ability power. Zhonya's Hourglass offers a critical defensive option. Runes like Dark Harvest and Ravenous Hunter synergize with her playstyle, while Transcendence and Gathering Storm provide scaling.",
      "items": [
        "Night Harvester",
        "Sorcerer's Shoes",
        "Lich Bane",
        "Rabadon's Deathcap",
        "Void Staff",
        "Zhonya's Hourglass"
      ],
      "role": "jungle",
      "runes": [
        "Dark Harvest",
        "Sudden Impact",
        "Eyeball Collection",
        "Ravenous Hunter",
        "Transcendence",
        "Gathering Storm"
      ]
    },
    {
      "champion": "Alistar",
      "description": "This tanky build focuses on turning Alistar into a disruptive force in the mid lane. Sunfire Aegis, Thornmail, and Demonic Embrace provide him with high damage and tankiness, while Mercury's Treads, Force of Nature, and Abyssal Mask offer resilience against magic damage. Aftershock and Font of Life synergize with his engage potential, while Second Wind and Overgrowth provide sustain. Transcendence and Gathering Storm offer scaling.",
      "items": [
        "Sunfire Aegis",
        "Thornmail",
        "Demonic Embrace",
        "Mercury's Treads",
        "Force of Nature",
        "Abyssal Mask"
      ],
      "role": "middle",
      "runes": [
        "Aftershock",
        "Font of Life",
        "Second Wind",
        "Overgrowth",
        "Transcendence",
        "Gathering Storm"
      ]
    },
    {
      "champion": "Amumu",
      "description": "This build utilizes Amumu's natural tankiness to make him a surprisingly effective bottom laner. Sunfire Aegis, Thornmail, and Demonic Embrace provide him with damage and tankiness, while Plated Steelcaps, Force of Nature, and Abyssal Mask offer resilience against magic damage. Aftershock and Font of Life synergize with his engage potential, while Conditioning and Overgrowth offer additional tankiness. Triumph and Legend: Tenacity boost his survivability in teamfights.",
      "items": [
        "Sunfire Aegis",
        "Thornmail",
        "Demonic Embrace",
        "Plated Steelcaps",
        "Force of Nature",
        "Abyssal Mask"
      ],
      "role": "bottom",
      "runes": [
        "Aftershock",
        "Font of Life",
        "Conditioning",
        "Overgrowth",
        "Triumph",
        "Legend: Tenacity"
      ]
    },
    {
      "champion": "Annie",
      "description": "This unique build allows Annie to function as a burst mage jungler. Predator grants her exceptional ganking potential, while Cheap Shot and Eyeball Collection amplify her burst damage. Night Harvester, Rabadon's Deathcap, and Void Staff maximize her ability power, while Zhonya's Hourglass and Morellonomicon offer defensive options. Relentless Hunter provides movement speed for roaming, and Absolute Focus and Gathering Storm offer scaling.",
      "items": [
        "Night Harvester",
        "Sorcerer's Shoes",
        "Rabadon's Deathcap",
        "Void Staff",
        "Zhonya's Hourglass",
        "Morellonomicon"
      ],
      "role": "jungle",
      "runes": [
        "Predator",
        "Cheap Shot",
        "Eyeball Collection",
        "Relentless Hunter",
        "Absolute Focus",
        "Gathering Storm"
      ]
    },
    {
      "champion": "Ashe",
      "description": "This build focuses on Ashe's long range poke and utility in the mid lane. Imperial Mandate, Liandry's Anguish, and Rylai's Crystal Scepter amplify her poke and slow enemies, while Ionian Boots of Lucidity and Morellonomicon provide cooldown reduction and Grievous Wounds. Arcane Comet and Scorch enhance her poke, while Manaflow Band and Biscuit Delivery offer mana sustain. Transcendence and Cosmic Insight boost her ability haste and summoner spell cooldown reduction.",
      "items": [
        "Imperial Mandate",
        "Liandry's Anguish",
        "Rylai's Crystal Scepter",
        "Ionian Boots of Lucidity",
        "Morellonomicon",
        "Zhonya's Hourglass"
      ],
      "role": "middle",
      "runes": [
        "Arcane Comet",
        "Manaflow Band",
        "Transcendence",
        "Scorch",
        "Biscuit Delivery",
        "Cosmic Insight"
      ]
    },
    {
      "champion": "Aurelion Sol",
      "description": "This build allows Aurelion Sol to function as a poke support who scales well into the late game. Imperial Mandate, Ardent Censer, and Athene's Unholy Grail amplify his poke and support his carry, while Redemption and Mikael's Blessing offer additional utility. Summon Aery and Scorch enhance his poke potential, while Presence of Mind ensures he has the mana to spam his abilities. Transcendence and Coup de Grace provide scaling.",
      "items": [
        "Imperial Mandate",
        "Ardent Censer",
        "Athene's Unholy Grail",
        "Ionian Boots of Lucidity",
        "Redemption",
        "Mikael's Blessing"
      ],
      "role": "support",
      "runes": [
        "Summon Aery",
        "Manaflow Band",
        "Transcendence",
        "Scorch",
        "Presence of Mind",
        "Coup de Grace"
      ]
    },
    {
      "champion": "Azir",
      "description": "This unconventional build focuses on Azir's sustained damage and control in the jungle. Liandry's Anguish, Demonic Embrace, and Rylai's Crystal Scepter synergize with his soldiers to deal significant damage over time and slow enemies, while Nashor's Tooth provides additional attack speed and on-hit damage. Zhonya's Hourglass offers a critical defensive option. Conqueror, Presence of Mind, and Legend: Tenacity boost his survivability in extended fights, while Transcendence and Gathering Storm provide scaling.",
      "items": [
        "Liandry's Anguish",
        "Demonic Embrace",
        "Rylai's Crystal Scepter",
        "Sorcerer's Shoes",
        "Nashor's Tooth",
        "Zhonya's Hourglass"
      ],
      "role": "jungle",
      "runes": [
        "Conqueror",
        "Presence of Mind",
        "Legend: Tenacity",
        "Coup de Grace",
        "Transcendence",
        "Gathering Storm"
      ]
    },
    {
      "champion": "Bard",
      "description": "This highly mobile build transforms Bard into a burst mage jungler, utilizing his chimes and portals for quick rotations and surprise ganks. Runic Echoes allows for efficient camp clearing, while Lich Bane adds burst damage to his auto attacks after using abilities. Rabadon's Deathcap and Void Staff maximize his magic damage, while Zhonya's Hourglass offers a critical defensive option. Electrocute, Cheap Shot, and Eyeball Collection provide burst damage, while Ravenous Hunter, Transcendence, and Gathering Storm offer sustain and scaling.",
      "items": [
        "Runic Echoes",
        "Sorcerer's Shoes",
        "Lich Bane",
        "Rabadon's Deathcap",
        "Void Staff",
        "Zhonya's Hourglass"
      ],
      "role": "jungle",
      "runes": [
        "Electrocute",
        "Cheap Shot",
        "Eyeball Collection",
        "Ravenous Hunter",
        "Transcendence",
        "Gathering Storm"
      ]
    },
    {
      "champion": "Blitzcrank",
      "description": "This build focuses on Blitzcrank's surprising mobility and engage potential in the jungle. Cinderhulk provides health and sustain, Mobility Boots enhance his roaming speed, while Dead Man's Plate and Thornmail add damage and tankiness. Warmog's Armor and Force of Nature further increase his survivability. Predator allows him to quickly close in on gank targets, while Cheap Shot and Eyeball Collection amplify his burst damage. Relentless Hunter provides additional movement speed for ganks, while Triumph and Legend: Tenacity increase his survivability in teamfights.",
      "items": [
        "Cinderhulk",
        "Mobility Boots",
        "Dead Man's Plate",
        "Thornmail",
        "Warmog's Armor",
        "Force of Nature"
      ],
      "role": "jungle",
      "runes": [
        "Predator",
        "Cheap Shot",
        "Eyeball Collection",
        "Relentless Hunter",
        "Triumph",
        "Legend: Tenacity"
      ]
    },
    {
      "champion": "Brand",
      "description": "This build capitalizes on Brand's powerful area-of-effect damage and turns him into a strong, magic-damage jungler. Runic Echoes allows for efficient camp clearing, while Liandry's Anguish amplifies his burn damage, especially against tankier targets. Rabadon's Deathcap and Void Staff maximize his magic damage output, while Morellonomicon provides Grievous Wounds to counter healing. Dark Harvest synergizes well with his burst damage, and Cheap Shot, Eyeball Collection, and Ravenous Hunter enhance his damage output. Transcendence and Gathering Storm offer scaling.",
      "items": [
        "Runic Echoes",
        "Sorcerer's Shoes",
        "Liandry's Anguish",
        "Rabadon's Deathcap",
        "Void Staff",
        "Morellonomicon"
      ],
      "role": "jungle",
      "runes": [
        "Dark Harvest",
        "Cheap Shot",
        "Eyeball Collection",
        "Ravenous Hunter",
        "Transcendence",
        "Gathering Storm"
      ]
    },
    {
      "champion": "Braum",
      "description": "This build utilizes Braum's natural tankiness and crowd control to make him a potent engage tank in the jungle. Cinderhulk provides health and sustain for jungling, Mobility Boots enhance his ganking speed, while Dead Man's Plate and Thornmail add damage and tankiness. Warmog's Armor and Force of Nature further bolster his survivability. Aftershock synergizes well with his engage, while Font of Life provides extra utility for his team. Conditioning and Overgrowth offer additional tankiness, while Triumph and Legend: Tenacity enhance his survivability in teamfights.",
      "items": [
        "Cinderhulk",
        "Mobility Boots",
        "Dead Man's Plate",
        "Thornmail",
        "Warmog's Armor",
        "Force of Nature"
      ],
      "role": "jungle",
      "runes": [
        "Aftershock",
        "Font of Life",
        "Conditioning",
        "Overgrowth",
        "Triumph",
        "Legend: Tenacity"
      ]
    },
    {
      "champion": "Caitlyn",
      "description": "This off-meta build turns Caitlyn into a long-range poke support with powerful utility. Glacial Augment synergizes with her traps and net, creating potent slows for her team to follow up. Imperial Mandate amplifies allied damage on slowed targets, while Galeforce and Rapid Firecannon offer mobility and additional poke damage. Runes like Magical Footwear, Biscuit Delivery, and Cosmic Insight enhance her laning phase and provide sustain.",
      "items": [
        "Imperial Mandate",
        "Galeforce",
        "Rapid Firecannon",
        "Ionian Boots of Lucidity",
        "Mortal Reminder",
        "Guardian Angel"
      ],
      "role": "support",
      "runes": [
        "Glacial Augment",
        "Magical Footwear",
        "Biscuit Delivery",
        "Cosmic Insight",
        "Absolute Focus",
        "Gathering Storm"
      ]
    },
    {
      "champion": "Camille",
      "description": "This build focuses on Camille's ability to duel and thrive in extended fights as a bottom laner. Divine Sunderer, Trinity Force, and Sterak's Gage provide a mix of damage, sustain, and tankiness, allowing her to trade effectively and survive burst. Plated Steelcaps, Death's Dance, and Guardian Angel offer additional survivability. Grasp of the Undying, Shield Bash, and Bone Plating enhance her laning phase and sustain, while Triumph and Legend: Alacrity provide combat stats. Overgrowth increases her late-game tankiness.",
      "items": [
        "Divine Sunderer",
        "Plated Steelcaps",
        "Trinity Force",
        "Sterak's Gage",
        "Death's Dance",
        "Guardian Angel"
      ],
      "role": "bottom",
      "runes": [
        "Grasp of the Undying",
        "Shield Bash",
        "Bone Plating",
        "Overgrowth",
        "Triumph",
        "Legend: Alacrity"
      ]
    },
    {
      "champion": "Cassiopeia",
      "description": "This build focuses on maximizing Cassiopeia's damage over time and crowd control as a support, enabling her to harass and lock down enemies. Liandry's Anguish, Rylai's Crystal Scepter, and Demonic Embrace enhance her damage output, while Morellonomicon provides Grievous Wounds to counter healing. Zhonya's Hourglass offers a critical defensive option. Summon Aery and Scorch enhance her poke potential, while Presence of Mind ensures she has the mana to sustain her abilities. Transcendence and Coup de Grace offer scaling.",
      "items": [
        "Liandry's Anguish",
        "Rylai's Crystal Scepter",
        "Morellonomicon",
        "Ionian Boots of Lucidity",
        "Demonic Embrace",
        "Zhonya's Hourglass"
      ],
      "role": "support",
      "runes": [
        "Summon Aery",
        "Manaflow Band",
        "Transcendence",
        "Scorch",
        "Presence of Mind",
        "Coup de Grace"
      ]
    },
    {
      "champion": "Cho'Gath",
      "description": "This build capitalizes on Cho'Gath's tankiness and crowd control to make him a formidable peel support. Knight's Vow allows him to redirect damage to himself and protect his carry, Frozen Heart and Thornmail offer high armor and reduce enemy attack speed, while Plated Steelcaps and Abyssal Mask provide magic resist. Aftershock synergizes with his knock-up, Font of Life offers extra utility, and Conditioning and Overgrowth increase his tankiness. Triumph and Legend: Tenacity boost his survivability in teamfights.",
      "items": [
        "Knight's Vow",
        "Frozen Heart",
        "Thornmail",
        "Plated Steelcaps",
        "Abyssal Mask",
        "Warmog's Armor"
      ],
      "role": "support",
      "runes": [
        "Aftershock",
        "Font of Life",
        "Conditioning",
        "Overgrowth",
        "Triumph",
        "Legend: Tenacity"
      ]
    },
    {
      "champion": "Corki",
      "description": "This build focuses on Corki's poke damage and utility in the support role. Imperial Mandate, Ardent Censer, and Athene's Unholy Grail amplify his poke and healing potential, while Ionian Boots of Lucidity, Redemption, and Mikael's Blessing provide additional utility for his team. Summon Aery and Scorch enhance his poke, while Presence of Mind ensures he has the mana to sustain his abilities. Transcendence and Coup de Grace provide scaling.",
      "items": [
        "Imperial Mandate",
        "Ardent Censer",
        "Athene's Unholy Grail",
        "Ionian Boots of Lucidity",
        "Redemption",
        "Mikael's Blessing"
      ],
      "role": "support",
      "runes": [
        "Summon Aery",
        "Manaflow Band",
        "Transcendence",
        "Scorch",
        "Presence of Mind",
        "Coup de Grace"
      ]
    },
    {
      "champion": "Darius",
      "description": "This bruiser build allows Darius to effectively jungle and dominate teamfights. Goredrinker and Black Cleaver provide sustain, damage, and armor shred, while Sterak's Gage offers survivability. Mercury's Treads, Dead Man's Plate, and Thornmail provide a mix of mobility, tankiness, and damage reflection. Conqueror, Triumph, and Last Stand synergize with his fighting style, while Ravenous Hunter and Taste of Blood enhance his sustain.",
      "items": [
        "Goredrinker",
        "Black Cleaver",
        "Sterak's Gage",
        "Mercury's Treads",
        "Dead Man's Plate",
        "Thornmail"
      ],
      "role": "jungle",
      "runes": [
        "Conqueror",
        "Triumph",
        "Legend: Tenacity",
        "Last Stand",
        "Ravenous Hunter",
        "Taste of Blood"
      ]
    },
    {
      "champion": "Diana",
      "description": "This high-attack speed build turns Diana into an aggressive on-hit carry for the bottom lane. Kraken Slayer provides on-hit damage, Berserker's Greaves, Runaan's Hurricane, and Phantom Dancer maximize her attack speed, while Infinity Edge and Guardian Angel offer damage and survivability. Lethal Tempo synergizes with her attack speed, Presence of Mind ensures she has the mana to spam abilities, and Legend: Alacrity further boosts her attack speed. Triumph and Legend: Bloodline provide sustain and survivability.",
      "items": [
        "Kraken Slayer",
        "Berserker's Greaves",
        "Runaan's Hurricane",
        "Infinity Edge",
        "Phantom Dancer",
        "Guardian Angel"
      ],
      "role": "bottom",
      "runes": [
        "Lethal Tempo",
        "Presence of Mind",
        "Legend: Alacrity",
        "Coup de Grace",
        "Triumph",
        "Legend: Bloodline"
      ]
    }
  ]
}

実際に使ってみた

3 連敗しました。

まとめ

LLM に大きいデータをまとめて与えて、LoL のビルドを考えてもらうことができました。

問題点として、アイテムの情報が古いものになっているなど、不確実な部分もありました。また、ビルドの提案はユニークなものが多かったですが、実際に使うと弱かったです。

LoL で勝ちたい人は、op.gg などの統計サイトで最新のビルドを確認することをおすすめします。

また、ユニークなビルドを試すときには、チームメイトに迷惑をかけないように注意しましょう。

https://www.op.gg/champions

Discussion