diff --git a/Gemma/README.md b/Gemma/README.md index bf3da7e..89f59ee 100644 --- a/Gemma/README.md +++ b/Gemma/README.md @@ -48,6 +48,7 @@ This folder is organized into several categories, each focusing on a speicific a | [[Gemma_3]Using_with_Ollama_Python_Inference_with_Images.ipynb]([Gemma_3]Using_with_Ollama_Python_Inference_with_Images.ipynb) | Run inference with images on Gemma 3 using [Ollama Python library](https://github.com/ollama/ollama-python). | | [[Gemma_3]Using_with_Transformersjs.ipynb]([Gemma_3]Using_with_Transformersjs.ipynb) | Run Gemma 3 with [Transformers.js](https://github.com/huggingface/transformers.js). | | [[Gemma_3]Activation_Hacking.ipynb]([Gemma_3]Activation_Hacking.ipynb) | Examine and modify internal states, including the residual stream, MLP activations, and attention mechanisms. | +| [[Gemma_3]Chess.ipynb]([Gemma_3]Chess.ipynb) | Gemma \| Chess: Learn, Analyze, and Discover a New Dimension! | ## Prompting | Notebook Name | Description | diff --git a/Gemma/[Gemma_3]Chess.ipynb b/Gemma/[Gemma_3]Chess.ipynb new file mode 100644 index 0000000..b2d6391 --- /dev/null +++ b/Gemma/[Gemma_3]Chess.ipynb @@ -0,0 +1,770 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "ELAK3D1hLdI3" + }, + "source": [ + "# Gemma Chess: Discover a New Dimension!\n", + "\n", + "\n", + " \n", + "
\n", + " Run in Google Colab\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "f6-oFLQoJ-_w" + }, + "outputs": [], + "source": [ + "!pip install gemma\n", + "!pip install python-chess cairosvg" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZsVR0WwVLbeb" + }, + "source": [ + "## Load Gemma 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "bWuOztoZLPDv" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/root/.cache/kagglehub/models/google/gemma-3/flax/gemma3-12b-it/1\n", + "CKPT_PATH: /root/.cache/kagglehub/models/google/gemma-3/flax/gemma3-12b-it/1/gemma3-12b-it\n", + "TOKENIZER_PATH: /root/.cache/kagglehub/models/google/gemma-3/flax/gemma3-12b-it/1/tokenizer.model\n" + ] + } + ], + "source": [ + "import os\n", + "from google.colab import userdata\n", + "\n", + "# Note: `userdata.get` is a Colab API. If you're not using Colab, set the env\n", + "# vars as appropriate for your system.\n", + "os.environ[\"KAGGLE_USERNAME\"] = userdata.get(\"KAGGLE_USERNAME\")\n", + "os.environ[\"KAGGLE_KEY\"] = userdata.get(\"KAGGLE_KEY\")\n", + "\n", + "# Avoid memory fragmentation on JAX\n", + "os.environ[\"XLA_PYTHON_CLIENT_MEM_FRACTION\"] = \"1.00\"\n", + "\n", + "import kagglehub\n", + "\n", + "GEMMA_VARIANT = \"gemma3-12b-it\"\n", + "GEMMA_PATH = kagglehub.model_download(f'google/gemma-3/flax/{GEMMA_VARIANT}')\n", + "print(GEMMA_PATH)\n", + "CKPT_PATH = os.path.join(GEMMA_PATH, GEMMA_VARIANT)\n", + "TOKENIZER_PATH = os.path.join(GEMMA_PATH, 'tokenizer.model')\n", + "print('CKPT_PATH:', CKPT_PATH)\n", + "print('TOKENIZER_PATH:', TOKENIZER_PATH)\n", + "\n", + "# Load model parameters and tokenizer\n", + "from gemma import gm\n", + "\n", + "model = gm.nn.Gemma3_12B()\n", + "params = gm.ckpts.load_params(CKPT_PATH)\n", + "tokenizer = gm.text.Gemma3Tokenizer(TOKENIZER_PATH)\n", + "\n", + "chatbot = gm.text.ChatSampler(\n", + " model=model,\n", + " params=params,\n", + " multi_turn=False,\n", + " tokenizer=tokenizer,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YlbELEIuRgg8" + }, + "source": [ + "## Helper functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "UIxaX6WXRf6X" + }, + "outputs": [ + { + "data": { + "image/jpeg": "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\n", + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import chess\n", + "import chess.svg\n", + "\n", + "board = chess.Board()\n", + "\n", + "from cairosvg import svg2png\n", + "from io import BytesIO\n", + "from PIL import Image\n", + "\n", + "def get_board_img(board):\n", + " out = BytesIO()\n", + " svg2png(chess.svg.board(board=board), write_to=out)\n", + " return Image.open(out)\n", + "\n", + "import re\n", + "\n", + "def extract_code_blocks(text):\n", + " \"\"\"\n", + " Extracts code blocks enclosed in triple backticks\n", + " \"\"\"\n", + " code_block_regex = r\"`(.*?)`\"\n", + " blocks = re.findall(code_block_regex, text, re.DOTALL)\n", + "\n", + " cleaned_blocks = []\n", + " for block in blocks:\n", + " if len(block) <= 0:\n", + " continue\n", + "\n", + " # Remove optional language specifier\n", + " clean_block = block.strip()\n", + " if '\\n' in clean_block:\n", + " clean_block = clean_block.split('\\n', 1)[1]\n", + " else:\n", + " clean_block = clean_block\n", + " cleaned_blocks.append(clean_block.strip())\n", + "\n", + " return cleaned_blocks\n", + "\n", + "def build_prompt():\n", + " prompt = f\"\"\"\n", + "If you decide to invoke any of the function(s), it should be wrapped with ```tool_code```.\n", + "\n", + "You have access to the following tools.\n", + "\n", + "* `board.push_san(move:str)`: Make a move in standard algebraic notation)\n", + "\n", + "{'BLACK' if board.turn == chess.BLACK else 'WHITE'} to move.\n", + "Possible moves are {list(board.legal_moves)}.\n", + "Make your move.\n", + "\"\"\"\n", + " print(prompt)\n", + " return prompt\n", + "\n", + "def build_prompt_rev():\n", + " prompt = f\"\"\"If you decide to invoke any of the function(s), it should be wrapped with ```tool_code```.\n", + "\n", + "You have access to the following tools.\n", + "\n", + "* `get_best_move()`: Get the best move from the engine.\n", + "\n", + "{'BLACK' if board.turn == chess.BLACK else 'WHITE'} to move.\n", + "Get the next best move and explain it easy enough for five year old.\n", + "\"\"\"\n", + " return prompt\n", + "\n", + "get_board_img(board)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "n8c2AG57F2Dt" + }, + "source": [ + "# Explainer" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ESM5EfdoF5hz" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Okay, let's analyze this game between Kasparov and Deep Blue and pinpoint the most interesting move. Given the context of this match (Kasparov vs. a supercomputer), the moves that stand out are those that demonstrate either Kasparov's strategic brilliance or Deep Blue's surprising (or flawed) calculations.\n", + "\n", + "After careful consideration, I believe **32. g6** is the most interesting move. Here's why:\n", + "\n", + "* **Sacrifice and Initiative:** This move is a pawn sacrifice (g6). Pawn sacrifices are often interesting because they disrupt the opponent's plans and can create attacking opportunities. In this case, Kasparov sacrifices the pawn to open the g-file and create a direct attack on Deep Blue's king.\n", + "* **Deep Blue's Calculation Error (Likely):** It's highly probable that Deep Blue miscalculated the consequences of this sacrifice. While the move isn't *immediately* winning, it creates a complex tactical situation that likely exceeded Deep Blue's ability to evaluate accurately at the time. Deep Blue was known to be strong in brute-force calculation but weaker in long-term strategic assessment. The g6 sacrifice forces Deep Blue to deal with multiple threats and potential lines of attack, potentially leading to errors.\n", + "* **Kasparov's Psychological Impact:** Even if Deep Blue *could* have calculated the position accurately, playing such a bold and unexpected sacrifice would have put pressure on the computer. Kasparov was a master of psychological warfare, and this move likely aimed to unsettle Deep Blue's evaluation process.\n", + "* **Leads to a Decisive Attack:** The move g6 directly leads to a series of tactical blows that ultimately decide the game. The subsequent moves (Bf3, Qb5, Qxf1+, etc.) all stem from the initiative created by the pawn sacrifice.\n", + "\n", + "**Why other moves are less interesting (though still important):**\n", + "\n", + "* **13. Nh4 g5:** A dynamic exchange, but fairly standard.\n", + "* **20. dxe4 Bc5:** A typical recapture.\n", + "* **24. f3 Nxe3:** A tactical exchange, but not particularly surprising.\n", + "* **42. Nxg4+ Nxg4+:** A forced sequence, a consequence of the earlier moves.\n", + "\n", + "**In conclusion, 32. g6 is the most interesting move because it's a bold, strategically significant pawn sacrifice that likely exploited a weakness in Deep Blue's evaluation capabilities and set the stage for Kasparov's victory.**\n", + "\n", + "\n", + "\n", + "Do you want me to elaborate on any specific aspect of the game or the move 32. g6?\n" + ] + } + ], + "source": [ + "prompt = f\"\"\"What is the most interesting move from below?\n", + "\n", + "[Event \"IBM Man-Machine, New York USA\"]\n", + "[Site \"01\"]\n", + "[Date \"1997.??.??\"]\n", + "[EventDate \"?\"]\n", + "[Round \"?\"]\n", + "[Result \"1-0\"]\n", + "[White \"Garry Kasparov\"]\n", + "[Black \"Deep Blue (Computer)\"]\n", + "[ECO \"A06\"]\n", + "[WhiteElo \"?\"]\n", + "[BlackElo \"?\"]\n", + "[PlyCount \"89\"]\n", + "1.Nf3 d5 2.g3 Bg4 3.b3 Nd7 4.Bb2 e6 5.Bg2 Ngf6 6.O-O c6 7.d3 Bd6 8.Nbd2 O-O 9.h3 Bh5 10.e3 h6 11.Qe1 Qa5 12.a3 Bc7 13.Nh4 g5 14.Nhf3 e5 15.e4 Rfe8 16.Nh2 Qb6 17.Qc1 a5 18.Re1 Bd6 19.Ndf1 dxe4 20.dxe4 Bc5 21.Ne3 Rad8 22.Nhf1 g4 23.hxg4 Nxg4 24.f3 Nxe3 25.Nxe3 Be7 26.Kh1 Bg5 27.Re2 a4 28.b4 f5 29.exf5 e4 30.f4 Bxe2 31.fxg5 Ne5 32.g6 Bf3 33.Bc3 Qb5 34.Qf1 Qxf1+ 35.Rxf1 h5 36.Kg1 Kf8 37.Bh3 b5 38.Kf2 Kg7 39.g4 Kh6 40.Rg1 hxg4 41.Bxg4 Bxg4 42.Nxg4+ Nxg4+ 43.Rxg4 Rd5 44.f6 Rd1 45.g7 1-0\n", + "\"\"\"\n", + "\n", + "response = chatbot.chat(prompt=prompt)\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QLJpQ1NRMTq4" + }, + "outputs": [ + { + "data": { + "image/svg+xml": "
. . . r r . k .\n. p . . . . . .\n. q p . . . P p\n. . . . n P . .\np P . . p . . .\nP . . . N . P .\n. B P . b . B .\nR . Q . . . . K
", + "text/plain": [ + "Board('3rr1k1/1p6/1qp3Pp/4nP2/pP2p3/P3N1P1/1BP1b1B1/R1Q4K b - - 0 32')" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "board = chess.Board(\"3rr1k1/1p6/1qp4p/4nPP1/pP2p3/P3N1P1/1BP1b1B1/R1Q4K w - - 1 32\")\n", + "board.push_san(\"g6\")\n", + "board" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gKVPkBa7UxgI" + }, + "source": [ + "# Storytellers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JVw-9UN-UxGI" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The air in the IBM auditorium crackled with a nervous energy. It was 1997, New York City, and the world was holding its breath. Garry Kasparov, the reigning World Chess Champion, sat across from a hulking machine – Deep Blue, IBM’s chess-playing supercomputer. This was the rematch, the chance for Deep Blue to avenge its previous defeat.\n", + "\n", + "Kasparov, a whirlwind of intensity, tapped his fingers on the table, his eyes fixed on the board. He’d studied Deep Blue’s previous games, analyzed its strengths and weaknesses. He knew this wasn't just a game; it was a symbolic battle – man versus machine, intuition versus calculation.\n", + "\n", + "The opening unfolded with a familiar, almost polite, dance. Kasparov, playing white, opted for a solid, positional approach with 1. Nf3. Deep Blue responded predictably, but Kasparov, sensing an opportunity, began to subtly steer the game towards a more complex, tactical landscape. He sacrificed a pawn, a calculated risk to disrupt Deep Blue’s rigid, algorithmic thinking.\n", + "\n", + "\"It's trying to force me into a closed position,\" Kasparov muttered to his second, Yuri. \"But I won't let it.\"\n", + "\n", + "The middle game became a tense, intricate struggle. Kasparov, relying on his intuition and understanding of positional nuances, maneuvered his pieces with a deceptive fluidity. Deep Blue, in turn, churned through millions of calculations per second, evaluating every possible move with cold, unfeeling precision. \n", + "\n", + "At move 15, Kasparov saw his chance. A daring pawn push, e4, opened the position and created a series of tactical possibilities. Deep Blue, seemingly unfazed, responded with a move that, on the surface, appeared logical. But Kasparov saw a deeper flaw, a subtle vulnerability in Deep Blue’s defensive structure.\n", + "\n", + "\"There,\" he whispered, pointing to a square on the board. \"It's overextended. It's relying too much on brute force.\"\n", + "\n", + "The game spiraled into a chaotic endgame. Kasparov, with a series of brilliant sacrifices and precise attacks, relentlessly pressed his advantage. Deep Blue, despite its immense processing power, seemed to falter, its calculations failing to account for the human element – the ability to anticipate, to improvise, to *feel* the flow of the game.\n", + "\n", + "The pivotal moment came at move 32. Kasparov sacrificed his bishop, a seemingly reckless move that left his king exposed. But it was a trap. Deep Blue, calculating the immediate material gain, took the bait. \n", + "\n", + "\"It fell for it,\" Kasparov breathed, a flicker of triumph in his eyes.\n", + "\n", + "The final moves were a relentless cascade of attacks. Kasparov, with a combination of tactical brilliance and positional mastery, forced Deep Blue into a position from which there was no escape. At move 45, with a final, decisive push, Kasparov delivered the checkmate.\n", + "\n", + "The auditorium erupted in applause. Kasparov, exhausted but exhilarated, rose from his chair. He looked across at the silent, unblinking machine. \n", + "\n", + "\"It's a formidable opponent,\" he said, his voice echoing in the hall. \"But today, intuition prevailed.\"\n", + "\n", + "The score flashed on the screen: 1-0. Garry Kasparov had won. The battle of man versus machine had been fought, and for now, at least, humanity had emerged victorious. But everyone knew, with a chilling certainty, that the war was far from over. Deep Blue would learn. It would adapt. And the next time, the outcome might be very different.\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "prompt = f\"\"\"Write a short story about the gameplay below.\n", + "\n", + "[Event \"IBM Man-Machine, New York USA\"]\n", + "[Site \"01\"]\n", + "[Date \"1997.??.??\"]\n", + "[EventDate \"?\"]\n", + "[Round \"?\"]\n", + "[Result \"1-0\"]\n", + "[White \"Garry Kasparov\"]\n", + "[Black \"Deep Blue (Computer)\"]\n", + "[ECO \"A06\"]\n", + "[WhiteElo \"?\"]\n", + "[BlackElo \"?\"]\n", + "[PlyCount \"89\"]\n", + "1.Nf3 d5 2.g3 Bg4 3.b3 Nd7 4.Bb2 e6 5.Bg2 Ngf6 6.O-O c6 7.d3 Bd6 8.Nbd2 O-O 9.h3 Bh5 10.e3 h6 11.Qe1 Qa5 12.a3 Bc7 13.Nh4 g5 14.Nhf3 e5 15.e4 Rfe8 16.Nh2 Qb6 17.Qc1 a5 18.Re1 Bd6 19.Ndf1 dxe4 20.dxe4 Bc5 21.Ne3 Rad8 22.Nhf1 g4 23.hxg4 Nxg4 24.f3 Nxe3 25.Nxe3 Be7 26.Kh1 Bg5 27.Re2 a4 28.b4 f5 29.exf5 e4 30.f4 Bxe2 31.fxg5 Ne5 32.g6 Bf3 33.Bc3 Qb5 34.Qf1 Qxf1+ 35.Rxf1 h5 36.Kg1 Kf8 37.Bh3 b5 38.Kf2 Kg7 39.g4 Kh6 40.Rg1 hxg4 41.Bxg4 Bxg4 42.Nxg4+ Nxg4+ 43.Rxg4 Rd5 44.f6 Rd1 45.g7 1-0\n", + "\"\"\"\n", + "\n", + "response = chatbot.chat(prompt=prompt)\n", + "print(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2sVuJsJbWw2l" + }, + "source": [ + "# Supporting Chess Learning" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "1z9BXjhUW3tm" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Okay, let's break down the Sicilian Defense in chess. It's a hugely popular and complex opening, considered the most popular response to White's opening move of 1. e4. Here's a comprehensive explanation, covering its basics, key ideas, variations, and why it's so important.\n", + "\n", + "**1. The Basic Idea: Challenging White's Center**\n", + "\n", + "* **White's Opening:** White typically starts with 1. e4 (moving the King's pawn two squares forward). This aims to control the center of the board and open lines for development.\n", + "* **Black's Response: 1... c5** This is the defining move of the Sicilian Defense. Instead of mirroring White's pawn move (like 1... e5, which leads to more symmetrical openings), Black plays 1... c5.\n", + "* **What it Does:**\n", + " * **Challenges White's Central Control:** The c5 pawn immediately attacks White's d4 square. It prevents White from easily establishing a strong pawn center with d4.\n", + " * **Asymmetrical Position:** The Sicilian creates an asymmetrical position from the very beginning. This leads to more dynamic, tactical, and often sharper games compared to more symmetrical openings.\n", + " * **Counterattacking Potential:** Black often aims to develop a strong attack on White's kingside.\n", + "\n", + "**2. Why is it so Popular?**\n", + "\n", + "* **Fighting for the Win:** Black isn't content to simply equalize. The Sicilian is a fighting opening, giving Black good chances to play for a win against 1. e4.\n", + "* **Rich in Theory:** It's incredibly well-studied, with a vast amount of theory. This means there are many different variations to choose from, allowing players to tailor their approach to their style.\n", + "* **Dynamic and Tactical:** The Sicilian often leads to exciting, tactical battles.\n", + "* **Historically Significant:** Many world champions (Fischer, Kasparov, Kramnik, Carlsen) have used the Sicilian extensively.\n", + "\n", + "**3. Key Variations (A Simplified Overview - There are *many*!)**\n", + "\n", + "The Sicilian Defense branches out into a *huge* number of variations. Here are some of the most important and common ones, grouped roughly by their character:\n", + "\n", + "* **Open Sicilian (2. Nf3 d6 3. d4):** This is the most common and theoretically rich branch. White plays d4, opening the position.\n", + " * **Najdorf Variation (3... cxd4 4. Nxd4 Nf6 5. Nc3 a6):** The most popular and arguably most complex variation. Black prepares ...e5 and ...b5 to challenge White's control of the center and kingside.\n", + " * **Dragon Variation (3... g6):** Black fianchettoes (develops) their bishop to g7, creating a powerful diagonal aimed at White's center. Known for sharp, attacking games.\n", + " * **Classical Variation (3... Nf6 4. Nc3 Nc6):** A more solid and positional approach.\n", + " * **Scheveningen Variation (3... e6 4. Nc3 Nf6 5. g3):** Black creates a solid pawn structure and prepares to develop their pieces.\n", + "* **Closed Sicilian (2. Nc3):** White avoids the open game and aims for a more positional struggle. Less common at the highest levels but can be effective.\n", + "* **Alapin Variation (2. c3):** White supports their d4 pawn push and aims for a solid, positional game.\n", + "* **Rossolimo Variation (2. Nf3 Nc6 3. Bb5):** White avoids the main lines of the Open Sicilian by developing the bishop to b5, pinning the knight.\n", + "\n", + "**4. General Ideas for Black in the Sicilian**\n", + "\n", + "* **Control the d5 Square:** This is a crucial square in many Sicilian variations. Black often tries to control it, either directly with pawns or indirectly with pieces.\n", + "* **Develop Actively:** Black needs to develop their pieces quickly and efficiently, often focusing on the queenside.\n", + "* **Kingside Attack:** Many Sicilian variations involve a later kingside attack by Black.\n", + "* **Be Prepared for Sharp Tactics:** The Sicilian is a tactical opening, so Black needs to be sharp and calculating.\n", + "\n", + "**5. General Ideas for White in the Sicilian**\n", + "\n", + "* **Establish a Strong Center:** White often tries to establish a strong pawn center with d4 and e4.\n", + "* **Control the Open Files:** White needs to control the open files, especially the d-file and e-file.\n", + "* **Kingside Defense:** White needs to be prepared to defend against Black's kingside attack.\n", + "* **Exploit Black's Queenside Weaknesses:** The Sicilian can sometimes leave Black's queenside slightly vulnerable.\n", + "\n", + "**Resources for Learning More:**\n", + "\n", + "* **Chess.com:** Has articles, lessons, and videos on the Sicilian Defense.\n", + "* **Lichess.org:** Similar resources to Chess.com.\n", + "* **YouTube:** Search for \"Sicilian Defense\" and you'll find countless videos explaining the opening.\n", + "* **Chess Books:** There are many books dedicated to the Sicilian Defense, covering specific variations in detail.\n", + "\n", + "\n", + "\n", + "**To help me tailor my explanation further, could you tell me:**\n", + "\n", + "* Are you a beginner, intermediate, or advanced chess player?\n", + "* Are you interested in learning a specific variation of the Sicilian?\n" + ] + } + ], + "source": [ + "response = chatbot.chat(prompt=\"What is the \\\"Sicilian Defense\\\" in chess?\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QJEho9TCikVE" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "자, 시실리안 디펜스는 체스에서 아주 유명하고 재미있는 수들로 이루어진 전략이야. 마치 숨바꼭질처럼, 상대방을 속이고 기회를 잡는 방법이라고 생각하면 돼!\n", + "\n", + "**체스 게임 시작:**\n", + "\n", + "체스 게임은 보통 이렇게 시작해.\n", + "\n", + "```\n", + " a b c d e f g h\n", + "8 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖ 8\n", + "7 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ 7\n", + "6 . . . . . . . . 6\n", + "5 . . . . . . . . 5\n", + "4 . . . . . . . . 4\n", + "3 . . . . . . . . 3\n", + "2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙ 2\n", + "1 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖ 1\n", + " a b c d e f g h\n", + "```\n", + "\n", + "**시실리안 디펜스는 뭘까?**\n", + "\n", + "보통 백(흰색)이 먼저 움직이는데, 백이 폰을 앞으로 두 칸 움직이는 'e4' 수로 시작하는 경우가 많아. 그러면 검(검은색)은 그냥 폰을 앞으로 두 칸 움직이는 'e5' 대신, 다른 폰을 움직여서 백의 e4 폰을 공격하는 거야. 주로 'c5' 수로 움직여.\n", + "\n", + "**왜 시실리안 디펜스라고 부를까?**\n", + "\n", + "이 수법이 처음 시실리 섬에서 유행하기 시작했기 때문에 '시실리안'이라는 이름이 붙었대.\n", + "\n", + "**왜 이렇게 움직이는 걸까?**\n", + "\n", + "* **상대방을 당황하게 만들기:** 백은 보통 e4에 폰을 움직였을 때, 검은색이 e5로 똑같이 움직일 거라고 예상하거든. 그런데 검은색이 다른 폰을 움직이면 백은 당황해서 어떤 수를 둘지 고민하게 돼.\n", + "* **더 재미있는 게임 만들기:** 시실리안 디펜스는 복잡하고 다양한 수들이 나오기 때문에, 체스 게임이 더 재미있어질 수 있어. 마치 미로처럼, 상대방을 헷갈리게 만들면서 이길 수 있는 기회를 노리는 거지!\n", + "\n", + "**쉽게 말하면:**\n", + "\n", + "시실리안 디펜스는 체스에서 상대방을 놀라게 하고, 더 복잡하고 재미있는 게임을 만들 수 있는 전략이야. 마치 숨바꼭질에서 상대방이 어디 있는지 몰라하도록 숨는 것과 비슷하다고 생각하면 돼!\n", + "\n", + "**더 궁금한 점이 있다면 언제든지 물어봐!**\n" + ] + } + ], + "source": [ + "response = chatbot.chat(prompt=\"시실리안 디펜스가 뭐야? 초등학생도 쉽게 이해할 수 있게 설명해줘.\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YeSWH9kVXcpi" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Okay, let's break down the concept of a \"passed pawn\" in chess. It's a crucial idea for understanding pawn structure and endgame strategy.\n", + "\n", + "**What is a Passed Pawn?**\n", + "\n", + "A passed pawn is a pawn that has **no opposing pawns** on its file (the column it sits on) or on any adjacent files (the files immediately to its left and right). Essentially, there's nothing blocking its path to promotion.\n", + "\n", + "**Let's illustrate with an example:**\n", + "\n", + "Imagine a chessboard. Let's say White has a pawn on e5.\n", + "\n", + "* **If** there are no Black pawns on the e-file (e6, e7, e8) and no Black pawns on the d-file (d6, d7, d8) and no Black pawns on the f-file (f6, f7, f8), then the pawn on e5 is a **passed pawn**.\n", + "\n", + "* **If** Black has a pawn on e6, then the pawn on e5 is *not* a passed pawn. It's blocked.\n", + "\n", + "**Why are Passed Pawns Important?**\n", + "\n", + "Passed pawns are powerful because they represent a potential threat of promotion. Here's why they're valuable:\n", + "\n", + "* **Promotion Threat:** The ultimate goal of a pawn is to reach the opposite end of the board and promote to a Queen, Rook, Bishop, or Knight. A passed pawn has a clear, unobstructed path to do so.\n", + "* **Forcing Action:** A passed pawn forces the opponent to deal with it. They must dedicate pieces to block or capture it, which can tie up their forces and create weaknesses elsewhere on the board.\n", + "* **Endgame Dominance:** Passed pawns are *especially* strong in the endgame (when there are fewer pieces on the board). With fewer pieces to defend, a passed pawn can often be pushed to promotion, winning the game.\n", + "* **Creating Weaknesses:** The need to stop a passed pawn can force the opponent to move their King to defend, which can expose other squares and create tactical opportunities.\n", + "\n", + "**Types of Passed Pawns:**\n", + "\n", + "* **Protected Passed Pawn:** A passed pawn that is supported by another pawn. This makes it much harder to capture and even more dangerous.\n", + "* **Isolated Passed Pawn:** A passed pawn that has no friendly pawns on adjacent files to support it. While it can be a threat, it's also vulnerable to attack.\n", + "* **Connected Passed Pawn:** A passed pawn that is connected to other friendly pawns. This provides mutual support and makes it very difficult to stop.\n", + "\n", + "**Key Takeaways:**\n", + "\n", + "* A passed pawn is a pawn with a clear path to promotion.\n", + "* They are a significant threat and force the opponent to react.\n", + "* They are particularly powerful in the endgame.\n", + "* The type of passed pawn (protected, isolated, connected) affects its strength and vulnerability.\n", + "\n", + "\n", + "\n", + "Do you want me to give you some examples of how passed pawns are used in actual chess games, or perhaps explain how to create one?\n" + ] + } + ], + "source": [ + "response = chatbot.chat(prompt=\"Give me a clear explanation of the concept of a \\\"passed pawn\\\" in chess.\")\n", + "print(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "torZC-ChNFWv" + }, + "source": [ + "# Gemma explain chess" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EZdfZZDgSLFA" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2025-04-17 10:26:35-- https://github.com/official-stockfish/Stockfish/releases/latest/download/stockfish-ubuntu-x86-64-avx2.tar\n", + "Resolving github.com (github.com)... 140.82.112.3\n", + "Connecting to github.com (github.com)|140.82.112.3|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://github.com/official-stockfish/Stockfish/releases/download/sf_17.1/stockfish-ubuntu-x86-64-avx2.tar [following]\n", + "--2025-04-17 10:26:35-- https://github.com/official-stockfish/Stockfish/releases/download/sf_17.1/stockfish-ubuntu-x86-64-avx2.tar\n", + "Reusing existing connection to github.com:443.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/20976138/85758419-9488-4267-84ea-dc1379a61eb1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250417%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250417T102636Z&X-Amz-Expires=300&X-Amz-Signature=a4ece38c7d3844f03978d51f858ffdc22118ec7be587ad8134302ffacb96b9a0&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dstockfish-ubuntu-x86-64-avx2.tar&response-content-type=application%2Foctet-stream [following]\n", + "--2025-04-17 10:26:36-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/20976138/85758419-9488-4267-84ea-dc1379a61eb1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250417%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250417T102636Z&X-Amz-Expires=300&X-Amz-Signature=a4ece38c7d3844f03978d51f858ffdc22118ec7be587ad8134302ffacb96b9a0&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dstockfish-ubuntu-x86-64-avx2.tar&response-content-type=application%2Foctet-stream\n", + "Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n", + "Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 80087040 (76M) [application/octet-stream]\n", + "Saving to: ‘stockfish-ubuntu-x86-64-avx2.tar.1’\n", + "\n", + "stockfish-ubuntu-x8 100%[===================>] 76.38M 240MB/s in 0.3s \n", + "\n", + "2025-04-17 10:26:36 (240 MB/s) - ‘stockfish-ubuntu-x86-64-avx2.tar.1’ saved [80087040/80087040]\n", + "\n" + ] + } + ], + "source": [ + "!wget https://github.com/official-stockfish/Stockfish/releases/latest/download/stockfish-ubuntu-x86-64-avx2.tar\n", + "!tar -xf stockfish-ubuntu-x86-64-avx2.tar" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "LM4ecVq1P1aV" + }, + "outputs": [ + { + "data": { + "image/svg+xml": "
. . . r r . . .\n. . . . . . . .\n. . p . . . P k\n. p . . n P . .\np P . . p . B .\nP . B . N b . .\n. . P . . K . .\n. . . . . . R .
", + "text/plain": [ + "Board('3rr3/8/2p3Pk/1p2nP2/pP2p1B1/P1B1Nb2/2P2K2/6R1 b - - 0 41')" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import chess.engine\n", + "chessEngine = chess.engine.SimpleEngine.popen_uci(\"stockfish/stockfish-ubuntu-x86-64-avx2\")\n", + "\n", + "def get_best_move():\n", + " return chessEngine.play(board, chess.engine.Limit(time=0.1)).move\n", + "\n", + "sampler = gm.text.Sampler(\n", + " model=model,\n", + " params=params,\n", + " tokenizer=tokenizer,\n", + ")\n", + "chat_prompt = \"user\\n{prompt}\\nmodel\\n\"\n", + "\n", + "position = \"3rr3/8/2p3Pk/1p2nP2/pP2p1B1/P1B1Nb2/2P2K2/6R1 b - - 0 41\"\n", + "board = chess.Board(position)\n", + "board" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "oefhQNixP46B" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "user\n", + "If you decide to invoke any of the function(s), it should be wrapped with ```tool_code```.\n", + "\n", + "You have access to the following tools.\n", + "\n", + "* `get_best_move()`: Get the best move from the engine.\n", + "\n", + "BLACK to move.\n", + "Get the next best move and explain it easy enough for five year old.\n", + "\n", + "model\n", + "Okay, let's figure out the best move for Black!\n", + "\n", + "```tool_code\n", + "print(get_best_move())\n", + "```\n" + ] + } + ], + "source": [ + "prompt1 = chat_prompt.format(prompt=build_prompt_rev())\n", + "response1 = sampler.sample(prompt1)\n", + "chat_history = prompt1 + response1\n", + "print(chat_history)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "P4rU6XjRU6xK" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "user\n", + "If you decide to invoke any of the function(s), it should be wrapped with ```tool_code```.\n", + "\n", + "You have access to the following tools.\n", + "\n", + "* `get_best_move()`: Get the best move from the engine.\n", + "\n", + "BLACK to move.\n", + "Get the next best move and explain it easy enough for five year old.\n", + "\n", + "model\n", + "Okay, let's figure out the best move for Black!\n", + "\n", + "```tool_code\n", + "print(get_best_move())\n", + "```user\n", + "\n", + "```tool_output\n", + "e5g4\n", + "```\n", + "\n", + "model\n", + "Okay! The best move for Black is to move their knight from E5 to G4.\n", + "\n", + "Imagine the knight is a little horse jumping over the board. It can jump over other pieces! This move puts the horse in a good spot to attack White's king and maybe even take some of their pieces. It's like a surprise attack!\n" + ] + }, + { + "data": { + "image/svg+xml": "
. . . r r . . .\n. . . . . . . .\n. . p . . . P k\n. p . . . P . .\np P . . p . n .\nP . B . N b . .\n. . P . . K . .\n. . . . . . R .
", + "text/plain": [ + "Board('3rr3/8/2p3Pk/1p3P2/pP2p1n1/P1B1Nb2/2P2K2/6R1 w - - 0 42')" + ] + }, + "execution_count": 136, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# take the best move\n", + "import io\n", + "from contextlib import redirect_stdout\n", + "\n", + "f = io.StringIO()\n", + "with redirect_stdout(f):\n", + " result = eval(extract_code_blocks(response1)[0])\n", + "output = f.getvalue().rstrip('\\n')\n", + "move = result if output == '' else output\n", + "board.push_san(move)\n", + "\n", + "# return tool result, Gemma to explain\n", + "prompt2 = chat_prompt.format(prompt=f\"\"\"\n", + "```tool_output\n", + "{move}\n", + "```\n", + "\"\"\")\n", + "response2 = sampler.sample(chat_history + prompt2, images=get_board_img(board))\n", + "chat_history += prompt2 + response2\n", + "print(chat_history)\n", + "\n", + "board" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "name": "[Gemma_3]Chess.ipynb", + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}