話題のOpen InterpreterをDockerで動かす
こんにちは、福田です。
本日はOpenInterpreterを利用してみました。(公開忘れで数日放置していました…)
Open Interpreterとは
ChatGPTのCode Interpreter(現在はAdvanced Data Analysis)をローカルで動かすことができる、というサービスで話題になっているOpen Interpreterを利用してみました。
ChatGPT内での利用はインストール関連含め、さまざまな制約があるため、それらの制約がないOpen Interpreterの活用は今後も注目されていくでしょう。
とは言っても万が一ローカルで`sudo rm -rf *`など実行されてしまったら…など考えてしまい、Dockerで動かしてみよう!ということになりました。
Dockerで動かしてみる
すでに作成していただいている方がいらっしゃったので、こちらのリポジトリからそのまま利用させていただきました。
動かしてみる
早速動かしてみようと思います。操作は至って簡単。
interpreter -y
コマンドはこれだけで良いようです。
ここでapiキーを求められました。
apiキーを提供せずにそのまま実行するとcode llamaが選択される仕組みです。
Code-Llamaを利用
Welcome to Open Interpreter.
────────────────────────────────────────────────────────────
▌ OpenAI API key not found
To use GPT-4 (recommended) please provide an OpenAI API key.
To use Code-Llama (free but less capable) press enter.
────────────────────────────────────────────────────────────
モデル選択後、ローカルにモデルを保存してくれました。次回以降からダウンロドの必要はありません。
モデルは中間モデルの7b、ダウンロード自体は10GB以下です。
Open Interpreter will use Code Llama for local execution. Use your arrow keys to set
up the model.
[?] Parameter count (smaller is faster, larger is more capable): 13B
7B
> 13B
34B
[?]
Small | Size: 5.1 GB, Estimated RAM usage: 7.6 GB
> Medium | Size: 7.3 GB, Estimated RAM usage: 9.8 GB
Large | Size: 12.9 GB, Estimated RAM usage: 15.4 GB
実際に中間モデルで動かしてみました。それっぽいものは書いてくれています。さすがデータセットにcodeが大量に含まれているだけあります。
Model found at /Users/xxxxxx/Library/Application Support/Open
Interpreter/models/codellama-13b-instruct.Q4_K_M.gguf
▌ Model set to TheBloke/CodeLlama-13B-Instruct-GGUF
> tiktaktoeのコードを書いてください。 # Define the game board
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm
# Define the game board
board = np.zeros((3, 3))
# Define the player symbols
player1 = 'X'
player2 = 'O'
# Define the winning combinations
winning_combinations = [
(0, 1, 2),
(3, 4, 5),
(6, 7, 8),
(0, 3, 6),
(1, 4, 7),
(2, 5, 8),
(0, 4, 8),
(2, 4, 6)
]
# Define the game loop
while True:
# Print the board
print(board)
# Ask for player1 input
row_index = int(input("Player 1, please enter a row index: ")) - 1
col_index = int(input("Player 1, please enter a column index: ")) - 1
board[row_index][col_index] = player1
# Check if the game is over
for combination in winning_combinations:
if all([board[i][j] == player1 for i, j in zip(combination, range(3))]):
print("Player 1 wins!")
break
# Ask for player2 input
row_index = int(input("Player 2, please enter a row index: ")) - 1
col_index = int(input("Player 2, please enter a column index: ")) - 1
board[row_index][col_index] = player2
# Check if the game is over
for combination in winning_combinations:
if all([board[i][j] == player2 for i, j in zip(combination, range(3))]):
print("Player 2 wins!")
break
# Check if the game is a draw
if np.all(board != 0) and not any([board[i][j] == 0 for i in range(3) for j
in range(3)]):
print("It's a draw!")
break
ただ、正直な感想としてはこちらはまだまだというところでしょうか(最上位モデルでないというのもあるが、そこまで大きな差を感じられなかった)。
このコードに対する問題点(フィードバック)としては
ボードはnp.zeros((3, 3))で初期化されているため、シンボル 'X' と 'O'(文字列)を格納する際に型エラーが発生する。
定義した勝利の組み合わせとして一次元ボードとしているが、実際は2Dボード。
勝利をチェック❌
引き分けをチェック❌
などなど、そもそも動かない状態でした。
また、その後のインストール部分で無限ループが起きてしまいました。
GPT-4を利用
活用していくのであればメインはGPT-4になりそうです。
ただ、利用料金が恐ろしいことになるので、日常的に利用するのは躊躇してしまう。と感じました。
def print_board(board):
for row in board:
print("|".join(row))
print("-" * 5)
def check_win(board, player):
# 横、縦、対角線の勝利条件を確認
for i in range(3):
if all([cell == player for cell in board[i]]) or all([board[j][i] == player for j in range(3)]):
return True
if board[0][0] == player and board[1][1] == player and board[2][2] == player:
return True
if board[0][2] == player and board[1][1] == player and board[2][0] == player:
return True
return False
def get_empty_cells(board):
return [(i, j) for i in range(3) for j in range(3) if board[i][j] == " "]
def main():
board = [[" "]*3 for _ in range(3)]
current_player = "X"
for _ in range(9): # 最大9回の手を繰り返す
print_board(board)
print(f"{current_player}'s turn")
move = input("Enter your move (row col): ").split()
row, col = map(int, move)
if board[row][col] == " ":
board[row][col] = current_player
else:
print("Cell is already occupied!")
continue
if check_win(board, current_player):
print_board(board)
print(f"{current_player} wins!")
return
current_player = "X" if current_player == "O" else "O"
print_board(board)
print("It's a tie!")
if __name__ == "__main__":
main()
まとめ
Open Interpreterを利用して、Tiktaktoeのコードを記述していただくようにお願いしました。
モデルはCode llama(無料)とGPT-4(有料)が選択できる
速度と正確性を踏まえてGPT-4一択というのが現状(code-llama最上位は試していないが)