VSCode拡張機能(Phind.com – Code faster with AI)を利用してAIアシストプログラミングを試してみた

2024年2月12日python,AI

プログラミングをChatGPTなどを利用してコーディングをする機会も多くなってきました。

これまでは、ブラウザでChatGPTと会話しつつコーディングを進めていましたが、やはりエディタ(VSCode)と一体化したほうが生産性が高いのでは思い、今回は無料で利用できるPhindのVSCodeの拡張機能を試してみました。

Phindの他、「GitHub Copilot」やエディタ自体がAIアシスト対応の「Cursor」などもありますが、
「GitHub Copiliot」は有料、「Cursor」は無料でも利用できますが、無料の場合は使用回数に制限があります。
また、VSCodeと操作性は同じといっても別エディタであることには変わらず、今後もアップデートされるのかを気にするのであれば、VSCodeの拡張機能で対応しているものはないかと調べ、Phindに辿り着きました。

Phindとは

Phindは、開発者がより効率的にコーディングを行うためのAIアシストツールです。
コードの生成、修正提案、コードレビューなど、多様な開発作業を支援します。
Phindは人間の知識を活用しており、特定のプログラミング言語やフレームワークに特化した知識を持つAIを介して、ユーザーが直面する問題を解決する手助けをします。

PhindはChatGPT同様にブラウザからも利用できます。
コーディングに特化しているということですが、結構コーディング関係ない質問もそれなりに精度高く回答してくれます。

Pind.com

VSCode拡張機能「Phind」の導入方法

導入方法は、他のVSCode拡張機能と同じくマーケットプレースから導入できます。
手順としては以下の通り。

  • VSCodeのインストール確認: まず、Visual Studio Codeがシステムにインストールされていることを確認してください。
  • 拡張機能マーケットプレースの開き方: VSCodeを起動し、左側のアクティビティバーにある拡張機能アイコンをクリックするか、Ctrl+Shift+Xのショートカットキーを使用して拡張機能ビューを開きます。
  • Phind拡張機能の検索: 拡張機能ビューの検索バーに「Phind」と入力して、Phindの拡張機能を見つけます。
  • Phind拡張機能のインストール: Phindの拡張機能リストからインストールボタンをクリックし、インストールを完了します。
  • VSCodeの再起動: インストールが完了すると、VSCodeは再起動を促す通知を表示します。この通知を確認し、VSCodeを再起動してPhindの機能を利用できるようにします。

VSCode+Phindの開発画面

Phind拡張機能を表示した状態の開発画面です。

VSCode+Phindでのプログラミング方法

Phindの機能ごとに説明するよりも、簡単なプログラムを例に、新規作成・コード修正・コード追加・エラー内容からの自動コード提案の機能などを説明します。

プログラムのサンプルとしては、最大公約数・最大公約数を求めるプログラミングを例にします。

はじめの指示

Phindチャット画面を表示

VSCodeの「P」のアイコンをクリックするか、「Ctrl + Shift + I」でPhindのチャット画面を左側に表示させます。

ソースファイルを新規で作成

新規ファイル(phind-test.py)を作成し、開いておく
このファイルは自分で作りました。

Phindに指示

Phindのチャット画面から以下の指示をします。
最終的には、最大公約数と最小公倍数を求めたいが、一旦最大公約数のみで指示してみる。
最小公倍数はあとから追加指示する

指示

pythonで2つの引数を受け取り、最大公約数を表示するコードを書いて

Phindの回答

コードの説明とコードが表示されます。

回答

Pythonで2つの引数を受け取り、それらの最大公約数を計算して表示するコードは以下のようになります。
このコードはユークリッドの互除法を使用しています。

def gcd(a, b):
    while b !=  0:
        a, b = b, a % b
    return a

#  テスト用の引数
num1 =  48
num2 =  18

#  最大公約数を計算して表示
print("最大公約数:", gcd(num1, num2))

生成されたコードをエディタに反映

まだ、「phind-test.py」が何もない状態なので、
「Insert At Cursor」をクリックし全てのコードをエディタに反映しソースを保存する。

実行結果を確認

生成されたコードを実行する

$ python phind-test.py 
最大公約数: 6

特にエラーなく実行された、結果も正しいようだ。

