見出し画像

話題の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     

ただ、正直な感想としてはこちらはまだまだというところでしょうか(最上位モデルでないというのもあるが、そこまで大きな差を感じられなかった)。

このコードに対する問題点(フィードバック)としては

  1. ボードはnp.zeros((3, 3))で初期化されているため、シンボル 'X' と 'O'(文字列)を格納する際に型エラーが発生する。

  2. 定義した勝利の組み合わせとして一次元ボードとしているが、実際は2Dボード。

  3. 勝利をチェック❌

  4. 引き分けをチェック❌

などなど、そもそも動かない状態でした。

また、その後のインストール部分で無限ループが起きてしまいました。

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最上位は試していないが)





いいなと思ったら応援しよう!