指定する2つの値をコマンドラインの引数で指定するように修正

生成されたコードは2つの数値の最大公約数を求めるものだが、2つの数値が固定になっている。
確かにあまり条件をつけていなかったので、仕方がない。
コマンドラインの引数で2つの値を指定するように指示してみる。

Phindに指示

Phindのチャット画面から以下の指示をします。
あえて、簡素に指示してみる。

指示

コマンドラインの引数で指定するように修正して

Phindの回答

Phindからの回答を見ると、こちらの意図は汲み取ってくれたようだ。

回答

コマンドラインの引数を使用して2つの数値を受け取り、それらの最大公約数を計算するようにコードを修正します。
Pythonのsys.argvを使用してコマンドライン引数を取得し、int()関数で文字列を整数に変換します。

以下のコードは、コマンドライン引数を受け取り、最大公約数を計算して表示する機能を持っています。

import sys

def gcd(a, b):
    while b !=  0:
        a, b = b, a % b
    return a

if __name__ == "__main__":
    if len(sys.argv) !=  3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])

    print("最大公約数:", gcd(num1, num2))

生成されたコードをエディタに反映

修正したコードを反映させたい場合は、「Apply Edit」の機能を利用する。
「Apply Edit」をクリックして、エディタに反映しソースを保存する。

今回の例では、全てのコードが表示されているが、プログラムが大きくなると修正箇所のみ表示される。
その場合も「Apply Edit」をクリックすると、修正箇所のみに反映される。
※修正反映の場所が意図しない場所に反映されることもあるので注意!

実行結果を確認

生成されたコードを実行する

$ python phind-test.py 4 12
最大公約数: 4

コマンドライン引数から指定した値で計算が行われるようになった。

最小公倍数も同時に出力するように修正

最大公約数は表示できるようになったので、仕様変更を想定して最小公倍数を追加で表示するように指示してみます。

Phindに指示

Phindのチャット画面から以下の指示をします。

指示

最小公倍数も同時に出力するように修正して

Phindの回答

Phindからの回答を見ると、コードの説明もありこちらの指示が伝わっているかを確認できるので助かる。
今回も指示内容は伝わっているようだ。

コマンドライン引数を使用して2つの数値を受け取り、それらの最大公約数と最小公倍数を計算して表示するようにコードを修正します。
最小公倍数は、最大公約数を使用して計算できます。
最大公約数を求める関数gcdを使用して、最小公倍数を計算する新しい関数lcmを作成します。

以下のコードは、コマンドライン引数を受け取り、最大公約数と最小公倍数を計算して表示する機能を持っています。

import sys

def gcd(a, b):
    while b !=   0:
        a, b = b, a % b
    return a

def lcm(a, b):
    return abs(a * b) // gcd(a, b)

if __name__ == "__main__":
    if len(sys.argv) !=   3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])

    print("最大公約数:", gcd(num1, num2))
    print("最小公倍数:", lcm(num1, num2))

生成されたコードをエディタに反映

「Apply Edit」をクリックして、エディタに反映しソースを保存する

実行結果を確認

生成されたコードを実行する

$ python phind-test.py 4 12
最大公約数: 4
最小公倍数: 12

実行結果に最小公倍数が追加されている。
答えもあっているようだ。

コメントを追加

コードにコメントがなかったので、コメントの追加を指示する。

Phindに指示

Phindのチャット画面から以下の指示をします。

指示

コメントを追加して

Phindの回答

Phindからの回答から、特に違和感のないコメントを追加するコードが提示された。

回答

コメントを追加して、コードの各部分が何を行っているかを明確にするようにコードを修正します。

import sys

#  最大公約数を計算する関数
def gcd(a, b):
    while b !=   0:
        a, b = b, a % b
    return a

#  最小公倍数を計算する関数
def lcm(a, b):
    return abs(a * b) // gcd(a, b)

if __name__ == "__main__":
    #  コマンドライン引数の数が正しいかチェック
    if len(sys.argv) !=   3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    #  コマンドライン引数を整数に変換
    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])

    #  最大公約数と最小公倍数を計算して表示
    print("最大公約数:", gcd(num1, num2))
    print("最小公倍数:", lcm(num1, num2))

生成されたコードをエディタに反映

「Apply Edit」をクリックして、エディタに反映しソースを保存する。

実行結果を確認

生成されたコードを実行する

$ python phind-test.py 4 12
最大公約数: 4
最小公倍数: 12

コメントを追加しても元のコードには変更なし。
結果も同じで問題なし。

エラー内容からコードを修正させる

ターミナルの出力結果をもとにPhindに問い合わせする機能を試すために、
意図的に引数に文字(「a」と「b」)を指定してエラーを発生させ、そのエラー内容からどのように対応するかを確認する

プログラムを実行しエラーを発生させる

引数に「a」と「b」を指定してエラーを発生させる
ターミナルの出力結果は以下の状態

$ python phind-test.py a b
Traceback (most recent call last):
  File "/home/snow/dev/phind-test/phind-test.py", line 20, in <module>
    num1 = int(sys.argv[1])
ValueError: invalid literal for int() with base 10: 'a'

Phindにターミナルのエラー状態を伝え対応させる

Phindにターミナルの内容を伝えることは簡単でコピペする必要はありません。
「Ctrl + Shift + L」を押下するのみです。

それでは、「Ctrl + Shift + L」でターミナルのエラー内容をPhindに伝えて、対応を考えさせます。

すると、自動で以下のメッセージで問い合わせが行われた

以下は、Phind拡張機能のChatエリアに表示された内容

指示

This is the last command and its output from the terminal:
snow@HX90 ~/dev/phind-test
$ python phind-test.py a b
Traceback (most recent call last):
File “/home/snow/dev/phind-test/phind-test.py", line 20, in <module>
num1 = int(sys.argv[1])
ValueError: invalid literal for int() with base 10: 'a’

ターミナルの内容で問い合わせできたが、英語で指示されている。嫌な予感が。。。

Phindがエラー内容と対策を解説してきた

指示内容に日本語がないためかメッセージは英語になってしまったが、エラー内容と対策を説明してくれた

回答(原文)

The error message indicates that the script is trying to convert the string 'a’ to an integer, which is not possible because 'a’ is not a valid integer literal.
To handle this situation, you can modify the script to check if the input arguments can be converted to integers before attempting to do so.
If they cannot be converted, the script should exit gracefully with an appropriate error message.

Here’s how you can update the script to include error handling for non-integer inputs:


This updated code includes a try…except block to catch ValueError exceptions, which occur when the conversion to an integer fails.
It also provides a more informative error message to the user.

Apply this updated code to your phind-test.py file by clicking the button below.

上記をGoogle翻訳すると、以下の通り

回答(翻訳)

エラー メッセージは、スクリプトが文字列 'a’ を整数に変換しようとしているが、’a’ が有効な整数リテラルではないため変換できないことを示しています。
この状況に対処するには、入力引数を整数に変換する前に、入力引数を整数に変換できるかどうかをチェックするようにスクリプトを変更します。
変換できない場合、スクリプトは適切なエラー メッセージを表示して正常に終了する必要があります。

非整数入力のエラー処理を組み込むようにスクリプトを更新する方法は次のとおりです。


この更新されたコードには、整数への変換が失敗した場合に発生する ValueError 例外をキャッチするための try…Except ブロックが含まれています。
また、より有益なエラー メッセージがユーザーに提供されます。

下のボタンをクリックして、この更新されたコードを phind-test.py ファイルに適用します。

エラー対応がされたコードが自動生成される

特に「Ctrl + Shift + L」を押下してから何もすることなく、自動でエラー対策したコードが生成される。
これは、すごい!

ブラウザベースのAI機能では味わえない感覚だ。
ただ、コメントが英語になってしまった。

import sys

# Function to calculate greatest common divisor
def gcd(a, b):
    while b !=  0:
        a, b = b, a % b
    return a

# Function to calculate least common multiple
def lcm(a, b):
    return abs(a * b) // gcd(a, b)

if __name__ == "__main__":
    # Check if the correct number of command line arguments are provided
    if len(sys.argv) !=  3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    # Attempt to convert command line arguments to integers
    try:
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
    except ValueError:
        print("Error: Both arguments must be integers.")
        sys.exit(1)

    # Calculate and display the greatest common divisor and least common multiple
    print("Greatest Common Divisor:", gcd(num1, num2))
    print("Least Common Multiple:", lcm(num1, num2))

生成されたコードをエディタに反映

なぜか、「Apply Edit」をクリックしてもエディタに反映されなくなる。(たまたま固まっただけかも)
仕方なく、コードを全削除して「Insert At Cursor」で反映させる。

実行結果を確認

生成されたコードを実行する

$ python phind-test.py a b
Error: Both arguments must be integers.

$ python phind-test.py 6 18
Greatest Common Divisor: 6
Least Common Multiple: 18

引数に、文字を指定すると数値の指定を促すメッセージが出力されるようになった。

数値を指定した場合の実行結果も英語表記になってしまっているが、結果は正しそうだ。

選択したコードの修正でコメント内容を英語から日本語に修正する

チャット画面で指示してもできますが、選択した範囲の修正機能である「Ctrl + Shift + M」を利用してみます。

Phindに指示

コメント部分を含むコードを選択(ほぼ全部ですが)する

「Ctrl + Shift + M」を押下すると、VSCodeの上部に指示を入力するためのテキストエリアが表示されるので、

指示

コメントを日本語に修正して

と指示する

Phindからの修正案が提示される

選択したコードの上から順に、修正されていき、以下の修正案が提示される。
一瞬では終わらない。1行毎に考えているのがわかるスピード感です。

import sys

# Function to calculate greatest common divisor ← Removed
# 最大公約数を計算する関数  ← Added
def gcd(a, b):
    while b !=  0:
        a, b = b, a % b
    return a

# Function to calculate least common multiple ← Removed
# 最小公倍数を計算する関数  ← Added
def lcm(a, b):
    return abs(a * b) // gcd(a, b)

if __name__ == "__main__":
    # Check if the correct number of command line arguments are provided ← Removed
    # コマンドライン引数が正しい数であるかを確認  ← Added
    if len(sys.argv) !=  3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    # Attempt to convert command line arguments to integers ← Removed
    # コマンドライン引数を整数に変換を試みる  ← Added
    try:
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
    except ValueError:
        print("Error: Both arguments must be integers.")
        sys.exit(1)

    # Calculate and display the greatest common divisor and least common multiple ← Removed
    # 最大公約数と最小公倍数を計算し、表示する  ← Added
    print("Greatest Common Divisor:", gcd(num1, num2))
    print("Least Common Multiple:", lcm(num1, num2))

修正内容は削除部分(Removed)と追加部分(Added)で背景色が色分けされて表示されるため、それほど確認しづらくはないです。

提示されたコードを反映

提示された修正内容でOKであれば、再度「Ctrl + Shift + M」を押下すると確定できます。
※tabキーを押すとキャンセルできました。

確定した結果は以下の通り。

import sys

# 最大公約数を計算する関数
def gcd(a, b):
    while b !=  0:
        a, b = b, a % b
    return a

# 最小公倍数を計算する関数
def lcm(a, b):
    return abs(a * b) // gcd(a, b)

if __name__ == "__main__":
    # コマンドライン引数が正しい数であるかを確認
    if len(sys.argv) !=  3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    # コマンドライン引数を整数に変換を試みる
    try:
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
    except ValueError:
        print("Error: Both arguments must be integers.")
        sys.exit(1)

    # 最大公約数と最小公倍数を計算し、表示する
    print("Greatest Common Divisor:", gcd(num1, num2))
    print("Least Common Multiple:", lcm(num1, num2))

実行結果を確認

生成されたコードを実行する

$ python phind-test.py a b
Error: Both arguments must be integers.

$ python phind-test.py 6 18
Greatest Common Divisor: 6
Least Common Multiple: 18

実行結果は、正常処理・エラー処理も問題なし

実行結果の英語表示を日本語表示に修正する

選択した範囲の修正機能である「Ctrl + Shift + M」を利用し、コードを修正させる。

Phindに指示

以下の2行を選択して、「Ctrl + Shift + M」を押下し、

指示

出力結果を日本語(最大公約数、最小公倍数)に修正して

と指示する

    print("Greatest Common Divisor:", gcd(num1, num2))
    print("Least Common Multiple:", lcm(num1, num2))

Phindからの修正案が提示される

コードの上から順に、修正されていき、以下の修正案が提示される。

    print("Greatest Common Divisor:", gcd(num1, num2))
    print("Least Common Multiple:", lcm(num1, num2))
← Removed
        print("最大公約数:", gcd(num1, num2))
        print("最小公倍数:", lcm(num1, num2))  ← Added

このとき、インデントがズレていることに気づかなかったため、そのまま確定してしましました。。。

提示されたコードを反映

提示された修正内容でOKであれば、再度「Ctrl + Shift + M」を押下すると確定する
確定した結果は以下の通り。

import sys

# 最大公約数を計算する関数
def gcd(a, b):
    while b !=  0:
        a, b = b, a % b
    return a

# 最小公倍数を計算する関数
def lcm(a, b):
    return abs(a * b) // gcd(a, b)

if __name__ == "__main__":
    # コマンドライン引数が正しい数であるかを確認
    if len(sys.argv) !=  3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    # コマンドライン引数を整数に変換を試みる
    try:
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
    except ValueError:
        print("Error: Both arguments must be integers.")
        sys.exit(1)

    # 最大公約数と最小公倍数を計算し、表示する
        print("最大公約数:", gcd(num1, num2))
        print("最小公倍数:", lcm(num1, num2))

実行結果を確認

生成されたコードを実行する

$ python phind-test.py 6 18

結果が出力されなくなっている。。。

よく見ると、最後に修正した結果表示の2行のインデントがおかしい(一つ深くなっている)

Phindに

指示1

実行されなくなった原因とコードの修正案と提示して

と指示したが、思った回答は得られず、

指示2

最後の2行のインデントがおかしいのではないか

と指摘することで正しい修正案を提示されましたが、今回は1行程度での指示でどの程度できるのかを確認したかったので、このあたりが限界なのかと感じました。

ともかく、コードを修正した結果(インデントを直しただけですが)は以下の通り。

完成したコード

import sys

# 最大公約数を計算する関数
def gcd(a, b):
    while b !=  0:
        a, b = b, a % b
    return a

# 最小公倍数を計算する関数
def lcm(a, b):
    return abs(a * b) // gcd(a, b)

if __name__ == "__main__":
    # コマンドライン引数が正しい数であるかを確認
    if len(sys.argv) !=  3:
        print("Usage: python phind-test.py <number1> <number2>")
        sys.exit(1)

    # コマンドライン引数を整数に変換を試みる
    try:
        num1 = int(sys.argv[1])
        num2 = int(sys.argv[2])
    except ValueError:
        print("Error: Both arguments must be integers.")
        sys.exit(1)

    # 最大公約数と最小公倍数を計算し、表示する
    print("最大公約数:", gcd(num1, num2))
    print("最小公倍数:", lcm(num1, num2))

実行結果を確認

生成されたコードを実行する

$ python phind-test.py 6 18
最大公約数: 6
最小公倍数: 18

これで、正常時、エラー時の処理が問題なく動作する状態になった。
コメント、結果も日本語表示されるまでできたので、一旦完成とします。

ショートカット一覧

PhindのVSCode拡張機能で使用できる主なショートカットです。

Ctrl/Cmd + I: 現在の選択範囲で新しいチャットを開始します。
Ctrl/Cmd + Shift + I: 選択されたコードを既存のチャットに追加します。
Ctrl/Cmd + Shift + M: 選択されたコードを指示に基づいて自動的に書き換えます。
Ctrl/Cmd + Shift + L: ターミナルの出力についてPhindに問い合わせます。
Ctrl/Cmd + Shift + J: Phindパネルを開閉します。

まとめ

話題のAIサポート機能を利用したコーディングを試してみましたが、無料でもここまでできるようになっているのかと感心しました。

Phind拡張機能には、GitHub Copilotのようなコーディング中にコードが提示されるようなサポート機能はないですが、
ブラウザでChatGPTなどを開いてコードを質問していたことに比べると、格段に生産性は上がりそうです。

Phindはブラウザでも利用できます。
特に登録等の不要なためおすすめです。
ただ、日本語で質問しても回答が英語になることがよくあります。
VSCodeの拡張機能でもよく英語で回答されてしまします。
その点は今後の改善に期待です。

ちなみに最初の指示段階で結果を提示したり、何がやりたいかを具体的にすれば今回のサンプル程度であれば一発で出力できました。

python,AI

Posted by snow